Test code cleanup
This commit is contained in:
parent
acc4be2a35
commit
479913f0f0
|
@ -11,17 +11,23 @@
|
|||
0E0F160F1D197DB800C92580 /* Endian.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0F160D1D197DB800C92580 /* Endian.swift */; };
|
||||
0E0F16101D197DB800C92580 /* Endian.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0F160D1D197DB800C92580 /* Endian.swift */; };
|
||||
0E0F16111D197DB800C92580 /* Endian.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0F160D1D197DB800C92580 /* Endian.swift */; };
|
||||
0E3CE36C1DB5281E00FA45CF /* UnicodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CE36B1DB5281E00FA45CF /* UnicodeTests.swift */; };
|
||||
0E3CE36D1DB5282800FA45CF /* UnicodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CE36B1DB5281E00FA45CF /* UnicodeTests.swift */; };
|
||||
0E3CE36E1DB5282900FA45CF /* UnicodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CE36B1DB5281E00FA45CF /* UnicodeTests.swift */; };
|
||||
0E3CE3701DB529D700FA45CF /* TrimFieldsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CE36F1DB529D700FA45CF /* TrimFieldsTests.swift */; };
|
||||
0E3CE3711DB529D700FA45CF /* TrimFieldsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CE36F1DB529D700FA45CF /* TrimFieldsTests.swift */; };
|
||||
0E3CE3721DB529D700FA45CF /* TrimFieldsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E3CE36F1DB529D700FA45CF /* TrimFieldsTests.swift */; };
|
||||
0E7E8C8C1D0BC7BB0057A1C1 /* CSV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E7E8C811D0BC7BB0057A1C1 /* CSV.framework */; };
|
||||
0E7E8CA11D0BC7F10057A1C1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9D1D0BC7F10057A1C1 /* CSV.swift */; };
|
||||
0E7E8CA21D0BC7F10057A1C1 /* CSVError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9E1D0BC7F10057A1C1 /* CSVError.swift */; };
|
||||
0E7E8CA31D0BC7F10057A1C1 /* CSVVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E7E8C9F1D0BC7F10057A1C1 /* CSVVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
0E7E8CA91D0BC8050057A1C1 /* CSVReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA61D0BC8050057A1C1 /* CSVReaderTests.swift */; };
|
||||
0E7E8CA91D0BC8050057A1C1 /* LineBreakTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA61D0BC8050057A1C1 /* LineBreakTests.swift */; };
|
||||
0E7E8CAA1D0BC8050057A1C1 /* CSVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA71D0BC8050057A1C1 /* CSVTests.swift */; };
|
||||
0E7E8CBE1D0BC9D70057A1C1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9D1D0BC7F10057A1C1 /* CSV.swift */; };
|
||||
0E7E8CBF1D0BC9D70057A1C1 /* CSVError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9E1D0BC7F10057A1C1 /* CSVError.swift */; };
|
||||
0E7E8CC01D0BC9D70057A1C1 /* CSVVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E7E8C9F1D0BC7F10057A1C1 /* CSVVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
0E7E8CD01D0BCA2A0057A1C1 /* CSV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E7E8CC61D0BCA2A0057A1C1 /* CSV.framework */; };
|
||||
0E7E8CDD1D0BCA840057A1C1 /* CSVReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA61D0BC8050057A1C1 /* CSVReaderTests.swift */; };
|
||||
0E7E8CDD1D0BCA840057A1C1 /* LineBreakTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA61D0BC8050057A1C1 /* LineBreakTests.swift */; };
|
||||
0E7E8CDE1D0BCA840057A1C1 /* CSVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA71D0BC8050057A1C1 /* CSVTests.swift */; };
|
||||
0E7E8CE01D0BCA8E0057A1C1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9D1D0BC7F10057A1C1 /* CSV.swift */; };
|
||||
0E7E8CE11D0BCA8E0057A1C1 /* CSVError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9E1D0BC7F10057A1C1 /* CSVError.swift */; };
|
||||
|
@ -30,7 +36,7 @@
|
|||
0E7E8D001D0BCDCF0057A1C1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9D1D0BC7F10057A1C1 /* CSV.swift */; };
|
||||
0E7E8D011D0BCDCF0057A1C1 /* CSVError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8C9E1D0BC7F10057A1C1 /* CSVError.swift */; };
|
||||
0E7E8D021D0BCDCF0057A1C1 /* CSVVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E7E8C9F1D0BC7F10057A1C1 /* CSVVersion.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
0E7E8D031D0BCDDD0057A1C1 /* CSVReaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA61D0BC8050057A1C1 /* CSVReaderTests.swift */; };
|
||||
0E7E8D031D0BCDDD0057A1C1 /* LineBreakTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA61D0BC8050057A1C1 /* LineBreakTests.swift */; };
|
||||
0E7E8D041D0BCDDD0057A1C1 /* CSVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E7E8CA71D0BC8050057A1C1 /* CSVTests.swift */; };
|
||||
0E9317D41D0DB2F200AC20A0 /* CSV+init.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9317D31D0DB2F200AC20A0 /* CSV+init.swift */; };
|
||||
0E9317D51D0DB2F200AC20A0 /* CSV+init.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9317D31D0DB2F200AC20A0 /* CSV+init.swift */; };
|
||||
|
@ -79,12 +85,14 @@
|
|||
|
||||
/* Begin PBXFileReference section */
|
||||
0E0F160D1D197DB800C92580 /* Endian.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Endian.swift; sourceTree = "<group>"; };
|
||||
0E3CE36B1DB5281E00FA45CF /* UnicodeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnicodeTests.swift; sourceTree = "<group>"; };
|
||||
0E3CE36F1DB529D700FA45CF /* TrimFieldsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrimFieldsTests.swift; sourceTree = "<group>"; };
|
||||
0E7E8C811D0BC7BB0057A1C1 /* CSV.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSV.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
0E7E8C8B1D0BC7BB0057A1C1 /* CSVTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
0E7E8C9D1D0BC7F10057A1C1 /* CSV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSV.swift; sourceTree = "<group>"; };
|
||||
0E7E8C9E1D0BC7F10057A1C1 /* CSVError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVError.swift; sourceTree = "<group>"; };
|
||||
0E7E8C9F1D0BC7F10057A1C1 /* CSVVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSVVersion.h; sourceTree = "<group>"; };
|
||||
0E7E8CA61D0BC8050057A1C1 /* CSVReaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVReaderTests.swift; sourceTree = "<group>"; };
|
||||
0E7E8CA61D0BC8050057A1C1 /* LineBreakTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineBreakTests.swift; sourceTree = "<group>"; };
|
||||
0E7E8CA71D0BC8050057A1C1 /* CSVTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVTests.swift; sourceTree = "<group>"; };
|
||||
0E7E8CAC1D0BC8610057A1C1 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
0E7E8CAE1D0BC8690057A1C1 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
|
@ -164,6 +172,7 @@
|
|||
0E7E8C821D0BC7BB0057A1C1 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
usesTabs = 0;
|
||||
};
|
||||
0E7E8C821D0BC7BB0057A1C1 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
|
@ -207,9 +216,11 @@
|
|||
0E7E8CA51D0BC8050057A1C1 /* CSV */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0E7E8CA61D0BC8050057A1C1 /* CSVReaderTests.swift */,
|
||||
0E7E8CA71D0BC8050057A1C1 /* CSVTests.swift */,
|
||||
0E7E8CA61D0BC8050057A1C1 /* LineBreakTests.swift */,
|
||||
0E9317DD1D0DBCC500AC20A0 /* ReadmeTests.swift */,
|
||||
0E3CE36F1DB529D700FA45CF /* TrimFieldsTests.swift */,
|
||||
0E3CE36B1DB5281E00FA45CF /* UnicodeTests.swift */,
|
||||
);
|
||||
path = CSV;
|
||||
sourceTree = "<group>";
|
||||
|
@ -513,8 +524,10 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0E9317DF1D0DBCC500AC20A0 /* ReadmeTests.swift in Sources */,
|
||||
0E3CE3711DB529D700FA45CF /* TrimFieldsTests.swift in Sources */,
|
||||
0E7E8CAA1D0BC8050057A1C1 /* CSVTests.swift in Sources */,
|
||||
0E7E8CA91D0BC8050057A1C1 /* CSVReaderTests.swift in Sources */,
|
||||
0E7E8CA91D0BC8050057A1C1 /* LineBreakTests.swift in Sources */,
|
||||
0E3CE36D1DB5282800FA45CF /* UnicodeTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -551,8 +564,10 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0E9317DE1D0DBCC500AC20A0 /* ReadmeTests.swift in Sources */,
|
||||
0E3CE3701DB529D700FA45CF /* TrimFieldsTests.swift in Sources */,
|
||||
0E7E8CDE1D0BCA840057A1C1 /* CSVTests.swift in Sources */,
|
||||
0E7E8CDD1D0BCA840057A1C1 /* CSVReaderTests.swift in Sources */,
|
||||
0E7E8CDD1D0BCA840057A1C1 /* LineBreakTests.swift in Sources */,
|
||||
0E3CE36C1DB5281E00FA45CF /* UnicodeTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -575,8 +590,10 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
0E9317E01D0DBCC500AC20A0 /* ReadmeTests.swift in Sources */,
|
||||
0E3CE3721DB529D700FA45CF /* TrimFieldsTests.swift in Sources */,
|
||||
0E7E8D041D0BCDDD0057A1C1 /* CSVTests.swift in Sources */,
|
||||
0E7E8D031D0BCDDD0057A1C1 /* CSVReaderTests.swift in Sources */,
|
||||
0E7E8D031D0BCDDD0057A1C1 /* LineBreakTests.swift in Sources */,
|
||||
0E3CE36E1DB5282900FA45CF /* UnicodeTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
|
|
@ -1,304 +0,0 @@
|
|||
//
|
||||
// CSVReaderTests.swift
|
||||
// CSV
|
||||
//
|
||||
// Created by Yasuhiro Hatta on 2016/06/11.
|
||||
//
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import XCTest
|
||||
@testable import CSV
|
||||
|
||||
class CSVReaderTests: XCTestCase {
|
||||
|
||||
func test1Line() {
|
||||
let csv = "abab,cdcd,efef"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
}
|
||||
|
||||
func testQuoted() {
|
||||
let csv = "abab,\"cdcd\",efef"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
}
|
||||
|
||||
func testLF() {
|
||||
let csv = "abab,cdcd,efef\nzxcv,asdf,qwer"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qwer"])
|
||||
}
|
||||
|
||||
func testCommaInQuotationMarks() {
|
||||
let csv = "abab,\"cd,cd\",efef"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cd,cd", "efef"])
|
||||
}
|
||||
|
||||
func testCRLF() {
|
||||
let csv = "abab,cdcd,efef\r\nzxcv,asdf,qwer"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qwer"])
|
||||
}
|
||||
|
||||
func testEscapedQuotationMark1() {
|
||||
let csv = "abab,\"\"\"cdcd\",efef\r\nzxcv,asdf,qwer"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "\"cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qwer"])
|
||||
}
|
||||
|
||||
func testEscapedQuotationMark2() {
|
||||
let csv = "abab,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\""
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er"])
|
||||
}
|
||||
|
||||
func testEmptyField() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLastCR() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\",\r"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLastCRLF() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\",\r\n"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLastLF() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\",\n"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLFInQuotationMarks() {
|
||||
let csv = "abab,,\"\rcdcd\n\",efef\r\nzxcv,asdf,\"qw\"\"er\",\n"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "\rcdcd\n", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLineBreakLF() {
|
||||
let csv = "qwe,asd\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCR() {
|
||||
let csv = "qwe,asd\rzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCRLF() {
|
||||
let csv = "qwe,asd\r\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakLFLF() {
|
||||
let csv = "qwe,asd\n\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 3)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], [""])
|
||||
XCTAssertEqual(records[2], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCRCR() {
|
||||
let csv = "qwe,asd\r\rzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 3)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], [""])
|
||||
XCTAssertEqual(records[2], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCRLFCRLF() {
|
||||
let csv = "qwe,asd\r\n\r\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 3)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], [""])
|
||||
XCTAssertEqual(records[2], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
// func testEncodingWithoutBOM() {
|
||||
// var index = 0
|
||||
// let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
// for encoding in allEncodings() {
|
||||
// print("index: \(index)")
|
||||
// let records = parse(csv: csv, encoding: encoding)
|
||||
// XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
// XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
// index += 1
|
||||
// }
|
||||
// }
|
||||
|
||||
func testUTF8WithBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf8
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf8BOM, count: utf8BOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF8.self)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF16WithNativeEndianBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv,😆asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf16
|
||||
var mutableData = Data()
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF16.self, endian: .unknown)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "😆asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF16WithBigEndianBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\n😆zxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf16BigEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf16BigEndianBOM, count: utf16BigEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF16.self, endian: .big)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["😆zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF16WithLittleEndianBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv😆,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf16LittleEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf16LittleEndianBOM, count: utf16LittleEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF16.self, endian: .little)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv😆", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF32WithNativeEndianBOM() {
|
||||
let csvString = "😆abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf32
|
||||
var mutableData = Data()
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF32.self, endian: .unknown)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["😆abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF32WithBigEndianBOM() {
|
||||
let csvString = "abab,,cd😆cd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf32BigEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf32BigEndianBOM, count: utf32BigEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF32.self, endian: .big)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cd😆cd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF32WithLittleEndianBOM() {
|
||||
let csvString = "abab,,cdcd,ef😆ef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf32LittleEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf32LittleEndianBOM, count: utf32LittleEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF32.self, endian: .little)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "ef😆ef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
// func allEncodings() -> [String.Encoding] {
|
||||
// return [
|
||||
// // multi-byte character encodings
|
||||
// //String.Encoding.shiftJIS,
|
||||
// //String.Encoding.japaneseEUC,
|
||||
// String.Encoding.utf8,
|
||||
// // wide character encodings
|
||||
// String.Encoding.utf16BigEndian,
|
||||
// String.Encoding.utf16LittleEndian,
|
||||
// String.Encoding.utf32BigEndian,
|
||||
// String.Encoding.utf32LittleEndian,
|
||||
// ]
|
||||
// }
|
||||
|
||||
func parse(csv: String) -> [[String]] {
|
||||
let reader = try! CSV(string: csv)
|
||||
var records = [[String]]()
|
||||
for row in reader {
|
||||
records.append(row)
|
||||
}
|
||||
return records
|
||||
}
|
||||
|
||||
func getRecords(csv: CSV) -> [[String]] {
|
||||
var records = [[String]]()
|
||||
for row in csv {
|
||||
records.append(row)
|
||||
}
|
||||
return records
|
||||
}
|
||||
|
||||
// func parse(csv: String, encoding: String.Encoding) -> [[String]] {
|
||||
// let data = csv.data(using: encoding)!
|
||||
// return parse(data: data, encoding: encoding)
|
||||
// }
|
||||
//
|
||||
// func parse(data: Data, encoding: String.Encoding) -> [[String]] {
|
||||
// let stream = InputStream(data: data)
|
||||
// let reader = try! CSV(stream: stream, encoding: encoding)
|
||||
// var records = [[String]]()
|
||||
// for row in reader {
|
||||
// records.append(row)
|
||||
// }
|
||||
// return records
|
||||
// }
|
||||
|
||||
static var allTests : [(String, (CSVReaderTests) -> () throws -> Void)] {
|
||||
return [
|
||||
//("testExample1", testExample1),
|
||||
]
|
||||
}
|
||||
|
||||
}
|
|
@ -3,15 +3,15 @@
|
|||
// CSV
|
||||
//
|
||||
// Created by Yasuhiro Hatta on 2016/06/11.
|
||||
//
|
||||
// Copyright © 2016 yaslab. All rights reserved.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import CSV
|
||||
|
||||
class CSVTests: XCTestCase {
|
||||
|
||||
func test1Line() {
|
||||
|
||||
func testOneLine() {
|
||||
let csv = "\"abc\",1,2"
|
||||
var i = 0
|
||||
for row in try! CSV(string: csv) {
|
||||
|
@ -24,7 +24,7 @@ class CSVTests: XCTestCase {
|
|||
XCTAssertEqual(i, 1)
|
||||
}
|
||||
|
||||
func test2Lines() {
|
||||
func testTwoLines() {
|
||||
let csv = "\"abc\",1,2\n\"cde\",3,4"
|
||||
var i = 0
|
||||
for row in try! CSV(string: csv) {
|
||||
|
@ -67,7 +67,7 @@ class CSVTests: XCTestCase {
|
|||
XCTAssertEqual(i, 3)
|
||||
}
|
||||
|
||||
func testMiddleLineEmpty() {
|
||||
func testMiddleLineIsEmpty() {
|
||||
let csv = "\"abc\",1,2\n\n\"cde\",3,4"
|
||||
var i = 0
|
||||
for row in try! CSV(string: csv) {
|
||||
|
@ -82,6 +82,40 @@ class CSVTests: XCTestCase {
|
|||
XCTAssertEqual(i, 3)
|
||||
}
|
||||
|
||||
func testCommaInQuotationMarks() {
|
||||
let csvString = "abab,\"cd,cd\",efef"
|
||||
var csv = try! CSV(string: csvString)
|
||||
let row = csv.next()!
|
||||
XCTAssertEqual(row, ["abab", "cd,cd", "efef"])
|
||||
}
|
||||
|
||||
func testEscapedQuotationMark1() {
|
||||
let csvString = "abab,\"\"\"cdcd\",efef\r\nzxcv,asdf,qwer"
|
||||
var csv = try! CSV(string: csvString)
|
||||
var row = csv.next()!
|
||||
XCTAssertEqual(row, ["abab", "\"cdcd", "efef"])
|
||||
row = csv.next()!
|
||||
XCTAssertEqual(row, ["zxcv", "asdf", "qwer"])
|
||||
}
|
||||
|
||||
func testEscapedQuotationMark2() {
|
||||
let csvString = "abab,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\""
|
||||
var csv = try! CSV(string: csvString)
|
||||
var row = csv.next()!
|
||||
XCTAssertEqual(row, ["abab", "cdcd", "efef"])
|
||||
row = csv.next()!
|
||||
XCTAssertEqual(row, ["zxcv", "asdf", "qw\"er"])
|
||||
}
|
||||
|
||||
func testEmptyField() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
var csv = try! CSV(string: csvString)
|
||||
var row = csv.next()!
|
||||
XCTAssertEqual(row, ["abab", "", "cdcd", "efef"])
|
||||
row = csv.next()!
|
||||
XCTAssertEqual(row, ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testDoubleQuoteBeforeLineBreak() {
|
||||
let csv = "\"abc\",1,\"2\"\n\n\"cde\",3,\"4\""
|
||||
var i = 0
|
||||
|
@ -96,50 +130,6 @@ class CSVTests: XCTestCase {
|
|||
}
|
||||
XCTAssertEqual(i, 3)
|
||||
}
|
||||
|
||||
// func testBufferSizeMod0() {
|
||||
// let csvString = "0,1,2,3,4,5,6,7,8,9\n"
|
||||
// let csv = try! CSV(string: csvString, bufferSize: 12)
|
||||
// XCTAssertEqual(csv.bufferSize, 12)
|
||||
// }
|
||||
//
|
||||
// func testBufferSizeMod1() {
|
||||
// let csvString = "0,1,2,3,4,5,6,7,8,9\n"
|
||||
// let csv = try! CSV(string: csvString, bufferSize: 13)
|
||||
// XCTAssertEqual(csv.bufferSize, 16)
|
||||
// }
|
||||
//
|
||||
// func testBufferSizeMod2() {
|
||||
// let csvString = "0,1,2,3,4,5,6,7,8,9\n"
|
||||
// let csv = try! CSV(string: csvString, bufferSize: 14)
|
||||
// XCTAssertEqual(csv.bufferSize, 16)
|
||||
// }
|
||||
//
|
||||
// func testBufferSizeMod3() {
|
||||
// let csvString = "0,1,2,3,4,5,6,7,8,9\n"
|
||||
// let csv = try! CSV(string: csvString, bufferSize: 15)
|
||||
// XCTAssertEqual(csv.bufferSize, 16)
|
||||
// }
|
||||
//
|
||||
// func testBufferSizeMod4() {
|
||||
// let csvString = "0,1,2,3,4,5,6,7,8,9\n"
|
||||
// let csv = try! CSV(string: csvString, bufferSize: 16)
|
||||
// XCTAssertEqual(csv.bufferSize, 16)
|
||||
// }
|
||||
//
|
||||
// func testBigDataAndSmallBufferSize() {
|
||||
// let line = "0,1,2,3,4,5,6,7,8,9\n"
|
||||
// var csv = ""
|
||||
// for _ in 0..<10000 {
|
||||
// csv += line
|
||||
// }
|
||||
// var i = 0
|
||||
// for row in try! CSV(string: csv, bufferSize: 10) {
|
||||
// XCTAssertEqual(row, ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"])
|
||||
// i += 1
|
||||
// }
|
||||
// XCTAssertEqual(i, 10000)
|
||||
// }
|
||||
|
||||
func testSubscript() {
|
||||
let csvString = "id,name\n001,hoge\n002,fuga"
|
||||
|
@ -174,113 +164,5 @@ class CSVTests: XCTestCase {
|
|||
XCTAssertEqual(rows[0], ["あ", "い1", "う", "えお"])
|
||||
XCTAssertEqual(rows[1], ["", "", "x", ""])
|
||||
}
|
||||
|
||||
func testTrimFields1() {
|
||||
let csvString = "abc,def,ghi"
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields2() {
|
||||
let csvString = " abc, def, ghi"
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields3() {
|
||||
let csvString = "abc ,def ,ghi "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields4() {
|
||||
let csvString = " abc , def , ghi "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields5() {
|
||||
let csvString = "\"abc\",\"def\",\"ghi\""
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields6() {
|
||||
let csvString = " \"abc\", \"def\", \"ghi\""
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields7() {
|
||||
let csvString = "\"abc\" ,\"def\" ,\"ghi\" "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields8() {
|
||||
let csvString = " \"abc\" , \"def\" , \"ghi\" "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields9() {
|
||||
let csvString = "\" abc \",\" def \",\" ghi \""
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, [" abc ", " def ", " ghi "])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields10() {
|
||||
let csvString = "\tabc,\t\tdef\t,ghi\t"
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields11() {
|
||||
let csvString = " abc \n def "
|
||||
var csv = try! CSV(string: csvString, trimFields: true)
|
||||
|
||||
let row1 = csv.next()!
|
||||
XCTAssertEqual(row1, ["abc"])
|
||||
let row2 = csv.next()!
|
||||
XCTAssertEqual(row2, ["def"])
|
||||
}
|
||||
|
||||
func testTrimFields12() {
|
||||
let csvString = " \"abc \" \n \" def\" "
|
||||
var csv = try! CSV(string: csvString, trimFields: true)
|
||||
|
||||
let row1 = csv.next()!
|
||||
XCTAssertEqual(row1, ["abc "])
|
||||
let row2 = csv.next()!
|
||||
XCTAssertEqual(row2, [" def"])
|
||||
}
|
||||
|
||||
func testTrimFields13() {
|
||||
let csvString = " abc \t\tdef\t ghi "
|
||||
let csv = try! CSV(string: csvString, trimFields: true, delimiter: UnicodeScalar("\t")!)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
//
|
||||
// LineBreakTests.swift
|
||||
// CSV
|
||||
//
|
||||
// Created by Yasuhiro Hatta on 2016/06/11.
|
||||
// Copyright © 2016 yaslab. All rights reserved.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import CSV
|
||||
|
||||
class LineBreakTests: XCTestCase {
|
||||
|
||||
func testLF() {
|
||||
let csv = "abab,cdcd,efef\nzxcv,asdf,qwer"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qwer"])
|
||||
}
|
||||
|
||||
func testCRLF() {
|
||||
let csv = "abab,cdcd,efef\r\nzxcv,asdf,qwer"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qwer"])
|
||||
}
|
||||
|
||||
func testLastCR() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\",\r"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLastCRLF() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\",\r\n"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLastLF() {
|
||||
let csv = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\",\n"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLFInQuotationMarks() {
|
||||
let csv = "abab,,\"\rcdcd\n\",efef\r\nzxcv,asdf,\"qw\"\"er\",\n"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["abab", "", "\rcdcd\n", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testLineBreakLF() {
|
||||
let csv = "qwe,asd\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCR() {
|
||||
let csv = "qwe,asd\rzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCRLF() {
|
||||
let csv = "qwe,asd\r\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 2)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakLFLF() {
|
||||
let csv = "qwe,asd\n\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 3)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], [""])
|
||||
XCTAssertEqual(records[2], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCRCR() {
|
||||
let csv = "qwe,asd\r\rzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 3)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], [""])
|
||||
XCTAssertEqual(records[2], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
func testLineBreakCRLFCRLF() {
|
||||
let csv = "qwe,asd\r\n\r\nzxc,rty"
|
||||
let records = parse(csv: csv)
|
||||
XCTAssertEqual(records.count, 3)
|
||||
XCTAssertEqual(records[0], ["qwe", "asd"])
|
||||
XCTAssertEqual(records[1], [""])
|
||||
XCTAssertEqual(records[2], ["zxc", "rty"])
|
||||
}
|
||||
|
||||
private func parse(csv: String) -> [[String]] {
|
||||
let reader = try! CSV(string: csv)
|
||||
var records = [[String]]()
|
||||
for row in reader {
|
||||
records.append(row)
|
||||
}
|
||||
return records
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
//
|
||||
// TrimFieldsTests.swift
|
||||
// CSV
|
||||
//
|
||||
// Created by Yasuhiro Hatta on 2016/10/18.
|
||||
// Copyright © 2016 yaslab. All rights reserved.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import CSV
|
||||
|
||||
class TrimFieldsTests: XCTestCase {
|
||||
|
||||
func testTrimFields1() {
|
||||
let csvString = "abc,def,ghi"
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields2() {
|
||||
let csvString = " abc, def, ghi"
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields3() {
|
||||
let csvString = "abc ,def ,ghi "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields4() {
|
||||
let csvString = " abc , def , ghi "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields5() {
|
||||
let csvString = "\"abc\",\"def\",\"ghi\""
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields6() {
|
||||
let csvString = " \"abc\", \"def\", \"ghi\""
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields7() {
|
||||
let csvString = "\"abc\" ,\"def\" ,\"ghi\" "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields8() {
|
||||
let csvString = " \"abc\" , \"def\" , \"ghi\" "
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields9() {
|
||||
let csvString = "\" abc \",\" def \",\" ghi \""
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, [" abc ", " def ", " ghi "])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields10() {
|
||||
let csvString = "\tabc,\t\tdef\t,ghi\t"
|
||||
let csv = try! CSV(string: csvString, trimFields: true)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
func testTrimFields11() {
|
||||
let csvString = " abc \n def "
|
||||
var csv = try! CSV(string: csvString, trimFields: true)
|
||||
|
||||
let row1 = csv.next()!
|
||||
XCTAssertEqual(row1, ["abc"])
|
||||
let row2 = csv.next()!
|
||||
XCTAssertEqual(row2, ["def"])
|
||||
}
|
||||
|
||||
func testTrimFields12() {
|
||||
let csvString = " \"abc \" \n \" def\" "
|
||||
var csv = try! CSV(string: csvString, trimFields: true)
|
||||
|
||||
let row1 = csv.next()!
|
||||
XCTAssertEqual(row1, ["abc "])
|
||||
let row2 = csv.next()!
|
||||
XCTAssertEqual(row2, [" def"])
|
||||
}
|
||||
|
||||
func testTrimFields13() {
|
||||
let csvString = " abc \t\tdef\t ghi "
|
||||
let csv = try! CSV(string: csvString, trimFields: true, delimiter: UnicodeScalar("\t")!)
|
||||
for row in csv {
|
||||
XCTAssertEqual(row, ["abc", "", "def", "ghi"])
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
//
|
||||
// UnicodeTests.swift
|
||||
// CSV
|
||||
//
|
||||
// Created by Yasuhiro Hatta on 2016/10/18.
|
||||
// Copyright © 2016 yaslab. All rights reserved.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import CSV
|
||||
|
||||
class UnicodeTests: XCTestCase {
|
||||
|
||||
func testUTF8WithBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf8
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf8BOM, count: utf8BOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF8.self)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF16WithNativeEndianBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv,😆asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf16
|
||||
var mutableData = Data()
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF16.self, endian: .unknown)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "😆asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF16WithBigEndianBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\n😆zxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf16BigEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf16BigEndianBOM, count: utf16BigEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF16.self, endian: .big)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["😆zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF16WithLittleEndianBOM() {
|
||||
let csvString = "abab,,cdcd,efef\r\nzxcv😆,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf16LittleEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf16LittleEndianBOM, count: utf16LittleEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF16.self, endian: .little)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv😆", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF32WithNativeEndianBOM() {
|
||||
let csvString = "😆abab,,cdcd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf32
|
||||
var mutableData = Data()
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF32.self, endian: .unknown)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["😆abab", "", "cdcd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF32WithBigEndianBOM() {
|
||||
let csvString = "abab,,cd😆cd,efef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf32BigEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf32BigEndianBOM, count: utf32BigEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF32.self, endian: .big)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cd😆cd", "efef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
func testUTF32WithLittleEndianBOM() {
|
||||
let csvString = "abab,,cdcd,ef😆ef\r\nzxcv,asdf,\"qw\"\"er\","
|
||||
let encoding = String.Encoding.utf32LittleEndian
|
||||
var mutableData = Data()
|
||||
mutableData.append(utf32LittleEndianBOM, count: utf32LittleEndianBOM.count)
|
||||
mutableData.append(csvString.data(using: encoding)!)
|
||||
let stream = InputStream(data: mutableData as Data)
|
||||
let csv = try! CSV(stream: stream, codecType: UTF32.self, endian: .little)
|
||||
let records = getRecords(csv: csv)
|
||||
XCTAssertEqual(records[0], ["abab", "", "cdcd", "ef😆ef"])
|
||||
XCTAssertEqual(records[1], ["zxcv", "asdf", "qw\"er", ""])
|
||||
}
|
||||
|
||||
private func getRecords(csv: CSV) -> [[String]] {
|
||||
var records = [[String]]()
|
||||
for row in csv {
|
||||
records.append(row)
|
||||
}
|
||||
return records
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue