public async Task TwoWaySynchronize_AddedBoth_NewEntitiesAreMatching(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            var addedLocal = await _localRepository.Create(v => "Item l");

            var addedServer = await _serverRepository.Create(v => "Item s");

            await _serverRepository.Create(v => "Item s2");

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(
                    conflictWinner,
                    new List <IEntityRelationData <Identifier, int, Identifier, int> >
                {
                    new EntityRelationData(addedLocal.Id, addedLocal.Version, addedServer.Id, addedServer.Version)
                });
                AssertLocalCount(4);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");
                AssertLocal(0, "Item l");
                AssertLocal("l4", 0, "Item s2");

                AssertServerCount(4);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2", 0, "Item 2");
                AssertServer(0, "Item s");
                AssertServer("s4", 0, "Item s2");
            });
        }
        public async Task TwoWaySynchronize_DeletedLocal_WithWrongHint2(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            _localRepository.Delete("l1");
            _localRepository.Delete("l2");

            ExecuteMultipleTimes(() =>
            {
                SynchronizePartialTwoWay(
                    conflictWinner,
                    new[]
                {
                    IdWithHints.Create(new Identifier("l1"), (int?)666, null),
                },
                    CreateIdentifiers());

                AssertLocalCount(0);

                AssertServerCount(1);
                AssertServer("s2", 0, "Item 2");
            });

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);

                AssertLocalCount(0);
                AssertServerCount(0);
            });
        }
 protected void SynchronizeTwoWay (
   GenericConflictResolution winner,
   List<IEntityRelationData<Identifier, int, Identifier, int>> matchingEntities = null)
 {
   var strategy = CreateTwoWaySyncStrategy (winner);
   SynchronizeInternal (strategy, matchingEntities);
 }
Ejemplo n.º 4
0
        protected void SynchronizeTwoWay(
            GenericConflictResolution winner,
            List <IEntityRelationData <Identifier, int, Identifier, int> > matchingEntities = null)
        {
            var strategy = CreateTwoWaySyncStrategy(winner);

            SynchronizeInternal(strategy, false, matchingEntities);
        }
Ejemplo n.º 5
0
        protected Exception SynchronizeTwoWayNoThrow(
            GenericConflictResolution winner,
            List <IEntityRelationData <Identifier, int, Identifier, int> > matchingEntities = null)
        {
            var strategy = CreateTwoWaySyncStrategy(winner);

            return(SynchronizeInternal(strategy, true, matchingEntities));
        }
 protected void SynchronizePartialTwoWay (
     GenericConflictResolution winner,
     Identifier[] aEntitesToSynchronize,
     Identifier[] bEntitesToSynchronize)
 {
   var strategy = CreateTwoWaySyncStrategy (winner);
   PartialSynchronizeInternal (strategy, aEntitesToSynchronize, bEntitesToSynchronize);
 }
Ejemplo n.º 7
0
        protected void SynchronizePartialTwoWay(
            GenericConflictResolution winner,
            IIdWithHints <Identifier, int>[] aEntitesToSynchronize,
            IIdWithHints <Identifier, int>[] bEntitesToSynchronize)
        {
            var strategy = CreateTwoWaySyncStrategy(winner);

            PartialSynchronizeInternal(strategy, aEntitesToSynchronize, bEntitesToSynchronize);
        }
    private TwoWayInitialSyncStateCreationStrategy<Identifier, int, string, Identifier, int, string> CreateTwoWaySyncStrategy (GenericConflictResolution winner)
    {
      IConflictInitialSyncStateCreationStrategy<Identifier, int, string, Identifier, int, string> conflictInitialStrategy;
      if (winner == GenericConflictResolution.AWins)
        conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyAWins<Identifier, int, string, Identifier, int, string> (_factory);
      else
        conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyBWins<Identifier, int, string, Identifier, int, string> (_factory);

      var strategy = new TwoWayInitialSyncStateCreationStrategy<Identifier, int, string, Identifier, int, string> (_factory, conflictInitialStrategy);
      return strategy;
    }
        public void Synchronize(GenericConflictResolution winner)
        {
            IConflictInitialSyncStateCreationStrategy<string, int, string, string, int, string> conflictInitialStrategy;
              if (winner == GenericConflictResolution.AWins)
            conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyAWins<string, int, string, string, int, string> (_factory);
              else
            conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyBWins<string, int, string, string, int, string> (_factory);

              var strategy = new TwoWayInitialSyncStateCreationStrategy<string, int, string, string, int, string> (_factory, conflictInitialStrategy);

              SynchronizeInternal (strategy);
        }
        public void TwoWaySynchronize_DeletedBoth(GenericConflictResolution conflictWinner)
        {
            _synchronizerSetup.InitializeWithTwoEvents();

            _synchronizerSetup._serverRepository.Delete("s1");
            _synchronizerSetup._localRepository.Delete("l2");

            ExecuteMultipleTimes(() =>
            {
                Synchronize(conflictWinner);
                _synchronizerSetup.AssertLocalCount(0);

                _synchronizerSetup.AssertServerCount(0);
            });
        }
        public async Task TwoWaySynchronize_DeletedBoth(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            _serverRepository.Delete("s1");
            _localRepository.Delete("l2");

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);
                AssertLocalCount(0);

                AssertServerCount(0);
            });
        }
