@@ -237,6 +237,7 @@ class TestNSData: LoopbackServerTest {
237
237
( " test_base64DecodeWithPadding1 " , test_base64DecodeWithPadding1) ,
238
238
( " test_base64DecodeWithPadding2 " , test_base64DecodeWithPadding2) ,
239
239
( " test_rangeOfData " , test_rangeOfData) ,
240
+ ( " test_sr10689_rangeOfDataProtocol " , test_sr10689_rangeOfDataProtocol) ,
240
241
( " test_initNSMutableData() " , test_initNSMutableData) ,
241
242
( " test_initNSMutableDataWithLength " , test_initNSMutableDataWithLength) ,
242
243
( " test_initNSMutableDataWithCapacity " , test_initNSMutableDataWithCapacity) ,
@@ -848,6 +849,97 @@ class TestNSData: LoopbackServerTest {
848
849
849
850
}
850
851
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
+
851
943
// Check all of the NSMutableData constructors are available.
852
944
func test_initNSMutableData( ) {
853
945
let mData = NSMutableData ( )
0 commit comments