Skip to content

Commit 46ce38c

Browse files
committed
DataProtocol: Add tests for SR-10689.
1 parent 19a8e4e commit 46ce38c

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
@@ -237,6 +237,7 @@ class TestNSData: LoopbackServerTest {
237237
("test_base64DecodeWithPadding1", test_base64DecodeWithPadding1),
238238
("test_base64DecodeWithPadding2", test_base64DecodeWithPadding2),
239239
("test_rangeOfData", test_rangeOfData),
240+
("test_sr10689_rangeOfDataProtocol", test_sr10689_rangeOfDataProtocol),
240241
("test_initNSMutableData()", test_initNSMutableData),
241242
("test_initNSMutableDataWithLength", test_initNSMutableDataWithLength),
242243
("test_initNSMutableDataWithCapacity", test_initNSMutableDataWithCapacity),
@@ -848,6 +849,97 @@ class TestNSData: LoopbackServerTest {
848849

849850
}
850851

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

0 commit comments

Comments
 (0)