@@ -192,4 +192,82 @@ - (void)testCanBeUsedInDescendingQueries {
192
192
XCTAssertEqualObjects (FIRQuerySnapshotGetData (snapshot), (@[ @{ @" v" : @" d" , @" sort" : @3.0 } ]));
193
193
}
194
194
195
+ FIRTimestamp *TimestampWithMicros (int64_t seconds, int32_t micros) {
196
+ // Firestore only supports microsecond resolution, so use a microsecond as a minimum value for
197
+ // nanoseconds.
198
+ return [FIRTimestamp timestampWithSeconds: seconds nanoseconds: micros * 1000 ];
199
+ }
200
+
201
+ - (void )testTimestampsCanBePassedToQueriesAsLimits {
202
+ FIRCollectionReference *testCollection = [self collectionRefWithDocuments: @{
203
+ @" a" : @{@" timestamp" : TimestampWithMicros (100 , 2 )},
204
+ @" b" : @{@" timestamp" : TimestampWithMicros (100 , 5 )},
205
+ @" c" : @{@" timestamp" : TimestampWithMicros (100 , 3 )},
206
+ @" d" : @{@" timestamp" : TimestampWithMicros (100 , 1 )},
207
+ // Number of microseconds deliberately repeated.
208
+ @" e" : @{@" timestamp" : TimestampWithMicros (100 , 5 )},
209
+ @" f" : @{@" timestamp" : TimestampWithMicros (100 , 4 )},
210
+ }];
211
+ FIRQuery *query = [testCollection queryOrderedByField: @" timestamp" ];
212
+ FIRQuerySnapshot *querySnapshot =
213
+ [self readDocumentSetForRef: [[query queryStartingAfterValues: @[ TimestampWithMicros (100 , 2 ) ]]
214
+ queryEndingAtValues: @[ TimestampWithMicros (100 , 5 ) ]]];
215
+ XCTAssertEqualObjects (FIRQuerySnapshotGetIDs (querySnapshot), (@[ @" c" , @" f" , @" b" , @" e" ]));
216
+ }
217
+
218
+ - (void )testTimestampsCanBePassedToQueriesInWhereClause {
219
+ FIRTimestamp *currentTimestamp = [FIRTimestamp timestamp ];
220
+ int64_t seconds = currentTimestamp.seconds ;
221
+ int32_t micros = currentTimestamp.nanoseconds / 1000 ;
222
+ FIRCollectionReference *testCollection = [self collectionRefWithDocuments: @{
223
+ @" a" : @{
224
+ @" timestamp" : TimestampWithMicros (seconds, micros + 2 ),
225
+ },
226
+ @" b" : @{
227
+ @" timestamp" : TimestampWithMicros (seconds, micros - 1 ),
228
+ },
229
+ @" c" : @{
230
+ @" timestamp" : TimestampWithMicros (seconds, micros + 3 ),
231
+ },
232
+ @" d" : @{
233
+ @" timestamp" : TimestampWithMicros (seconds, micros),
234
+ },
235
+ @" e" : @{
236
+ @" timestamp" : TimestampWithMicros (seconds, micros + 1 ),
237
+ }
238
+ }];
239
+
240
+ FIRQuerySnapshot *querySnapshot = [self
241
+ readDocumentSetForRef: [[testCollection queryWhereField: @" timestamp"
242
+ isGreaterThanOrEqualTo: TimestampWithMicros (seconds, micros)]
243
+ queryWhereField: @" timestamp"
244
+ isLessThan: TimestampWithMicros (seconds, micros + 3 )]];
245
+ XCTAssertEqualObjects (FIRQuerySnapshotGetIDs (querySnapshot), (@[ @" d" , @" e" , @" a" ]));
246
+ }
247
+
248
+ - (void )testTimestampsAreTruncatedToMicroseconds {
249
+ FIRTimestamp *nanos = [FIRTimestamp timestampWithSeconds: 0 nanoseconds: 123456789 ];
250
+ FIRTimestamp *micros = [FIRTimestamp timestampWithSeconds: 0 nanoseconds: 123456000 ];
251
+ FIRTimestamp *millis = [FIRTimestamp timestampWithSeconds: 0 nanoseconds: 123000000 ];
252
+ FIRCollectionReference *testCollection = [self collectionRefWithDocuments: @{
253
+ @" a" : @{@" timestamp" : nanos},
254
+ }];
255
+
256
+ FIRQuerySnapshot *querySnapshot =
257
+ [self readDocumentSetForRef: [testCollection queryWhereField: @" timestamp" isEqualTo: nanos]];
258
+ XCTAssertEqualObjects (FIRQuerySnapshotGetIDs (querySnapshot), (@[ @" a" ]));
259
+
260
+ // Because Timestamp should have been truncated to microseconds, the microsecond timestamp
261
+ // should be considered equal to the nanosecond one.
262
+ querySnapshot =
263
+ [self readDocumentSetForRef: [testCollection queryWhereField: @" timestamp" isEqualTo: micros]];
264
+ XCTAssertEqualObjects (FIRQuerySnapshotGetIDs (querySnapshot), (@[ @" a" ]));
265
+
266
+ // The truncation is just to the microseconds, however, so the millisecond timestamp should be
267
+ // treated as different and thus the query should return no results.
268
+ querySnapshot =
269
+ [self readDocumentSetForRef: [testCollection queryWhereField: @" timestamp" isEqualTo: millis]];
270
+ XCTAssertEqualObjects (FIRQuerySnapshotGetIDs (querySnapshot), (@[]));
271
+ }
272
+
195
273
@end
0 commit comments