Ejemplo n.º 12
0
        public async Task TwoWaySynchronize_DeletedLocal(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            await _localRepository.Delete("l1");

            ExecuteMultipleTimes(() =>
            {
                Synchronize(conflictWinner);
                AssertLocalCount(1);
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(1);
                AssertServer("s2", 0, "Item 2");
            });
        }
        public void TwoWaySynchronize_UpdatedServer(GenericConflictResolution conflictWinner)
        {
            _synchronizerSetup.InitializeWithTwoEvents();
            _synchronizerSetup._serverRepository.UpdateWithoutIdChange("s1", v => "upd Item 1");

            ExecuteMultipleTimes(() =>
            {
                Synchronize(conflictWinner);
                _synchronizerSetup.AssertLocalCount(2);
                _synchronizerSetup.AssertLocal("l1u", 1, "upd Item 1");
                _synchronizerSetup.AssertLocal("l2", 0, "Item 2");

                _synchronizerSetup.AssertServerCount(2);
                _synchronizerSetup.AssertServer("s1", 1, "upd Item 1");
                _synchronizerSetup.AssertServer("s2", 0, "Item 2");
            });
        }
        public void TwoWaySynchronize_AddedServer(GenericConflictResolution conflictWinner)
        {
            _synchronizerSetup._serverRepository.Create(v => "Item 1");
            _synchronizerSetup._serverRepository.Create(v => "Item 2");

            ExecuteMultipleTimes(() =>
            {
                Synchronize(conflictWinner);
                _synchronizerSetup.AssertLocalCount(2);
                _synchronizerSetup.AssertLocal("l1", 0, "Item 1");
                _synchronizerSetup.AssertLocal("l2", 0, "Item 2");

                _synchronizerSetup.AssertServerCount(2);
                _synchronizerSetup.AssertServer("s1", 0, "Item 1");
                _synchronizerSetup.AssertServer("s2", 0, "Item 2");
            });
        }
    public async Task TwoWaySynchronize_AddedServer (GenericConflictResolution conflictWinner)
    {
      await _serverRepository.Create (v => "Item 1");
      await _serverRepository.Create (v => "Item 2");

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);
        AssertLocalCount (2);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");

        AssertServerCount (2);
        AssertServer ("s1", 0, "Item 1");
        AssertServer ("s2", 0, "Item 2");
      });
    }
