| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using Avalonia.Collections;
- using Avalonia.Controls.Utils;
- using Xunit;
- namespace Avalonia.Controls.UnitTests.Utils
- {
- public class SelectedItemsSyncTests
- {
- [Fact]
- public void Initial_Items_Are_From_Model()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- Assert.Equal(new[] { "bar", "baz" }, items);
- }
- [Fact]
- public void Selecting_On_Model_Adds_Item()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- target.Model.Select(0);
- Assert.Equal(new[] { "bar", "baz", "foo" }, items);
- }
- [Fact]
- public void Selecting_Duplicate_On_Model_Adds_Item()
- {
- var target = CreateTarget(new[] { "foo", "bar", "baz", "foo", "bar", "baz" });
- var items = target.GetOrCreateItems();
- target.Model.Select(4);
- Assert.Equal(new[] { "bar", "baz", "bar" }, items);
- }
- [Fact]
- public void Deselecting_On_Model_Removes_Item()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- target.Model.Deselect(1);
- Assert.Equal(new[] { "baz" }, items);
- }
- [Fact]
- public void Deselecting_Duplicate_On_Model_Removes_Item()
- {
- var target = CreateTarget(new[] { "foo", "bar", "baz", "foo", "bar", "baz" });
- var items = target.GetOrCreateItems();
- target.Model.Select(4);
- target.Model.Deselect(4);
- Assert.Equal(new[] { "baz", "bar" }, items);
- }
- [Fact]
- public void Reassigning_Model_Resets_Items()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- var newModel = new SelectionModel { Source = target.Model.Source };
- newModel.Select(0);
- newModel.Select(1);
- target.SetModel(newModel);
- Assert.Equal(new[] { "foo", "bar" }, items);
- }
- [Fact]
- public void Reassigning_Model_Tracks_New_Model()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- var newModel = new SelectionModel { Source = target.Model.Source };
- target.SetModel(newModel);
- newModel.Select(0);
- newModel.Select(1);
- Assert.Equal(new[] { "foo", "bar" }, items);
- }
- [Fact]
- public void Adding_To_Items_Selects_On_Model()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- items.Add("foo");
- Assert.Equal(
- new[] { new IndexPath(0), new IndexPath(1), new IndexPath(2) },
- target.Model.SelectedIndices);
- Assert.Equal(new[] { "bar", "baz", "foo" }, items);
- }
- [Fact]
- public void Removing_From_Items_Deselects_On_Model()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- items.Remove("baz");
- Assert.Equal(new[] { new IndexPath(1) }, target.Model.SelectedIndices);
- Assert.Equal(new[] { "bar" }, items);
- }
- [Fact]
- public void Replacing_Item_Updates_Model()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- items[0] = "foo";
- Assert.Equal(new[] { new IndexPath(0), new IndexPath(2) }, target.Model.SelectedIndices);
- Assert.Equal(new[] { "foo", "baz" }, items);
- }
- [Fact]
- public void Clearing_Items_Updates_Model()
- {
- var target = CreateTarget();
- var items = target.GetOrCreateItems();
- items.Clear();
- Assert.Empty(target.Model.SelectedIndices);
- }
- [Fact]
- public void Setting_Items_Updates_Model()
- {
- var target = CreateTarget();
- var oldItems = target.GetOrCreateItems();
- var newItems = new AvaloniaList<string> { "foo", "baz" };
- target.SetItems(newItems);
- Assert.Equal(new[] { new IndexPath(0), new IndexPath(2) }, target.Model.SelectedIndices);
- Assert.Same(newItems, target.GetOrCreateItems());
- Assert.NotSame(oldItems, target.GetOrCreateItems());
- Assert.Equal(new[] { "foo", "baz" }, newItems);
- }
- [Fact]
- public void Setting_Items_Subscribes_To_Model()
- {
- var target = CreateTarget();
- var items = new AvaloniaList<string> { "foo", "baz" };
- target.SetItems(items);
- target.Model.Select(1);
- Assert.Equal(new[] { "foo", "baz", "bar" }, items);
- }
- [Fact]
- public void Setting_Items_To_Null_Creates_Empty_Items()
- {
- var target = CreateTarget();
- var oldItems = target.GetOrCreateItems();
- target.SetItems(null);
- var newItems = Assert.IsType<AvaloniaList<object>>(target.GetOrCreateItems());
- Assert.NotSame(oldItems, newItems);
- }
- [Fact]
- public void Handles_Null_Model_Source()
- {
- var model = new SelectionModel();
- model.Select(1);
- var target = new SelectedItemsSync(model);
- var items = target.GetOrCreateItems();
- Assert.Empty(items);
- model.Select(2);
- model.Source = new[] { "foo", "bar", "baz" };
- Assert.Equal(new[] { "bar", "baz" }, items);
- }
- [Fact]
- public void Does_Not_Accept_Fixed_Size_Items()
- {
- var target = CreateTarget();
- Assert.Throws<NotSupportedException>(() =>
- target.SetItems(new[] { "foo", "bar", "baz" }));
- }
- private static SelectedItemsSync CreateTarget(
- IEnumerable<string> items = null)
- {
- items ??= new[] { "foo", "bar", "baz" };
- var model = new SelectionModel { Source = items };
- model.SelectRange(new IndexPath(1), new IndexPath(2));
- var target = new SelectedItemsSync(model);
- return target;
- }
- }
- }
|