@@ -3738,6 +3738,102 @@ describe('input', function() {
3738
3738
} ) ;
3739
3739
} ) ;
3740
3740
3741
+ describe ( 'ngRequired' , function ( ) {
3742
+
3743
+ describe ( 'when the ngRequired expression initially evaluates to true' , function ( ) {
3744
+
3745
+ it ( 'should be valid even if value is 0' , function ( ) {
3746
+ compileInput ( '<input type="number" ng-model="value" name="numberInput" ng-required="true" />' ) ;
3747
+
3748
+ changeInputValueTo ( '0' ) ;
3749
+ expect ( inputElm ) . toBeValid ( ) ;
3750
+ expect ( scope . value ) . toBe ( 0 ) ;
3751
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3752
+ } ) ;
3753
+
3754
+ it ( 'should be valid even if value 0 is set from model' , function ( ) {
3755
+ compileInput ( '<input type="number" ng-model="value" name="numberInput" ng-required="true" />' ) ;
3756
+
3757
+ scope . $apply ( 'value = 0' ) ;
3758
+
3759
+ expect ( inputElm ) . toBeValid ( ) ;
3760
+ expect ( inputElm . val ( ) ) . toBe ( '0' ) ;
3761
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3762
+ } ) ;
3763
+
3764
+ it ( 'should register required on non boolean elements' , function ( ) {
3765
+ compileInput ( '<div ng-model="value" name="numberInput" ng-required="true">' ) ;
3766
+
3767
+ scope . $apply ( "value = ''" ) ;
3768
+
3769
+ expect ( inputElm ) . toBeInvalid ( ) ;
3770
+ expect ( scope . form . numberInput . $error . required ) . toBeTruthy ( ) ;
3771
+ } ) ;
3772
+
3773
+ it ( 'should change from invalid to valid when the value is empty and the ngRequired expression changes to false' , function ( ) {
3774
+ compileInput ( '<input type="number" ng-model="value" name="numberInput" ng-required="ngRequiredExpr" />' ) ;
3775
+
3776
+ scope . $apply ( 'ngRequiredExpr = true' ) ;
3777
+
3778
+ expect ( inputElm ) . toBeInvalid ( ) ;
3779
+ expect ( scope . value ) . toBeUndefined ( ) ;
3780
+ expect ( scope . form . numberInput . $error . required ) . toBeTruthy ( ) ;
3781
+
3782
+ scope . $apply ( 'ngRequiredExpr = false' ) ;
3783
+
3784
+ expect ( inputElm ) . toBeValid ( ) ;
3785
+ expect ( scope . value ) . toBeUndefined ( ) ;
3786
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3787
+ } ) ;
3788
+ } ) ;
3789
+
3790
+ describe ( 'when the ngRequired expression initially evaluates to false' , function ( ) {
3791
+
3792
+ it ( 'should be valid even if value is empty' , function ( ) {
3793
+ compileInput ( '<input type="number" ng-model="value" name="numberInput" ng-required="false" />' ) ;
3794
+
3795
+ expect ( inputElm ) . toBeValid ( ) ;
3796
+ expect ( scope . value ) . toBeUndefined ( ) ;
3797
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3798
+ expect ( scope . form . numberInput . $error . number ) . toBeFalsy ( ) ;
3799
+ } ) ;
3800
+
3801
+ it ( 'should be valid if value is non-empty' , function ( ) {
3802
+ compileInput ( '<input type="number" ng-model="value" name="numberInput" ng-required="false" />' ) ;
3803
+
3804
+ changeInputValueTo ( '42' ) ;
3805
+ expect ( inputElm ) . toBeValid ( ) ;
3806
+ expect ( scope . value ) . toBe ( 42 ) ;
3807
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3808
+ } ) ;
3809
+
3810
+ it ( 'should not register required on non boolean elements' , function ( ) {
3811
+ compileInput ( '<div ng-model="value" name="numberInput" ng-required="false">' ) ;
3812
+
3813
+ scope . $apply ( "value = ''" ) ;
3814
+
3815
+ expect ( inputElm ) . toBeValid ( ) ;
3816
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3817
+ } ) ;
3818
+
3819
+ it ( 'should change from valid to invalid when the value is empty and the ngRequired expression changes to true' , function ( ) {
3820
+ compileInput ( '<input type="number" ng-model="value" name="numberInput" ng-required="ngRequiredExpr" />' ) ;
3821
+
3822
+ scope . $apply ( 'ngRequiredExpr = false' ) ;
3823
+
3824
+ expect ( inputElm ) . toBeValid ( ) ;
3825
+ expect ( scope . value ) . toBeUndefined ( ) ;
3826
+ expect ( scope . form . numberInput . $error . required ) . toBeFalsy ( ) ;
3827
+
3828
+ scope . $apply ( 'ngRequiredExpr = true' ) ;
3829
+
3830
+ expect ( inputElm ) . toBeInvalid ( ) ;
3831
+ expect ( scope . value ) . toBeUndefined ( ) ;
3832
+ expect ( scope . form . numberInput . $error . required ) . toBeTruthy ( ) ;
3833
+ } ) ;
3834
+ } ) ;
3835
+ } ) ;
3836
+
3741
3837
describe ( 'minlength' , function ( ) {
3742
3838
3743
3839
it ( 'should invalidate values that are shorter than the given minlength' , function ( ) {
0 commit comments