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