public void WhenAnOptionalArgIndexIsLowerThanARequiredArgIndexThenShouldThrowOptionalArgumentBoundsException()
        {
            var testArgs = new[] { "0", "1" };

            Assert.Throws <OptionalArgumentBoundsException>(() =>
                                                            ArgParser.Serialize <OptionalArgBeforeRequiredArgClass>(testArgs));
        }
        public void WhenNullIsPassedForARequiredArgumentValueThenShouldThrowRequiredArgumentNullException()
        {
            var testArgs = new[] { "Null" };

            Assert.Throws <RequiredArgumentNullException>(() =>
                                                          ArgParser.Serialize <OptionalWithDefaultValueHappyArgClass>(testArgs));
        }
        public void WhenTheArgumentsAreSerializedThenTheResultShouldContainTheSerializedValues()
        {
            var testArgs = new[] { "10" };

            var result = ArgParser.Serialize <TestArgClass>(testArgs);

            Assert.Equal(10, result.FirstArg);
        }
        public void WhenTheArgumentsAreSerializedThenTheResultShouldBeOfTheSpecifiedType()
        {
            var testArgs = new[] { "0" };

            var result = ArgParser.Serialize <TestArgClass>(testArgs);

            Assert.IsType <TestArgClass>(result);
        }
        public void WhenNoArgumentIsPassedCorrespondingToAnOptionalArgumentAndADefaultValueIsSpecifiedThenTheDefaultValueShouldBeUsed()
        {
            var testArgs = new[] { "10" };

            var result = ArgParser.Serialize <OptionalWithDefaultValueHappyArgClass>(testArgs);

            Assert.Equal(-1, result.OptionalIntArg);
            Assert.Equal(DateTime.Today, result.OptionalDateTimeArg);
        }
        public void WhenNullIsPassedForAnOptionalAnArgumentValueThenTheTheDefaultValueShouldBeUsed()
        {
            var testArgs = new[] { "10", "NULL", "null" };

            var result = ArgParser.Serialize <OptionalWithDefaultValueHappyArgClass>(testArgs);

            Assert.Equal(-1, result.OptionalIntArg);
            Assert.Equal(DateTime.Today, result.OptionalDateTimeArg);
        }
        public void GivenValidInputValuesThenAllSimpleTypesShouldSuccessfullySerialize()
        {
            var testArgs = new[] { "12", "test", "2/3/2019 5:00 PM", "1.5" };

            var result = ArgParser.Serialize <ExhaustiveArgClass>(testArgs);

            Assert.Equal(12, result.IntArg);
            Assert.Equal("test", result.StringArg);
            Assert.Equal(new DateTime(2019, 2, 3, 17, 0, 0), result.DateArg);
            Assert.Equal(1.5, result.DoubleArg);
        }
        public void WhenNullOrEmptyArgumentArrayIsPassedThenShouldReturnNull()
        {
            var emptyArgs = new string[0];

            string[] nullArgs = null;

            var emptyArgResult = ArgParser.Serialize <TestArgClass>(emptyArgs);
            var nullArgResult  = ArgParser.Serialize <TestArgClass>(nullArgs);

            Assert.Null(emptyArgResult);
            Assert.Null(nullArgResult);
        }
        public void WhenFewerArgumentsAreGivenThanTheNumberOfRequiredPropertiesInTheTargetClassThenShouldThrowArgumentCountException()
        {
            var testArgs = new[] { "10" };

            Assert.Throws <ArgumentCountException>(() => ArgParser.Serialize <MultipleArgClass>(testArgs));
        }
        public void WhenAnIndexIsSerializedWhichHasNotBeenDefinedThenShouldThrowIndexNotFoundException()
        {
            var testArgs = new[] { "10", "100" };

            Assert.Throws <IndexNotFoundException>(() => ArgParser.Serialize <SkipIndexArgClass>(testArgs));
        }
        public void WhenDuplicateIndexValueExistsThenShouldThrowDuplicateIndexException()
        {
            var testArgs = new[] { "10" };

            Assert.Throws <DuplicateIndexException>(() => ArgParser.Serialize <DuplicateArgClass>(testArgs));
        }