public void GetWriteData_CanCovertDecimalToPercentage(string expectedResult, string inputDataString,
                                                              int numberOfDecimalPlaces)
        {
            // Arrange
            decimal inputData = decimal.Parse(inputDataString);

            var attribute = new CsvConverterNumberAttribute();

            attribute.NumberOfDecimalPlaces = numberOfDecimalPlaces;

            var classUnderTest = new CsvConverterPercentage();

            classUnderTest.Initialize(attribute, new DefaultTypeConverterFactory());

            // Act
            string actual = classUnderTest.GetWriteData(typeof(decimal), inputData, ColumName, ColumnIndex, RowNumber);

            // Windows 7 and Windows 10 format strings differently so remove the space so that for the test it doesn't matter
            if (actual != null)
            {
                actual = actual.Replace(" ", "");
            }


            // Assert
            Assert.AreEqual(expectedResult, actual);
        }
        [DataRow(2, "200%", "P0")]  // Differs between windows 10 (20%) & windows 7 (20 %)
        public void GetWriteData_CanConvertIntToDecimal_IntConverted(int inputData, string expectedData, string formatData)
        {
            // Arrange
            var attribute = new CsvConverterNumberAttribute()
            {
                StringFormat = formatData
            };
            var cut = new CsvConverterDecimalToInt();

            cut.Initialize(attribute, new DefaultTypeConverterFactory());

            // Act
            string actualData = cut.GetWriteData(typeof(int), inputData, "Column1", 1, 1);

            // Windows 10 (2,000%) & Windows 7 (2,000 %) format percentages slightly differently
            // So remove spaces before comparing
            if (formatData != null && formatData.StartsWith("P"))
            {
                actualData = actualData.Replace(" ", "");
            }


            // Assert
            Assert.AreEqual(expectedData, actualData);
        }
        private void CreateConverter(Type inputType,
                                     CsvConverterNumberAttribute oneAttribute,
                                     IDefaultTypeConverterFactory defaultFactory)
        {
            ICsvConverter converter = defaultFactory.CreateConverter(inputType);

            converter.Initialize(oneAttribute, defaultFactory);
            _converterDictionary.Add(inputType, converter);
        }
        public void GetReadData_CannotHandleNonNumericStrings_ThrowsException(string inputData)
        {
            // Arrange
            var attribute = new CsvConverterNumberAttribute();
            var cut       = new CsvConverterDecimalToInt();

            cut.Initialize(attribute, new DefaultTypeConverterFactory());

            // Act
            decimal actual = (decimal)cut.GetReadData(typeof(decimal), inputData, "Column1", 1, 1);

            // Assert
            Assert.Fail("Exception should be thrown when invalid values are passed into the parser!");
        }
        public void GetReadData_CanConvertNonNullableDecimalsWithoutAnAttribute_ValuesConverted(string inputData, int?expected)
        {
            // Arrange
            var attribute = new CsvConverterNumberAttribute();
            var cut       = new CsvConverterDecimalToInt();

            cut.Initialize(attribute, new DefaultTypeConverterFactory());

            // Act
            int actual = (int)cut.GetReadData(typeof(int), inputData, "Column1", 1, 1);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        [DataRow("58.88", 59, true, 2)] // decimal places are IGNORED during reading!
        public void GetReadData_CanRoundToGivenPrecision_NumberRoundedProperly(string inputData, int?expected,
                                                                               bool allowRounding, int numberOfDecimalPlaces)
        {
            // Arrange
            var attribute = new CsvConverterNumberAttribute()
            {
                AllowRounding = allowRounding, NumberOfDecimalPlaces = numberOfDecimalPlaces
            };
            var cut = new CsvConverterDecimalToInt();

            cut.Initialize(attribute, new DefaultTypeConverterFactory());

            // Act
            int actual = (int)cut.GetReadData(typeof(int), inputData, "Column1", 1, 1);

            // Assert
            Assert.AreEqual(expected, actual);
        }
        public void GetReadData_CanCovertStringWithPercentageSign(string inputData, string expected,
                                                                  int numberOfDecimalPlaces)
        {
            // Arrange
            var attribute = new CsvConverterNumberAttribute();

            attribute.NumberOfDecimalPlaces = numberOfDecimalPlaces;

            var classUnderTest = new CsvConverterPercentage();

            classUnderTest.Initialize(attribute, new DefaultTypeConverterFactory());

            decimal expectedResult = decimal.Parse(expected);

            // Act
            var actual = classUnderTest.GetReadData(typeof(decimal), inputData, ColumName, ColumnIndex, RowNumber);

            // Assert
            Assert.AreEqual(expectedResult, actual);
        }