【C# 】TinyCsvParser 测试程序

3 篇文章 0 订阅

 

/TinyCsvParser 测试/
############################   TinyCsvParser.Test   ##########################
#一、  CsvParser
1.1  CsvParserArrayTest
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;
using TinyCsvParser.Ranges;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class CsvParserArrayTest
    {
        private class Measurement
        {
            public string Id { get; set; }

            public float[] Values { get; set; }
        }

        private class CsvMeasurementMapping : CsvMapping<Measurement>
        {
            public CsvMeasurementMapping()
            {
                MapProperty(0, x => x.Id); //第0列与 Measurement类的ID对应
                MapProperty(new RangeDefinition(1, 2), x => x.Values); //第1-2列与values数组对应
            }
        }

        [Test]
        public void FloatArraysTest()//浮点数组测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(false, ';'); //CSV解析器选项  false:不跳过标题
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });//CSV读取器选项   
            CsvMeasurementMapping csvMapper = new CsvMeasurementMapping();
            CsvParser<Measurement> csvParser = new CsvParser<Measurement>(csvParserOptions, csvMapper); //解析Measurement对象


            var stringBuilder = new StringBuilder()
                .AppendLine("Device1;1.0;2.0")
                .AppendLine("Device2;3.0;4.0");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList(); //从字符串读取数据进行解析 解析结果转为列表

            Assert.AreEqual(2, result.Count); //两条结果

            Assert.IsTrue(result.All(x => x.IsValid));//所有结果有效

            Assert.AreEqual("Device1", result[0].Result.Id); //第一条对象
            Assert.IsNotNull(result[0].Result.Values);//非null
            Assert.AreEqual(2, result[0].Result.Values.Length);//第一条 value数组长度
            Assert.AreEqual(1.0, result[0].Result.Values[0]);//第一条value数组第一个值
            Assert.AreEqual(2.0, result[0].Result.Values[1]);

            Assert.AreEqual("Device2", result[1].Result.Id);//第二条结果ID
            Assert.IsNotNull(result[1].Result.Values); //第二条结果的数组 非null
            Assert.AreEqual(2, result[1].Result.Values.Length);//第二条数组结果
            Assert.AreEqual(3.0, result[1].Result.Values[0]);
            Assert.AreEqual(4.0, result[1].Result.Values[1]);
        }
    }
}

1.2 CsvParserExtensionsTest
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.IO;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class CsvParserExtensionsTest
    {	//每条记录对应的对象类
        private class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public DateTime BirthDate { get; set; } //出生日期
        }
		//Person映射
        private class CsvPersonMapping : CsvMapping<Person>
        {
            public CsvPersonMapping()
            {
                MapProperty(0, x => x.FirstName);//第1列 
                MapProperty(1, x => x.LastName);//第2列
                MapProperty(2, x => x.BirthDate);//第3列
            }
        }


        [Test]
        public void ReadFromFile_null_Test()  // 读取null文件测试,抛出异常
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';', 1, true);//解析器选项:跳过标题,分隔符";",平行度 ,保持顺序
            CsvPersonMapping csvMapper = new CsvPersonMapping();//映射器: Person映射
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);//Person解析器

            Assert.Throws<ArgumentNullException>(() => csvParser.ReadFromFile(null, Encoding.UTF8));//读取null文件
        }

        [Test]
        public void ReadFromFileTest()//读取文件测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';', 1, true);//跳过标题,分隔符";",平行度 ,保持顺序
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate")
                .AppendLine("     Philipp;Wagner;1986/05/12       ")
                .AppendLine("Max;Mustermann;2014/01/01");
#if NETCOREAPP1_1
            var basePath = AppContext.BaseDirectory;//获取程序所在目录
#else 
            var basePath = AppDomain.CurrentDomain.BaseDirectory;//获取程序所在目录
