public void changeTrackingService_hasTransientEntities_should_be_true_after_undo()
        {
            var svc = new ChangeTrackingService();
            var p = new Person( svc, true );
            svc.Undo();

            svc.HasTransientEntities.Should().Be.True();
        }
        public void after_Undo_collection_is_rolledback()
        {
            Int32 expected = 0;

            IChangeTrackingService svc = new ChangeTrackingService();

            PersonCollection p = new PersonCollection( svc );
            p.Add( new Person( svc, false ) );

            svc.Undo();

            p.Count.Should().Be.EqualTo( expected );
        }
        public void after_multiple_change_canRedo_is_false()
        {
            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc, false );
            p.Name = "Mauro";
            svc.Undo();
            p.Name = "Foo";

            Assert.IsFalse( svc.CanRedo );
        }
        public void afterUndo_service_canRedo()
        {
            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc, false );
            p.Name = "Mauro";

            svc.Undo();

            Assert.IsTrue( svc.CanRedo );
        }
        public void service_after_redo_CanRedo_is_false()
        {
            String expected = "Mauro";

            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc );
            p.Name = expected;

            svc.Undo();
            svc.Redo();

            Assert.IsFalse( svc.CanRedo );
        }
        public void afterUndo_service_Redo_restore_previous_value()
        {
            ChangeTrackingService svc = new ChangeTrackingService();
            Int32 expected = 1;

            PersonCollection p = new PersonCollection( svc );
            p.Add( new Person( null, false ) );

            svc.Undo();
            svc.Redo();

            Assert.AreEqual<Int32>( expected, p.Count );
        }
		public void changeTrackingService_using_beginAtomicOperation_should_fully_rollback_on_single_undo()
		{
			var target = new ChangeTrackingService();

			var person = new Person( target );
			var list = new PersonCollection( target );

			using( var actual = target.BeginAtomicOperation() )
			{
				person.Name = "Mauro";
				list.Add( person );
				person.Name = "Mauro Servienti";

				actual.Complete();
			}

			target.Undo();

			list.Count.Should().Be.EqualTo( 0 );
			person.Name.Should().Be.EqualTo( String.Empty );
		}
        public void afterUndo_propertyValue_is_rolledback()
        {
            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc, false );
            String expected = p.Name;
            p.Name = "Mauro";

            svc.Undo();

            Assert.AreEqual<String>( expected, p.Name );
        }
        public void after_suspend_cannot_call_Redo()
        {
            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc );
            p.Name = "Mauro";
            svc.Undo();

            svc.Suspend();
            svc.Redo();
        }
        public void service_on_undo_of_last_change_entity_if_tansient_has_forward_changes_and_is_transient()
        {
            EntityTrackingStates expected = EntityTrackingStates.IsTransient | EntityTrackingStates.AutoRemove | EntityTrackingStates.HasForwardChanges;

            ChangeTrackingService svc = new ChangeTrackingService();
            Person p = new Person( svc );
            p.Name = "Mauro";

            svc.Undo();
            EntityTrackingStates actual = svc.GetEntityState( p );

            Assert.AreEqual<EntityTrackingStates>( expected, actual );
        }
        public void service_on_undo_of_last_change_entity_if_not_tansient_has_only_forward_changes()
        {
            EntityTrackingStates expected = EntityTrackingStates.HasForwardChanges;

            ChangeTrackingService svc = new ChangeTrackingService();
            Person p = new Person( svc, false );
            p.Name = "Mauro";

            svc.Undo();
            EntityTrackingStates actual = svc.GetEntityState( p );

            Assert.AreEqual<EntityTrackingStates>( expected, actual );
        }
        public void service_cannot_revert_to_an_invalid_bookmark()
        {
            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc );
            p.Name = "Mauro";

            var bmk = svc.CreateBookmark();
            svc.Undo();
            svc.Revert( bmk );
        }
        public void service_redoes_are_in_the_correct_order()
        {
            var p1 = new Person( null, false );
            var p2 = new Person( null, false );
            var p3 = new Person( null, false );

            ChangeTrackingService svc = new ChangeTrackingService();

            PersonCollection list = new PersonCollection( svc );
            list.Add( p1 );
            list.Add( p2 );
            list.Add( p3 );
            list.Move( p2, 0 );
            list.Remove( p1 );

            while( svc.CanUndo )
            {
                svc.Undo();
            }

            svc.Redo();
            Assert.AreEqual<Int32>( 1, list.Count );
            Assert.IsTrue( list.Contains( p1 ) );

            svc.Redo();
            Assert.AreEqual<Int32>( 2, list.Count );
            Assert.IsTrue( list.Contains( p2 ) );

            svc.Redo();
            Assert.AreEqual<Int32>( 3, list.Count );
            Assert.IsTrue( list.Contains( p3 ) );

            svc.Redo();
            Assert.AreEqual<Int32>( 0, list.IndexOf( p2 ) );

            svc.Redo();
            Assert.AreEqual<Int32>( 2, list.Count );
            Assert.IsFalse( list.Contains( p1 ) );
        }
        public void service_on_clear_undo_entities_are_restored()
        {
            var source = new Person[] 
            {
                new Person( null, false ),
                new Person( null, false ),
                new Person( null, false ),
                new Person( null, false ),
                new Person( null, false )
            };

            ChangeTrackingService svc = new ChangeTrackingService();

            PersonCollection list = new PersonCollection( svc );
            list.BeginInit();
            list.AddRange( source );
            list.EndInit();

            list.Clear();
            svc.Undo();

            Assert.AreEqual<Int32>( source.Length, list.Count() );
            source.ForEach( p =>
            {
                Int32 expected = Array.IndexOf( source, p );
                Int32 actual = list.IndexOf( p );

                Assert.AreEqual<Int32>( expected, actual );
            } );
        }
        public void afterUndo_service_Redo_restore_previous_value()
        {
            ChangeTrackingService svc = new ChangeTrackingService();
            String expected = "Mauro";

            Person p = new Person( svc, false );
            p.Name = expected;

            svc.Undo();
            svc.Redo();

            Assert.AreEqual<String>( expected, p.Name );
        }
        public void entity_registeredAsTransient_without_autoRemove_on_Undo_is_transient()
        {
            ChangeTrackingService svc = new ChangeTrackingService();
            EntityTrackingStates expected = EntityTrackingStates.IsTransient;

            Person p = new Person( svc, false );
            svc.RegisterTransient( p, false );
            svc.Undo();

            EntityTrackingStates actual = svc.GetEntityState( p );

            Assert.AreEqual<EntityTrackingStates>( expected, actual );
        }
        public void service_on_undo_of_last_change_isChanged_false()
        {
            ChangeTrackingService svc = new ChangeTrackingService();
            Person p = new Person( svc );
            p.Name = "Mauro";

            svc.Undo();

            Assert.IsFalse( svc.IsChanged );
        }
        public void service_on_undo_with_nothing_to_do_not_raise_trackingServiceStateChanged_event()
        {
            Int32 expected = 0;
            Int32 actual = 0;

            ChangeTrackingService svc = new ChangeTrackingService();
            Person p = new Person( svc );

            svc.TrackingServiceStateChanged += ( sender, args ) => { actual++; };
            svc.Undo();

            Assert.AreEqual<Int32>( expected, actual );
        }
        public void service_on_redo_raise_trackingServiceStateChanged_event()
        {
            Int32 expected = 2; //1: Store actual value, 2: Redo
            Int32 actual = 0;

            ChangeTrackingService svc = new ChangeTrackingService();
            Person p = new Person( svc );
            p.Name = "Mauro";
            svc.Undo();

            svc.TrackingServiceStateChanged += ( sender, args ) => { actual++; };
            svc.Redo();

            Assert.AreEqual<Int32>( expected, actual );
        }
        public void service_validate_a_bookmark_invalid_is_false()
        {
            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc );
            p.Name = "Mauro";

            var bmk = svc.CreateBookmark();
            svc.Undo();

            Assert.IsFalse( svc.Validate( bmk ) );
        }
        public void service_correcly_handle_multiple_undos_redos()
        {
            String expected = "Mauro";

            ChangeTrackingService svc = new ChangeTrackingService();

            Person p = new Person( svc );
            p.Name = expected;

            svc.Undo();
            svc.Redo();
            svc.Undo();
            svc.Redo();

            Assert.AreEqual<String>( expected, p.Name );
        }
		public void changeTrackingService_using_beginAtomicOperation_redo_should_reapply_all_changes_with_one_pass()
		{
			var target = new ChangeTrackingService();

			var person = new Person( target );
			var list = new PersonCollection( target );

			using( var actual = target.BeginAtomicOperation() )
			{
				person.Name = "Mauro";
				list.Add( person );
				person.Name = "Mauro Servienti";

				actual.Complete();
			}

			target.Undo();
			target.Redo();

			list.Count.Should().Be.EqualTo( 1 );
			person.Name.Should().Be.EqualTo( "Mauro Servienti" );
		}
        public void after_multiple_change_canRedo_is_false()
        {
            IChangeTrackingService svc = new ChangeTrackingService();

            PersonCollection p = new PersonCollection( svc );
            p.Add( new Person( null, false ) );
            svc.Undo();
            p.Add( new Person( null, false ) );

            Assert.IsFalse( svc.CanRedo );
        }