@@ -810,86 +810,103 @@ func TestNotJSONEncodableTime(t *testing.T) {
810
810
811
811
var parseDurationTests = []struct {
812
812
in string
813
- ok bool
814
813
want Duration
815
814
}{
816
815
// simple
817
- {"0" , true , 0 },
818
- {"5s" , true , 5 * Second },
819
- {"30s" , true , 30 * Second },
820
- {"1478s" , true , 1478 * Second },
816
+ {"0" , 0 },
817
+ {"5s" , 5 * Second },
818
+ {"30s" , 30 * Second },
819
+ {"1478s" , 1478 * Second },
821
820
// sign
822
- {"-5s" , true , - 5 * Second },
823
- {"+5s" , true , 5 * Second },
824
- {"-0" , true , 0 },
825
- {"+0" , true , 0 },
821
+ {"-5s" , - 5 * Second },
822
+ {"+5s" , 5 * Second },
823
+ {"-0" , 0 },
824
+ {"+0" , 0 },
826
825
// decimal
827
- {"5.0s" , true , 5 * Second },
828
- {"5.6s" , true , 5 * Second + 600 * Millisecond },
829
- {"5.s" , true , 5 * Second },
830
- {".5s" , true , 500 * Millisecond },
831
- {"1.0s" , true , 1 * Second },
832
- {"1.00s" , true , 1 * Second },
833
- {"1.004s" , true , 1 * Second + 4 * Millisecond },
834
- {"1.0040s" , true , 1 * Second + 4 * Millisecond },
835
- {"100.00100s" , true , 100 * Second + 1 * Millisecond },
826
+ {"5.0s" , 5 * Second },
827
+ {"5.6s" , 5 * Second + 600 * Millisecond },
828
+ {"5.s" , 5 * Second },
829
+ {".5s" , 500 * Millisecond },
830
+ {"1.0s" , 1 * Second },
831
+ {"1.00s" , 1 * Second },
832
+ {"1.004s" , 1 * Second + 4 * Millisecond },
833
+ {"1.0040s" , 1 * Second + 4 * Millisecond },
834
+ {"100.00100s" , 100 * Second + 1 * Millisecond },
836
835
// different units
837
- {"10ns" , true , 10 * Nanosecond },
838
- {"11us" , true , 11 * Microsecond },
839
- {"12µs" , true , 12 * Microsecond }, // U+00B5
840
- {"12μs" , true , 12 * Microsecond }, // U+03BC
841
- {"13ms" , true , 13 * Millisecond },
842
- {"14s" , true , 14 * Second },
843
- {"15m" , true , 15 * Minute },
844
- {"16h" , true , 16 * Hour },
836
+ {"10ns" , 10 * Nanosecond },
837
+ {"11us" , 11 * Microsecond },
838
+ {"12µs" , 12 * Microsecond }, // U+00B5
839
+ {"12μs" , 12 * Microsecond }, // U+03BC
840
+ {"13ms" , 13 * Millisecond },
841
+ {"14s" , 14 * Second },
842
+ {"15m" , 15 * Minute },
843
+ {"16h" , 16 * Hour },
845
844
// composite durations
846
- {"3h30m" , true , 3 * Hour + 30 * Minute },
847
- {"10.5s4m" , true , 4 * Minute + 10 * Second + 500 * Millisecond },
848
- {"-2m3.4s" , true , - (2 * Minute + 3 * Second + 400 * Millisecond )},
849
- {"1h2m3s4ms5us6ns" , true , 1 * Hour + 2 * Minute + 3 * Second + 4 * Millisecond + 5 * Microsecond + 6 * Nanosecond },
850
- {"39h9m14.425s" , true , 39 * Hour + 9 * Minute + 14 * Second + 425 * Millisecond },
845
+ {"3h30m" , 3 * Hour + 30 * Minute },
846
+ {"10.5s4m" , 4 * Minute + 10 * Second + 500 * Millisecond },
847
+ {"-2m3.4s" , - (2 * Minute + 3 * Second + 400 * Millisecond )},
848
+ {"1h2m3s4ms5us6ns" , 1 * Hour + 2 * Minute + 3 * Second + 4 * Millisecond + 5 * Microsecond + 6 * Nanosecond },
849
+ {"39h9m14.425s" , 39 * Hour + 9 * Minute + 14 * Second + 425 * Millisecond },
851
850
// large value
852
- {"52763797000ns" , true , 52763797000 * Nanosecond },
851
+ {"52763797000ns" , 52763797000 * Nanosecond },
853
852
// more than 9 digits after decimal point, see https://golang.org/issue/6617
854
- {"0.3333333333333333333h" , true , 20 * Minute },
853
+ {"0.3333333333333333333h" , 20 * Minute },
855
854
// 9007199254740993 = 1<<53+1 cannot be stored precisely in a float64
856
- {"9007199254740993ns" , true , (1 << 53 + 1 ) * Nanosecond },
855
+ {"9007199254740993ns" , (1 << 53 + 1 ) * Nanosecond },
857
856
// largest duration that can be represented by int64 in nanoseconds
858
- {"9223372036854775807ns" , true , (1 << 63 - 1 ) * Nanosecond },
859
- {"9223372036854775.807us" , true , (1 << 63 - 1 ) * Nanosecond },
860
- {"9223372036s854ms775us807ns" , true , (1 << 63 - 1 ) * Nanosecond },
857
+ {"9223372036854775807ns" , (1 << 63 - 1 ) * Nanosecond },
858
+ {"9223372036854775.807us" , (1 << 63 - 1 ) * Nanosecond },
859
+ {"9223372036s854ms775us807ns" , (1 << 63 - 1 ) * Nanosecond },
861
860
// large negative value
862
- {"-9223372036854775807ns" , true , - 1 << 63 + 1 * Nanosecond },
861
+ {"-9223372036854775807ns" , - 1 << 63 + 1 * Nanosecond },
863
862
// huge string; issue 15011.
864
- {"0.100000000000000000000h" , true , 6 * Minute },
863
+ {"0.100000000000000000000h" , 6 * Minute },
865
864
// This value tests the first overflow check in leadingFraction.
866
- {"0.830103483285477580700h" , true , 49 * Minute + 48 * Second + 372539827 * Nanosecond },
867
-
868
- // errors
869
- {"" , false , 0 },
870
- {"3" , false , 0 },
871
- {"-" , false , 0 },
872
- {"s" , false , 0 },
873
- {"." , false , 0 },
874
- {"-." , false , 0 },
875
- {".s" , false , 0 },
876
- {"+.s" , false , 0 },
877
- {"3000000h" , false , 0 }, // overflow
878
- {"9223372036854775808ns" , false , 0 }, // overflow
879
- {"9223372036854775.808us" , false , 0 }, // overflow
880
- {"9223372036854ms775us808ns" , false , 0 }, // overflow
881
- // largest negative value of type int64 in nanoseconds should fail
882
- // see https://go-review.googlesource.com/#/c/2461/
883
- {"-9223372036854775808ns" , false , 0 },
865
+ {"0.830103483285477580700h" , 49 * Minute + 48 * Second + 372539827 * Nanosecond },
884
866
}
885
867
886
868
func TestParseDuration (t * testing.T ) {
887
869
for _ , tc := range parseDurationTests {
888
870
d , err := ParseDuration (tc .in )
889
- if tc . ok && ( err != nil || d != tc .want ) {
871
+ if err != nil || d != tc .want {
890
872
t .Errorf ("ParseDuration(%q) = %v, %v, want %v, nil" , tc .in , d , err , tc .want )
891
- } else if ! tc .ok && err == nil {
873
+ }
874
+ }
875
+ }
876
+
877
+ var parseDurationErrorTests = []struct {
878
+ in string
879
+ expect string
880
+ }{
881
+ // invalid
882
+ {"" , `""` },
883
+ {"3" , `"3"` },
884
+ {"-" , `"-"` },
885
+ {"s" , `"s"` },
886
+ {"." , `"."` },
887
+ {"-." , `"-."` },
888
+ {".s" , `".s"` },
889
+ {"+.s" , `"+.s"` },
890
+ {"1d" , `"1d"` },
891
+ // overflow
892
+ {"9223372036854775810ns" , `"9223372036854775810ns"` },
893
+ {"9223372036854775808ns" , `"9223372036854775808ns"` },
894
+ // largest negative value of type int64 in nanoseconds should fail
895
+ // see https://go-review.googlesource.com/#/c/2461/
896
+ {"-9223372036854775808ns" , `"-9223372036854775808ns"` },
897
+ {"9223372036854776us" , `"9223372036854776us"` },
898
+ {"3000000h" , `"3000000h"` },
899
+ {"9223372036854775.808us" , `"9223372036854775.808us"` },
900
+ {"9223372036854ms775us808ns" , `"9223372036854ms775us808ns"` },
901
+ }
902
+
903
+ func TestParseDurationErrors (t * testing.T ) {
904
+ for _ , tc := range parseDurationErrorTests {
905
+ _ , err := ParseDuration (tc .in )
906
+ if err == nil {
892
907
t .Errorf ("ParseDuration(%q) = _, nil, want _, non-nil" , tc .in )
908
+ } else if ! strings .Contains (err .Error (), tc .expect ) {
909
+ t .Errorf ("ParseDuration(%q) = _, %q, error does not contain %q" , tc .in , err , tc .expect )
893
910
}
894
911
}
895
912
}
0 commit comments