Ejemplo n.º 1
0
 public InterpolationState(SynchronizableTargetMember synchronizableTargetMember, TargetSynchronizerRoot targetSynchronizerRoot,
                           ISerializer serializer)
 {
     _synchronizableTargetMember = synchronizableTargetMember;
     _targetSynchronizerRoot     = targetSynchronizerRoot;
     _serializer = serializer;
 }
        public TargetSynchronizer Synchronize(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type referenceType)
        {
            Type[] genericArgs = referenceType.GetGenericArguments();
            Type   observableDictionarySyncSourceObjectType = typeof(ObservableDictionaryTargetSynchronizer <,>).MakeGenericType(genericArgs);

            return((TargetSynchronizer)Activator.CreateInstance(observableDictionarySyncSourceObjectType, targetSynchronizerRoot, referenceId, referenceType));
        }
        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);
        }
Ejemplo n.º 4
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 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);
        }
Ejemplo n.º 6
0
 public TakeSynchronizedOnEachUpdateState(SynchronizableTargetMember synchronizableTargetMember,
                                          TargetSynchronizerRoot targetSynchronizerRoot)
 {
     _synchronizableTargetMember      = synchronizableTargetMember;
     _targetSynchronizerRoot          = targetSynchronizerRoot;
     _targetSynchronizerRoot.EndRead += TargetSynchronizerRootOnEndRead;
 }
Ejemplo n.º 7
0
        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 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);
        }
Ejemplo n.º 9
0
        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(); });
        }
        public ObservableHashSetTargetSynchronizer(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type referenceType) : base(referenceId)
        {
            _targetSynchronizerRoot = targetSynchronizerRoot;
            _clock = _targetSynchronizerRoot.Clock;

            base.Reference = Activator.CreateInstance(referenceType);
            BaseObject.CollectionChanged += OnCollectionChanged;

            _itemSerializer = targetSynchronizerRoot.Settings.Serializers.FindSerializerByType(typeof(TItem));
        }
Ejemplo n.º 12
0
 public SynchronizableTargetMember(
     object declaringReference,
     SynchronizableMember synchronizableMember,
     TargetSynchronizerRoot targetSynchronizerRoot)
 {
     _synchronizableMember   = synchronizableMember;
     _targetSynchronizerRoot = targetSynchronizerRoot;
     _declaringReference     = declaringReference;
     _state = ManualState.Instance;
 }
        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);
        }
Ejemplo n.º 14
0
        private static void RunMonoSyncTest(int entityCount)
        {
            Console.WriteLine();
            Console.WriteLine($"Benchmark with {entityCount} entities");

            // Initialization
            Console.Write("Initializing: ");
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            var world          = new MonoSyncWorld();
            var syncSourceRoot = new SourceSynchronizerRoot(world);

            using (world.Entities.BeginMassUpdate())
            {
                for (int i = 0; i < entityCount; i++)
                {
                    world.Entities.Add(i, new Entity());
                }
            }
            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds + "MS");
            stopwatch.Reset();

            // Full write
            Console.Write("Full write: ");
            stopwatch.Start();


            WriteSession fullWriteSession = syncSourceRoot.BeginWrite();
            var          syncTargetRoot   = new TargetSynchronizerRoot <MonoSyncWorld>(fullWriteSession.WriteFull());

            fullWriteSession.Dispose();

            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds + "MS");
            stopwatch.Reset();

            int changes = entityCount / 10;

            Console.Write($"{changes} changes write: ");
            stopwatch.Start();

            for (int i = 0; i < changes; i++)
            {
                world.Entities[i].XPos = 2;
            }
            using (WriteSession writeSession = syncSourceRoot.BeginWrite())
            {
                var data = writeSession.WriteChanges().SetTick(TimeSpan.Zero);
                syncTargetRoot.Read(data);
            }
            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds + "MS");
        }
Ejemplo n.º 15
0
        public ObservableDictionaryTargetSynchronizer(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type baseType) : base(referenceId)
        {
            _targetSynchronizerRoot = targetSynchronizerRoot;
            _clock = _targetSynchronizerRoot.Clock;

            base.Reference = Activator.CreateInstance(baseType);
            Reference.CollectionChanged += OnCollectionChanged;

            _keySerializer   = targetSynchronizerRoot.Settings.Serializers.FindSerializerByType(typeof(TKey));
            _valueSerializer = targetSynchronizerRoot.Settings.Serializers.FindSerializerByType(typeof(TValue));
        }
Ejemplo n.º 16
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_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);
        }
Ejemplo n.º 18
0
        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 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 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);
        }
Ejemplo n.º 21
0
        public ObjectTargetSynchronizer(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type referenceType) : base(referenceId)
        {
            _targetSynchronizerRoot = targetSynchronizerRoot;
            Reference = FormatterServices.GetUninitializedObject(referenceType);

            SynchronizableMember[] synchronizableMembers = targetSynchronizerRoot.SynchronizableMemberFactory.FromType(referenceType);

            SynchronizableTargetMembers = new SynchronizableTargetMember[synchronizableMembers.Length];
            for (var syncPropertyIndex = 0; syncPropertyIndex < synchronizableMembers.Length; syncPropertyIndex++)
            {
                SynchronizableMember synchronizableMember = synchronizableMembers[syncPropertyIndex];
                var synchronizableTargetMember            = new SynchronizableTargetMember(Reference, synchronizableMember, _targetSynchronizerRoot);
                SynchronizableTargetMembers[syncPropertyIndex] = synchronizableTargetMember;
            }
            _targetSynchronizerRoot.EndRead += TargetSynchronizerRootOnEndRead;
        }
        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 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_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);
        }
Ejemplo n.º 26
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);
        }
Ejemplo n.º 27
0
 public TargetSynchronizer Synchronize(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type referenceType)
 {
     return(new ArrayTargetSynchronizer(targetSynchronizerRoot, referenceId, referenceType));
 }
Ejemplo n.º 28
0
 public TargetSynchronizer Synchronize(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type referenceType)
 {
     return(new StringTargetSynchronizer(referenceId));
 }
Ejemplo n.º 29
0
 public HighestTickState(SynchronizableTargetMember synchronizableTargetMember, TargetSynchronizerRoot targetSynchronizerRoot)
 {
     _synchronizableTargetMember = synchronizableTargetMember;
     _targetSynchronizerRoot     = targetSynchronizerRoot;
 }
Ejemplo n.º 30
0
 public TargetSynchronizer Synchronize(TargetSynchronizerRoot targetSynchronizerRoot, int referenceId, Type referenceType)
 {
     return(new NotifyPropertyChangedTargetSynchronizer(targetSynchronizerRoot, referenceId, referenceType));
 }