public void Synchronizing_Test()
        {
            var playerMock = new PlayerMock();

            playerMock.Level = 5;
            var sourceSynchronizerRoot = new SourceSynchronizerRoot(playerMock);
            var targetSynchronizerRoot = new TargetSynchronizerRoot <PlayerMock>(sourceSynchronizerRoot.WriteFullAndDispose());

            Assert.Equal(5, targetSynchronizerRoot.Reference.Level);
        }
        public void Clear_ShouldThrowNotImplemented()
        {
            var sourceDictionary       = new ObservableDictionary <int, string>();
            var SourceSynchronizerRoot = new SourceSynchronizerRoot(sourceDictionary);

            byte[] data = SourceSynchronizerRoot.WriteFullAndDispose();
            var    TargetSynchronizerRoot = new TargetSynchronizerRoot <ObservableDictionary <int, string> >(data);

            Assert.Throws <NotSupportedException>(() => { TargetSynchronizerRoot.Reference.Clear(); });
        }
Example #3
0
        public void Initializing_NonConstructorPropertyWithoutSetter_ThrowsSetterNotFoundException()
        {
            var attributeMarkedMethodMockSource = new NotifyPropertyChangedGetterOnlyMock();

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(attributeMarkedMethodMockSource);

            Assert.Throws <SetterNotAvailableException>(() =>
            {
                var TargetSynchronizerRoot = new TargetSynchronizerRoot(SourceSynchronizerRoot.WriteFullAndDispose());
            });
        }
        public void Synchronizing_Array_Test()
        {
            int[,,] expected = new int[3, 3, 5]
            {
                { { 1, 2, 6, 4, 5 }, { 2, 2, 3, 4, 5 }, { 3, 2, 3, 4, 5 } },
                { { 1, 2, 3, 4, 5 }, { 2, 2, 3, 4, 5 }, { 3, 2, 3, 4, 5 } },
                { { 1, 2, 3, 4, 5 }, { 99, 2, 3, 4, 5 }, { 3, 2, 3, 99, 3 } }
            };
            var SourceSynchronizerRoot = new SourceSynchronizerRoot(expected);
            var TargetSynchronizerRoot = new TargetSynchronizerRoot <int[, , ]>(SourceSynchronizerRoot.WriteFullAndDispose());

            Assert.Equal(expected, TargetSynchronizerRoot.Reference);
        }
        public void Synchronizing_RollsBackTargetChangesPriorToSourceTick()
        {
            var sourceDictionary = new ObservableDictionary <int, string>();

            var sourceSynchronizerRoot = new SourceSynchronizerRoot(sourceDictionary);

            var targetSynchronizerRoot = new TargetSynchronizerRoot <ObservableDictionary <int, string> >(
                sourceSynchronizerRoot.WriteFullAndDispose());

            ObservableDictionary <int, string> targetDictionary = targetSynchronizerRoot.Reference;

            targetDictionary.Add(1, "2");

            targetSynchronizerRoot.Clock.OwnTick = TimeSpan.FromMilliseconds(5);

            //Set tick older than client tick
            byte[] changes = sourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.FromMilliseconds(5));
            targetSynchronizerRoot.Read(changes);

            // Recently added item should be rolled back
            Assert.Empty(targetDictionary);
        }
        public void Synchronizing_RollsBackTargetChangesPriorToSourceTick()
        {
            var source = new ObservableHashSet <string>();
            var SourceSynchronizerRoot = new SourceSynchronizerRoot(source);

            byte[] writeFullAndDispose    = SourceSynchronizerRoot.WriteFullAndDispose();
            var    TargetSynchronizerRoot = new TargetSynchronizerRoot <ObservableHashSet <string> >(
                writeFullAndDispose);

            ObservableHashSet <string> target = TargetSynchronizerRoot.Reference;

            target.Add("2");

            TargetSynchronizerRoot.Clock.OwnTick = TimeSpan.FromMilliseconds(5);

            //Set tick older than client tick
            byte[] changes = SourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.FromMilliseconds(6));
            TargetSynchronizerRoot.Read(changes);

            // Recently added item should be rolled back
            Assert.Empty(target);
        }
        public void AddingItems_AfterClear_ShouldSynchronizeItems()
        {
            var hashSetTestObject = new NotifyPropertyChangedHashSetTestObject {
                RandomIntProperty = 5
            };

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(hashSetTestObject);

            hashSetTestObject.Players.Clear();

            var TargetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedHashSetTestObject>(SourceSynchronizerRoot.WriteFullAndDispose());

            hashSetTestObject.Players.Add(new NotifyPropertyChangedTestPlayer {
                Name = "player1", Health = 100, Level = 30
            });
            hashSetTestObject.Players.Add(new NotifyPropertyChangedTestPlayer {
                Name = "player2", Health = 44, Level = 1337
            });

            TargetSynchronizerRoot.Read(SourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.FromMilliseconds(10)));

            NotifyPropertyChangedHashSetTestObject targetGameWorld = TargetSynchronizerRoot.Reference;

            AssertExtension.AssertCloneEqual(hashSetTestObject, targetGameWorld);
        }