#endif
            var filePath = Path.Combine(basePath, "test_file.txt");//文件路径

            File.WriteAllText(filePath, stringBuilder.ToString(), Encoding.UTF8);//写入文件

            var result = csvParser
                .ReadFromFile(filePath.ToString(), Encoding.UTF8)
                .ToList();//解析文件

            Assert.AreEqual(2, result.Count);//记录条数

            Assert.IsTrue(result.All(x => x.IsValid));//所有记录有效

            Assert.AreEqual("Philipp", result[0].Result.FirstName);// 第一条记录的FirstName属性
            Assert.AreEqual("Wagner", result[0].Result.LastName);

            Assert.AreEqual(1986, result[0].Result.BirthDate.Year);//第一条记录出生日期的年份
            Assert.AreEqual(5, result[0].Result.BirthDate.Month);
            Assert.AreEqual(12, result[0].Result.BirthDate.Day);

            Assert.AreEqual("Max", result[1].Result.FirstName);//第二条记录的FirstName
            Assert.AreEqual("Mustermann", result[1].Result.LastName);
            Assert.AreEqual(2014, result[1].Result.BirthDate.Year);
            Assert.AreEqual(1, result[1].Result.BirthDate.Month);
            Assert.AreEqual(1, result[1].Result.BirthDate.Day);
        }

        [Test]
        public void ReadFromStream_null_Test()//读取null流 抛出ArgumentNullException异常测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';', 1, true);
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            Assert.Throws<ArgumentNullException>(() => csvParser.ReadFromStream(null, Encoding.UTF8));
        }

        [Test]
        public void ReadFromStreamTest()//读取流测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';', 1, true);
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate")
                .AppendLine("     Philipp;Wagner;1986/05/12       ")
                .AppendLine("Max;Mustermann;2014/01/01");
#if NETCOREAPP1_1
            var basePath = AppContext.BaseDirectory;
#else 
            var basePath = AppDomain.CurrentDomain.BaseDirectory;
#endif
            var filePath = Path.Combine(basePath, "test_file.txt");

            File.WriteAllText(filePath, stringBuilder.ToString(), Encoding.UTF8);

            using (var stream = File.OpenRead(filePath))//打开文件,返回文件流
            {
                var result = csvParser
                    .ReadFromStream(stream, Encoding.UTF8)
                    .ToList();//解析文件流

                Assert.AreEqual(2, result.Count);//记录条数

                Assert.IsTrue(result.All(x => x.IsValid));//所有记录有效

                Assert.AreEqual("Philipp", result[0].Result.FirstName);
                Assert.AreEqual("Wagner", result[0].Result.LastName);

                Assert.AreEqual(1986, result[0].Result.BirthDate.Year);
                Assert.AreEqual(5, result[0].Result.BirthDate.Month);
                Assert.AreEqual(12, result[0].Result.BirthDate.Day);

                Assert.AreEqual("Max", result[1].Result.FirstName);
                Assert.AreEqual("Mustermann", result[1].Result.LastName);
                Assert.AreEqual(2014, result[1].Result.BirthDate.Year);
                Assert.AreEqual(1, result[1].Result.BirthDate.Month);
                Assert.AreEqual(1, result[1].Result.BirthDate.Day);
            }
        }
    }
}

