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