public void ReadCsv_ClassWithNullableCompositeStruct_ObjectsWithNullValues() { var serializer = new CsvSerializerContext() { ThrowOnFailedDeserialize = false }; var converter = new SingleNullableStructValueCsvConverter(); serializer.Converters.Add(converter); serializer.Converters.Add(new CompositeStructCsvConverter()); string[] csv = new string[] { "ValueId,ValueDuration", // header "1,15.24", // first record ",", // second empty record "2,-99.24", // third record "" // empty line after the last record }; List <SingleNullableStructValue> result = new List <SingleNullableStructValue>(); using (var source = new StringReader(String.Join(Environment.NewLine, csv))) using (var reader = new CsvReader(source, serializer.Configuration)) { var naming = new CsvHeaderNamingContext(); if (reader.Read()) { converter.ReadCsvHeader(reader, serializer); } while (reader.Read()) { result.Add((SingleNullableStructValue)converter.ReadCsv(reader, typeof(SingleNullableStructValue), serializer, naming)); } } Assert.AreEqual(3, result.Count); Assert.IsNotNull(result[0]); Assert.IsTrue(result[0].Value.HasValue); Assert.AreEqual(1, result[0].Value.Value.Id); Assert.AreEqual(15.24, result[0].Value.Value.Duration); Assert.IsNotNull(result[1]); Assert.IsFalse(result[1].Value.HasValue); Assert.IsNotNull(result[2]); Assert.IsTrue(result[2].Value.HasValue); Assert.AreEqual(2, result[2].Value.Value.Id); Assert.AreEqual(-99.24, result[2].Value.Value.Duration); }
public void WriteCsv_ClassWithNullableCompositeStruct_RecordsWithNullValues() { var serializer = new CsvSerializerContext(); var converter = new SingleNullableStructValueCsvConverter(); serializer.Converters.Add(converter); serializer.Converters.Add(new CompositeStructCsvConverter()); var target = new StringWriter(); var writer = new CsvWriter(target, serializer.Configuration); converter.WriteCsvHeader(writer, typeof(SingleNullableStructValue), serializer, new CsvHeaderNamingContext()); writer.NextRecord(); converter.WriteCsv(new SingleNullableStructValue() { Value = new CompositeStruct() { Id = 1, Duration = 15.24 } }, writer, serializer); writer.NextRecord(); converter.WriteCsv(new SingleNullableStructValue() { Value = null }, writer, serializer); writer.NextRecord(); converter.WriteCsv(new SingleNullableStructValue() { Value = new CompositeStruct() { Id = 2, Duration = -99.24 } }, writer, serializer); writer.NextRecord(); writer.Dispose(); target.Close(); string[] expected = new string[] { "ValueId,ValueDuration", // header "1,15.24", // first record ",", // second empty record "2,-99.24", // third record "" // empty line after the last record }; Assert.AreEqual(String.Join(Environment.NewLine, expected), target.ToString()); }