public void CommandFactory_Should_ReturnAppropriateDefaultCommand([ValueSource(nameof(CommandSelectionSuccessful))] CommandFactoryFixture data)
        {
            // Arrange
            var commandMockArray = new Mock<ICommand<object>>[data.CommandNames.Length];
            var expectedCommand = null as ICommand<object>;

            for (var i = 0; i < data.CommandNames.Length; ++i)
            {
                var name = data.CommandNames[i];

                commandMockArray[i] = new Mock<ICommand<object>>();
                commandMockArray[i].Setup(x => x.Name).Returns(name);

                if (name == data.NameOfDefaultCommand)
                {
                    expectedCommand = commandMockArray[i].Object;
                }
            }

            var commandArrayMock = commandMockArray.Select(x => x.Object).ToArray();

            var objectUnderTest = new CommandFactory<object>(commandArrayMock, data.NameOfDefaultCommand);

            // Act
            var command = objectUnderTest.GetCommand(null as string);

            // Assert
            Assert.AreEqual(expectedCommand, command);
        }
        public void CommandFactory_Should_AlwaysProvideValidSequenceOfCommands([ValueSource(nameof(CommandSelectionSuccessful))] CommandFactoryFixture data)
        {
            // Arrange
            var commandMockArray = new Mock<ICommand<object>>[data.CommandNames.Length];

            for (var i = 0; i < data.CommandNames.Length; ++i)
            {
                var name = data.CommandNames[i];

                commandMockArray[i] = new Mock<ICommand<object>>();
                commandMockArray[i].Setup(x => x.Name).Returns(name);
            }

            var commandArrayMock = commandMockArray.Select(x => x.Object).ToArray();

            var objectUnderTest = new CommandFactory<object>(commandArrayMock, data.NameOfDefaultCommand);

            // Act
            var commands = objectUnderTest.Commands;

            // Assert
            foreach (var command in commandArrayMock)
            {
                Assert.IsTrue(commands.Any(x => x == command));
            }
        }
        public void CommandFactory_Should_ThrowArgumentOutOfRangeExceptionOnInvalidNameOfDefaultCommand([ValueSource(nameof(CommandSelectionInvalidNameOfDefaultCommand))] CommandFactoryFixture data)
        {
            // Arrange
            var commandMockArray = new Mock<ICommand<object>>[data.CommandNames.Length];

            for (var i = 0; i < data.CommandNames.Length; ++i)
            {
                var name = data.CommandNames[i];

                commandMockArray[i] = new Mock<ICommand<object>>();
                commandMockArray[i].Setup(x => x.Name).Returns(name);
            }

            var commandArrayMock = commandMockArray.Select(x => x.Object).ToArray();

            // Act
            Assert.Throws<ArgumentOutOfRangeException>(() => new CommandFactory<object>(commandArrayMock, data.NameOfDefaultCommand));

            // Assert
        }
        public void CommandFactory_Should_ThrowDuplicateNameExceptionWhenCommandsWithEqualNamesArePassed([ValueSource(nameof(CommandSelectionDuplicates))] CommandFactoryFixture data)
        {
            // Arrange
            var commandMockArray = new Mock<ICommand<object>>[data.CommandNames.Length];

            for (var i = 0; i < data.CommandNames.Length; ++i)
            {
                var name = data.CommandNames[i];

                commandMockArray[i] = new Mock<ICommand<object>>();
                commandMockArray[i].Setup(x => x.Name).Returns(name);
            }

            var commandArrayMock = commandMockArray.Select(x => x.Object).ToArray();

            // Act
            Assert.Throws<DuplicateNameException>(() => new CommandFactory<object>(commandArrayMock, data.NameOfDefaultCommand));

            // Assert

        }