private static Dictionary <int, CompetitionRunResult> ImportRunResultsFrom(string path) { DateTime currentTimeUtc = SystemContext.UtcNow(); var imported = new Dictionary <int, CompetitionRunResult>(); using var textReader = new StreamReader(path); var settings = new DelimitedValuesReaderSettings { Culture = Settings.Default.ImportExportCulture }; using var valuesReader = new DelimitedValuesReader(textReader, settings); AssertRequiredColumnsExist(valuesReader); bool hasOptionalColumns = ContainsOptionalColumnNames(valuesReader); foreach (IDelimitedValuesReaderRow row in valuesReader) { try { CompetitionRunResult runResult = GetRunResultFrom(row, hasOptionalColumns, currentTimeUtc); imported[runResult.Competitor.Number] = runResult; } catch (Exception ex) { throw new Exception($"Failed to read import file at row {valuesReader.LineNumber}: {ex.Message}", ex); } } return(imported); }
private static void AssertRequiredColumnsExist(DelimitedValuesReader reader) { List <string> missingColumnNames = RequiredColumnNames.Where(requiredColumnName => !reader.ColumnNames.Contains(requiredColumnName)).ToList(); if (missingColumnNames.Count > 0) { throw new Exception($"Missing column names: {string.Join(", ", missingColumnNames)}."); } }
public void When_source_contains_only_line_breaks_it_should_fail() { // Arrange var source = new StringReader("\n\n"); // Act Action action = () => _ = new DelimitedValuesReader(source); // Assert action.Should().ThrowExactly <DelimitedValuesParseException>().WithMessage("Source contains no columns."); }
public void When_source_contains_single_line_break_it_should_fail() { // Arrange var source = new StringReader("\n"); // Act Action action = () => _ = new DelimitedValuesReader(source); // Assert action.Should().ThrowExactly <DelimitedValuesParseException>().WithMessage("Missing column names on first line."); }
public void When_only_header_has_been_read_it_should_be_positioned_at_first_line() { // Arrange Func <DelimitedValuesReader> construction = () => new DelimitedValuesReaderBuilder().Build(); // Act using DelimitedValuesReader reader = construction(); // Assert reader.LineNumber.Should().Be(1); }
private static Dictionary<int, CompetitionRunResult> ImportRunResultsFrom([NotNull] string path) { DateTime currentTimeUtc = SystemContext.UtcNow(); var imported = new Dictionary<int, CompetitionRunResult>(); using (var textReader = new StreamReader(path)) { var settings = new DelimitedValuesReaderSettings { Culture = Settings.Default.ImportExportCulture }; using (var valuesReader = new DelimitedValuesReader(textReader, settings)) { AssertRequiredColumnsExist(valuesReader); bool hasOptionalColumns = ContainsOptionalColumnNames(valuesReader); foreach (IDelimitedValuesReaderRow row in valuesReader) { try { CompetitionRunResult runResult = GetRunResultFrom(row, hasOptionalColumns, currentTimeUtc); imported[runResult.Competitor.Number] = runResult; } catch (Exception ex) { throw new Exception( $"Failed to read import file at row {valuesReader.LineNumber}: {ex.Message}", ex); } } } } return imported; }
private static bool ContainsOptionalColumnNames(DelimitedValuesReader reader) { return(OptionalColumnNames.All(optionalColumnName => reader.ColumnNames.Contains(optionalColumnName))); }