@@ -552,7 +552,7 @@ public void setVariousLimitsEnsureDataIsCorrect()
552
552
ValueExpectationHelper expectations = new ValueExpectationHelper ();
553
553
expectations .add (ref .limitToLast (1 ), new MapBuilder ().put ("c" , 3L ).build ());
554
554
expectations .add (ref .endAt (null ).limitToLast (1 ), new MapBuilder ().put ("c" , 3L ).build ());
555
- // expectations.add(ref.endBefore(null).limitToLast(1), null);
555
+ expectations .add (ref .endBefore (null ).limitToLast (1 ), null );
556
556
expectations .add (ref .limitToLast (2 ), new MapBuilder ().put ("b" , 2L ).put ("c" , 3L ).build ());
557
557
expectations .add (
558
558
ref .limitToLast (3 ), new MapBuilder ().put ("a" , 1L ).put ("b" , 2L ).put ("c" , 3L ).build ());
@@ -1422,7 +1422,6 @@ public void startAtEndAtWithPriorityWorks() throws DatabaseException, Interrupte
1422
1422
helper .waitForEvents ();
1423
1423
}
1424
1424
1425
- // TODO(wyszynski): endBefore
1426
1425
@ Test
1427
1426
public void startAfterEndAtWithPriorityWorks () throws DatabaseException , InterruptedException {
1428
1427
DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
@@ -1471,8 +1470,8 @@ public void startAfterEndBeforeWithPriorityWorks()
1471
1470
ValueExpectationHelper helper = new ValueExpectationHelper ();
1472
1471
helper .add (
1473
1472
ref .startAfter ("w" ).endBefore ("z" ), new MapBuilder ().put ("c" , 3L ).put ("b" , 2L ).build ());
1474
- // helper.add(ref.startAfter("w").endBefore("w"), null);
1475
- // helper.add(ref.startAfter("a").endBefore("c"), null);
1473
+ helper .add (ref .startAfter ("w" ).endBefore ("w" ), null );
1474
+ helper .add (ref .startAfter ("a" ).endBefore ("c" ), null );
1476
1475
Semaphore semaphore = new Semaphore (0 );
1477
1476
ref .setValue (
1478
1477
new MapBuilder ()
@@ -1515,7 +1514,6 @@ public void startAtEndAtWithPriorityWorksWithServerData()
1515
1514
helper .waitForEvents ();
1516
1515
}
1517
1516
1518
- // TODO(wyszynski): endBefore
1519
1517
@ Test
1520
1518
public void startAfterEndAtWithPriorityWorksWithServerData ()
1521
1519
throws DatabaseException , InterruptedException {
@@ -1537,6 +1535,48 @@ public void startAfterEndAtWithPriorityWorksWithServerData()
1537
1535
helper .waitForEvents ();
1538
1536
}
1539
1537
1538
+ @ Test
1539
+ public void startAtEndBeforeWithPriorityWorksWithServerData ()
1540
+ throws DatabaseException , InterruptedException {
1541
+ DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
1542
+
1543
+ ref .setValue (
1544
+ new MapBuilder ()
1545
+ .put ("a" , new MapBuilder ().put (".value" , 1 ).put (".priority" , "z" ).build ())
1546
+ .put ("b" , new MapBuilder ().put (".value" , 2 ).put (".priority" , "y" ).build ())
1547
+ .put ("c" , new MapBuilder ().put (".value" , 3 ).put (".priority" , "x" ).build ())
1548
+ .put ("d" , new MapBuilder ().put (".value" , 4 ).put (".priority" , "w" ).build ())
1549
+ .build ());
1550
+
1551
+ ValueExpectationHelper helper = new ValueExpectationHelper ();
1552
+ helper .add (ref .startAt ("w" ).endBefore ("y" ), new MapBuilder ().put ("d" , 4L ).put ("c" , 3L ).build ());
1553
+ helper .add (ref .startAt ("w" ).endBefore ("x" ), new MapBuilder ().put ("d" , 4L ).build ());
1554
+ helper .add (ref .startAt ("a" ).endBefore ("c" ), null );
1555
+
1556
+ helper .waitForEvents ();
1557
+ }
1558
+
1559
+ @ Test
1560
+ public void startAfterEndBeforeWithPriorityWorksWithServerData ()
1561
+ throws DatabaseException , InterruptedException {
1562
+ DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
1563
+
1564
+ ref .setValue (
1565
+ new MapBuilder ()
1566
+ .put ("a" , new MapBuilder ().put (".value" , 1 ).put (".priority" , "z" ).build ())
1567
+ .put ("b" , new MapBuilder ().put (".value" , 2 ).put (".priority" , "y" ).build ())
1568
+ .put ("c" , new MapBuilder ().put (".value" , 3 ).put (".priority" , "x" ).build ())
1569
+ .put ("d" , new MapBuilder ().put (".value" , 4 ).put (".priority" , "w" ).build ())
1570
+ .build ());
1571
+
1572
+ ValueExpectationHelper helper = new ValueExpectationHelper ();
1573
+ helper .add (ref .startAfter ("w" ).endBefore ("y" ), new MapBuilder ().put ("c" , 3L ).build ());
1574
+ helper .add (ref .startAfter ("w" ).endBefore ("x" ), null );
1575
+ helper .add (ref .startAfter ("a" ).endBefore ("c" ), null );
1576
+
1577
+ helper .waitForEvents ();
1578
+ }
1579
+
1540
1580
@ Test
1541
1581
public void startAtEndAtWithPriorityAndNameWorks ()
1542
1582
throws DatabaseException , InterruptedException {
@@ -3481,7 +3521,6 @@ public void onCancelled(DatabaseError error) {}
3481
3521
assertEquals ("a" , removedSecond .get (0 ));
3482
3522
}
3483
3523
3484
- // TODO(wyszynski): endBefore
3485
3524
@ Test
3486
3525
public void correctlyGetEventsForStartAfterEndAtQueriesWhenPriorityChanges ()
3487
3526
throws DatabaseException , TestFailure , ExecutionException , TimeoutException ,
@@ -3568,6 +3607,93 @@ public void onCancelled(DatabaseError error) {}
3568
3607
assertEquals ("a" , removedSecond .get (0 ));
3569
3608
}
3570
3609
3610
+ @ Test
3611
+ public void correctlyGetEventsForStartAtEndBeforeQueriesWhenPriorityChanges ()
3612
+ throws DatabaseException , TestFailure , ExecutionException , TimeoutException ,
3613
+ InterruptedException {
3614
+ DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
3615
+
3616
+ final List <String > addedFirst = new ArrayList <String >();
3617
+ final List <String > removedFirst = new ArrayList <String >();
3618
+ final List <String > addedSecond = new ArrayList <String >();
3619
+ final List <String > removedSecond = new ArrayList <String >();
3620
+
3621
+ ref .startAt (0 )
3622
+ .endBefore (10 )
3623
+ .addChildEventListener (
3624
+ new ChildEventListener () {
3625
+ @ Override
3626
+ public void onChildAdded (DataSnapshot snapshot , String previousChildName ) {
3627
+ addedFirst .add (snapshot .getKey ());
3628
+ }
3629
+
3630
+ @ Override
3631
+ public void onChildChanged (DataSnapshot snapshot , String previousChildName ) {
3632
+ // No-op
3633
+ }
3634
+
3635
+ @ Override
3636
+ public void onChildRemoved (DataSnapshot snapshot ) {
3637
+ removedFirst .add (snapshot .getKey ());
3638
+ }
3639
+
3640
+ @ Override
3641
+ public void onChildMoved (DataSnapshot snapshot , String previousChildName ) {
3642
+ // No-op
3643
+ }
3644
+
3645
+ @ Override
3646
+ public void onCancelled (DatabaseError error ) {}
3647
+ });
3648
+
3649
+ ref .startAt (10 )
3650
+ .endBefore (20 )
3651
+ .addChildEventListener (
3652
+ new ChildEventListener () {
3653
+ @ Override
3654
+ public void onChildAdded (DataSnapshot snapshot , String previousChildName ) {
3655
+ addedSecond .add (snapshot .getKey ());
3656
+ }
3657
+
3658
+ @ Override
3659
+ public void onChildChanged (DataSnapshot snapshot , String previousChildName ) {
3660
+ // No-op
3661
+ }
3662
+
3663
+ @ Override
3664
+ public void onChildRemoved (DataSnapshot snapshot ) {
3665
+ removedSecond .add (snapshot .getKey ());
3666
+ }
3667
+
3668
+ @ Override
3669
+ public void onChildMoved (DataSnapshot snapshot , String previousChildName ) {
3670
+ // No-op
3671
+ }
3672
+
3673
+ @ Override
3674
+ public void onCancelled (DatabaseError error ) {}
3675
+ });
3676
+
3677
+ ref .child ("a" ).setValue ("a" , 5 );
3678
+ ref .child ("a" ).setValue ("a" , 15 );
3679
+ ref .child ("a" ).setValue ("a" , 10 );
3680
+ ref .child ("a" ).setValue ("a" , 20 );
3681
+ new WriteFuture (ref .child ("a" ), "a" , 5 ).timedGet ();
3682
+
3683
+ assertEquals (2 , addedFirst .size ());
3684
+ assertEquals ("a" , addedFirst .get (0 ));
3685
+ assertEquals ("a" , addedFirst .get (1 ));
3686
+
3687
+ assertEquals (1 , removedFirst .size ());
3688
+ assertEquals ("a" , removedFirst .get (0 ));
3689
+
3690
+ assertEquals (1 , addedSecond .size ());
3691
+ assertEquals ("a" , addedSecond .get (0 ));
3692
+
3693
+ assertEquals (1 , removedSecond .size ());
3694
+ assertEquals ("a" , removedSecond .get (0 ));
3695
+ }
3696
+
3571
3697
@ Test
3572
3698
public void behavesWithDivergingQueries ()
3573
3699
throws DatabaseException , TestFailure , ExecutionException , TimeoutException ,
@@ -3741,6 +3867,45 @@ public void onCancelled(DatabaseError error) {}
3741
3867
IntegrationTestHelpers .waitFor (done );
3742
3868
}
3743
3869
3870
+ @ Test
3871
+ public void integerKeysBehaveNumericallyEndBefore ()
3872
+ throws InterruptedException , TestFailure , TimeoutException {
3873
+ final DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
3874
+ final Semaphore done = new Semaphore (0 );
3875
+ ref .setValue (
3876
+ new MapBuilder ()
3877
+ .put ("1" , true )
3878
+ .put ("50" , true )
3879
+ .put ("550" , true )
3880
+ .put ("6" , true )
3881
+ .put ("600" , true )
3882
+ .put ("70" , true )
3883
+ .put ("8" , true )
3884
+ .put ("80" , true )
3885
+ .build (),
3886
+ new DatabaseReference .CompletionListener () {
3887
+ @ Override
3888
+ public void onComplete (DatabaseError error , DatabaseReference ref ) {
3889
+ ref .endBefore (null , "10" )
3890
+ .addListenerForSingleValueEvent (
3891
+ new ValueEventListener () {
3892
+ @ Override
3893
+ public void onDataChange (DataSnapshot snapshot ) {
3894
+ Map <String , Object > expected =
3895
+ new MapBuilder ().put ("1" , true ).put ("6" , true ).put ("8" , true ).build ();
3896
+ DeepEquals .assertEquals (expected , snapshot .getValue ());
3897
+ done .release ();
3898
+ }
3899
+
3900
+ @ Override
3901
+ public void onCancelled (DatabaseError error ) {}
3902
+ });
3903
+ }
3904
+ });
3905
+
3906
+ IntegrationTestHelpers .waitFor (done );
3907
+ }
3908
+
3744
3909
@ Test
3745
3910
public void integerKeysBehaveNumericallyWithStartAfterOverflow ()
3746
3911
throws InterruptedException , TestFailure , TimeoutException {
@@ -3779,6 +3944,95 @@ public void onCancelled(DatabaseError error) {}
3779
3944
IntegrationTestHelpers .waitFor (done );
3780
3945
}
3781
3946
3947
+ @ Test
3948
+ public void integerKeysBehaveNumericallyWithEndBeforeUnderflow ()
3949
+ throws InterruptedException , TestFailure , TimeoutException {
3950
+ final DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
3951
+ final Semaphore done = new Semaphore (0 );
3952
+ ref .setValue (
3953
+ new MapBuilder ()
3954
+ .put (String .valueOf (Integer .MIN_VALUE ), true )
3955
+ .put ("80" , true )
3956
+ .put ("1" , true )
3957
+ .put ("50" , true )
3958
+ .put ("550" , true )
3959
+ .put ("6" , true )
3960
+ .put ("600" , true )
3961
+ .put ("70" , true )
3962
+ .put ("8" , true )
3963
+ .build (),
3964
+ new DatabaseReference .CompletionListener () {
3965
+ @ Override
3966
+ public void onComplete (DatabaseError error , DatabaseReference ref ) {
3967
+ ref .endBefore (null , String .valueOf (Integer .MIN_VALUE ))
3968
+ .addListenerForSingleValueEvent (
3969
+ new ValueEventListener () {
3970
+ @ Override
3971
+ public void onDataChange (DataSnapshot snapshot ) {
3972
+ DeepEquals .assertEquals (null , snapshot .getValue ());
3973
+ done .release ();
3974
+ }
3975
+
3976
+ @ Override
3977
+ public void onCancelled (DatabaseError error ) {}
3978
+ });
3979
+ }
3980
+ });
3981
+
3982
+ IntegrationTestHelpers .waitFor (done );
3983
+ }
3984
+
3985
+ @ Test
3986
+ public void integerKeysBehaveNumericallyWithEndBeforeMinLex ()
3987
+ throws InterruptedException , TestFailure , TimeoutException {
3988
+ final DatabaseReference ref = IntegrationTestHelpers .getRandomNode ();
3989
+ final Semaphore done = new Semaphore (0 );
3990
+ ref .setValue (
3991
+ new MapBuilder ()
3992
+ .put (String .valueOf (Integer .MAX_VALUE ), true )
3993
+ .put ("80" , true )
3994
+ .put ("1" , true )
3995
+ .put ("50" , true )
3996
+ .put ("550" , true )
3997
+ .put ("6" , true )
3998
+ .put ("600" , true )
3999
+ .put ("70" , true )
4000
+ .put ("8" , true )
4001
+ .put ("a" , true )
4002
+ .build (),
4003
+ new DatabaseReference .CompletionListener () {
4004
+ @ Override
4005
+ public void onComplete (DatabaseError error , DatabaseReference ref ) {
4006
+ ref .endBefore (null , String .valueOf (/* MIN_PUSH_CHAR = */ '-' ))
4007
+ .addListenerForSingleValueEvent (
4008
+ new ValueEventListener () {
4009
+ @ Override
4010
+ public void onDataChange (DataSnapshot snapshot ) {
4011
+ DeepEquals .assertEquals (
4012
+ snapshot .getValue (),
4013
+ new MapBuilder ()
4014
+ .put (String .valueOf (Integer .MAX_VALUE ), true )
4015
+ .put ("80" , true )
4016
+ .put ("1" , true )
4017
+ .put ("50" , true )
4018
+ .put ("550" , true )
4019
+ .put ("6" , true )
4020
+ .put ("600" , true )
4021
+ .put ("70" , true )
4022
+ .put ("8" , true )
4023
+ .build ());
4024
+ done .release ();
4025
+ }
4026
+
4027
+ @ Override
4028
+ public void onCancelled (DatabaseError error ) {}
4029
+ });
4030
+ }
4031
+ });
4032
+
4033
+ IntegrationTestHelpers .waitFor (done );
4034
+ }
4035
+
3782
4036
@ Test
3783
4037
public void integerKeysBehaveNumerically2 ()
3784
4038
throws InterruptedException , TestFailure , TimeoutException {
0 commit comments