403 строки
9.6 KiB
C#
403 строки
9.6 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using NUnit.Framework;
|
|
|
|
namespace Xamarin.Forms.Core.UnitTests
|
|
{
|
|
[TestFixture]
|
|
public class ObservableWrapperTests : BaseTestFixture
|
|
{
|
|
[Test]
|
|
public void Constructor ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (observableCollection);
|
|
|
|
Assert.IsEmpty (wrapper);
|
|
|
|
Assert.Throws<ArgumentNullException> (() => new ObservableWrapper<View, View> (null));
|
|
}
|
|
|
|
[Test]
|
|
public void IgnoresInternallyAdded ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (observableCollection);
|
|
|
|
var child = new View ();
|
|
|
|
observableCollection.Add (child);
|
|
|
|
Assert.IsEmpty (wrapper);
|
|
}
|
|
|
|
[Test]
|
|
public void TracksExternallyAdded ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (observableCollection);
|
|
|
|
var child = new Button ();
|
|
|
|
wrapper.Add (child);
|
|
|
|
Assert.AreEqual (child, wrapper[0]);
|
|
Assert.AreEqual (child, observableCollection[0]);
|
|
}
|
|
|
|
[Test]
|
|
public void AddWithInternalItemsAlreadyAdded ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (observableCollection);
|
|
|
|
var view = new View ();
|
|
observableCollection.Add (view);
|
|
|
|
var btn = new Button ();
|
|
|
|
wrapper.Add (btn);
|
|
|
|
Assert.AreEqual (btn, wrapper[0]);
|
|
Assert.AreEqual (1, wrapper.Count);
|
|
|
|
Assert.Contains (btn, observableCollection);
|
|
Assert.Contains (view, observableCollection);
|
|
Assert.AreEqual (2, observableCollection.Count);
|
|
}
|
|
|
|
[Test]
|
|
public void IgnoresInternallyAddedSameType ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (observableCollection);
|
|
|
|
var child = new View ();
|
|
|
|
observableCollection.Add (child);
|
|
|
|
Assert.IsEmpty (wrapper);
|
|
}
|
|
|
|
[Test]
|
|
public void TracksExternallyAddedSameType ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (observableCollection);
|
|
|
|
var child = new Button ();
|
|
|
|
wrapper.Add (child);
|
|
|
|
Assert.AreEqual (child, wrapper[0]);
|
|
Assert.AreEqual (child, observableCollection[0]);
|
|
}
|
|
|
|
[Test]
|
|
public void AddWithInternalItemsAlreadyAddedSameType ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (observableCollection);
|
|
|
|
var view = new View ();
|
|
observableCollection.Add (view);
|
|
|
|
var btn = new Button ();
|
|
|
|
wrapper.Add (btn);
|
|
|
|
Assert.AreEqual (btn, wrapper[0]);
|
|
Assert.AreEqual (1, wrapper.Count);
|
|
|
|
Assert.Contains (btn, observableCollection);
|
|
Assert.Contains (view, observableCollection);
|
|
Assert.AreEqual (2, observableCollection.Count);
|
|
}
|
|
|
|
[Test]
|
|
public void CannotRemoveInternalItem ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (observableCollection);
|
|
|
|
var child = new View ();
|
|
|
|
observableCollection.Add (child);
|
|
|
|
Assert.IsEmpty (wrapper);
|
|
|
|
Assert.False (wrapper.Remove (child));
|
|
|
|
Assert.Contains (child, observableCollection);
|
|
}
|
|
|
|
[Test]
|
|
public void ReadOnly ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (observableCollection);
|
|
|
|
Assert.False (wrapper.IsReadOnly);
|
|
|
|
wrapper.Add (new Button ());
|
|
|
|
wrapper.IsReadOnly = true;
|
|
|
|
Assert.True (wrapper.IsReadOnly);
|
|
|
|
Assert.Throws<NotSupportedException> (() => wrapper.Remove (wrapper[0]));
|
|
Assert.Throws<NotSupportedException> (() => wrapper.Add (new Button ()));
|
|
Assert.Throws<NotSupportedException> (() => wrapper.RemoveAt (0));
|
|
Assert.Throws<NotSupportedException> (() => wrapper.Insert (0, new Button ()));
|
|
Assert.Throws<NotSupportedException> (wrapper.Clear);
|
|
}
|
|
|
|
[Test]
|
|
public void Indexer ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (observableCollection);
|
|
|
|
wrapper.Add (new Button ());
|
|
|
|
var newButton = new Button ();
|
|
|
|
wrapper[0] = newButton;
|
|
|
|
Assert.AreEqual (newButton, wrapper[0]);
|
|
}
|
|
|
|
[Test]
|
|
public void IndexerSameType ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (observableCollection);
|
|
|
|
wrapper.Add (new Button ());
|
|
|
|
var newButton = new Button ();
|
|
|
|
wrapper[0] = newButton;
|
|
|
|
Assert.AreEqual (newButton, wrapper[0]);
|
|
}
|
|
|
|
[Test]
|
|
public void CopyTo ()
|
|
{
|
|
var observableCollection = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (observableCollection);
|
|
|
|
var child1 = new Button ();
|
|
var child2 = new Button ();
|
|
var child3 = new Button ();
|
|
var child4 = new Button ();
|
|
var child5 = new Button ();
|
|
|
|
observableCollection.Add (new Stepper ());
|
|
wrapper.Add (child1);
|
|
observableCollection.Add (new Button ());
|
|
wrapper.Add (child2);
|
|
wrapper.Add (child3);
|
|
wrapper.Add (child4);
|
|
wrapper.Add (child5);
|
|
observableCollection.Add (new Button ());
|
|
|
|
var target = new View[30];
|
|
wrapper.CopyTo (target, 2);
|
|
|
|
Assert.AreEqual (target[2], child1);
|
|
Assert.AreEqual (target[3], child2);
|
|
Assert.AreEqual (target[4], child3);
|
|
Assert.AreEqual (target[5], child4);
|
|
Assert.AreEqual (target[6], child5);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCSimpleAdd ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (oc);
|
|
|
|
var child = new Button ();
|
|
|
|
Button addedResult = null;
|
|
int addIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
addedResult = args.NewItems[0] as Button;
|
|
addIndex = args.NewStartingIndex;
|
|
};
|
|
|
|
wrapper.Add (child);
|
|
|
|
Assert.AreEqual (0, addIndex);
|
|
Assert.AreEqual (child, addedResult);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCSimpleAddToInner ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, View> (oc);
|
|
|
|
var child = new Button ();
|
|
|
|
Button addedResult = null;
|
|
int addIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
addedResult = args.NewItems[0] as Button;
|
|
addIndex = args.NewStartingIndex;
|
|
};
|
|
|
|
oc.Add (child);
|
|
|
|
Assert.AreEqual (-1, addIndex);
|
|
Assert.AreEqual (null, addedResult);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCComplexAdd ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (oc);
|
|
|
|
oc.Add (new Stepper ());
|
|
|
|
var child = new Button ();
|
|
|
|
Button addedResult = null;
|
|
int addIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
addedResult = args.NewItems[0] as Button;
|
|
addIndex = args.NewStartingIndex;
|
|
};
|
|
|
|
wrapper.Add (child);
|
|
|
|
Assert.AreEqual (0, addIndex);
|
|
Assert.AreEqual (child, addedResult);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCSimpleRemove ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (oc);
|
|
|
|
var child = new Button ();
|
|
wrapper.Add (child);
|
|
|
|
Button removedResult = null;
|
|
int removeIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
removedResult = args.OldItems[0] as Button;
|
|
removeIndex = args.OldStartingIndex;
|
|
};
|
|
|
|
wrapper.Remove (child);
|
|
|
|
Assert.AreEqual (0, removeIndex);
|
|
Assert.AreEqual (child, removedResult);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCSimpleRemoveFromInner ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (oc);
|
|
|
|
var child = new Button ();
|
|
oc.Add (child);
|
|
|
|
Button addedResult = null;
|
|
int addIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
addedResult = args.OldItems[0] as Button;
|
|
addIndex = args.OldStartingIndex;
|
|
};
|
|
|
|
oc.Remove (child);
|
|
|
|
Assert.AreEqual (-1, addIndex);
|
|
Assert.AreEqual (null, addedResult);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCComplexRemove ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (oc);
|
|
|
|
oc.Add (new Stepper ());
|
|
|
|
var child = new Button ();
|
|
wrapper.Add (child);
|
|
|
|
Button removedResult = null;
|
|
int removeIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
removedResult = args.OldItems[0] as Button;
|
|
removeIndex = args.OldStartingIndex;
|
|
};
|
|
|
|
wrapper.Remove (child);
|
|
|
|
Assert.AreEqual (child, removedResult);
|
|
Assert.AreEqual (0, removeIndex);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCComplexRemoveLast ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (oc);
|
|
|
|
oc.Add (new Stepper ());
|
|
|
|
wrapper.Add (new Button ());
|
|
wrapper.Add (new Button ());
|
|
var child = new Button ();
|
|
wrapper.Add (child);
|
|
|
|
Button removedResult = null;
|
|
int removeIndex = -1;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
removedResult = args.OldItems[0] as Button;
|
|
removeIndex = args.OldStartingIndex;
|
|
};
|
|
|
|
wrapper.Remove (child);
|
|
|
|
Assert.AreEqual (child, removedResult);
|
|
Assert.AreEqual (2, removeIndex);
|
|
}
|
|
|
|
[Test]
|
|
public void INCCReplace ()
|
|
{
|
|
var oc = new ObservableCollection<View> ();
|
|
var wrapper = new ObservableWrapper<View, Button> (oc);
|
|
|
|
var child1 = new Button ();
|
|
var child2 = new Button ();
|
|
|
|
wrapper.Add (child1);
|
|
|
|
int index = -1;
|
|
Button oldItem = null;
|
|
Button newItem = null;
|
|
wrapper.CollectionChanged += (sender, args) => {
|
|
index = args.NewStartingIndex;
|
|
oldItem = args.OldItems[0] as Button;
|
|
newItem = args.NewItems[0] as Button;
|
|
};
|
|
|
|
wrapper[0] = child2;
|
|
|
|
Assert.AreEqual (0, index);
|
|
Assert.AreEqual (child1, oldItem);
|
|
Assert.AreEqual (child2, newItem);
|
|
}
|
|
}
|
|
}
|