1.3 CsvParserTest
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;
using TinyCsvParser.Tokenizer;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class CsvParserTest
    {
        private class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public DateTime BirthDate { get; set; }
        }

        private class CsvPersonMapping : CsvMapping<Person>
        {
            public CsvPersonMapping()
            {
                MapProperty(0, x => x.FirstName);
                MapProperty(1, x => x.LastName);
                MapProperty(2, x => x.BirthDate);
            }
        }

        [Test]
        public void NullInputTest()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';' );
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            Assert.Throws<ArgumentNullException>(() =>
            {
                var result = csvParser.Parse(null);
            });
        }

        [Test]
        public void ToStringTest()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true,  ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            // Make sure the ToString() doesn't throw... 
            Assert.DoesNotThrow(() => csvParser.ToString());

            // TODO Check ToString Output
        }

        [Test]
        public void SkipHeaderTest()//跳过标题
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate") //标题行
                .AppendLine("Philipp;Wagner;1986/05/12")
                .AppendLine("Max;Mustermann;2014/01/01");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();//解析stringBuilder

            Assert.AreEqual(2, result.Count);

            Assert.IsTrue(result.All(x => x.IsValid));

            Assert.AreEqual("Philipp", result[0].Result.FirstName);
            Assert.AreEqual("Wagner", result[0].Result.LastName);

            Assert.AreEqual(1, result[0].RowIndex);
            Assert.AreEqual(1986, result[0].Result.BirthDate.Year);
            Assert.AreEqual(5, result[0].Result.BirthDate.Month);
            Assert.AreEqual(12, result[0].Result.BirthDate.Day);

            Assert.AreEqual("Max", result[1].Result.FirstName);
            Assert.AreEqual("Mustermann", result[1].Result.LastName);

            Assert.AreEqual(2, result[1].RowIndex);
            Assert.AreEqual(2014, result[1].Result.BirthDate.Year);
            Assert.AreEqual(1, result[1].Result.BirthDate.Month);
            Assert.AreEqual(1, result[1].Result.BirthDate.Day);
        }

        [Test]
        public void DoNotSkipHeaderTest()//不跳过标题
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(false, ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("Philipp;Wagner;1986/05/12")//无标题
                .AppendLine("Max;Mustermann;2014/01/01");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual(2, result.Count);

            Assert.IsTrue(result.All(x => x.IsValid));

            Assert.AreEqual("Philipp", result[0].Result.FirstName);
            Assert.AreEqual("Wagner", result[0].Result.LastName);

            Assert.AreEqual(0, result[0].RowIndex);
            Assert.AreEqual(1986, result[0].Result.BirthDate.Year);
            Assert.AreEqual(5, result[0].Result.BirthDate.Month);
            Assert.AreEqual(12, result[0].Result.BirthDate.Day);

            Assert.AreEqual("Max", result[1].Result.FirstName);
            Assert.AreEqual("Mustermann", result[1].Result.LastName);

            Assert.AreEqual(1, result[1].RowIndex);
            Assert.AreEqual(2014, result[1].Result.BirthDate.Year);
            Assert.AreEqual(1, result[1].Result.BirthDate.Month);
            Assert.AreEqual(1, result[1].Result.BirthDate.Day);
        }


        [Test]
        public void EmptyDataTest()//Empty数据测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';'); //跳过标题
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });

            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate");//标题行

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual(0, result.Count);//0条有效数据
        }

        [Test]
        public void TrimLineTest()//Trim 行测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';', 1, true);//跳过标题
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate")//标题行
                .AppendLine("     Philipp;Wagner;1986/05/12       ")//待Trim的行
                .AppendLine("Max;Mustermann;2014/01/01");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual(2, result.Count);//有效数据2

            Assert.IsTrue(result.All(x => x.IsValid));

            Assert.AreEqual("Philipp", result[0].Result.FirstName);
            Assert.AreEqual("Wagner", result[0].Result.LastName);

            Assert.AreEqual(1986, result[0].Result.BirthDate.Year);
            Assert.AreEqual(5, result[0].Result.BirthDate.Month);
            Assert.AreEqual(12, result[0].Result.BirthDate.Day);

            Assert.AreEqual("Max", result[1].Result.FirstName);
            Assert.AreEqual("Mustermann", result[1].Result.LastName);
            Assert.AreEqual(2014, result[1].Result.BirthDate.Year);
            Assert.AreEqual(1, result[1].Result.BirthDate.Month);
            Assert.AreEqual(1, result[1].Result.BirthDate.Day);
        }


        [Test]
        public void ParallelLinqTest()//linq查询测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';', 3, true);//跳过标题
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate")//标题行
                .AppendLine("Philipp;Wagner;1986/05/12")
                .AppendLine("Max;Mustermann;2014/01/01");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .Where(x => x.IsValid)
                .Where(x => x.Result.FirstName == "Philipp") //筛选条件
                .ToList();

            Assert.AreEqual(1, result.Count);//有效数据1

            Assert.AreEqual("Philipp", result[0].Result.FirstName);
            Assert.AreEqual("Wagner", result[0].Result.LastName);

            Assert.AreEqual(1986, result[0].Result.BirthDate.Year);
            Assert.AreEqual(5, result[0].Result.BirthDate.Month);
            Assert.AreEqual(12, result[0].Result.BirthDate.Day);
        }

        [Test]
        public void CommentLineTest()//注释行测试  注释字符串“#”
        {	//跳过标题行  注释字符串“#”    分隔符:new StringSplitTokenizer(new [] {';'}
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, "#", new StringSplitTokenizer(new [] {';'}, false));
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMapping csvMapper = new CsvPersonMapping();
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate")//标题行
                .AppendLine("#Philipp;Wagner;1986/05/12")//注释行
                .AppendLine("Max;Mustermann;2014/01/01");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .Where(x => x.IsValid)
                .ToList();

            Assert.AreEqual(1, result.Count);//有效数据1

            Assert.AreEqual("Max", result[0].Result.FirstName);
            Assert.AreEqual("Mustermann", result[0].Result.LastName);

            Assert.AreEqual(2014, result[0].Result.BirthDate.Year);
            Assert.AreEqual(1, result[0].Result.BirthDate.Month);
            Assert.AreEqual(1, result[0].Result.BirthDate.Day);
        }

        [Test]
        public void StringArrayMappingTest()  //字符串数组映射测试
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(false, ';');//不跳过标题
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvStringArrayMapping csvMapper = new CsvStringArrayMapping();
            CsvParser<string[]> csvParser = new CsvParser<string[]>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("Philipp;Wagner;1986/05/12")
                .AppendLine("Max;Mustermann;2014/01/01");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();//解析

            Assert.AreEqual(2, result.Count); //有效数据2 

            Assert.IsTrue(result.All(x => x.IsValid));

            Assert.AreEqual("Philipp", result[0].Result[0]);
            Assert.AreEqual("Wagner", result[0].Result[1]);
            Assert.AreEqual("1986/05/12", result[0].Result[2]);

            Assert.AreEqual("Max", result[1].Result[0]);
            Assert.AreEqual("Mustermann", result[1].Result[1]);
            Assert.AreEqual("2014/01/01", result[1].Result[2]);
        }
    }
}

