From bd03ad3eb9e0d96407a85f875f7cbc33b3c251da Mon Sep 17 00:00:00 2001 From: NinjaCodes Date: Sun, 1 Sep 2019 00:47:01 +0100 Subject: [PATCH] - Refactor engine to align parsers --- README.md | 18 +-- src/Ninja.FileUtil/Engine.cs | 107 +++++++----------- src/Ninja.FileUtil/File.cs | 8 +- src/Ninja.FileUtil/Ninja.FileUtil.csproj | 4 +- src/Ninja.FileUtil/Parser/Extensions.cs | 20 ++-- src/Ninja.FileUtil/Parser/ILineParser.cs | 5 +- src/Ninja.FileUtil/Parser/Impl/LineParser.cs | 20 ++-- .../Engine/MultiDelimited/EngineFixture.cs | 30 ++--- .../Engine/SingleDelimited/EngineFixture.cs | 9 +- .../Ninja.FileUtil.Tests.csproj | 6 +- .../Parser/LineParserFixture.cs | 52 ++++----- test/Ninja.FileUtil.Tests/Parser/TestLine.cs | 13 +++ 12 files changed, 138 insertions(+), 154 deletions(-) diff --git a/README.md b/README.md index f9b8220..e97f284 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ FileLine base class has an index property that holds the index of the parsed lin Once you have created the line class it is as simple as calling the Engine.GetFile() method as follows > - `var files = new Engine(configSettings).GetFiles();` + `var files = new Engine(configSettings).GetFiles();` The engine will parse the files found at the specified folder location and return a collection of `File` objects ie. one for each file parsed with an array of strongly typed lines (in this case Employee[]). @@ -188,7 +188,7 @@ ie one for the header, footer and data line respectively. We continue by creating two extra classes HeaderLine and FooterLine as follows. - public class HeaderLine : FileLine + public class Header : FileLine { [Column(0)] public string Name { get; set; } @@ -205,9 +205,9 @@ We continue by creating two extra classes HeaderLine and FooterLine as follows. To parse the file you call the GetFiles() Method as follows - > -`var files = new Engine(configSettings).GetFiles();` +`var files = new Engine(configSettings).GetFiles();` -The engine will parse the files and return a collection of `File` objects +The engine will parse the files and return a collection of `File` objects ie. one for each file parsed with strongly typed header, footer and data line arrays. @@ -243,9 +243,9 @@ An example dummy implementation is as follows You can pass the custom provider to the engine as follows - - `var files = new Engine(configSettings, new CustomProvider()).GetFiles();` + `var files = new Engine(configSettings, new CustomProvider()).GetFiles();` - `var files = new Engine(configSettings, new CustomProvider()).GetFiles();` + `var files = new Engine(configSettings, new CustomProvider()).GetFiles();` Returns ``` @@ -258,15 +258,15 @@ public class File /// /// Parsed header lines. /// - public TH[] Headers { get; set; } + public TH Header { get; set; } /// /// Parsed data lines. /// public TD[] Data { get; set; } /// - /// Parsed footer lines. + /// Parsed footer line. /// - public TF[] Footers { get; set; } + public TF Footer { get; set; } } ``` diff --git a/src/Ninja.FileUtil/Engine.cs b/src/Ninja.FileUtil/Engine.cs index 152573c..b51f637 100644 --- a/src/Ninja.FileUtil/Engine.cs +++ b/src/Ninja.FileUtil/Engine.cs @@ -7,39 +7,43 @@ namespace Ninja.FileUtil { - public class Engine where T : FileLine, new() + public class Engine { private readonly IFileProvider fileProvider; private readonly ILineParser lineParser; - internal Engine(IFileProvider fileProvider, ILineParser lineParser) + internal Engine(ILineParser lineParser, IFileProvider fileProvider) { this.fileProvider = fileProvider; this.lineParser = lineParser; } + /// - /// Create Single line type Engine instance with default parser. + /// Create Engine instance with default parser and file provider. /// - /// Parser setting instance. - /// File provider instance. - public Engine(IParserSettings parserSettings, IFileProvider fileProvider) - : this(fileProvider, new LineParser(parserSettings.Delimiter)) + /// + /// You need to provide the parser and file provider settings. + /// + /// Configuration settings for default file provider and parser + public Engine(IConfigSettings settings) + : this(new LineParser(settings.ParserSettings), new DefaulProvider(settings.ProviderSettings, new FileHelper())) { } + /// - /// Create Multi line type Engine instance with default parser and default file provider. + /// Create Engine instance with custom file provider and default parser. /// - /// Configuration settings for default file provider and default parser - public Engine(IConfigSettings settings) - : this(settings.ParserSettings, new DefaulProvider(settings.ProviderSettings, new FileHelper())) + /// Parser settings. + /// Custom file provider instance. + public Engine(IParserSettings parserSettings, IFileProvider fileProvider) + : this(new LineParser(parserSettings), fileProvider) { - + } - /// /// Get all single fixed format lines from a text file parsed into a strongly typed array - /// Default delimiter is '|' + /// Default delimiter is '|'. Override by specifying the delimiter in parser settings. /// Example File - /// "John Walsh|456RT4|True|Male" /// "Simone Walsh|456RT5|True|Female" @@ -48,64 +52,30 @@ public Engine(IConfigSettings settings) /// /// Collection of Files each parsed with typed class arrays /// - public File[] GetFiles() + public File[] GetFiles() where T : FileLine, new() { var files = fileProvider.GetFiles(); return files.Select(file => new File - { - FileMeta = new FileMeta { - FileName = file.FileName, - FilePath = file.FilePath, - FileSize = file.FileSize, - Lines = file.Lines, - }, - - Data = lineParser.ParseWithNoLineType(file.Lines) - }) - .ToArray(); - } - } - - public class Engine where TH : FileLine, new() - where TD : FileLine, new() - where TF : FileLine, new() - { - private readonly IFileProvider fileProvider; - private readonly ILineParser lineParser; - private readonly IParserSettings parserSettings; - - internal Engine(IFileProvider fileProvider, ILineParser lineParser) - { - this.fileProvider = fileProvider; - this.lineParser = lineParser; - } - /// - /// Create Multi line type Engine instance with default parser. - /// - /// Parser setting instance. - /// File provider instance. - public Engine(IParserSettings parserSettings, IFileProvider fileProvider) - : this(fileProvider, new LineParser(parserSettings.Delimiter)) - { - this.parserSettings = parserSettings; - } - - /// - /// Create Multi line type Engine instance with default parser and default file provider. - /// - /// Configuration settings for default file provider and default parser - public Engine(IConfigSettings settings) - : this(settings.ParserSettings, new DefaulProvider(settings.ProviderSettings, new FileHelper())) - { + FileMeta = new FileMeta + { + FileName = file.FileName, + FilePath = file.FilePath, + FileSize = file.FileSize, + Lines = file.Lines, + }, + Data = lineParser.Parse(file.Lines) + }) + .ToArray(); } /// /// Get all multi-format lines from a text file parsed into header, data and footer /// typed arrays respectively. - /// Header line starts with H, data line starts with D and - /// footer line starts with F by defaults + /// Default delimiter is '|'. + /// By default, Header line starts with H, data line starts with D and footer line starts with F. + /// Override these values in parser settings. /// Example File - /// "H|22-10-2016|Employee Status" /// "D|John Walsh|456RT4|True" @@ -118,8 +88,11 @@ public Engine(IConfigSettings settings) /// /// Collection of Files each parsed with header, footer and data typed arrays /// - public File[] GetFiles() - { + public File[] GetFiles() + where TH : FileLine, new() + where TD : FileLine, new() + where TF : FileLine, new() + { var files = fileProvider.GetFiles(); return files.Select(file => @@ -134,9 +107,9 @@ public File[] GetFiles() Lines = file.Lines, }, - Headers = lineParser.ParseWithLineType(file.Lines.Where(x => x.StartsWith(parserSettings.LineHeaders.GetHeaderValue())).ToArray(), LineType.Header), - Footers = lineParser.ParseWithLineType(file.Lines.Where(x => x.StartsWith(parserSettings.LineHeaders.GetFooterValue())).ToArray(), LineType.Footer), - Data = lineParser.ParseWithLineType(file.Lines.Where(x => x.StartsWith(parserSettings.LineHeaders.GetDataValue())).ToArray(), LineType.Data) + Header = lineParser.Parse(file.Lines, LineType.Header).FirstOrDefault(), + Footer = lineParser.Parse(file.Lines, LineType.Footer).FirstOrDefault(), + Data = lineParser.Parse(file.Lines, LineType.Data) }; return parsed; diff --git a/src/Ninja.FileUtil/File.cs b/src/Ninja.FileUtil/File.cs index 834656c..c2232da 100644 --- a/src/Ninja.FileUtil/File.cs +++ b/src/Ninja.FileUtil/File.cs @@ -22,17 +22,17 @@ public class File where T: FileLine /// public FileMeta FileMeta { get; set; } /// - /// Parsed header lines. + /// Parsed header line. /// - public TH[] Headers { get; set; } + public TH Header { get; set; } /// /// Parsed data lines. /// public TD[] Data { get; set; } /// - /// Parsed footer lines. + /// Parsed footer line. /// - public TF[] Footers { get; set; } + public TF Footer { get; set; } } public class FileMeta diff --git a/src/Ninja.FileUtil/Ninja.FileUtil.csproj b/src/Ninja.FileUtil/Ninja.FileUtil.csproj index b458819..4932366 100644 --- a/src/Ninja.FileUtil/Ninja.FileUtil.csproj +++ b/src/Ninja.FileUtil/Ninja.FileUtil.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 Public @@ -16,6 +16,6 @@ Example: pipe delimited, csv, etc. Fixed Width File Parser https://github.com/NinjaRocks/FileUtil.Core https://1drv.ms/u/s!Aq_ncig7TU4551b5fzxOad-pDMfL - 1.0.4 + 1.1.0 \ No newline at end of file diff --git a/src/Ninja.FileUtil/Parser/Extensions.cs b/src/Ninja.FileUtil/Parser/Extensions.cs index e487618..8aa59e7 100644 --- a/src/Ninja.FileUtil/Parser/Extensions.cs +++ b/src/Ninja.FileUtil/Parser/Extensions.cs @@ -23,17 +23,17 @@ public static char GetValue(this IDelimiter delimiter) return delimiter?.Value ?? ','; } - public static string GetHeaderValue(this ILineHeaders lineHeaders) + public static string GetLineHead(this ILineHeaders lineHeaders, LineType type) { - return lineHeaders?.Header ?? "H"; - } - public static string GetFooterValue(this ILineHeaders lineHeaders) - { - return lineHeaders?.Footer ?? "F"; - } - public static string GetDataValue(this ILineHeaders lineHeaders) - { - return lineHeaders?.Data ?? "D"; + switch (type) + { + case LineType.Header: + return lineHeaders?.Header ?? "H"; + case LineType.Footer: + return lineHeaders?.Footer ?? "F"; + default: + return lineHeaders?.Data ?? "D"; + } } } } \ No newline at end of file diff --git a/src/Ninja.FileUtil/Parser/ILineParser.cs b/src/Ninja.FileUtil/Parser/ILineParser.cs index 85e4fb3..9d6843f 100644 --- a/src/Ninja.FileUtil/Parser/ILineParser.cs +++ b/src/Ninja.FileUtil/Parser/ILineParser.cs @@ -2,8 +2,7 @@ namespace Ninja.FileUtil.Parser { internal interface ILineParser { - T[] ParseWithNoLineType(string[] lines) where T : IFileLine, new(); - T[] ParseWithLineType(string[] lines, LineType type) where T : IFileLine, new(); + T[] Parse(string[] lines) where T : IFileLine, new(); + T[] Parse(string[] lines, LineType type) where T : IFileLine, new(); } - } \ No newline at end of file diff --git a/src/Ninja.FileUtil/Parser/Impl/LineParser.cs b/src/Ninja.FileUtil/Parser/Impl/LineParser.cs index 46fb7d0..7412256 100644 --- a/src/Ninja.FileUtil/Parser/Impl/LineParser.cs +++ b/src/Ninja.FileUtil/Parser/Impl/LineParser.cs @@ -6,33 +6,33 @@ using System.Threading.Tasks; using Ninja.FileUtil.Configuration; - namespace Ninja.FileUtil.Parser.Impl { internal class LineParser : ILineParser { - private readonly IDelimiter delimiter; + private readonly IParserSettings parserSettings; - public LineParser(IDelimiter delimiter) + public LineParser(IParserSettings parserSettings) { - this.delimiter = delimiter; + this.parserSettings = parserSettings; } - public T[] ParseWithNoLineType(string[] lines) where T : IFileLine, new() + public T[] Parse(string[] lines) where T : IFileLine, new() { return Parse(lines, LineType.Data, false); - } - public T[] ParseWithLineType(string[] lines, LineType type) where T : IFileLine, new() + public T[] Parse(string[] lines, LineType type) where T : IFileLine, new() { - return Parse(lines, type, true); + var filteredLines = lines?.Where(x => x.StartsWith(parserSettings.LineHeaders.GetLineHead(type))).ToArray(); + return Parse(filteredLines, type, true); } private T[] Parse(string[] lines, LineType type, bool hasLineHeader) where T : IFileLine, new() { - if (lines == null || lines.Length == 0) return Enumerable.Empty().ToArray(); + if (lines == null || lines.Length == 0) + return Enumerable.Empty().ToArray(); var list = new T[lines.Length]; @@ -147,7 +147,7 @@ public LineParser(IDelimiter delimiter) private string[] GetDelimiterSeparatedValues(string line) { - var values = line.Split(delimiter.GetValue()) + var values = line.Split(parserSettings.Delimiter.GetValue()) .Select(x => !string.IsNullOrWhiteSpace(x)? x.Trim(): x) .ToArray(); return values; diff --git a/test/Ninja.FileUtil.Tests/Engine/MultiDelimited/EngineFixture.cs b/test/Ninja.FileUtil.Tests/Engine/MultiDelimited/EngineFixture.cs index 4d2f143..7bc24e3 100644 --- a/test/Ninja.FileUtil.Tests/Engine/MultiDelimited/EngineFixture.cs +++ b/test/Ninja.FileUtil.Tests/Engine/MultiDelimited/EngineFixture.cs @@ -12,7 +12,7 @@ public class EngineFixture private Mock provider; private Mock configuration; private Mock delimiter; - private Engine engine; + private FileUtil.Engine engine; [SetUp] public void Setup() @@ -26,13 +26,13 @@ public void Setup() configuration.Setup(x => x.LineHeaders.Data).Returns("D"); configuration.Setup(x => x.LineHeaders.Footer).Returns("F"); - engine = new Engine(configuration.Object, provider.Object); + engine = new FileUtil.Engine(configuration.Object, provider.Object); } [Test] public void TestGetFilesForNoFileFromProviderShouldReturnEmptyCollection() { - Assert.IsEmpty(engine.GetFiles()); + Assert.IsEmpty(engine.GetFiles()); } [Test] @@ -49,7 +49,7 @@ public void TestGetFilesForFileReceivedFromProviderShouldReturnEmptyCollection() provider.Setup(x => x.GetFiles()).Returns(new[] { fileMeta }); - var parsedfiles = engine.GetFiles(); + var parsedfiles = engine.GetFiles(); Assert.IsNotEmpty(parsedfiles); Assert.That(parsedfiles[0].FileMeta.FileName, Is.EqualTo(fileMeta.FileName)); @@ -57,13 +57,13 @@ public void TestGetFilesForFileReceivedFromProviderShouldReturnEmptyCollection() Assert.That(parsedfiles[0].FileMeta.FileSize, Is.EqualTo(fileMeta.FileSize)); Assert.That(parsedfiles[0].FileMeta.Lines, Is.EqualTo(fileMeta.Lines)); - Assert.IsAssignableFrom(parsedfiles[0].Headers[0]); + Assert.IsAssignableFrom(parsedfiles[0].Header); - Assert.That(parsedfiles[0].Headers[0].Index, Is.EqualTo(0)); - Assert.That(parsedfiles[0].Headers[0].Type, Is.EqualTo(LineType.Header)); - Assert.IsEmpty(parsedfiles[0].Headers[0].Errors); - Assert.That(parsedfiles[0].Headers[0].Date, Is.EqualTo(date)); - Assert.That(parsedfiles[0].Headers[0].Name, Is.EqualTo("Employee Status")); + Assert.That(parsedfiles[0].Header.Index, Is.EqualTo(0)); + Assert.That(parsedfiles[0].Header.Type, Is.EqualTo(LineType.Header)); + Assert.IsEmpty(parsedfiles[0].Header.Errors); + Assert.That(parsedfiles[0].Header.Date, Is.EqualTo(date)); + Assert.That(parsedfiles[0].Header.Name, Is.EqualTo("Employee Status")); Assert.IsAssignableFrom(parsedfiles[0].Data[0]); @@ -76,13 +76,13 @@ public void TestGetFilesForFileReceivedFromProviderShouldReturnEmptyCollection() Assert.That(parsedfiles[0].Data[0].Reference, Is.EqualTo("456RT4")); Assert.That(parsedfiles[0].Data[0].InService, Is.EqualTo(true)); - Assert.IsAssignableFrom(parsedfiles[0].Footers[0]); + Assert.IsAssignableFrom(parsedfiles[0].Footer); - Assert.That(parsedfiles[0].Footers[0].Index, Is.EqualTo(0)); - Assert.That(parsedfiles[0].Footers[0].Type, Is.EqualTo(LineType.Footer)); - Assert.IsEmpty(parsedfiles[0].Footers[0].Errors); + Assert.That(parsedfiles[0].Footer.Index, Is.EqualTo(0)); + Assert.That(parsedfiles[0].Footer.Type, Is.EqualTo(LineType.Footer)); + Assert.IsEmpty(parsedfiles[0].Footer.Errors); - Assert.That(parsedfiles[0].Footers[0].TotalRecords, Is.EqualTo(1)); + Assert.That(parsedfiles[0].Footer.TotalRecords, Is.EqualTo(1)); } } } diff --git a/test/Ninja.FileUtil.Tests/Engine/SingleDelimited/EngineFixture.cs b/test/Ninja.FileUtil.Tests/Engine/SingleDelimited/EngineFixture.cs index b270b2f..730f515 100644 --- a/test/Ninja.FileUtil.Tests/Engine/SingleDelimited/EngineFixture.cs +++ b/test/Ninja.FileUtil.Tests/Engine/SingleDelimited/EngineFixture.cs @@ -11,7 +11,7 @@ public class EngineFixture private Mock provider; private Mock configuration; private Mock delimiter; - private Engine engine; + private FileUtil.Engine engine; [SetUp] public void Setup() @@ -21,13 +21,13 @@ public void Setup() delimiter = new Mock(); delimiter.Setup(x => x.Value).Returns('|'); configuration.Setup(x => x.Delimiter).Returns(delimiter.Object); - engine = new Engine(configuration.Object, provider.Object); + engine = new FileUtil.Engine(configuration.Object, provider.Object); } [Test] public void TestGetFilesForNoFileFromProviderShouldReturnEmptyCollection() { - Assert.IsEmpty(engine.GetFiles()); + Assert.IsEmpty(engine.GetFiles()); } [Test] @@ -43,7 +43,7 @@ public void TestGetFilesForFileReceivedFromProviderShouldReturnEmptyCollection() provider.Setup(x => x.GetFiles()).Returns(new[] { fileMeta }); - var parsedfiles = engine.GetFiles(); + var parsedfiles = engine.GetFiles(); Assert.IsNotEmpty(parsedfiles); Assert.That(parsedfiles[0].FileMeta.FileName, Is.EqualTo(fileMeta.FileName)); @@ -69,7 +69,6 @@ public void TestGetFilesForFileReceivedFromProviderShouldReturnEmptyCollection() Assert.That(parsedfiles[0].Data[1].Name, Is.EqualTo("Samuel Dias")); Assert.That(parsedfiles[0].Data[1].IsMember, Is.EqualTo(true)); - } } } diff --git a/test/Ninja.FileUtil.Tests/Ninja.FileUtil.Tests.csproj b/test/Ninja.FileUtil.Tests/Ninja.FileUtil.Tests.csproj index 9a21c7f..3d209e0 100644 --- a/test/Ninja.FileUtil.Tests/Ninja.FileUtil.Tests.csproj +++ b/test/Ninja.FileUtil.Tests/Ninja.FileUtil.Tests.csproj @@ -6,9 +6,9 @@ - - - + + + diff --git a/test/Ninja.FileUtil.Tests/Parser/LineParserFixture.cs b/test/Ninja.FileUtil.Tests/Parser/LineParserFixture.cs index 65ecab8..b286c03 100644 --- a/test/Ninja.FileUtil.Tests/Parser/LineParserFixture.cs +++ b/test/Ninja.FileUtil.Tests/Parser/LineParserFixture.cs @@ -1,7 +1,6 @@ using Moq; using Ninja.FileUtil.Configuration; using Ninja.FileUtil.Parser.Impl; -using Ninja.FileUtil.Tests.Configuration; using NUnit.Framework; namespace Ninja.FileUtil.Tests.Parser @@ -10,24 +9,25 @@ namespace Ninja.FileUtil.Tests.Parser class LineParserFixture { private Mock configuration; - private Mock delimiter; private LineParser parser; [SetUp] public void Setup() { configuration = new Mock(); - delimiter = new Mock(); - configuration.Setup(x => x.Delimiter).Returns(delimiter.Object); - delimiter.Setup(x => x.Value).Returns('|'); - parser = new LineParser(delimiter.Object); + + configuration.Setup(x => x.Delimiter.Value).Returns('|'); + configuration.Setup(x => x.LineHeaders.Header).Returns("H"); + configuration.Setup(x => x.LineHeaders.Data).Returns("D"); + configuration.Setup(x => x.LineHeaders.Footer).Returns("F"); + parser = new LineParser(configuration.Object); } [Test] public void TestParseForNullInputShouldReturnEmptyArray() { - Assert.IsEmpty(parser.ParseWithNoLineType(null)); - Assert.IsEmpty(parser.ParseWithLineType(null, LineType.Data)); + Assert.IsEmpty(parser.Parse(null)); + Assert.IsEmpty(parser.Parse(null, LineType.Data)); } [Test] @@ -38,19 +38,20 @@ public void TestParseWithLineHeaderInputShouldReturnCorrectlyParsedArray() "D|Bob Marley|True", "D|John Walsh|False" }; - var prsed = parser.ParseWithLineType(lines, LineType.Data); + + var parsed = parser.Parse(lines, LineType.Data); - Assert.That(prsed.Length, Is.EqualTo(2)); + Assert.That(parsed.Length, Is.EqualTo(2)); - Assert.That(prsed[0].Name, Is.EqualTo("Bob Marley")); - Assert.That(prsed[0].IsMember, Is.EqualTo(true)); - Assert.That(prsed[0].Type, Is.EqualTo(LineType.Data)); - Assert.IsEmpty(prsed[0].Errors); + Assert.That(parsed[0].Name, Is.EqualTo("Bob Marley")); + Assert.That(parsed[0].IsMember, Is.EqualTo(true)); + Assert.That(parsed[0].Type, Is.EqualTo(LineType.Data)); + Assert.IsEmpty(parsed[0].Errors); - Assert.That(prsed[1].Name, Is.EqualTo("John Walsh")); - Assert.That(prsed[1].IsMember, Is.EqualTo(false)); - Assert.That(prsed[1].Type, Is.EqualTo(LineType.Data)); - Assert.IsEmpty(prsed[1].Errors); + Assert.That(parsed[1].Name, Is.EqualTo("John Walsh")); + Assert.That(parsed[1].IsMember, Is.EqualTo(false)); + Assert.That(parsed[1].Type, Is.EqualTo(LineType.Data)); + Assert.IsEmpty(parsed[1].Errors); } [Test] @@ -61,7 +62,7 @@ public void TestParseWithNoLineHeaderInputShouldReturnCorrectlyParsedArray() "Bob Marley|True", "John Walsh|False" }; - var prsed = parser.ParseWithNoLineType(lines); + var prsed = parser.Parse(lines); Assert.That(prsed.Length, Is.EqualTo(2)); @@ -82,24 +83,23 @@ public void TestParseWithNoLineHeaderInputShouldReturnCorrectlyParsedArray() [TestCase("H|hbtrb|ej ef|fer|rc |", true)] public void TestParseForInvalidInputShouldReturnError(string line, bool hasLineType) { - if (!hasLineType) parser = new LineParser(new TestFullConfig('|').Delimiter); + if (!hasLineType) parser = new LineParser(configuration.Object); var result = hasLineType - ? parser.ParseWithNoLineType(new[] {line}) - : parser.ParseWithLineType(new[] {line}, LineType.Header); + ? parser.Parse(new[] {line}) + : parser.Parse(new[] {line}, LineType.Header); Assert.IsNotEmpty(result[0].Errors); } - [Test] + [Test] public void TestParseForInvalidFileLineWithNoColumnAttributesShouldReturnError() { - - var result = parser.ParseWithLineType(new[] { "edndx|medmd" }, LineType.Data); + var result = parser.Parse(new[] { "D|edndx|medmd" }, LineType.Data); Assert.IsNotEmpty(result[0].Errors); - result = parser.ParseWithNoLineType(new[] { "edndx|medmd" }); + result = parser.Parse(new[] { "edndx|medmd" }); Assert.IsNotEmpty(result[0].Errors); } diff --git a/test/Ninja.FileUtil.Tests/Parser/TestLine.cs b/test/Ninja.FileUtil.Tests/Parser/TestLine.cs index 13fd8fd..5471e14 100644 --- a/test/Ninja.FileUtil.Tests/Parser/TestLine.cs +++ b/test/Ninja.FileUtil.Tests/Parser/TestLine.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace Ninja.FileUtil.Tests.Parser @@ -18,5 +19,17 @@ public TestLine() [Column(1)] public bool IsMember { get; set; } } + public class FooterLine : FileLine + { + [Column(0)] + public int TotalRecords { get; set; } + } + public class HeaderLine : FileLine + { + [Column(0)] + public string Report { get; set; } + [Column(1)] + public DateTime Date { get; set; } + } } \ No newline at end of file