using System; using NUnit.Framework; using System.Collections.ObjectModel; using System.Globalization; namespace Xamarin.Forms.Core.UnitTests { [TestFixture] public class PickerTests : BaseTestFixture { class PickerTestsContextFixture { public class PickerTestsNestedClass { public string Nested { get; set; } } public PickerTestsNestedClass Nested { get; set; } public string DisplayName { get; set; } public string ComplexName { get; set; } public PickerTestsContextFixture(string displayName, string complexName) { DisplayName = displayName; ComplexName = complexName; } public PickerTestsContextFixture() { } } class PickerTestsBindingContext { public ObservableCollection Items { get; set; } public object SelectedItem { get; set; } } class PickerTestValueConverter : IValueConverter { public bool ConvertCalled { get; private set; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { ConvertCalled = true; var cf = (PickerTestsContextFixture)value; return cf.DisplayName; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } [Test] public void TestSetSelectedIndexOnNullRows() { var picker = new Picker(); Assert.IsEmpty(picker.Items); Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = 2; Assert.AreEqual(-1, picker.SelectedIndex); } [Test] public void TestSelectedIndexInRange() { var picker = new Picker { Items = { "John", "Paul", "George", "Ringo" }, SelectedIndex = 2 }; Assert.AreEqual(2, picker.SelectedIndex); picker.SelectedIndex = 42; Assert.AreEqual(3, picker.SelectedIndex); picker.SelectedIndex = -1; Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = -42; Assert.AreEqual(-1, picker.SelectedIndex); } [Test] public void TestSelectedIndexInRangeDefaultSelectedIndex() { var picker = new Picker { Items = { "John", "Paul", "George", "Ringo" } }; Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = -5; Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = 2; Assert.AreEqual(2, picker.SelectedIndex); picker.SelectedIndex = 42; Assert.AreEqual(3, picker.SelectedIndex); picker.SelectedIndex = -1; Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = -42; Assert.AreEqual(-1, picker.SelectedIndex); } [Test] public void TestSelectedIndexChangedOnCollectionShrink() { var picker = new Picker { Items = { "John", "Paul", "George", "Ringo" }, SelectedIndex = 3 }; Assert.AreEqual(3, picker.SelectedIndex); picker.Items.RemoveAt(3); picker.Items.RemoveAt(2); Assert.AreEqual(1, picker.SelectedIndex); picker.Items.Clear(); Assert.AreEqual(-1, picker.SelectedIndex); } [Test] public void TestSelectedIndexOutOfRangeUpdatesSelectedItem() { var picker = new Picker { ItemsSource = new ObservableCollection { "Monkey", "Banana", "Lemon" }, SelectedIndex = 0 }; Assert.AreEqual("Monkey", picker.SelectedItem); picker.SelectedIndex = 42; Assert.AreEqual("Lemon", picker.SelectedItem); picker.SelectedIndex = -42; Assert.IsNull(picker.SelectedItem); } [Test] public void TestUnsubscribeINotifyCollectionChanged() { var list = new ObservableCollection(); var picker = new Picker { ItemsSource = list }; Assert.AreEqual(0, picker.Items.Count); var newList = new ObservableCollection(); picker.ItemsSource = newList; list.Add("item"); Assert.AreEqual(0, picker.Items.Count); } [Test] public void TestEmptyCollectionResetItems() { var list = new ObservableCollection { "John", "George", "Ringo" }; var picker = new Picker { ItemsSource = list }; Assert.AreEqual(3, picker.Items.Count); picker.ItemsSource = new ObservableCollection(); Assert.AreEqual(0, picker.Items.Count); } [Test] public void TestSetItemsSourceProperty() { var items = new ObservableCollection { new { Name = "John" }, "Paul", "Ringo", 0, new DateTime(1970, 1, 1), }; var picker = new Picker { ItemDisplayBinding = new Binding("Name"), ItemsSource = items }; Assert.AreEqual(5, picker.Items.Count); Assert.AreEqual("John", picker.Items[0]); Assert.AreEqual(null, picker.Items[3]); } [Test] public void TestDisplayConverter() { var obj = new PickerTestsContextFixture("John", "John Doe"); var converter = new PickerTestValueConverter(); var picker = new Picker { ItemDisplayBinding = new Binding (Binding.SelfPath, converter:converter), ItemsSource = new ObservableCollection { obj } }; Assert.IsTrue(converter.ConvertCalled); Assert.AreEqual("John", picker.Items[0]); } [Test] public void TestItemsSourceCollectionChangedAppend() { var items = new ObservableCollection { new { Name = "John" }, "Paul", "Ringo" }; var picker = new Picker { ItemDisplayBinding = new Binding("Name"), ItemsSource = items, SelectedIndex = 0 }; Assert.AreEqual(3, picker.Items.Count); Assert.AreEqual("John", picker.Items[0]); items.Add(new { Name = "George" }); Assert.AreEqual(4, picker.Items.Count); Assert.AreEqual("George", picker.Items[picker.Items.Count - 1]); } [Test] public void TestItemsSourceCollectionChangedClear() { var items = new ObservableCollection { new { Name = "John" }, "Paul", "Ringo" }; var picker = new Picker { ItemDisplayBinding = new Binding("Name"), ItemsSource = items, SelectedIndex = 0 }; Assert.AreEqual(3, picker.Items.Count); items.Clear(); Assert.AreEqual(0, picker.Items.Count); } [Test] public void TestItemsSourceCollectionChangedInsert() { var items = new ObservableCollection { new { Name = "John" }, "Paul", "Ringo" }; var picker = new Picker { ItemDisplayBinding = new Binding("Name"), ItemsSource = items, SelectedIndex = 0 }; Assert.AreEqual(3, picker.Items.Count); Assert.AreEqual("John", picker.Items[0]); items.Insert(1, new { Name = "George" }); Assert.AreEqual(4, picker.Items.Count); Assert.AreEqual("George", picker.Items[1]); } [Test] public void TestItemsSourceCollectionChangedReAssign() { var items = new ObservableCollection { new { Name = "John" }, "Paul", "Ringo" }; var bindingContext = new { Items = items }; var picker = new Picker { ItemDisplayBinding = new Binding("Name"), BindingContext = bindingContext }; picker.SetBinding(Picker.ItemsSourceProperty, "Items"); Assert.AreEqual(3, picker.Items.Count); items = new ObservableCollection { "Peach", "Orange" }; picker.BindingContext = new { Items = items }; picker.ItemDisplayBinding = null; Assert.AreEqual(2, picker.Items.Count); Assert.AreEqual("Peach", picker.Items[0]); } [Test] public void TestItemsSourceCollectionChangedRemove() { var items = new ObservableCollection { new { Name = "John" }, new { Name = "Paul" }, new { Name = "Ringo"}, }; var picker = new Picker { ItemDisplayBinding = new Binding("Name"), ItemsSource = items, SelectedIndex = 0 }; Assert.AreEqual(3, picker.Items.Count); Assert.AreEqual("John", picker.Items[0]); items.RemoveAt(1); Assert.AreEqual(2, picker.Items.Count); Assert.AreEqual("Ringo", picker.Items[1]); } [Test] public void TestItemsSourceCollectionOfStrings() { var items = new ObservableCollection { "John", "Paul", "Ringo" }; var picker = new Picker { ItemsSource = items, SelectedIndex = 0 }; Assert.AreEqual(3, picker.Items.Count); Assert.AreEqual("John", picker.Items[0]); } [Test] public void TestSelectedItemDefault() { var bindingContext = new PickerTestsBindingContext { Items = new ObservableCollection { new PickerTestsContextFixture("John", "John") } }; var picker = new Picker { BindingContext = bindingContext }; picker.SetBinding(Picker.ItemsSourceProperty, "Items"); picker.SetBinding(Picker.SelectedItemProperty, "SelectedItem"); Assert.AreEqual(1, picker.Items.Count); Assert.AreEqual(-1, picker.SelectedIndex); Assert.AreEqual(bindingContext.SelectedItem, picker.SelectedItem); } [Test] public void ThrowsWhenModifyingItemsIfItemsSourceIsSet() { var picker = new Picker { ItemsSource = new System.Collections.Generic.List () }; Assert.Throws(() => picker.Items.Add("foo")); } [Test] public void TestNestedDisplayMemberPathExpression() { var obj = new PickerTestsContextFixture { Nested = new PickerTestsContextFixture.PickerTestsNestedClass { Nested = "NestedProperty" } }; var picker = new Picker { ItemDisplayBinding = new Binding("Nested.Nested"), ItemsSource = new ObservableCollection { obj }, SelectedIndex = 0 }; Assert.AreEqual("NestedProperty", picker.Items[0]); } [Test] public void TestItemsSourceEnums() { var picker = new Picker { ItemsSource = new ObservableCollection { TextAlignment.Start, TextAlignment.Center, TextAlignment.End }, SelectedIndex = 0 }; Assert.AreEqual("Start", picker.Items[0]); } [Test] public void TestSelectedItemSet() { var obj = new PickerTestsContextFixture("John", "John"); var bindingContext = new PickerTestsBindingContext { Items = new ObservableCollection { obj }, SelectedItem = obj }; var picker = new Picker { BindingContext = bindingContext, ItemDisplayBinding = new Binding("DisplayName"), }; picker.SetBinding(Picker.ItemsSourceProperty, "Items"); picker.SetBinding(Picker.SelectedItemProperty, "SelectedItem"); Assert.AreEqual(1, picker.Items.Count); Assert.AreEqual(0, picker.SelectedIndex); Assert.AreEqual(obj, picker.SelectedItem); } [Test] public void TestSelectedItemChangeSelectedIndex() { var obj = new PickerTestsContextFixture("John", "John"); var bindingContext = new PickerTestsBindingContext { Items = new ObservableCollection { obj }, }; var picker = new Picker { BindingContext = bindingContext, ItemDisplayBinding = new Binding("DisplayName"), }; picker.SetBinding(Picker.ItemsSourceProperty, "Items"); picker.SetBinding(Picker.SelectedItemProperty, "SelectedItem"); Assert.AreEqual(1, picker.Items.Count); Assert.AreEqual(-1, picker.SelectedIndex); Assert.AreEqual(null, picker.SelectedItem); picker.SelectedItem = obj; Assert.AreEqual(0, picker.SelectedIndex); Assert.AreEqual(obj, picker.SelectedItem); picker.SelectedIndex = -1; Assert.AreEqual(-1, picker.SelectedIndex); Assert.AreEqual(null, picker.SelectedItem); } } }