@@ -639,17 +639,52 @@ describe('Database Functions', () => {
639639 expect ( subject . val ( ) ) . to . equal ( 0 ) ;
640640 populate ( { myKey : 0 } ) ;
641641 expect ( subject . val ( ) ) . to . deep . equal ( { myKey : 0 } ) ;
642-
643- // Null values are still reported as null.
644- populate ( { myKey : null } ) ;
645- expect ( subject . val ( ) ) . to . deep . equal ( { myKey : null } ) ;
646642 } ) ;
647643
648644 // Regression test: .val() was returning array of nulls when there's a property called length (BUG#37683995)
649645 it ( 'should return correct values when data has "length" property' , ( ) => {
650646 populate ( { length : 3 , foo : 'bar' } ) ;
651647 expect ( subject . val ( ) ) . to . deep . equal ( { length : 3 , foo : 'bar' } ) ;
652648 } ) ;
649+
650+ it ( 'should deal with null-values appropriately' , ( ) => {
651+ populate ( null ) ;
652+ expect ( subject . val ( ) ) . to . be . null ;
653+
654+ populate ( { myKey : null } ) ;
655+ expect ( subject . val ( ) ) . to . be . null ;
656+ } ) ;
657+
658+ it ( 'should deal with empty object values appropriately' , ( ) => {
659+ populate ( { } ) ;
660+ expect ( subject . val ( ) ) . to . be . null ;
661+
662+ populate ( { myKey : { } } ) ;
663+ expect ( subject . val ( ) ) . to . be . null ;
664+
665+ populate ( { myKey : { child : null } } ) ;
666+ expect ( subject . val ( ) ) . to . be . null ;
667+ } ) ;
668+
669+ it ( 'should deal with empty array values appropriately' , ( ) => {
670+ populate ( [ ] ) ;
671+ expect ( subject . val ( ) ) . to . be . null ;
672+
673+ populate ( { myKey : [ ] } ) ;
674+ expect ( subject . val ( ) ) . to . be . null ;
675+
676+ populate ( { myKey : [ null ] } ) ;
677+ expect ( subject . val ( ) ) . to . be . null ;
678+
679+ populate ( { myKey : [ { } ] } ) ;
680+ expect ( subject . val ( ) ) . to . be . null ;
681+
682+ populate ( { myKey : [ { myKey : null } ] } ) ;
683+ expect ( subject . val ( ) ) . to . be . null ;
684+
685+ populate ( { myKey : [ { myKey : { } } ] } ) ;
686+ expect ( subject . val ( ) ) . to . be . null ;
687+ } ) ;
653688 } ) ;
654689
655690 describe ( '#child(): DataSnapshot' , ( ) => {
@@ -676,14 +711,37 @@ describe('Database Functions', () => {
676711 } ) ;
677712
678713 it ( 'should be false for a non-existent value' , ( ) => {
679- populate ( { a : { b : 'c' } } ) ;
714+ populate ( { a : { b : 'c' , nullChild : null } } ) ;
680715 expect ( subject . child ( 'd' ) . exists ( ) ) . to . be . false ;
716+ expect ( subject . child ( 'nullChild' ) . exists ( ) ) . to . be . false ;
681717 } ) ;
682718
683719 it ( 'should be false for a value pathed beyond a leaf' , ( ) => {
684720 populate ( { a : { b : 'c' } } ) ;
685721 expect ( subject . child ( 'a/b/c' ) . exists ( ) ) . to . be . false ;
686722 } ) ;
723+
724+ it ( 'should be false for an empty object value' , ( ) => {
725+ populate ( { a : { } } ) ;
726+ expect ( subject . child ( 'a' ) . exists ( ) ) . to . be . false ;
727+
728+ populate ( { a : { child : null } } ) ;
729+ expect ( subject . child ( 'a' ) . exists ( ) ) . to . be . false ;
730+
731+ populate ( { a : { child : { } } } ) ;
732+ expect ( subject . child ( 'a' ) . exists ( ) ) . to . be . false ;
733+ } ) ;
734+
735+ it ( 'should be false for an empty array value' , ( ) => {
736+ populate ( { a : [ ] } ) ;
737+ expect ( subject . child ( 'a' ) . exists ( ) ) . to . be . false ;
738+
739+ populate ( { a : [ null ] } ) ;
740+ expect ( subject . child ( 'a' ) . exists ( ) ) . to . be . false ;
741+
742+ populate ( { a : [ { } ] } ) ;
743+ expect ( subject . child ( 'a' ) . exists ( ) ) . to . be . false ;
744+ } ) ;
687745 } ) ;
688746
689747 describe ( '#forEach(action: (a: DataSnapshot) => boolean): boolean' , ( ) => {
@@ -712,6 +770,17 @@ describe('Database Functions', () => {
712770
713771 expect ( subject . forEach ( counter ) ) . to . equal ( false ) ;
714772 expect ( count ) . to . eq ( 0 ) ;
773+
774+ populate ( {
775+ a : 'foo' ,
776+ nullChild : null ,
777+ emptyObjectChild : { } ,
778+ emptyArrayChild : [ ] ,
779+ } ) ;
780+ count = 0 ;
781+
782+ expect ( subject . forEach ( counter ) ) . to . equal ( false ) ;
783+ expect ( count ) . to . eq ( 1 ) ;
715784 } ) ;
716785
717786 it ( 'should cancel further enumeration if callback returns true' , ( ) => {
@@ -751,13 +820,51 @@ describe('Database Functions', () => {
751820
752821 describe ( '#numChildren()' , ( ) => {
753822 it ( 'should be key count for objects' , ( ) => {
754- populate ( { a : 'b' , c : 'd' } ) ;
823+ populate ( {
824+ a : 'b' ,
825+ c : 'd' ,
826+ nullChild : null ,
827+ emptyObjectChild : { } ,
828+ emptyArrayChild : [ ] ,
829+ } ) ;
755830 expect ( subject . numChildren ( ) ) . to . eq ( 2 ) ;
756831 } ) ;
757832
758833 it ( 'should be 0 for non-objects' , ( ) => {
759834 populate ( 23 ) ;
760835 expect ( subject . numChildren ( ) ) . to . eq ( 0 ) ;
836+
837+ populate ( {
838+ nullChild : null ,
839+ emptyObjectChild : { } ,
840+ emptyArrayChild : [ ] ,
841+ } ) ;
842+ expect ( subject . numChildren ( ) ) . to . eq ( 0 ) ;
843+ } ) ;
844+ } ) ;
845+
846+ describe ( '#hasChildren()' , ( ) => {
847+ it ( 'should true for objects' , ( ) => {
848+ populate ( {
849+ a : 'b' ,
850+ c : 'd' ,
851+ nullChild : null ,
852+ emptyObjectChild : { } ,
853+ emptyArrayChild : [ ] ,
854+ } ) ;
855+ expect ( subject . hasChildren ( ) ) . to . be . true ;
856+ } ) ;
857+
858+ it ( 'should be false for non-objects' , ( ) => {
859+ populate ( 23 ) ;
860+ expect ( subject . hasChildren ( ) ) . to . be . false ;
861+
862+ populate ( {
863+ nullChild : null ,
864+ emptyObjectChild : { } ,
865+ emptyArrayChild : [ ] ,
866+ } ) ;
867+ expect ( subject . hasChildren ( ) ) . to . be . false ;
761868 } ) ;
762869 } ) ;
763870
@@ -769,9 +876,17 @@ describe('Database Functions', () => {
769876 } ) ;
770877
771878 it ( 'should return false if a child is missing' , ( ) => {
772- populate ( { a : 'b' } ) ;
879+ populate ( {
880+ a : 'b' ,
881+ nullChild : null ,
882+ emptyObjectChild : { } ,
883+ emptyArrayChild : [ ] ,
884+ } ) ;
773885 expect ( subject . hasChild ( 'c' ) ) . to . be . false ;
774886 expect ( subject . hasChild ( 'a/b' ) ) . to . be . false ;
887+ expect ( subject . hasChild ( 'nullChild' ) ) . to . be . false ;
888+ expect ( subject . hasChild ( 'emptyObjectChild' ) ) . to . be . false ;
889+ expect ( subject . hasChild ( 'emptyArrayChild' ) ) . to . be . false ;
775890 } ) ;
776891 } ) ;
777892
@@ -801,11 +916,21 @@ describe('Database Functions', () => {
801916
802917 describe ( '#toJSON(): Object' , ( ) => {
803918 it ( 'should return the current value' , ( ) => {
804- populate ( { a : 'b' } ) ;
919+ populate ( {
920+ a : 'b' ,
921+ nullChild : null ,
922+ emptyObjectChild : { } ,
923+ emptyArrayChild : [ ] ,
924+ } ) ;
805925 expect ( subject . toJSON ( ) ) . to . deep . equal ( subject . val ( ) ) ;
806926 } ) ;
807927 it ( 'should be stringifyable' , ( ) => {
808- populate ( { a : 'b' } ) ;
928+ populate ( {
929+ a : 'b' ,
930+ nullChild : null ,
931+ emptyObjectChild : { } ,
932+ emptyArrayChild : [ ] ,
933+ } ) ;
809934 expect ( JSON . stringify ( subject ) ) . to . deep . equal ( '{"a":"b"}' ) ;
810935 } ) ;
811936 } ) ;
0 commit comments