@@ -1077,6 +1077,99 @@ class TestData : TestDataSuper {
1077
1077
expectEqual ( slice4 [ 0 ] , 8 )
1078
1078
}
1079
1079
1080
+ func test_rangeOfDataProtocol( ) {
1081
+ // https://bugs.swift.org/browse/SR-10689
1082
+
1083
+ let base = Data ( [ 0x00 , 0x01 , 0x02 , 0x03 , 0x00 , 0x01 , 0x02 , 0x03 ,
1084
+ 0x00 , 0x01 , 0x02 , 0x03 , 0x00 , 0x01 , 0x02 , 0x03 ] )
1085
+ let subdata = base [ 10 ..< 13 ] // [0x02, 0x03, 0x00]
1086
+ let oneByte = base [ 14 ..< 15 ] // [0x02]
1087
+
1088
+ do { // firstRange(of:in:)
1089
+ func assertFirstRange( _ data: Data , _ fragment: Data , range: ClosedRange < Int > ? = nil ,
1090
+ expectedStartIndex: Int ? ,
1091
+ _ message: @autoclosure ( ) -> String = " " ,
1092
+ file: String = #file, line: UInt = #line) {
1093
+ if let index = expectedStartIndex {
1094
+ let expectedRange : Range < Int > = index..< ( index + fragment. count)
1095
+ if let someRange = range {
1096
+ expectEqual ( data. firstRange ( of: fragment, in: someRange) , expectedRange, message ( ) , file: file, line: line)
1097
+ } else {
1098
+ expectEqual ( data. firstRange ( of: fragment) , expectedRange, message ( ) , file: file, line: line)
1099
+ }
1100
+ } else {
1101
+ if let someRange = range {
1102
+ expectNil ( data. firstRange ( of: fragment, in: someRange) , message ( ) , file: file, line: line)
1103
+ } else {
1104
+ expectNil ( data. firstRange ( of: fragment) , message ( ) , file: file, line: line)
1105
+ }
1106
+ }
1107
+ }
1108
+
1109
+ assertFirstRange ( base, base, expectedStartIndex: base. startIndex)
1110
+ assertFirstRange ( base, subdata, expectedStartIndex: 2 )
1111
+ assertFirstRange ( base, oneByte, expectedStartIndex: 2 )
1112
+
1113
+ assertFirstRange ( subdata, base, expectedStartIndex: nil )
1114
+ assertFirstRange ( subdata, subdata, expectedStartIndex: subdata. startIndex)
1115
+ assertFirstRange ( subdata, oneByte, expectedStartIndex: subdata. startIndex)
1116
+
1117
+ assertFirstRange ( oneByte, base, expectedStartIndex: nil )
1118
+ assertFirstRange ( oneByte, subdata, expectedStartIndex: nil )
1119
+ assertFirstRange ( oneByte, oneByte, expectedStartIndex: oneByte. startIndex)
1120
+
1121
+ assertFirstRange ( base, subdata, range: 1 ... 14 , expectedStartIndex: 2 )
1122
+ assertFirstRange ( base, subdata, range: 6 ... 8 , expectedStartIndex: 6 )
1123
+ assertFirstRange ( base, subdata, range: 8 ... 10 , expectedStartIndex: nil )
1124
+
1125
+ assertFirstRange ( base, oneByte, range: 1 ... 14 , expectedStartIndex: 2 )
1126
+ assertFirstRange ( base, oneByte, range: 6 ... 6 , expectedStartIndex: 6 )
1127
+ assertFirstRange ( base, oneByte, range: 8 ... 9 , expectedStartIndex: nil )
1128
+ }
1129
+
1130
+ do { // lastRange(of:in:)
1131
+ func assertLastRange( _ data: Data , _ fragment: Data , range: ClosedRange < Int > ? = nil ,
1132
+ expectedStartIndex: Int ? ,
1133
+ _ message: @autoclosure ( ) -> String = " " ,
1134
+ file: String = #file, line: UInt = #line) {
1135
+ if let index = expectedStartIndex {
1136
+ let expectedRange : Range < Int > = index..< ( index + fragment. count)
1137
+ if let someRange = range {
1138
+ expectEqual ( data. lastRange ( of: fragment, in: someRange) , expectedRange, message ( ) , file: file, line: line)
1139
+ } else {
1140
+ expectEqual ( data. lastRange ( of: fragment) , expectedRange, message ( ) , file: file, line: line)
1141
+ }
1142
+ } else {
1143
+ if let someRange = range {
1144
+ expectNil ( data. lastRange ( of: fragment, in: someRange) , message ( ) , file: file, line: line)
1145
+ } else {
1146
+ expectNil ( data. lastRange ( of: fragment) , message ( ) , file: file, line: line)
1147
+ }
1148
+ }
1149
+ }
1150
+
1151
+ assertLastRange ( base, base, expectedStartIndex: base. startIndex)
1152
+ assertLastRange ( base, subdata, expectedStartIndex: 10 )
1153
+ assertLastRange ( base, oneByte, expectedStartIndex: 14 )
1154
+
1155
+ assertLastRange ( subdata, base, expectedStartIndex: nil )
1156
+ assertLastRange ( subdata, subdata, expectedStartIndex: subdata. startIndex)
1157
+ assertLastRange ( subdata, oneByte, expectedStartIndex: subdata. startIndex)
1158
+
1159
+ assertLastRange ( oneByte, base, expectedStartIndex: nil )
1160
+ assertLastRange ( oneByte, subdata, expectedStartIndex: nil )
1161
+ assertLastRange ( oneByte, oneByte, expectedStartIndex: oneByte. startIndex)
1162
+
1163
+ assertLastRange ( base, subdata, range: 1 ... 14 , expectedStartIndex: 10 )
1164
+ assertLastRange ( base, subdata, range: 6 ... 8 , expectedStartIndex: 6 )
1165
+ assertLastRange ( base, subdata, range: 8 ... 10 , expectedStartIndex: nil )
1166
+
1167
+ assertLastRange ( base, oneByte, range: 1 ... 14 , expectedStartIndex: 14 )
1168
+ assertLastRange ( base, oneByte, range: 6 ... 6 , expectedStartIndex: 6 )
1169
+ assertLastRange ( base, oneByte, range: 8 ... 9 , expectedStartIndex: nil )
1170
+ }
1171
+ }
1172
+
1080
1173
func test_sliceAppending( ) {
1081
1174
// https://bugs.swift.org/browse/SR-4473
1082
1175
var fooData = Data ( )
@@ -3882,6 +3975,7 @@ DataTests.test("test_noCopyBehavior") { TestData().test_noCopyBehavior() }
3882
3975
DataTests . test ( " test_doubleDeallocation " ) { TestData ( ) . test_doubleDeallocation ( ) }
3883
3976
DataTests . test ( " test_repeatingValueInitialization " ) { TestData ( ) . test_repeatingValueInitialization ( ) }
3884
3977
DataTests . test ( " test_rangeZoo " ) { TestData ( ) . test_rangeZoo ( ) }
3978
+ DataTests . test ( " test_rangeOfDataProtocol " ) { TestData ( ) . test_rangeOfDataProtocol ( ) }
3885
3979
DataTests . test ( " test_sliceAppending " ) { TestData ( ) . test_sliceAppending ( ) }
3886
3980
DataTests . test ( " test_replaceSubrange " ) { TestData ( ) . test_replaceSubrange ( ) }
3887
3981
DataTests . test ( " test_sliceWithUnsafeBytes " ) { TestData ( ) . test_sliceWithUnsafeBytes ( ) }
0 commit comments