Ejemplo n.º 16
0
        public async Task TwoWaySynchronize_AddedServer(GenericConflictResolution conflictWinner)
        {
            await _serverRepository.Create(v => Task.FromResult("Item 1"), NullSynchronizationContextFactory.Instance.Create().Result);

            await _serverRepository.Create(v => Task.FromResult("Item 2"), NullSynchronizationContextFactory.Instance.Create().Result);

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);
                AssertLocalCount(2);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(2);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2", 0, "Item 2");
            });
        }
        public void Synchronize(GenericConflictResolution winner)
        {
            IConflictInitialSyncStateCreationStrategy <Identifier, int, string, Identifier, int, string> conflictInitialStrategy;

            if (winner == GenericConflictResolution.AWins)
            {
                conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyAWins <Identifier, int, string, Identifier, int, string> (_factory);
            }
            else
            {
                conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyBWins <Identifier, int, string, Identifier, int, string> (_factory);
            }


            var strategy = new TwoWayInitialSyncStateCreationStrategy <Identifier, int, string, Identifier, int, string> (_factory, conflictInitialStrategy);

            SynchronizeInternal(strategy);
        }
        public async Task TwoWaySynchronize_UpdatedLocal(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            _localRepository.UpdateWithoutIdChange("l1", v => "upd Item 1");

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);
                AssertLocalCount(2);
                AssertLocal("l1", 1, "upd Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(2);
                AssertServer("s1u", 1, "upd Item 1");
                AssertServer("s2", 0, "Item 2");
            });
        }
        public async Task TwoWaySynchronize_AddedServer(GenericConflictResolution conflictWinner)
        {
            await _serverRepository.Create(v => "Item 1");

            await _serverRepository.Create(v => "Item 2");

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);
                AssertLocalCount(2);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(2);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2", 0, "Item 2");
            });
        }
    public async Task TwoWaySynchronize_ChangedLocal_VersionSpecified (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents();

      _localRepository.UpdateWithoutIdChange ("l1", _ => "Item 1 upd");
      _localRepository.UpdateWithoutIdChange ("l2", _ => "Item 2 upd");

      ExecuteMultipleTimes (() =>
      {
        SynchronizePartialTwoWay (
            conflictWinner,
            new[]
            {
                IdWithHints.Create (new Identifier ("l1"), (int?) 0, null), // Same version as knyown version specified => isn't synced
                IdWithHints.Create (new Identifier ("l2"), (int?) 999, null) // Other version as knyown version specified => is synced
            },
            CreateIdentifiers());

        AssertLocalCount (2);
        AssertLocal ("l1", 1, "Item 1 upd");
        AssertLocal ("l2", 1, "Item 2 upd");

        AssertServerCount (2);
        AssertServer ("s1", 0, "Item 1");
        AssertServer ("s2u", 1, "Item 2 upd");
      });

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);

        AssertLocalCount (2);
        AssertLocal ("l1", 1, "Item 1 upd");
        AssertLocal ("l2", 1, "Item 2 upd");

        AssertServerCount (2);
        AssertServer ("s1u", 1, "Item 1 upd");
        AssertServer ("s2u", 1, "Item 2 upd");
      });
    }
        public async Task TwoWaySynchronize_ChangedLocal_VersionSpecified(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            _localRepository.UpdateWithoutIdChange("l1", _ => "Item 1 upd");
            _localRepository.UpdateWithoutIdChange("l2", _ => "Item 2 upd");

            ExecuteMultipleTimes(() =>
            {
                SynchronizePartialTwoWay(
                    conflictWinner,
                    new[]
                {
                    IdWithHints.Create(new Identifier("l1"), (int?)0, null),      // Same version as knyown version specified => isn't synced
                    IdWithHints.Create(new Identifier("l2"), (int?)999, null)     // Other version as knyown version specified => is synced
                },
                    CreateIdentifiers());

                AssertLocalCount(2);
                AssertLocal("l1", 1, "Item 1 upd");
                AssertLocal("l2", 1, "Item 2 upd");

                AssertServerCount(2);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2u", 1, "Item 2 upd");
            });

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);

                AssertLocalCount(2);
                AssertLocal("l1", 1, "Item 1 upd");
                AssertLocal("l2", 1, "Item 2 upd");

                AssertServerCount(2);
                AssertServer("s1u", 1, "Item 1 upd");
                AssertServer("s2u", 1, "Item 2 upd");
            });
        }
        public void TwoWaySynchronize_AddedBoth(GenericConflictResolution conflictWinner)
        {
            _synchronizerSetup.InitializeWithTwoEvents();

            _synchronizerSetup._localRepository.Create(v => "Item l");
            _synchronizerSetup._serverRepository.Create(v => "Item s");

            ExecuteMultipleTimes(() =>
            {
                Synchronize(conflictWinner);
                _synchronizerSetup.AssertLocalCount(4);
                _synchronizerSetup.AssertLocal("l1", 0, "Item 1");
                _synchronizerSetup.AssertLocal("l2", 0, "Item 2");
                _synchronizerSetup.AssertLocal(0, "Item l");
                _synchronizerSetup.AssertLocal(0, "Item s");

                _synchronizerSetup.AssertServerCount(4);
                _synchronizerSetup.AssertServer("s1", 0, "Item 1");
                _synchronizerSetup.AssertServer("s2", 0, "Item 2");
                _synchronizerSetup.AssertServer(0, "Item l");
                _synchronizerSetup.AssertServer(0, "Item s");
            });
        }
        public async Task TwoWaySynchronize_ChangedLocal_SpecifiedTwice(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            _localRepository.UpdateWithoutIdChange("l1", _ => "Item 1 upd");
            _localRepository.UpdateWithoutIdChange("l2", _ => "Item 2 upd");

            ExecuteMultipleTimes(() =>
            {
                SynchronizePartialTwoWay(
                    conflictWinner,
                    CreateIdentifiers("l1"),
                    CreateIdentifiers("s1"));

                AssertLocalCount(2);
                AssertLocal("l1", 1, "Item 1 upd");
                AssertLocal("l2", 1, "Item 2 upd");

                AssertServerCount(2);
                AssertServer("s1u", 1, "Item 1 upd");
                AssertServer("s2", 0, "Item 2");
            });
        }
    public async Task TwoWaySynchronize_ChangedLocal_SpecifiedTwice (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents();

      _localRepository.UpdateWithoutIdChange ("l1", _ => "Item 1 upd");
      _localRepository.UpdateWithoutIdChange ("l2", _ => "Item 2 upd");

      ExecuteMultipleTimes (() =>
      {
        SynchronizePartialTwoWay (
            conflictWinner,
            C ("l1"),
            C ("s1"));

        AssertLocalCount (2);
        AssertLocal ("l1", 1, "Item 1 upd");
        AssertLocal ("l2", 1, "Item 2 upd");

        AssertServerCount (2);
        AssertServer ("s1u", 1, "Item 1 upd");
        AssertServer ("s2", 0, "Item 2");
      });
    }
    public async Task TwoWaySynchronize_AddedBoth (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents();

      await _localRepository.Create (v => "Item l");
      await _serverRepository.Create (v => "Item s");

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);
        AssertLocalCount (4);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");
        AssertLocal (0, "Item l");
        AssertLocal (0, "Item s");

        AssertServerCount (4);
        AssertServer ("s1", 0, "Item 1");
        AssertServer ("s2", 0, "Item 2");
        AssertServer (0, "Item l");
        AssertServer (0, "Item s");
      });
    }
        public async Task TwoWaySynchronize_AddedLocal_WithHint(GenericConflictResolution conflictWinner)
        {
            await _localRepository.Create(v => Task.FromResult("Item 1"), NullSynchronizationContextFactory.Instance.Create().Result);

            await _localRepository.Create(v => Task.FromResult("Item 2"), NullSynchronizationContextFactory.Instance.Create().Result);

            ExecuteMultipleTimes(() =>
            {
                SynchronizePartialTwoWay(
                    conflictWinner,
                    new[]
                {
                    IdWithHints.Create(new Identifier("l1"), (int?)0, null),
                },
                    CreateIdentifiers());

                AssertLocalCount(2);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(1);
                AssertServer("s1", 0, "Item 1");
            });

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);

                AssertLocalCount(2);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(2);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2", 0, "Item 2");
            });
        }
        public async Task TwoWaySynchronize_AddedBoth(GenericConflictResolution conflictWinner)
        {
            await InitializeWithTwoEvents();

            await _localRepository.Create(v => "Item l");

            await _serverRepository.Create(v => "Item s");

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);
                AssertLocalCount(4);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");
                AssertLocal(0, "Item l");
                AssertLocal(0, "Item s");

                AssertServerCount(4);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2", 0, "Item 2");
                AssertServer(0, "Item l");
                AssertServer(0, "Item s");
            });
        }
        public async Task TwoWaySynchronize_AddedLocal_WithWrongHint(GenericConflictResolution conflictWinner)
        {
            await _localRepository.Create(v => Task.FromResult("Item 1"), NullSynchronizationContextFactory.Instance.Create().Result);

            await _localRepository.Create(v => Task.FromResult("Item 2"), NullSynchronizationContextFactory.Instance.Create().Result);

            ExecuteMultipleTimes(() =>
            {
                SynchronizePartialTwoWay(
                    conflictWinner,
                    new[]
                {
                    IdWithHints.Create(new Identifier("l1"), (int?)null, true),      // specifying deletion hint true for a new item causes the item not to be synced
                },
                    CreateIdentifiers());

                AssertLocalCount(2);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(0);
            });

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(conflictWinner);

                AssertLocalCount(2);
                AssertLocal("l1", 0, "Item 1");
                AssertLocal("l2", 0, "Item 2");

                AssertServerCount(2);
                AssertServer("s1", 0, "Item 1");
                AssertServer("s2", 0, "Item 2");
            });
        }
    public async Task TwoWaySynchronize_AddedBoth_NewEntitiesAreMatching (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents();

      var addedLocal = await _localRepository.Create (v => "Item l");
      var addedServer = await _serverRepository.Create (v => "Item s");
      await _serverRepository.Create (v => "Item s2");

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (
            conflictWinner,
            new List<IEntityRelationData<Identifier, int, Identifier, int>>
            {
                new EntityRelationData (addedLocal.Id, addedLocal.Version, addedServer.Id, addedServer.Version)
            });
        AssertLocalCount (4);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");
        AssertLocal (0, "Item l");
        AssertLocal ("l4", 0, "Item s2");

        AssertServerCount (4);
        AssertServer ("s1", 0, "Item 1");
        AssertServer ("s2", 0, "Item 2");
        AssertServer (0, "Item s");
        AssertServer ("s4", 0, "Item s2");
      });
    }
 protected void SynchronizeTwoWay (GenericConflictResolution winner)
 {
   var strategy = CreateTwoWaySyncStrategy (winner);
   SynchronizeInternal (strategy);
 }
    public async Task TwoWaySynchronize_DeletedBothWithConflict (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents();

      _serverRepository.Delete ("s1");
      _localRepository.Delete ("l1");

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);
        AssertLocalCount (1);
        AssertLocal ("l2", 0, "Item 2");

        AssertServerCount (1);
        AssertServer ("s2", 0, "Item 2");
      });
    }
    public async Task TwoWaySynchronize_DeletedLocal_WithWrongHint2 (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents ();

      _localRepository.Delete ("l1");
      _localRepository.Delete ("l2");

      ExecuteMultipleTimes (() =>
      {
        SynchronizePartialTwoWay (
            conflictWinner,
            new[]
            {
                IdWithHints.Create (new Identifier ("l1"), (int?) 666, null),
            },
            CreateIdentifiers ());

        AssertLocalCount (0);

        AssertServerCount (1);
        AssertServer ("s2", 0, "Item 2");
      });

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);

        AssertLocalCount (0);
        AssertServerCount (0);
      });
    }
