public void ObservableMasterSlaveCollectionRedoAtRemoveAtWithSlave(ObservableMasterSlaveCollection <int> list)
    {
        // ARRANGE
        EnvironmentSettings.AlwaysSuppressCurrentSynchronizationContext = true;

        using (var slaveCollection = new ObservableList <int>
        {
            -1,
            -5,
            -12,
        })
        {
            list.SetSlaveList(slaveCollection);

            list.RemoveAt(2);
            Assert.True(list[2] == 23);
            list.Undo();
            Assert.True(list[2] == 19);

            // ACT
            list.Redo();

            // ASSERT
            Assert.True(list[2] == 23);

            Assert.True(list.Contains(-5));
        }
    }
    public void ObservableMasterSlaveCollectionUndoAtClearWithSlave(ObservableMasterSlaveCollection <int> list)
    {
        // ARRANGE
        EnvironmentSettings.AlwaysSuppressCurrentSynchronizationContext = true;

        using (var slaveCollection = new ObservableList <int>
        {
            -1,
            -5,
            -12,
        })
        {
            list.SetSlaveList(slaveCollection);

            list.Clear();

            Assert.False(list.Contains(1));
            Assert.False(list.Contains(7));
            Assert.False(list.Contains(19));
            Assert.False(list.Contains(23));
            Assert.False(list.Contains(4));

            // ACT
            list.Undo();

            // ASSERT
            Assert.True(list.Contains(1));
            Assert.True(list.Contains(7));
            Assert.True(list.Contains(19));
            Assert.True(list.Contains(23));
            Assert.True(list.Contains(4));

            Assert.True(list.Contains(-5));
        }
    }
    public void ObservableMasterSlaveCollectionMultipleRedoCutoffWithSlave(
        ObservableMasterSlaveCollection <int> list)
    {
        // ARRANGE
        EnvironmentSettings.AlwaysSuppressCurrentSynchronizationContext = true;

        using (var slaveCollection = new ObservableList <int>
        {
            -1,
            -5,
            -12,
        })
        {
            list.SetSlaveList(slaveCollection);

            list.Add(15);
            list.Add(89);
            list.Add(3);
            list.Add(2);
            list.Add(57);

            // ACT
            list.Undo();
            list.Undo();
            list.Undo();
            list.Redo();

            list.Add(74);

            list.Redo();
            list.Redo();
            list.Redo();

            // ASSERT
            Assert.True(list.Contains(3));
            Assert.False(list.Contains(57));
            Assert.False(list.Contains(2));
            Assert.True(list.Contains(74));

            Assert.True(list.Contains(-5));
        }
    }
    public void ObservableMasterSlaveCollectionUndoMultipleOperationsWithSlave(
        ObservableMasterSlaveCollection <int> list)
    {
        // ARRANGE
        EnvironmentSettings.AlwaysSuppressCurrentSynchronizationContext = true;

        using (var slaveCollection = new ObservableList <int>
        {
            -1,
            -5,
            -12,
        })
        {
            list.SetSlaveList(slaveCollection);

            list.Add(18);
            list.RemoveAt(1);
            list.Insert(
                3,
                5);
            list.Clear();
            list.Add(7);

            // Act & Assert groups
            Assert.True(list.Count == 4);
            Assert.True(list[0] == 7);

            // Level one
            list.Undo();
            Assert.True(list.Count == 3);

            // Level two
            list.Undo();
            Assert.True(list.Count == 9);
            Assert.True(list[3] == 5);

            // Level three
            list.Undo();
            Assert.True(list.Count == 8);
            Assert.True(list[3] == 4);

            // Level four
            list.Undo();
            Assert.True(list.Count == 9);
            Assert.True(list[1] == 7);

            // Level two
            list.Undo();
            Assert.True(list.Count == 8);
            Assert.False(list.Contains(18));

            // Redo
            list.Redo();
            list.Redo();
            list.Redo();
            list.Redo();
            Assert.True(list.Count == 3);

            Assert.True(list.Contains(-5));
        }
    }