Пример #1
0
        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();
        }
Пример #2
0
        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();
        }
Пример #3
0
        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));
            }
        }
Пример #4
0
        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());
        }
Пример #5
0
        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"));
        }
Пример #6
0
        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");
        }
Пример #7
0
        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");
            }
        }
Пример #8
0
        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();
        }
Пример #9
0
        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();
        }
Пример #10
0
        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"));
        }
Пример #11
0
 internal YMapEvent(YMap map, Transaction transaction, ISet <string> subs)
     : base(map, transaction)
 {
     KeysChanged = subs;
 }