Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions SwiftCSV/Parser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,9 @@ enum Parser {
}

// Append remainder of the cache, unless we're past the limit already.
if !limitReached(rowIndex) {
if !field.isEmpty {
if !limitReached(rowIndex), rowIndex >= offset {
if !field.isEmpty || !fields.isEmpty || !state.atStart {
fields.append(field)
}

if !fields.isEmpty {
try rowCallback(fields)
}
}
Expand Down
37 changes: 37 additions & 0 deletions SwiftCSVTests/FinalEmptyFieldTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import XCTest
@testable import SwiftCSV

class FinalEmptyFieldTests: XCTestCase {
func testTrailingEmptyFieldIsPreservedWithoutNewline() throws {
for suffix in [",", ",\"\"", ",,"] {
let withoutNewline = try Parser.array(text: "value" + suffix, delimiter: .comma)
let withNewline = try Parser.array(text: "value" + suffix + "\n", delimiter: .comma)
XCTAssertEqual(withoutNewline, withNewline)
}
}

func testQuotedEmptySingleFieldIsPreserved() throws {
XCTAssertEqual(try Parser.array(text: "\"\"", delimiter: .comma), [[""]])
let csv = try EnumeratedCSV(string: "header\n\"\"", delimiter: .comma)
XCTAssertEqual(csv.rows, [[""]])
}

func testHeaderAndRowKeepTrailingEmptyColumns() throws {
let csv = try EnumeratedCSV(string: "name,\nAlice,", delimiter: .comma)
XCTAssertEqual(csv.header, ["name", ""])
XCTAssertEqual(csv.rows, [["Alice", ""]])
XCTAssertEqual(csv.serialized, "name,\nAlice,")
}

func testEmptyAndCompletedInputDoNotGainRows() throws {
XCTAssertEqual(try Parser.array(text: "", delimiter: .comma), [])
XCTAssertEqual(try Parser.array(text: " \t", delimiter: .comma), [])
XCTAssertEqual(try Parser.array(text: "value\n", delimiter: .comma), [["value"]])
}

func testOffsetsAndLimitsStillExcludeRows() throws {
XCTAssertEqual(try Parser.array(text: "value", delimiter: .comma, startAt: 1), [])
XCTAssertEqual(try Parser.array(text: "\"\"", delimiter: .comma, rowLimit: 0), [])
XCTAssertEqual(try Parser.array(text: "a\n\"\"", delimiter: .comma, rowLimit: 1), [["a"]])
}
}