Ejemplo n.º 33
0
        private TwoWayInitialSyncStateCreationStrategy <Identifier, int, string, Identifier, int, string, int> CreateTwoWaySyncStrategy(GenericConflictResolution winner)
        {
            IConflictInitialSyncStateCreationStrategy <Identifier, int, string, Identifier, int, string, int> conflictInitialStrategy;

            if (winner == GenericConflictResolution.AWins)
            {
                conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyAWins <Identifier, int, string, Identifier, int, string, int> (_factory);
            }
            else
            {
                conflictInitialStrategy = new ConflictInitialSyncStateCreationStrategyBWins <Identifier, int, string, Identifier, int, string, int> (_factory);
            }

            var strategy = new TwoWayInitialSyncStateCreationStrategy <Identifier, int, string, Identifier, int, string, int> (_factory, conflictInitialStrategy);

            return(strategy);
        }
    public async Task TwoWaySynchronize_AddedLocal_WithHint (GenericConflictResolution conflictWinner)
    {
      await _localRepository.Create (v => Task.FromResult("Item 1"), NullSynchronizationContextFactory.Instance.Create ().Result);
      await _localRepository.Create (v => Task.FromResult ("Item 2"), NullSynchronizationContextFactory.Instance.Create ().Result);

      ExecuteMultipleTimes (() =>
      {
        SynchronizePartialTwoWay (
            conflictWinner,
            new[]
            {
                IdWithHints.Create (new Identifier ("l1"), (int?) 0, null),
            },
            CreateIdentifiers ());

        AssertLocalCount (2);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");

        AssertServerCount (1);
        AssertServer ("s1", 0, "Item 1");
      });

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);

        AssertLocalCount (2);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");

        AssertServerCount (2);
        AssertServer ("s1", 0, "Item 1");
        AssertServer ("s2", 0, "Item 2");
      });
    }
    public async Task TwoWaySynchronize_AddedLocal_WithWrongHint (GenericConflictResolution conflictWinner)
    {
      await _localRepository.Create (v => Task.FromResult("Item 1"), NullSynchronizationContextFactory.Instance.Create ().Result);
      await _localRepository.Create (v => Task.FromResult("Item 2"), NullSynchronizationContextFactory.Instance.Create ().Result);

      ExecuteMultipleTimes (() =>
      {
        SynchronizePartialTwoWay (
            conflictWinner,
            new[]
            {
                IdWithHints.Create (new Identifier ("l1"), (int?) null, true), // specifying deletion hint true for a new item causes the item not to be synced
            },
            CreateIdentifiers ());

        AssertLocalCount (2);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");

        AssertServerCount (0);
      });

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);

        AssertLocalCount (2);
        AssertLocal ("l1", 0, "Item 1");
        AssertLocal ("l2", 0, "Item 2");

        AssertServerCount (2);
        AssertServer ("s1", 0, "Item 1");
        AssertServer ("s2", 0, "Item 2");
      });
    }
        public async Task TwoWaySynchronize_AddedBothWithoutExisting_NewEntitiesAreMatching(GenericConflictResolution conflictWinner)
        {
            var addedLocal = await _localRepository.Create(v => "Item l");

            var addedServer = await _serverRepository.Create(v => "Item s");

            ExecuteMultipleTimes(() =>
            {
                SynchronizeTwoWay(
                    conflictWinner,
                    new List <IEntityRelationData <Identifier, int, Identifier, int> >
                {
                    new EntityRelationData(addedLocal.Id, addedLocal.Version, addedServer.Id, addedServer.Version)
                });
                AssertLocalCount(1);
                AssertLocal(0, "Item l");

                AssertServerCount(1);
                AssertServer(0, "Item s");
            });
        }
    public async Task TwoWaySynchronize_AddedBothWithoutExisting_NewEntitiesAreMatching (GenericConflictResolution conflictWinner)
    {
      var addedLocal = await _localRepository.Create (v => "Item l");
      var addedServer = await _serverRepository.Create (v => "Item s");

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (
            conflictWinner,
            new List<IEntityRelationData<Identifier, int, Identifier, int>>
            {
                new EntityRelationData (addedLocal.Id, addedLocal.Version, addedServer.Id, addedServer.Version)
            });
        AssertLocalCount (1);
        AssertLocal (0, "Item l");

        AssertServerCount (1);
        AssertServer (0, "Item s");
      });
    }
    public async Task TwoWaySynchronize_UpdatedBoth (GenericConflictResolution conflictWinner)
    {
      await InitializeWithTwoEvents();
      _serverRepository.UpdateWithoutIdChange ("s1", v => "upd Item 1");
      _localRepository.UpdateWithoutIdChange ("l2", v => "upd Item 2");

      ExecuteMultipleTimes (() =>
      {
        SynchronizeTwoWay (conflictWinner);
        AssertLocalCount (2);
        AssertLocal ("l1u", 1, "upd Item 1");
        AssertLocal ("l2", 1, "upd Item 2");

        AssertServerCount (2);
        AssertServer ("s1", 1, "upd Item 1");
        AssertServer ("s2u", 1, "upd Item 2");
      });
    }