Skip to content

Commit 19017a7

Browse files
committed
DataProtocol: Add tests for SR-10689.
1 parent b3c96d4 commit 19017a7

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

TestFoundation/TestNSData.swift

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ class TestNSData: LoopbackServerTest {
234234
("test_base64DecodeWithPadding1", test_base64DecodeWithPadding1),
235235
("test_base64DecodeWithPadding2", test_base64DecodeWithPadding2),
236236
("test_rangeOfData", test_rangeOfData),
237+
("test_sr10689_rangeOfDataProtocol", test_sr10689_rangeOfDataProtocol),
237238
("test_initNSMutableData()", test_initNSMutableData),
238239
("test_initNSMutableDataWithLength", test_initNSMutableDataWithLength),
239240
("test_initNSMutableDataWithCapacity", test_initNSMutableDataWithCapacity),
@@ -831,6 +832,97 @@ class TestNSData: LoopbackServerTest {
831832

832833
}
833834

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

0 commit comments

Comments
 (0)