Example #8
0
        public void SynchronizingString_ThatIsNotReferenceEqual_Test()
        {
            var sourceGameWorld = new NotifyPropertyChangedTestGameWorld {
                RandomIntProperty = 5
            };

            // Concatenating 1 to make sure the string is a new object
            sourceGameWorld.Players.Add("player1", new NotifyPropertyChangedTestPlayer {
                Name = "sameString" + 1, Health = 100, Level = 30
            });

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(sourceGameWorld);

            var TargetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedTestGameWorld>(SourceSynchronizerRoot.WriteFullAndDispose());

            sourceGameWorld.Players.Add("player2", new NotifyPropertyChangedTestPlayer {
                Name = "sameString" + 1, Health = 44, Level = 1337
            });
            SynchronizationPacket writeChangesAndDispose = SourceSynchronizerRoot.WriteChangesAndDispose();

            TargetSynchronizerRoot.Read(writeChangesAndDispose.SetTick(TimeSpan.Zero));

            NotifyPropertyChangedTestGameWorld targetGameWorld = TargetSynchronizerRoot.Reference;

            AssertExtension.AssertCloneEqual(sourceGameWorld, targetGameWorld);
        }
        public void Synchronizing_GetterManual_Resolves()
        {
            var sourceConstructorMock = new NotifyPropertyChangedManualGetterOnlyMock();

            var sourceSynchronizerRoot = new SourceSynchronizerRoot(sourceConstructorMock);

            Assert.Equal(5, sourceConstructorMock.SomeValue);

            sourceConstructorMock.SomeValue = 6;

            var TargetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedManualGetterOnlyMock>(sourceSynchronizerRoot.WriteFullAndDispose());

            NotifyPropertyChangedManualGetterOnlyMock targetConstructorMock = TargetSynchronizerRoot.Reference;

            Assert.Equal(6, targetConstructorMock.SomeValue);
        }
        public void Synchronizing_PropertiesUsedAsConstructorParameters_ShouldNotSynchronizeAfterConstructor()
        {
            var sourceConstructorMock = new NotifyPropertyChangedSynchronizeConstructorMock();

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(sourceConstructorMock);

            var TargetSynchronizerRoot =
                new TargetSynchronizerRoot <NotifyPropertyChangedSynchronizeConstructorMock>(SourceSynchronizerRoot.WriteFullAndDispose());
            NotifyPropertyChangedSynchronizeConstructorMock targetConstructorMock = TargetSynchronizerRoot.Reference;

            Assert.Equal(1, targetConstructorMock.DictionarySetCount);
        }
        public void Synchronizing_MarkedParameterizedConstructor_InvokesConstructorWithParameters()
        {
            var sourceConstructorMock = new NotifyPropertyChangedSynchronizeConstructorMock();

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(sourceConstructorMock);

            var TargetSynchronizerRoot =
                new TargetSynchronizerRoot <NotifyPropertyChangedSynchronizeConstructorMock>(SourceSynchronizerRoot.WriteFullAndDispose());

            TargetSynchronizerRoot.Read(SourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.Zero));

            NotifyPropertyChangedSynchronizeConstructorMock targetConstructorMock = TargetSynchronizerRoot.Reference;

            Assert.True(targetConstructorMock.SyncConstructorCalled);
        }
        public void Synchronizing_PropertyWithoutSetterThroughConstructor_Synchronizes()
        {
            var getterOnlyConstructorMockSource = new NotifyPropertyChangedGetterOnlyConstructorMock(5);
            var SourceSynchronizerRoot          = new SourceSynchronizerRoot(getterOnlyConstructorMockSource);
            var TargetSynchronizerRoot          = new TargetSynchronizerRoot <NotifyPropertyChangedGetterOnlyConstructorMock>(SourceSynchronizerRoot.WriteFullAndDispose());
            NotifyPropertyChangedGetterOnlyConstructorMock notifyPropertyChangedGetterOnlyConstructorMockRoot = TargetSynchronizerRoot.Reference;

            Assert.Equal(getterOnlyConstructorMockSource.IntProperty, notifyPropertyChangedGetterOnlyConstructorMockRoot.IntProperty);
        }
        public void Changing_ConstructorProperty_Synchronizes()
        {
            var getterOnlyConstructorMockSource = new ConstructedPropertyChangeSynchronizationMock(5f);

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(getterOnlyConstructorMockSource);
            var TargetSynchronizerRoot = new TargetSynchronizerRoot <ConstructedPropertyChangeSynchronizationMock>(SourceSynchronizerRoot.WriteFullAndDispose());

            ConstructedPropertyChangeSynchronizationMock getterOnlyConstructorMockRoot = TargetSynchronizerRoot.Reference;

            Assert.Equal(getterOnlyConstructorMockSource.Accessor, getterOnlyConstructorMockRoot.Accessor);

            TargetSynchronizerRoot.Read(SourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.Zero));

            Assert.Equal(getterOnlyConstructorMockSource.Accessor, getterOnlyConstructorMockRoot.Accessor);
        }
        public void Constructing_DependencyConstructorParameter_ResolvesFromDependencyResolver()
        {
            var dependencyConstructorMock = new NotifyPropertyChangedConstructedDependencyMock();

            var SourceSynchronizerRoot = new SourceSynchronizerRoot(dependencyConstructorMock);

            var TargetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedConstructedDependencyMock>(SourceSynchronizerRoot.WriteFullAndDispose(), serviceProvider: new TestServiceProvider());

            Assert.NotNull(TargetSynchronizerRoot.Reference.SomeService);
        }
        public void SynchronizingFull_TargetObjectEqualsSource()
        {
            var sourceGameWorld = new NotifyPropertyChangedTestGameWorld {
                RandomIntProperty = 5
            };

            sourceGameWorld.Players.Add("player1", new NotifyPropertyChangedTestPlayer {
                Name = "player1", Health = 100, Level = 30
            });
            sourceGameWorld.Players.Add("player2", new NotifyPropertyChangedTestPlayer {
                Name = "player2", Health = 44, Level = 1337
            });

            var sourceSynchronizerRoot = new SourceSynchronizerRoot(sourceGameWorld);

            var targetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedTestGameWorld>(sourceSynchronizerRoot.WriteFullAndDispose());
            NotifyPropertyChangedTestGameWorld targetGameWorld = targetSynchronizerRoot.Reference;

            AssertExtension.AssertCloneEqual(sourceGameWorld, targetGameWorld);
        }
        public void Synchronizing_PrivateField_Test()
        {
            var privateMock            = new PrivateFieldMock(5);
            var SourceSynchronizerRoot = new SourceSynchronizerRoot(privateMock);
            var TargetSynchronizerRoot = new TargetSynchronizerRoot <PrivateFieldMock>(SourceSynchronizerRoot.WriteFullAndDispose());

            Assert.Equal(5, TargetSynchronizerRoot.Reference.GetTestValue);
        }
        public void AddingItems_AfterClear_ShouldSynchronizeItems()
        {
            var sourceGameWorld = new NotifyPropertyChangedTestGameWorld {
                RandomIntProperty = 5
            };

            var sourceSynchronizerRoot = new SourceSynchronizerRoot(sourceGameWorld);

            sourceGameWorld.Players.Clear();

            var targetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedTestGameWorld>(sourceSynchronizerRoot.WriteFullAndDispose());

            sourceGameWorld.Players.Add("player1", new NotifyPropertyChangedTestPlayer {
                Name = "player1", Health = 100, Level = 30
            });
            sourceGameWorld.Players.Add("player2", new NotifyPropertyChangedTestPlayer {
                Name = "player2", Health = 44, Level = 1337
            });

            targetSynchronizerRoot.Read(sourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.FromMilliseconds(10)));

            NotifyPropertyChangedTestGameWorld targetGameWorld = targetSynchronizerRoot.Reference;

            AssertExtension.AssertCloneEqual(sourceGameWorld, targetGameWorld);
        }
Example #18
0
        public void Synchronizing_ValueWithLowerTickThanDirtyTick_ShouldNotBeSet()
        {
            var sourceObject = new NotifyPropertyChangedLatestTickMock {
                Value = 5
            };
            var SourceSynchronizerRoot = new SourceSynchronizerRoot(sourceObject);

            var TargetSynchronizerRoot = new TargetSynchronizerRoot <NotifyPropertyChangedLatestTickMock>(SourceSynchronizerRoot.WriteFullAndDispose());
            var targetObject           = TargetSynchronizerRoot.Reference;

            Assert.Equal(5, targetObject.Value);

            TargetSynchronizerRoot.Clock.OwnTick = TimeSpan.FromMilliseconds(10);
            targetObject.Value = 7;
            sourceObject.Value = 6;

            TargetSynchronizerRoot.Read(SourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.FromMilliseconds(9)));

            Assert.Equal(7, targetObject.Value);

            TargetSynchronizerRoot.Read(SourceSynchronizerRoot.WriteChangesAndDispose().SetTick(TimeSpan.FromMilliseconds(11)));

            Assert.Equal(6, targetObject.Value);
        }