@@ -2703,6 +2703,91 @@ describe('input', function() {
2703
2703
expect ( inputElm . val ( ) ) . toBe ( '10' ) ;
2704
2704
expect ( $rootScope . form . alias . $error . step ) . toBeFalsy ( ) ;
2705
2705
} ) ;
2706
+
2707
+ it ( 'should use the correct "step base" when `[min]` is specified' , function ( ) {
2708
+ $rootScope . min = 5 ;
2709
+ $rootScope . step = 10 ;
2710
+ $rootScope . value = 10 ;
2711
+ var inputElm = helper . compileInput (
2712
+ '<input type="number" ng-model="value" min="{{min}}" ' + attrHtml + ' />' ) ;
2713
+ var ngModel = inputElm . controller ( 'ngModel' ) ;
2714
+
2715
+ expect ( inputElm . val ( ) ) . toBe ( '10' ) ;
2716
+ expect ( inputElm ) . toBeInvalid ( ) ;
2717
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
2718
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
2719
+
2720
+ helper . changeInputValueTo ( '15' ) ;
2721
+ expect ( inputElm ) . toBeValid ( ) ;
2722
+ expect ( $rootScope . value ) . toBe ( 15 ) ;
2723
+
2724
+ $rootScope . $apply ( 'step = 3' ) ;
2725
+ expect ( inputElm . val ( ) ) . toBe ( '15' ) ;
2726
+ expect ( inputElm ) . toBeInvalid ( ) ;
2727
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
2728
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
2729
+
2730
+ helper . changeInputValueTo ( '8' ) ;
2731
+ expect ( inputElm ) . toBeValid ( ) ;
2732
+ expect ( $rootScope . value ) . toBe ( 8 ) ;
2733
+
2734
+ $rootScope . $apply ( 'min = 10; step = 20' ) ;
2735
+ helper . changeInputValueTo ( '30' ) ;
2736
+ expect ( inputElm . val ( ) ) . toBe ( '30' ) ;
2737
+ expect ( inputElm ) . toBeValid ( ) ;
2738
+ expect ( $rootScope . value ) . toBe ( 30 ) ;
2739
+
2740
+ $rootScope . $apply ( 'min = 5' ) ;
2741
+ expect ( inputElm . val ( ) ) . toBe ( '30' ) ;
2742
+ expect ( inputElm ) . toBeInvalid ( ) ;
2743
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
2744
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
2745
+
2746
+ $rootScope . $apply ( 'step = 0.00000001' ) ;
2747
+ expect ( inputElm . val ( ) ) . toBe ( '30' ) ;
2748
+ expect ( inputElm ) . toBeValid ( ) ;
2749
+ expect ( $rootScope . value ) . toBe ( 30 ) ;
2750
+
2751
+ // 0.3 - 0.2 === 0.09999999999999998
2752
+ $rootScope . $apply ( 'min = 0.2; step = (0.3 - 0.2)' ) ;
2753
+ helper . changeInputValueTo ( '0.3' ) ;
2754
+ expect ( inputElm . val ( ) ) . toBe ( '0.3' ) ;
2755
+ expect ( inputElm ) . toBeInvalid ( ) ;
2756
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
2757
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
2758
+ } ) ;
2759
+
2760
+ it ( 'should correctly validate even in cases where the JS floating point arithmetic fails' ,
2761
+ function ( ) {
2762
+ $rootScope . step = 0.1 ;
2763
+ var inputElm = helper . compileInput (
2764
+ '<input type="number" ng-model="value" ' + attrHtml + ' />' ) ;
2765
+ var ngModel = inputElm . controller ( 'ngModel' ) ;
2766
+
2767
+ expect ( inputElm . val ( ) ) . toBe ( '' ) ;
2768
+ expect ( inputElm ) . toBeValid ( ) ;
2769
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
2770
+
2771
+ helper . changeInputValueTo ( '0.3' ) ;
2772
+ expect ( inputElm ) . toBeValid ( ) ;
2773
+ expect ( $rootScope . value ) . toBe ( 0.3 ) ;
2774
+
2775
+ helper . changeInputValueTo ( '2.9999999999999996' ) ;
2776
+ expect ( inputElm ) . toBeInvalid ( ) ;
2777
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
2778
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
2779
+
2780
+ // 0.5 % 0.1 === 0.09999999999999998
2781
+ helper . changeInputValueTo ( '0.5' ) ;
2782
+ expect ( inputElm ) . toBeValid ( ) ;
2783
+ expect ( $rootScope . value ) . toBe ( 0.5 ) ;
2784
+
2785
+ // 3.5 % 0.1 === 0.09999999999999981
2786
+ helper . changeInputValueTo ( '3.5' ) ;
2787
+ expect ( inputElm ) . toBeValid ( ) ;
2788
+ expect ( $rootScope . value ) . toBe ( 3.5 ) ;
2789
+ }
2790
+ ) ;
2706
2791
} ) ;
2707
2792
} ) ;
2708
2793
@@ -3516,6 +3601,87 @@ describe('input', function() {
3516
3601
expect ( inputElm . val ( ) ) . toBe ( '10' ) ;
3517
3602
expect ( scope . form . alias . $error . step ) . toBeFalsy ( ) ;
3518
3603
} ) ;
3604
+
3605
+ it ( 'should use the correct "step base" when `[min]` is specified' , function ( ) {
3606
+ $rootScope . min = 5 ;
3607
+ $rootScope . step = 10 ;
3608
+ $rootScope . value = 10 ;
3609
+ var inputElm = helper . compileInput (
3610
+ '<input type="range" ng-model="value" min="{{min}}" step="{{step}}"" />' ) ;
3611
+ var ngModel = inputElm . controller ( 'ngModel' ) ;
3612
+
3613
+ expect ( inputElm . val ( ) ) . toBe ( '10' ) ;
3614
+ expect ( inputElm ) . toBeInvalid ( ) ;
3615
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
3616
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
3617
+
3618
+ helper . changeInputValueTo ( '15' ) ;
3619
+ expect ( inputElm ) . toBeValid ( ) ;
3620
+ expect ( $rootScope . value ) . toBe ( 15 ) ;
3621
+
3622
+ $rootScope . $apply ( 'step = 3' ) ;
3623
+ expect ( inputElm . val ( ) ) . toBe ( '15' ) ;
3624
+ expect ( inputElm ) . toBeInvalid ( ) ;
3625
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
3626
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
3627
+
3628
+ helper . changeInputValueTo ( '8' ) ;
3629
+ expect ( inputElm ) . toBeValid ( ) ;
3630
+ expect ( $rootScope . value ) . toBe ( 8 ) ;
3631
+
3632
+ $rootScope . $apply ( 'min = 10; step = 20; value = 30' ) ;
3633
+ expect ( inputElm . val ( ) ) . toBe ( '30' ) ;
3634
+ expect ( inputElm ) . toBeValid ( ) ;
3635
+ expect ( $rootScope . value ) . toBe ( 30 ) ;
3636
+
3637
+ $rootScope . $apply ( 'min = 5' ) ;
3638
+ expect ( inputElm . val ( ) ) . toBe ( '30' ) ;
3639
+ expect ( inputElm ) . toBeInvalid ( ) ;
3640
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
3641
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
3642
+
3643
+ $rootScope . $apply ( 'step = 0.00000001' ) ;
3644
+ expect ( inputElm . val ( ) ) . toBe ( '30' ) ;
3645
+ expect ( inputElm ) . toBeValid ( ) ;
3646
+ expect ( $rootScope . value ) . toBe ( 30 ) ;
3647
+
3648
+ // 0.3 - 0.2 === 0.09999999999999998
3649
+ $rootScope . $apply ( 'min = 0.2; step = 0.09999999999999998; value = 0.3' ) ;
3650
+ expect ( inputElm . val ( ) ) . toBe ( '0.3' ) ;
3651
+ expect ( inputElm ) . toBeInvalid ( ) ;
3652
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
3653
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
3654
+ } ) ;
3655
+
3656
+ it ( 'should correctly validate even in cases where the JS floating point arithmetic fails' ,
3657
+ function ( ) {
3658
+ var inputElm = helper . compileInput ( '<input type="range" ng-model="value" step="0.1" />' ) ;
3659
+ var ngModel = inputElm . controller ( 'ngModel' ) ;
3660
+
3661
+ expect ( inputElm . val ( ) ) . toBe ( '' ) ;
3662
+ expect ( inputElm ) . toBeValid ( ) ;
3663
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
3664
+
3665
+ helper . changeInputValueTo ( '0.3' ) ;
3666
+ expect ( inputElm ) . toBeValid ( ) ;
3667
+ expect ( $rootScope . value ) . toBe ( 0.3 ) ;
3668
+
3669
+ helper . changeInputValueTo ( '2.9999999999999996' ) ;
3670
+ expect ( inputElm ) . toBeInvalid ( ) ;
3671
+ expect ( ngModel . $error . step ) . toBe ( true ) ;
3672
+ expect ( $rootScope . value ) . toBeUndefined ( ) ;
3673
+
3674
+ // 0.5 % 0.1 === 0.09999999999999998
3675
+ helper . changeInputValueTo ( '0.5' ) ;
3676
+ expect ( inputElm ) . toBeValid ( ) ;
3677
+ expect ( $rootScope . value ) . toBe ( 0.5 ) ;
3678
+
3679
+ // 3.5 % 0.1 === 0.09999999999999981
3680
+ helper . changeInputValueTo ( '3.5' ) ;
3681
+ expect ( inputElm ) . toBeValid ( ) ;
3682
+ expect ( $rootScope . value ) . toBe ( 3.5 ) ;
3683
+ }
3684
+ ) ;
3519
3685
}
3520
3686
} ) ;
3521
3687
} ) ;
0 commit comments