1.4 CsvReaderOptionsTests
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class CsvReaderOptionsTests
    {
        [Test]
        public void ToStringTest()
        {
            var csvReaderOptions = new CsvReaderOptions(new string[] { Environment.NewLine });
			//验证委托不会引发异常。
            Assert.DoesNotThrow(() => csvReaderOptions.ToString());
        }
    }
}

1.5  CustomTypeConverterTest 
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;
using TinyCsvParser.TypeConverter;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class TinyCsvParserTest
    {
        private class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public DateTime BirthDate { get; set; }
        }
		//不转换格式
        private class CsvPersonMapping : CsvMapping<Person>
        {
            public CsvPersonMapping()
            {
                MapProperty(0, x => x.FirstName);
                MapProperty(1, x => x.LastName);
                MapProperty(2, x => x.BirthDate);
            }
        }
		//类型转换提供者 进行格式转换
        private class CsvPersonMappingWithTypeConverterProvider : CsvMapping<Person>
        {
            public CsvPersonMappingWithTypeConverterProvider()
                : this(new TypeConverterProvider())
            {
            }
            public CsvPersonMappingWithTypeConverterProvider(ITypeConverterProvider typeConverterProvider)
                : base(typeConverterProvider)
            {
                MapProperty(0, x => x.FirstName);
                MapProperty(1, x => x.LastName);
                MapProperty(2, x => x.BirthDate);
            }
        }
		//自定义 数据格式转换
        private class CsvPersonMappingWithCustomConverter : CsvMapping<Person>
        {
            public CsvPersonMappingWithCustomConverter()
            {
                MapProperty(0, x => x.FirstName);
                MapProperty(1, x => x.LastName);
                MapProperty(2, x => x.BirthDate, new DateTimeConverter("yyyy###MM###dd")); //格式转换
            }
        }


        [Test]
        public void WeirdDateTimeTest_CustomConverterBased()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true,  ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvPersonMappingWithCustomConverter csvMapper = new CsvPersonMappingWithCustomConverter();//自定义格式转换
            CsvParser<Person> csvParser = new CsvParser<Person>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("FirstName;LastName;BirthDate")
                .AppendLine("Philipp;Wagner;1986###05###12"); //自定义时间类型

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual("Philipp", result[0].Result.FirstName);
            Assert.AreEqual("Wagner", result[0].Result.LastName);

            Assert.AreEqual(1986, result[0].Result.BirthDate.Year);
            Assert.AreEqual(5, result[0].Result.BirthDate.Month);
            Assert.AreEqual(12, result[0].Result.BirthDate.Day);
        }
    }
}

1.6 EnumConverterTest   枚举转换测试
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;
using TinyCsvParser.TypeConverter;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class EnumConverterTest
    {	//枚举类型
        private enum VehicleTypeEnum
        {
            Car,
            Bike
        }

        private class Vehicle
        {
            public VehicleTypeEnum VehicleType { get; set; }

            public string Name { get; set; }
        }

        private class CsvVehicleMapping : CsvMapping<Vehicle>
        {
            public CsvVehicleMapping()
            {
                MapProperty(0, x => x.VehicleType, new EnumConverter<VehicleTypeEnum>(true));//枚举转换
                MapProperty(1, x => x.Name);
            }
        }

        [Test]
        public void CustomEnumConverterTest()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvVehicleMapping csvMapper = new CsvVehicleMapping();
            CsvParser<Vehicle> csvParser = new CsvParser<Vehicle>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("VehicleType;Name")
                .AppendLine("Car;Suzuki Swift")
                .AppendLine("Bike;A Bike");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();//解析数据进行枚举类型转换

            Assert.AreEqual(VehicleTypeEnum.Car, result[0].Result.VehicleType);
            Assert.AreEqual("Suzuki Swift", result[0].Result.Name);

            Assert.AreEqual(VehicleTypeEnum.Bike, result[1].Result.VehicleType);//枚举类型转换成功
            Assert.AreEqual("A Bike", result[1].Result.Name);
        }
    }
}

