@@ -234,6 +234,7 @@ class TestNSData: LoopbackServerTest {
234
234
( " test_base64DecodeWithPadding1 " , test_base64DecodeWithPadding1) ,
235
235
( " test_base64DecodeWithPadding2 " , test_base64DecodeWithPadding2) ,
236
236
( " test_rangeOfData " , test_rangeOfData) ,
237
+ ( " test_sr10689_rangeOfDataProtocol " , test_sr10689_rangeOfDataProtocol) ,
237
238
( " test_initNSMutableData() " , test_initNSMutableData) ,
238
239
( " test_initNSMutableDataWithLength " , test_initNSMutableDataWithLength) ,
239
240
( " test_initNSMutableDataWithCapacity " , test_initNSMutableDataWithCapacity) ,
@@ -831,6 +832,97 @@ class TestNSData: LoopbackServerTest {
831
832
832
833
}
833
834
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
+
834
926
// Check all of the NSMutableData constructors are available.
835
927
func test_initNSMutableData( ) {
836
928
let mData = NSMutableData ( )
0 commit comments