diff options
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/PickerTests.cs')
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/PickerTests.cs | 488 |
1 files changed, 468 insertions, 20 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/PickerTests.cs b/Xamarin.Forms.Core.UnitTests/PickerTests.cs index 859f9025..01431cdd 100644 --- a/Xamarin.Forms.Core.UnitTests/PickerTests.cs +++ b/Xamarin.Forms.Core.UnitTests/PickerTests.cs @@ -1,42 +1,119 @@ using System; - using NUnit.Framework; -using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Globalization; namespace Xamarin.Forms.Core.UnitTests { + internal class ContextFixture + { + public class NestedClass + { + public string Nested { get; set; } + } + + public NestedClass Nested { get; set; } + + public string DisplayName { get; set; } + + public string ComplexName { get; set; } + + public ContextFixture(string displayName, string complexName) + { + DisplayName = displayName; + ComplexName = complexName; + } + + public ContextFixture() + { + } + } + + internal class BindingContext + { + public ObservableCollection<object> Items { get; set; } + + public object SelectedItem { get; set; } + } + + internal class PickerTestValueConverter : IValueConverter + { + public bool ConvertCalled { get; private set; } + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + ConvertCalled = true; + var cf = (ContextFixture)value; + return cf.DisplayName; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } + [TestFixture] public class PickerTests : BaseTestFixture { [Test] public void TestSetSelectedIndexOnNullRows() { - var picker = new Picker (); + var picker = new Picker(); - Assert.IsEmpty (picker.Items); - Assert.AreEqual (-1, picker.SelectedIndex); + Assert.IsEmpty(picker.Items); + Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = 2; - Assert.AreEqual (-1, picker.SelectedIndex); + 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 TestSelectedIndexInRange () + public void TestSelectedIndexInRangeDefaultSelectedIndex() { - var picker = new Picker { Items = { "John", "Paul", "George", "Ringo" } }; + 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); + Assert.AreEqual(2, picker.SelectedIndex); picker.SelectedIndex = 42; - Assert.AreEqual (3, picker.SelectedIndex); + Assert.AreEqual(3, picker.SelectedIndex); picker.SelectedIndex = -1; - Assert.AreEqual (-1, picker.SelectedIndex); + Assert.AreEqual(-1, picker.SelectedIndex); picker.SelectedIndex = -42; - Assert.AreEqual (-1, picker.SelectedIndex); + Assert.AreEqual(-1, picker.SelectedIndex); } [Test] @@ -44,16 +121,387 @@ namespace Xamarin.Forms.Core.UnitTests { var picker = new Picker { Items = { "John", "Paul", "George", "Ringo" }, SelectedIndex = 3 }; - Assert.AreEqual (3, picker.SelectedIndex); + 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<string> + { + "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<string>(); + var picker = new Picker + { + ItemsSource = list + }; + Assert.AreEqual(0, picker.Items.Count); + var newList = new ObservableCollection<string>(); + picker.ItemsSource = newList; + list.Add("item"); + Assert.AreEqual(0, picker.Items.Count); + } + + [Test] + public void TestEmptyCollectionResetItems() + { + var list = new ObservableCollection<string> + { + "John", + "George", + "Ringo" + }; + var picker = new Picker + { + ItemsSource = list + }; + Assert.AreEqual(3, picker.Items.Count); + picker.ItemsSource = new ObservableCollection<string>(); + Assert.AreEqual(0, picker.Items.Count); + } + + [Test] + public void TestDisplayFunc() + { + Func<object, string> customDisplayFunc = o => + { + var f = (ContextFixture)o; + return $"{f.DisplayName} ({f.ComplexName})"; + }; + var obj = new ContextFixture("Monkey", "Complex Monkey"); + var picker = new Picker + { + DisplayMemberPath = "Name", + DisplayFunc = customDisplayFunc, + ItemsSource = new ObservableCollection<object> + { + obj + }, + SelectedIndex = 1 + }; + Assert.AreEqual("Monkey (Complex Monkey)", picker.Items[0]); + } + + [Test] + public void TestSetItemsSourceProperty() + { + var items = new ObservableCollection<object> + { + new { Name = "John" }, + "Paul", + "Ringo", + 0, + new DateTime(1970, 1, 1), + }; + var picker = new Picker + { + DisplayMemberPath = "Name", + ItemsSource = items + }; + Assert.AreEqual(5, picker.Items.Count); + Assert.AreEqual("John", picker.Items[0]); + Assert.AreEqual("0", picker.Items[3]); + } + + [Test] + public void TestDisplayConverter() + { + var obj = new ContextFixture("John", "John Doe"); + var converter = new PickerTestValueConverter(); + var picker = new Picker + { + DisplayConverter = converter, + ItemsSource = new ObservableCollection<object> + { + obj + } + }; + Assert.IsTrue(converter.ConvertCalled); + Assert.AreEqual("John", picker.Items[0]); + } + + [Test] + public void TestDisplayMemberPathShouldThrowArgumentExceptionInvalidPath() + { + var obj = new ContextFixture("Monkey", "Complex Monkey"); + Func<Picker> picker = () => new Picker + { + DisplayMemberPath = "Name", + ItemsSource = new ObservableCollection<object> + { + obj + }, + SelectedIndex = 1 + }; + Assert.Throws<ArgumentException>(() => picker()); + } + + [Test] + public void TestItemsSourceCollectionChangedAppend() + { + var items = new ObservableCollection<object> + { + new { Name = "John" }, + "Paul", + "Ringo" + }; + var picker = new Picker + { + DisplayMemberPath = "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<object> + { + new { Name = "John" }, + "Paul", + "Ringo" + }; + var picker = new Picker + { + DisplayMemberPath = "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<object> + { + new { Name = "John" }, + "Paul", + "Ringo" + }; + var picker = new Picker + { + DisplayMemberPath = "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<object> + { + new { Name = "John" }, + "Paul", + "Ringo" + }; + var bindingContext = new { Items = items }; + var picker = new Picker + { + DisplayMemberPath = "Name", + BindingContext = bindingContext + }; + picker.SetBinding(Picker.ItemsSourceProperty, "Items"); + Assert.AreEqual(3, picker.Items.Count); + items = new ObservableCollection<object> + { + "Peach", + "Orange" + }; + picker.BindingContext = new { Items = items }; + Assert.AreEqual(2, picker.Items.Count); + Assert.AreEqual("Peach", picker.Items[0]); + } + + [Test] + public void TestItemsSourceCollectionChangedRemove() + { + var items = new ObservableCollection<object> + { + new { Name = "John" }, + "Paul", + "Ringo" + }; + var picker = new Picker + { + DisplayMemberPath = "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<string> + { + "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 BindingContext + { + Items = new ObservableCollection<object> + { + new ContextFixture("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); + } - picker.Items.RemoveAt (3); - picker.Items.RemoveAt (2); + [Test] + public void TestNestedDisplayMemberPathExpression() + { + var obj = new ContextFixture + { + Nested = new ContextFixture.NestedClass + { + Nested = "NestedProperty" + } + }; + var picker = new Picker + { + DisplayMemberPath = "Nested.Nested", + ItemsSource = new ObservableCollection<object> + { + obj + }, + SelectedIndex = 0 + }; + Assert.AreEqual("NestedProperty", picker.Items[0]); + } + [Test] + public void TestItemsSourceEnums() + { + var picker = new Picker + { + ItemsSource = new ObservableCollection<TextAlignment> + { + TextAlignment.Start, + TextAlignment.Center, + TextAlignment.End + }, + SelectedIndex = 0 + }; + Assert.AreEqual("Start", picker.Items[0]); + } - Assert.AreEqual (1, picker.SelectedIndex); + [Test] + public void TestSelectedItemSet() + { + var obj = new ContextFixture("John", "John"); + var bindingContext = new BindingContext + { + Items = new ObservableCollection<object> + { + obj + }, + SelectedItem = obj + }; + var picker = new Picker + { + BindingContext = bindingContext, + DisplayMemberPath = "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); + } - picker.Items.Clear (); - Assert.AreEqual (-1, picker.SelectedIndex); + [Test] + public void TestSelectedItemChangeSelectedIndex() + { + var obj = new ContextFixture("John", "John"); + var bindingContext = new BindingContext + { + Items = new ObservableCollection<object> + { + obj + }, + }; + var picker = new Picker + { + BindingContext = bindingContext, + DisplayMemberPath = "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); } - } -} + } +}
\ No newline at end of file |