1.7 NapUsing 测试
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class CsvRowMappingTest
    {
        private class MainClass
        {
            public string Property1 { get; set; }

            public SubClass SubClass { get; set; }
        }

        private class SubClass
        {
            public string Property2 { get; set; }

            public string Property3 { get; set; }
        }


        private class CsvMainClassMapping : CsvMapping<MainClass>
        {
            public CsvMainClassMapping()
            {
                MapProperty(0, x => x.Property1);
                MapUsing((entity, values) =>
                {
                    // Example of invalidating the row based on its contents
					//根据内容使行无效的示例
                    if (values.Tokens.Any(t => t == "Z"))
                    {
                        return false;
                    }

                    var subClass = new SubClass();

                    subClass.Property2 = values.Tokens[1];
                    subClass.Property3 = values.Tokens[2];

                    entity.SubClass = subClass;

                    return true;
                });
            }
        }

        [Test]
        public void MapUsingTest()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(false, ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvMainClassMapping csvMapper = new CsvMainClassMapping();
            CsvParser<MainClass> csvParser = new CsvParser<MainClass>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("X;Y;Z")
                .AppendLine("A;B;C");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual(2, result.Count);

            Assert.IsFalse(result[0].IsValid);
            Assert.IsTrue(result[1].IsValid);

            Assert.AreEqual("A", result[1].Result.Property1);

            Assert.IsNotNull(result[1].Result.SubClass);

            Assert.AreEqual("B", result[1].Result.SubClass.Property2);
            Assert.AreEqual("C", result[1].Result.SubClass.Property3);
        }
    }
}


#二、  集成 Integration 
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TinyCsvParser.Test.Integration
{
    public static class MeasurementUtils
    {
        public static void MeasureElapsedTime(string description, Action action)
        {
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = MeasureElapsedTime(action);

            // 格式化并显示 TimeSpan 值。
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);

            TestContext.WriteLine("[{0}] Elapsed Time = {1}", description, elapsedTime);
        }

        public static void MeasureElapsedTime(string description, Action action, Func<TimeSpan, string> timespanFormatter)
        {
            // 获取作为 TimeSpan 值的经过时间。
            TimeSpan ts = MeasureElapsedTime(action);

            string elapsedTime = timespanFormatter(ts);

            TestContext.WriteLine("[{0}] Elapsed Time = {1}", description, elapsedTime);
        }



        private static TimeSpan MeasureElapsedTime(Action action)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            action();
            stopWatch.Stop();

            return stopWatch.Elapsed;
        }

    }
}


#三、 Examples
3.1 DoubleConverterTest 
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NUnit.Framework;
using System;
using System.Globalization;
using System.Linq;
using System.Text;
using TinyCsvParser.Mapping;
using TinyCsvParser.TypeConverter;

namespace TinyCsvParser.Test.CsvParser
{
    [TestFixture]
    public class DoubleConverterTest
    {
        private class Entity
        {
            public double? Value { get; set; }//double 类型 
        }

        private class CsvEntityMapping : CsvMapping<Entity>
        {
            public CsvEntityMapping()
            {
                MapProperty(0, x => x.Value, new NullableDoubleConverter(new CultureInfo("de-DE")));//zh-CN
            }
        }

        [Test]
        public void ParseWithNULLStringTest()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(false,  ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            CsvEntityMapping csvMapper = new CsvEntityMapping();
            CsvParser<Entity> csvParser = new CsvParser<Entity>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("123,456");

            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual(123.456, result[0].Result.Value);
        }
    }
}


3.2 PolymorphismWithMapUsingTest 
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Linq;
using System.Text;
using NUnit.Framework;
using TinyCsvParser.Mapping;
using TinyCsvParser.Model;

namespace TinyCsvParser.Test.Examples
{
    [TestFixture]
    public class PolymorphismWithMapUsingTest
    {
        private class MyCsvRowEntity
        {
            public string ShapeName { get; set; }

            public Shape Shape { get; set; }
        }

        private abstract class Shape  {}

