|
20 | 20 | import static org.junit.Assert.assertEquals; |
21 | 21 | import static org.junit.Assert.assertFalse; |
22 | 22 | import static org.junit.Assert.assertNotNull; |
| 23 | +import static org.junit.Assert.assertTrue; |
23 | 24 |
|
24 | 25 | import androidx.test.ext.junit.runners.AndroidJUnit4; |
25 | 26 | import com.google.android.gms.tasks.Tasks; |
@@ -71,18 +72,31 @@ private void writeInitialData(Map<String, Object> initialData) { |
71 | 72 |
|
72 | 73 | private void expectLocalAndRemoteValue(double expectedSum) { |
73 | 74 | DocumentSnapshot snap = accumulator.awaitLocalEvent(); |
| 75 | + assertTrue(snap.get("sum") instanceof Double); |
74 | 76 | assertEquals(expectedSum, snap.getDouble("sum"), DOUBLE_EPSILON); |
75 | 77 | snap = accumulator.awaitRemoteEvent(); |
| 78 | + assertTrue(snap.get("sum") instanceof Double); |
76 | 79 | assertEquals(expectedSum, snap.getDouble("sum"), DOUBLE_EPSILON); |
77 | 80 | } |
78 | 81 |
|
79 | 82 | private void expectLocalAndRemoteValue(long expectedSum) { |
80 | 83 | DocumentSnapshot snap = accumulator.awaitLocalEvent(); |
| 84 | + assertTrue(snap.get("sum") instanceof Long); |
81 | 85 | assertEquals(expectedSum, (long) snap.getLong("sum")); |
82 | 86 | snap = accumulator.awaitRemoteEvent(); |
| 87 | + assertTrue(snap.get("sum") instanceof Long); |
83 | 88 | assertEquals(expectedSum, (long) snap.getLong("sum")); |
84 | 89 | } |
85 | 90 |
|
| 91 | + private void expectLocalAndRemoteNaN() { |
| 92 | + DocumentSnapshot snap = accumulator.awaitLocalEvent(); |
| 93 | + assertTrue(snap.get("sum") instanceof Double); |
| 94 | + assertTrue(Double.isNaN(snap.getDouble("sum"))); |
| 95 | + snap = accumulator.awaitRemoteEvent(); |
| 96 | + assertTrue(snap.get("sum") instanceof Double); |
| 97 | + assertTrue(Double.isNaN(snap.getDouble("sum"))); |
| 98 | + } |
| 99 | + |
86 | 100 | @Test |
87 | 101 | public void createDocumentWithIncrement() { |
88 | 102 | waitFor(docRef.set(map("sum", FieldValue.increment(1337)))); |
@@ -218,4 +232,128 @@ public void serverTimestampAndIncrement() throws ExecutionException, Interrupted |
218 | 232 | snap = accumulator.awaitRemoteEvent(); |
219 | 233 | assertEquals(1, (long) snap.getLong("val")); |
220 | 234 | } |
| 235 | + |
| 236 | + @Test |
| 237 | + public void createDocumentWithMinimum() { |
| 238 | + waitFor(docRef.set(map("sum", FieldValue.minimum(1337)))); |
| 239 | + expectLocalAndRemoteValue(1337L); |
| 240 | + } |
| 241 | + |
| 242 | + @Test |
| 243 | + public void createDocumentWithMaximum() { |
| 244 | + waitFor(docRef.set(map("sum", FieldValue.maximum(1337)))); |
| 245 | + expectLocalAndRemoteValue(1337L); |
| 246 | + } |
| 247 | + |
| 248 | + @Test |
| 249 | + public void minimumWithExistingInteger() { |
| 250 | + writeInitialData(map("sum", 10L)); |
| 251 | + waitFor(docRef.update("sum", FieldValue.minimum(5L))); |
| 252 | + expectLocalAndRemoteValue(5L); |
| 253 | + |
| 254 | + waitFor(docRef.update("sum", FieldValue.minimum(20L))); |
| 255 | + expectLocalAndRemoteValue(5L); |
| 256 | + } |
| 257 | + |
| 258 | + @Test |
| 259 | + public void maximumWithExistingInteger() { |
| 260 | + writeInitialData(map("sum", 10L)); |
| 261 | + waitFor(docRef.update("sum", FieldValue.maximum(5L))); |
| 262 | + expectLocalAndRemoteValue(10L); |
| 263 | + |
| 264 | + waitFor(docRef.update("sum", FieldValue.maximum(20L))); |
| 265 | + expectLocalAndRemoteValue(20L); |
| 266 | + } |
| 267 | + |
| 268 | + @Test |
| 269 | + public void minimumWithExistingDouble() { |
| 270 | + writeInitialData(map("sum", 10.5D)); |
| 271 | + waitFor(docRef.update("sum", FieldValue.minimum(5.5D))); |
| 272 | + expectLocalAndRemoteValue(5.5D); |
| 273 | + |
| 274 | + waitFor(docRef.update("sum", FieldValue.minimum(20.5D))); |
| 275 | + expectLocalAndRemoteValue(5.5D); |
| 276 | + } |
| 277 | + |
| 278 | + @Test |
| 279 | + public void maximumWithExistingDouble() { |
| 280 | + writeInitialData(map("sum", 10.5D)); |
| 281 | + waitFor(docRef.update("sum", FieldValue.maximum(5.5D))); |
| 282 | + expectLocalAndRemoteValue(10.5D); |
| 283 | + |
| 284 | + waitFor(docRef.update("sum", FieldValue.maximum(20.5D))); |
| 285 | + expectLocalAndRemoteValue(20.5D); |
| 286 | + } |
| 287 | + |
| 288 | + @Test |
| 289 | + public void mixedTypesPreserveOperandTypeForMinimum() { |
| 290 | + // field and input value of mixed types: field takes on type of smaller operand |
| 291 | + writeInitialData(map("sum", 10L)); |
| 292 | + waitFor(docRef.update("sum", FieldValue.minimum(5.5D))); |
| 293 | + expectLocalAndRemoteValue(5.5D); |
| 294 | + |
| 295 | + writeInitialData(map("sum", 10.5D)); |
| 296 | + waitFor(docRef.update("sum", FieldValue.minimum(5L))); |
| 297 | + expectLocalAndRemoteValue(5L); |
| 298 | + } |
| 299 | + |
| 300 | + @Test |
| 301 | + public void mixedTypesPreserveOperandTypeForMaximum() { |
| 302 | + // field and input value of mixed types: field takes on type of larger operand |
| 303 | + writeInitialData(map("sum", 10L)); |
| 304 | + waitFor(docRef.update("sum", FieldValue.maximum(20.5D))); |
| 305 | + expectLocalAndRemoteValue(20.5D); |
| 306 | + |
| 307 | + writeInitialData(map("sum", 10.5D)); |
| 308 | + waitFor(docRef.update("sum", FieldValue.maximum(20L))); |
| 309 | + expectLocalAndRemoteValue(20L); |
| 310 | + } |
| 311 | + |
| 312 | + @Test |
| 313 | + public void equivalentValuesDoNotChangeTypeForMinimum() { |
| 314 | + // equivalent (e.g. 3 and 3.0), field does not change type |
| 315 | + writeInitialData(map("sum", 3L)); |
| 316 | + waitFor(docRef.update("sum", FieldValue.minimum(3.0D))); |
| 317 | + expectLocalAndRemoteValue(3L); |
| 318 | + |
| 319 | + writeInitialData(map("sum", 3.0D)); |
| 320 | + waitFor(docRef.update("sum", FieldValue.minimum(3L))); |
| 321 | + expectLocalAndRemoteValue(3.0D); |
| 322 | + } |
| 323 | + |
| 324 | + @Test |
| 325 | + public void equivalentValuesDoNotChangeTypeForMaximum() { |
| 326 | + // equivalent (e.g. 3 and 3.0), field does not change type |
| 327 | + writeInitialData(map("sum", 3L)); |
| 328 | + waitFor(docRef.update("sum", FieldValue.maximum(3.0D))); |
| 329 | + expectLocalAndRemoteValue(3L); |
| 330 | + |
| 331 | + writeInitialData(map("sum", 3.0D)); |
| 332 | + waitFor(docRef.update("sum", FieldValue.maximum(3L))); |
| 333 | + expectLocalAndRemoteValue(3.0D); |
| 334 | + } |
| 335 | + |
| 336 | + @Test |
| 337 | + public void minimumWithNaN() { |
| 338 | + // If one of the values is NaN, minimum is NaN |
| 339 | + writeInitialData(map("sum", Double.NaN)); |
| 340 | + waitFor(docRef.update("sum", FieldValue.minimum(5L))); |
| 341 | + expectLocalAndRemoteNaN(); |
| 342 | + |
| 343 | + writeInitialData(map("sum", 5L)); |
| 344 | + waitFor(docRef.update("sum", FieldValue.minimum(Double.NaN))); |
| 345 | + expectLocalAndRemoteNaN(); |
| 346 | + } |
| 347 | + |
| 348 | + @Test |
| 349 | + public void maximumWithNaN() { |
| 350 | + // If one of the values is NaN, maximum is NaN |
| 351 | + writeInitialData(map("sum", Double.NaN)); |
| 352 | + waitFor(docRef.update("sum", FieldValue.maximum(5L))); |
| 353 | + expectLocalAndRemoteNaN(); |
| 354 | + |
| 355 | + writeInitialData(map("sum", 5L)); |
| 356 | + waitFor(docRef.update("sum", FieldValue.maximum(Double.NaN))); |
| 357 | + expectLocalAndRemoteNaN(); |
| 358 | + } |
221 | 359 | } |
0 commit comments