public void TestObserveDeepProperties() { Init(users: 4); var map0 = Maps[Users[0]]; var map1 = Maps[Users[1]]; var map2 = Maps[Users[2]]; var map3 = Maps[Users[3]]; var _map1 = new YMap(); map1.Set("map", _map1); int calls = 0; ID? dmapId = null; map1.DeepEventHandler += (s, e) => { foreach (var evt in e.Events) { calls++; Assert.IsTrue(evt.Changes.Keys.ContainsKey("deepmap")); Assert.AreEqual(1, evt.Path.Count); Assert.AreEqual("map", evt.Path.First()); dmapId = ((evt.Target as YMap).Get("deepmap") as YMap)._item?.Id; } }; Connector.FlushAllMessages(); var _map3 = map3.Get("map") as YMap; _map3.Set("deepmap", new YMap()); Connector.FlushAllMessages(); var _map2 = map2.Get("map") as YMap; _map2.Set("deepmap", new YMap()); Connector.FlushAllMessages(); var dmap1 = _map1.Get("deepmap") as YMap; var dmap2 = _map2.Get("deepmap") as YMap; var dmap3 = _map3.Get("deepmap") as YMap; Assert.IsTrue(calls > 0); Assert.IsTrue(ID.Equals(dmap1._item?.Id, dmap2._item?.Id)); Assert.IsTrue(ID.Equals(dmap1._item?.Id, dmap3._item?.Id)); Assert.IsTrue(ID.Equals(dmap1._item?.Id, dmapId)); CompareUsers(); }
public void TestYMapSetsYMap() { Init(users: 2); var map0 = Maps[Users[0]]; var map = new YMap(); map0.Set("map", map); Assert.AreEqual(map, map0.Get("map")); map.Set("one", 1); Assert.AreEqual(1, map.Get("one")); CompareUsers(); }
protected void CompareYMap(YMap map1, YMap map2) { if (ReferenceEquals(map1, map2)) { return; } Assert.IsTrue((map1 == null) == (map2 == null)); Assert.AreEqual(map1.Count, map2.Count); foreach (var key1 in map1.Keys()) { Assert.IsTrue(map2.ContainsKey(key1)); CompareObjects(map1.Get(key1), map2.Get(key1)); } }
public void TestUndoDeleteFilter() { Init(users: 3); var array0 = Arrays[Users[0]]; var undoManager = new UndoManager(new[] { array0 }, 500, it => !(it is Item item) || (item.Content is ContentType ct && ct.Type._map.Count == 0), new HashSet <object> { null }); var map0 = new YMap(); map0.Set("hi", 1); var map1 = new YMap(); array0.Insert(0, new[] { map0, map1 }); undoManager.Undo(); Assert.AreEqual(1, array0.Length); Assert.AreEqual(1, (array0.Get(0) as YMap).Keys().Count()); }
public void TestUndoMap() { Init(users: 3); var map0 = Maps[Users[0]]; var map1 = Maps[Users[1]]; var undoManager = new UndoManager(map0); map0.Set("a", 1); undoManager.Undo(); Assert.IsFalse(map0.ContainsKey("a")); undoManager.Redo(); Assert.AreEqual(1, map0.Get("a")); // Test subtypes and whether it can restore the whole type. var subType = new YMap(); map0.Set("a", subType); subType.Set("x", 42); Assert.AreEqual(42, (map0.Get("a") as YMap)?.Get("x")); undoManager.Undo(); Assert.AreEqual(1, map0.Get("a")); undoManager.Redo(); Assert.AreEqual(42, (map0.Get("a") as YMap)?.Get("x")); Connector.SyncAll(); // If content is overwritten by another user, undo operations should be skipped. map1.Set("a", 44); Connector.SyncAll(); undoManager.Undo(); Assert.AreEqual(44, map0.Get("a")); undoManager.Redo(); Assert.AreEqual(44, map0.Get("a")); // Test setting value multiple times. map0.Set("b", "initial"); undoManager.StopCapturing(); map0.Set("b", "val1"); map0.Set("b", "val2"); undoManager.StopCapturing(); undoManager.Undo(); Assert.AreEqual("initial", map0.Get("b")); }
public void TestNewChildDoesNotEmitEventInTransaction() { Init(users: 2); var array0 = Arrays[Users[0]]; var fired = false; Users[0].Transact(tr => { var newMap = new YMap(); newMap.EventHandler += (s, e) => { fired = true; }; array0.Insert(0, new object[] { newMap }); newMap.Set("tst", 42); }); Assert.IsFalse(fired, "Event does not trigger"); }
internal static ContentType Read(IUpdateDecoder decoder) { var typeRef = decoder.ReadTypeRef(); switch (typeRef) { case YArray.YArrayRefId: var arr = YArray.Read(decoder); return(new ContentType(arr)); case YMap.YMapRefId: var map = YMap.Read(decoder); return(new ContentType(map)); case YText.YTextRefId: var text = YText.Read(decoder); return(new ContentType(text)); default: throw new NotImplementedException($"Type {typeRef} not implemented"); } }
public void TestIteratingArrayContainingTypes() { var y = new YDoc(); var arr = y.GetArray("arr"); const int numItems = 10; for (int i = 0; i < numItems; i++) { var map = new YMap(); map.Set("value", i); arr.Add(new[] { map }); } int cnt = 0; foreach (var item in arr) { Assert.AreEqual(cnt++, (item as YMap).Get("value")); } y.Destroy(); }
public void TestMapHavingIterableAsConstructorParamTests() { Init(users: 1); var map0 = Maps[Users[0]]; var m1 = new YMap(new Dictionary <string, object> { { "number", 1 }, { "string", "hello" } }); map0.Set("m1", m1); Assert.AreEqual(1, m1.Get("number")); Assert.AreEqual("hello", m1.Get("string")); var obj = new object[] { 1 }; var m2 = new YMap(new Dictionary <string, object> { { "object", obj }, { "boolean", true } }); map0.Set("m2", m2); Assert.AreEqual(obj, m2.Get("object")); Assert.AreEqual(true, m2.Get("boolean")); CompareUsers(); }
public void TestUndoArray() { Init(users: 3); var array0 = Arrays[Users[0]]; var array1 = Arrays[Users[1]]; var undoManager = new UndoManager(array0); array0.Insert(0, new object[] { 1, 2, 3 }); array1.Insert(9, new object[] { 4, 5, 6 }); Connector.SyncAll(); CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, (ICollection)array0.ToArray()); undoManager.Undo(); CollectionAssert.AreEqual(new[] { 4, 5, 6 }, (ICollection)array0.ToArray()); undoManager.Redo(); CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, (ICollection)array0.ToArray()); Connector.SyncAll(); // User1 deletes [1] array1.Delete(0, 1); Connector.SyncAll(); undoManager.Undo(); CollectionAssert.AreEqual(new[] { 4, 5, 6 }, (ICollection)array0.ToArray()); undoManager.Redo(); CollectionAssert.AreEqual(new[] { 2, 3, 4, 5, 6 }, (ICollection)array0.ToArray()); array0.Delete(0, 5); // Test nested structure. var ymap = new YMap(); array0.Insert(0, new[] { ymap }); Assert.AreEqual(0, (array0.Get(0) as YMap)?.Count); undoManager.StopCapturing(); ymap.Set("a", 1); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Count); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Get("a")); undoManager.Undo(); Assert.AreEqual(0, (array0.Get(0) as YMap)?.Count); undoManager.Undo(); CollectionAssert.AreEqual(new[] { 2, 3, 4, 5, 6 }, (ICollection)array0.ToArray()); undoManager.Redo(); Assert.AreEqual(0, (array0.Get(0) as YMap)?.Count); undoManager.Redo(); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Count); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Get("a")); Connector.SyncAll(); (array1.Get(0) as YMap).Set("b", 2); Connector.SyncAll(); Assert.AreEqual(2, (array0.Get(0) as YMap)?.Count); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Get("a")); Assert.AreEqual(2, (array0.Get(0) as YMap)?.Get("b")); undoManager.Undo(); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Count); Assert.AreEqual(2, (array0.Get(0) as YMap)?.Get("b")); undoManager.Undo(); CollectionAssert.AreEqual(new[] { 2, 3, 4, 5, 6 }, (ICollection)array0.ToArray()); undoManager.Redo(); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Count); Assert.AreEqual(2, (array0.Get(0) as YMap)?.Get("b")); undoManager.Redo(); Assert.AreEqual(2, (array0.Get(0) as YMap)?.Count); Assert.AreEqual(1, (array0.Get(0) as YMap)?.Get("a")); Assert.AreEqual(2, (array0.Get(0) as YMap)?.Get("b")); }
internal YMapEvent(YMap map, Transaction transaction, ISet <string> subs) : base(map, transaction) { KeysChanged = subs; }