        private class Square : Shape
        {
            public int Width { get; set; }
        }

        private class Triangle : Shape
        {
            public int Side1 { get; set; }
            public int Side2 { get; set; }
            public int Side3 { get; set; }
        }

        private class MainMapping : CsvMapping<MyCsvRowEntity>
        {
            private readonly SquareMapping squareMap = new SquareMapping();
            private readonly TriangleMapping triangleMap = new TriangleMapping();

            public MainMapping()
            {
                MapProperty(0, x => x.ShapeName);
                MapUsing(ShapeMapper);  // You could also do this with an inline Lambda here...
            }

            private bool ShapeMapper(MyCsvRowEntity inProgressEntity, TokenizedRow rowData)
            {
                // NOTE: Be defensive and validate every piece of data you consume,
                // don't do things that will raise exceptions. (This same rule would
                // apply with any TypeConverter you write)... This gets called for
                // every row in your csv; if exceptions get raised within the loop
                // EVEN if you catch them), your performance will suffer dramatically!


                // We could also check this with tokens[0], but since we already mapped
                // it via MapProperty, we'll use the value on the entity that we're in
                // the process of building.
                if (inProgressEntity.ShapeName == "square")
                {
                    var subMap = squareMap.Map(rowData);
                    if (subMap.IsValid)
                    {
                        inProgressEntity.Shape = subMap.Result;
                    }

                    return subMap.IsValid;
                }

                if (inProgressEntity.ShapeName == "triangle")
                {
                    var subMap = triangleMap.Map(rowData);
                    if (subMap.IsValid)
                    {
                        inProgressEntity.Shape = subMap.Result;
                    }

                    return subMap.IsValid;
                }
                
                // NOTE: There are two possible strategies here. One, you can return true
                // which will allow any *OTHER* Row Mappings to run and see if they can make
                // sense of the data from this row. Maybe you have a whole separate mapper
                // for Circles & Ellipses, etc. Alternatively, you can return false, which
                // will cause this row to be marked as Invalid, SKIP any other Row Mappings,
                // and allow parsing to continue to subsequent rows.

                return false;
            }
        }

        
        // NOTE: These "sub" maps aren't referenced directly by the CsvParser, but instead
        // by the top-level map, which conditionally uses them based on the contents of a
        // given row.

        private class SquareMapping : CsvMapping<Square>
        {
            public SquareMapping()
            {
                MapProperty(1, s => s.Width);
            }
        }

        private class TriangleMapping : CsvMapping<Triangle>
        {
            public TriangleMapping()
            {
                MapProperty(1, s => s.Side1);
                MapProperty(2, s => s.Side2);
                MapProperty(3, s => s.Side3);
            }
        }



        [Test]
        public void MapUsingPolymorphicTest()
        {
            CsvParserOptions csvParserOptions = new CsvParserOptions(false, ';');
            CsvReaderOptions csvReaderOptions = new CsvReaderOptions(new[] { Environment.NewLine });
            MainMapping csvMapper = new MainMapping();

            CsvParser<MyCsvRowEntity> csvParser = new CsvParser<MyCsvRowEntity>(csvParserOptions, csvMapper);

            var stringBuilder = new StringBuilder()
                .AppendLine("square;10")
                .AppendLine("triangle;3;4;5")
                .AppendLine("circle;7")         // not handled, default return of false from the MapUsing delegate will fail this.
                .AppendLine("triangle;13;2");   // not enough sides, this will fail.


            var result = csvParser
                .ReadFromString(csvReaderOptions, stringBuilder.ToString())
                .ToList();

            Assert.AreEqual(4, result.Count);

            Assert.IsTrue(result[0].IsValid);
            Assert.IsTrue(result[1].IsValid);
            Assert.IsFalse(result[2].IsValid);
            Assert.IsFalse(result[3].IsValid);

            Assert.AreEqual("square", result[0].Result.ShapeName);
            Assert.AreEqual(typeof(Square), result[0].Result.Shape.GetType());
            Assert.AreEqual(10, ((Square) result[0].Result.Shape).Width);

            Assert.AreEqual("triangle", result[1].Result.ShapeName);
            Assert.AreEqual(typeof(Triangle), result[1].Result.Shape.GetType());
            Assert.AreEqual(3, ((Triangle) result[1].Result.Shape).Side1);
            Assert.AreEqual(4, ((Triangle) result[1].Result.Shape).Side2);
            Assert.AreEqual(5, ((Triangle) result[1].Result.Shape).Side3);

        }


    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值