@@ -253,6 +253,7 @@ class TestNSData: LoopbackServerTest {
253
253
( " test_base64DecodeWithPadding1 " , test_base64DecodeWithPadding1) ,
254
254
( " test_base64DecodeWithPadding2 " , test_base64DecodeWithPadding2) ,
255
255
( " test_rangeOfData " , test_rangeOfData) ,
256
+ ( " test_sr10689_rangeOfDataProtocol " , test_sr10689_rangeOfDataProtocol) ,
256
257
( " test_initNSMutableData() " , test_initNSMutableData) ,
257
258
( " test_initNSMutableDataWithLength " , test_initNSMutableDataWithLength) ,
258
259
( " test_initNSMutableDataWithCapacity " , test_initNSMutableDataWithCapacity) ,
@@ -949,6 +950,97 @@ class TestNSData: LoopbackServerTest {
949
950
950
951
}
951
952
953
+ func test_sr10689_rangeOfDataProtocol( ) {
954
+ // https://bugs.swift.org/browse/SR-10689
955
+
956
+ let base = Data ( [ 0x00 , 0x01 , 0x02 , 0x03 , 0x00 , 0x01 , 0x02 , 0x03 ,
957
+ 0x00 , 0x01 , 0x02 , 0x03 , 0x00 , 0x01 , 0x02 , 0x03 ] )
958
+ let subdata = base [ 10 ..< 13 ] // [0x02, 0x03, 0x00]
959
+ let oneByte = base [ 14 ..< 15 ] // [0x02]
960
+
961
+ do { // firstRange(of:in:)
962
+ func assertFirstRange( _ data: Data , _ fragment: Data , range: ClosedRange < Int > ? = nil , expectedStartIndex: Int ? ,
963
+ message: @autoclosure ( ) -> String = " " , file: StaticString = #file, line: UInt = #line)
964
+ {
965
+ if let index = expectedStartIndex {
966
+ let expectedRange : Range < Int > = index..< ( index + fragment. count)
967
+ if let someRange = range {
968
+ XCTAssertEqual ( data. firstRange ( of: fragment, in: someRange) , expectedRange, message ( ) , file: file, line: line)
969
+ } else {
970
+ XCTAssertEqual ( data. firstRange ( of: fragment) , expectedRange, message ( ) , file: file, line: line)
971
+ }
972
+ } else {
973
+ if let someRange = range {
974
+ XCTAssertNil ( data. firstRange ( of: fragment, in: someRange) , message ( ) , file: file, line: line)
975
+ } else {
976
+ XCTAssertNil ( data. firstRange ( of: fragment) , message ( ) , file: file, line: line)
977
+ }
978
+ }
979
+ }
980
+
981
+ assertFirstRange ( base, base, expectedStartIndex: base. startIndex)
982
+ assertFirstRange ( base, subdata, expectedStartIndex: 2 )
983
+ assertFirstRange ( base, oneByte, expectedStartIndex: 2 )
984
+
985
+ assertFirstRange ( subdata, base, expectedStartIndex: nil )
986
+ assertFirstRange ( subdata, subdata, expectedStartIndex: subdata. startIndex)
987
+ assertFirstRange ( subdata, oneByte, expectedStartIndex: subdata. startIndex)
988
+
989
+ assertFirstRange ( oneByte, base, expectedStartIndex: nil )
990
+ assertFirstRange ( oneByte, subdata, expectedStartIndex: nil )
991
+ assertFirstRange ( oneByte, oneByte, expectedStartIndex: oneByte. startIndex)
992
+
993
+ assertFirstRange ( base, subdata, range: 1 ... 14 , expectedStartIndex: 2 )
994
+ assertFirstRange ( base, subdata, range: 6 ... 8 , expectedStartIndex: 6 )
995
+ assertFirstRange ( base, subdata, range: 8 ... 10 , expectedStartIndex: nil )
996
+
997
+ assertFirstRange ( base, oneByte, range: 1 ... 14 , expectedStartIndex: 2 )
998
+ assertFirstRange ( base, oneByte, range: 6 ... 6 , expectedStartIndex: 6 )
999
+ assertFirstRange ( base, oneByte, range: 8 ... 9 , expectedStartIndex: nil )
1000
+ }
1001
+
1002
+ do { // lastRange(of:in:)
1003
+ func assertLastRange( _ data: Data , _ fragment: Data , range: ClosedRange < Int > ? = nil , expectedStartIndex: Int ? ,
1004
+ message: @autoclosure ( ) -> String = " " , file: StaticString = #file, line: UInt = #line)
1005
+ {
1006
+ if let index = expectedStartIndex {
1007
+ let expectedRange : Range < Int > = index..< ( index + fragment. count)
1008
+ if let someRange = range {
1009
+ XCTAssertEqual ( data. lastRange ( of: fragment, in: someRange) , expectedRange, message ( ) , file: file, line: line)
1010
+ } else {
1011
+ XCTAssertEqual ( data. lastRange ( of: fragment) , expectedRange, message ( ) , file: file, line: line)
1012
+ }
1013
+ } else {
1014
+ if let someRange = range {
1015
+ XCTAssertNil ( data. lastRange ( of: fragment, in: someRange) , message ( ) , file: file, line: line)
1016
+ } else {
1017
+ XCTAssertNil ( data. lastRange ( of: fragment) , message ( ) , file: file, line: line)
1018
+ }
1019
+ }
1020
+ }
1021
+
1022
+ assertLastRange ( base, base, expectedStartIndex: base. startIndex)
1023
+ assertLastRange ( base, subdata, expectedStartIndex: 10 )
1024
+ assertLastRange ( base, oneByte, expectedStartIndex: 14 )
1025
+
1026
+ assertLastRange ( subdata, base, expectedStartIndex: nil )
1027
+ assertLastRange ( subdata, subdata, expectedStartIndex: subdata. startIndex)
1028
+ assertLastRange ( subdata, oneByte, expectedStartIndex: subdata. startIndex)
1029
+
1030
+ assertLastRange ( oneByte, base, expectedStartIndex: nil )
1031
+ assertLastRange ( oneByte, subdata, expectedStartIndex: nil )
1032
+ assertLastRange ( oneByte, oneByte, expectedStartIndex: oneByte. startIndex)
1033
+
1034
+ assertLastRange ( base, subdata, range: 1 ... 14 , expectedStartIndex: 10 )
1035
+ assertLastRange ( base, subdata, range: 6 ... 8 , expectedStartIndex: 6 )
1036
+ assertLastRange ( base, subdata, range: 8 ... 10 , expectedStartIndex: nil )
1037
+
1038
+ assertLastRange ( base, oneByte, range: 1 ... 14 , expectedStartIndex: 14 )
1039
+ assertLastRange ( base, oneByte, range: 6 ... 6 , expectedStartIndex: 6 )
1040
+ assertLastRange ( base, oneByte, range: 8 ... 9 , expectedStartIndex: nil )
1041
+ }
1042
+ }
1043
+
952
1044
// Check all of the NSMutableData constructors are available.
953
1045
func test_initNSMutableData( ) {
954
1046
let mData = NSMutableData ( )
0 commit comments