Skip to content

Commit 1634a6c

Browse files
committed
DataProtocol: Add tests for SR-10689.
1 parent cd0bc7b commit 1634a6c

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

Tests/Foundation/Tests/TestNSData.swift

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ class TestNSData: LoopbackServerTest {
235235
("test_base64DecodeWithPadding1", test_base64DecodeWithPadding1),
236236
("test_base64DecodeWithPadding2", test_base64DecodeWithPadding2),
237237
("test_rangeOfData", test_rangeOfData),
238+
("test_sr10689_rangeOfDataProtocol", test_sr10689_rangeOfDataProtocol),
238239
("test_initNSMutableData()", test_initNSMutableData),
239240
("test_initNSMutableDataWithLength", test_initNSMutableDataWithLength),
240241
("test_initNSMutableDataWithCapacity", test_initNSMutableDataWithCapacity),
@@ -844,6 +845,97 @@ class TestNSData: LoopbackServerTest {
844845

845846
}
846847

848+
func test_sr10689_rangeOfDataProtocol() {
849+
// https://bugs.swift.org/browse/SR-10689
850+
851+
let base = Data([0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03,
852+
0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03])
853+
let subdata = base[10..<13] // [0x02, 0x03, 0x00]
854+
let oneByte = base[14..<15] // [0x02]
855+
856+
do { // firstRange(of:in:)
857+
func assertFirstRange(_ data: Data, _ fragment: Data, range: ClosedRange<Int>? = nil, expectedStartIndex: Int?,
858+
message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line)
859+
{
860+
if let index = expectedStartIndex {
861+
let expectedRange: Range<Int> = index..<(index + fragment.count)
862+
if let someRange = range {
863+
XCTAssertEqual(data.firstRange(of: fragment, in: someRange), expectedRange, message(), file: file, line: line)
864+
} else {
865+
XCTAssertEqual(data.firstRange(of: fragment), expectedRange, message(), file: file, line: line)
866+
}
867+
} else {
868+
if let someRange = range {
869+
XCTAssertNil(data.firstRange(of: fragment, in: someRange), message(), file: file, line: line)
870+
} else {
871+
XCTAssertNil(data.firstRange(of: fragment), message(), file: file, line: line)
872+
}
873+
}
874+
}
875+
876+
assertFirstRange(base, base, expectedStartIndex: base.startIndex)
877+
assertFirstRange(base, subdata, expectedStartIndex: 2)
878+
assertFirstRange(base, oneByte, expectedStartIndex: 2)
879+
880+
assertFirstRange(subdata, base, expectedStartIndex: nil)
881+
assertFirstRange(subdata, subdata, expectedStartIndex: subdata.startIndex)
882+
assertFirstRange(subdata, oneByte, expectedStartIndex: subdata.startIndex)
883+
884+
assertFirstRange(oneByte, base, expectedStartIndex: nil)
885+
assertFirstRange(oneByte, subdata, expectedStartIndex: nil)
886+
assertFirstRange(oneByte, oneByte, expectedStartIndex: oneByte.startIndex)
887+
888+
assertFirstRange(base, subdata, range: 1...14, expectedStartIndex: 2)
889+
assertFirstRange(base, subdata, range: 6...8, expectedStartIndex: 6)
890+
assertFirstRange(base, subdata, range: 8...10, expectedStartIndex: nil)
891+
892+
assertFirstRange(base, oneByte, range: 1...14, expectedStartIndex: 2)
893+
assertFirstRange(base, oneByte, range: 6...6, expectedStartIndex: 6)
894+
assertFirstRange(base, oneByte, range: 8...9, expectedStartIndex: nil)
895+
}
896+
897+
do { // lastRange(of:in:)
898+
func assertLastRange(_ data: Data, _ fragment: Data, range: ClosedRange<Int>? = nil, expectedStartIndex: Int?,
899+
message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line)
900+
{
901+
if let index = expectedStartIndex {
902+
let expectedRange: Range<Int> = index..<(index + fragment.count)
903+
if let someRange = range {
904+
XCTAssertEqual(data.lastRange(of: fragment, in: someRange), expectedRange, message(), file: file, line: line)
905+
} else {
906+
XCTAssertEqual(data.lastRange(of: fragment), expectedRange, message(), file: file, line: line)
907+
}
908+
} else {
909+
if let someRange = range {
910+
XCTAssertNil(data.lastRange(of: fragment, in: someRange), message(), file: file, line: line)
911+
} else {
912+
XCTAssertNil(data.lastRange(of: fragment), message(), file: file, line: line)
913+
}
914+
}
915+
}
916+
917+
assertLastRange(base, base, expectedStartIndex: base.startIndex)
918+
assertLastRange(base, subdata, expectedStartIndex: 10)
919+
assertLastRange(base, oneByte, expectedStartIndex: 14)
920+
921+
assertLastRange(subdata, base, expectedStartIndex: nil)
922+
assertLastRange(subdata, subdata, expectedStartIndex: subdata.startIndex)
923+
assertLastRange(subdata, oneByte, expectedStartIndex: subdata.startIndex)
924+
925+
assertLastRange(oneByte, base, expectedStartIndex: nil)
926+
assertLastRange(oneByte, subdata, expectedStartIndex: nil)
927+
assertLastRange(oneByte, oneByte, expectedStartIndex: oneByte.startIndex)
928+
929+
assertLastRange(base, subdata, range: 1...14, expectedStartIndex: 10)
930+
assertLastRange(base, subdata, range: 6...8, expectedStartIndex: 6)
931+
assertLastRange(base, subdata, range: 8...10, expectedStartIndex: nil)
932+
933+
assertLastRange(base, oneByte, range: 1...14, expectedStartIndex: 14)
934+
assertLastRange(base, oneByte, range: 6...6, expectedStartIndex: 6)
935+
assertLastRange(base, oneByte, range: 8...9, expectedStartIndex: nil)
936+
}
937+
}
938+
847939
// Check all of the NSMutableData constructors are available.
848940
func test_initNSMutableData() {
849941
let mData = NSMutableData()

0 commit comments

Comments
 (0)