コード例 #1
0
        public void TestCommutative()
        {
            var seq = new KSEQReplicatedList <string>("alice");

            seq.Add("test");
            Assert.AreEqual(1, seq.Count);
            var ident = new Ident(1, new[] { new Segment(0, "bob") });
            var op1   = new KSEQOperation <string>()
            {
                id        = ident,
                op        = KSEQOperationTypes.Insert,
                realTime  = DateTime.UtcNow.Ticks,
                replicaId = "bob",
                value     = "hello"
            };
            var op2 = new KSEQOperation <string>()
            {
                id        = ident,
                op        = KSEQOperationTypes.Remove,
                realTime  = DateTime.UtcNow.Ticks,
                replicaId = "bob"
            };

            seq.Apply(op2);
            Assert.AreEqual(1, seq.Count);
            seq.Apply(op1);
            Assert.AreEqual(1, seq.Count);
        }
コード例 #2
0
        public void TestRandomSingleReplica()
        {
            var random = new Random();
            var alice  = new KSEQReplicatedList <int>("alice");
            var bob    = new KSEQReplicatedList <int>("bob");
            var ops    = Enumerable.Range(0, 1000).Select(i =>
            {
                alice.Insert(random.Next(i), i);
                return(alice.lastOp);
            }).Concat(Enumerable.Range(0, 500)
                      .Select(i =>
            {
                alice.RemoveAt(random.Next(1000 - i));
                return(alice.lastOp);
            })).ToArray();

            Shuffle(ops, random);

            foreach (var op in ops)
            {
                if (op != null)
                {
                    bob.Apply(op.Value);
                }
            }

            Assert.AreEqual(alice.Count, bob.Count);
            Assert.AreEqual(500, alice.Count);
            Assert.IsTrue(alice.ToArray().SequenceEqual(bob.ToArray()));
        }
コード例 #3
0
        public void TestRemoveAtomApply()
        {
            var seq1 = new KSEQReplicatedList <int>("alice");
            var seq2 = new KSEQReplicatedList <int>("bob");

            seq1.Add(42);
            var insertOp = seq1.lastOp;

            seq2.Apply(insertOp);
            Assert.AreEqual(seq1.Count, seq2.Count);
            Assert.AreEqual(seq1.Count, 1);
            Assert.AreEqual(seq1[0], seq2[0]);
            seq2.RemoveAt(0);
            var removeOp = seq2.lastOp;

            seq1.Apply(removeOp);
            Assert.AreEqual(seq1.Count, seq2.Count);
            Assert.AreEqual(seq1.Count, 0);
            Assert.Throws <ArgumentOutOfRangeException>(() =>
            {
                var o = seq1[0];
            });

            Assert.Throws <ArgumentOutOfRangeException>(() =>
            {
                var o = seq2[0];
            });
        }
コード例 #4
0
        public void TestApplyInsertNoExistingAtom()
        {
            var seq1 = new KSEQReplicatedList <string>("alice");
            var seq2 = new KSEQReplicatedList <string>("bob");

            seq1.Add("a");
            var op = seq1.lastOp;

            seq2.Apply(op);
            Assert.AreEqual(1, seq2.Count);
            Assert.AreEqual("a", seq2[0]);
        }
コード例 #5
0
        public void TestRemoveNonexistentAtomSilentlySucceeds()
        {
            var seq1 = new KSEQReplicatedList <string>("alice");
            var seq2 = new KSEQReplicatedList <string>("bob");

            seq1.Add("a");
            seq2.Add("b");
            seq1.RemoveAt(0);
            var op = seq1.lastOp;

            Assert.IsNotNull(op);
            seq2.Apply(op);
            Assert.AreEqual(1, seq2.Count);
            Assert.AreEqual("b", seq2[0]);
        }
コード例 #6
0
        public void TestRandomMultiReplica()
        {
            var random = new Random();
            var alice  = new KSEQReplicatedList <int>("alice");
            var bob    = new KSEQReplicatedList <int>("bob");

            KSEQOperation <int>?[] GenerateOps(KSEQReplicatedList <int> replica)
            {
                return(Enumerable.Range(0, 1000).Select(i =>
                {
                    replica.Insert(random.Next(i), i);
                    return replica.lastOp;
                }).Concat(Enumerable.Range(0, 500)
                          .Select(i =>
                {
                    replica.RemoveAt(random.Next(1000 - i));
                    return replica.lastOp;
                })).ToArray());
            }

            var aliceOps = GenerateOps(alice);
            var bobOps   = GenerateOps(bob);

            Shuffle(aliceOps, random);
            Shuffle(bobOps, random);

            foreach (var op in aliceOps)
            {
                if (op != null)
                {
                    bob.Apply(op.Value);
                }
            }

            foreach (var op in bobOps)
            {
                if (op != null)
                {
                    alice.Apply(op.Value);
                }
            }


            Assert.AreEqual(alice.Count, bob.Count);
            Assert.IsTrue(alice.ToArray().SequenceEqual(bob.ToArray()));
        }
コード例 #7
0
        public void TestRemoveIdentTwice()
        {
            var seq = new KSEQReplicatedList <int>("test");

            seq.Add(42);
            var op1 = seq.lastOp;

            seq.Add(99);
            seq.RemoveAt(0);
            Assert.AreEqual(1, seq.Count);
            var op2 = new KSEQOperation <int>()
            {
                replicaId = "test",
                id        = op1?.id,
                realTime  = DateTime.UtcNow.Ticks,
                op        = KSEQOperationTypes.Remove
            };

            seq.Apply(op2);
            Assert.AreEqual(1, seq.Count);
        }
コード例 #8
0
        public void TestApplyInsertAlreadyExists()
        {
            var seq = new KSEQReplicatedList <int>("test");

            seq.Add(42);
            var op1 = seq.lastOp;

            Assert.AreEqual(1, seq.Count);
            Assert.AreEqual(42, seq[0]);
            var op2 = new KSEQOperation <int>()
            {
                id        = op1?.id,
                op        = KSEQOperationTypes.Insert,
                replicaId = "test",
                realTime  = DateTime.UtcNow.Ticks,
                value     = 99
            };

            seq.Apply(op2);
            Assert.AreEqual(1, seq.Count);
        }