| // Copyright 2011 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package json | |
| import ( | |
| "regexp" | |
| "testing" | |
| ) | |
| func TestNumberIsValid(t *testing.T) { | |
| // From: https://stackoverflow.com/a/13340826 | |
| var jsonNumberRegexp = regexp.MustCompile(`^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$`) | |
| validTests := []string{ | |
| "0", | |
| "-0", | |
| "1", | |
| "-1", | |
| "0.1", | |
| "-0.1", | |
| "1234", | |
| "-1234", | |
| "12.34", | |
| "-12.34", | |
| "12E0", | |
| "12E1", | |
| "12e34", | |
| "12E-0", | |
| "12e+1", | |
| "12e-34", | |
| "-12E0", | |
| "-12E1", | |
| "-12e34", | |
| "-12E-0", | |
| "-12e+1", | |
| "-12e-34", | |
| "1.2E0", | |
| "1.2E1", | |
| "1.2e34", | |
| "1.2E-0", | |
| "1.2e+1", | |
| "1.2e-34", | |
| "-1.2E0", | |
| "-1.2E1", | |
| "-1.2e34", | |
| "-1.2E-0", | |
| "-1.2e+1", | |
| "-1.2e-34", | |
| "0E0", | |
| "0E1", | |
| "0e34", | |
| "0E-0", | |
| "0e+1", | |
| "0e-34", | |
| "-0E0", | |
| "-0E1", | |
| "-0e34", | |
| "-0E-0", | |
| "-0e+1", | |
| "-0e-34", | |
| } | |
| for _, test := range validTests { | |
| if !isValidNumber(test) { | |
| t.Errorf("%s should be valid", test) | |
| } | |
| var f float64 | |
| if err := Unmarshal([]byte(test), &f); err != nil { | |
| t.Errorf("%s should be valid but Unmarshal failed: %v", test, err) | |
| } | |
| if !jsonNumberRegexp.MatchString(test) { | |
| t.Errorf("%s should be valid but regexp does not match", test) | |
| } | |
| } | |
| invalidTests := []string{ | |
| "", | |
| "invalid", | |
| "1.0.1", | |
| "1..1", | |
| "-1-2", | |
| "012a42", | |
| "01.2", | |
| "012", | |
| "12E12.12", | |
| "1e2e3", | |
| "1e+-2", | |
| "1e--23", | |
| "1e", | |
| "e1", | |
| "1e+", | |
| "1ea", | |
| "1a", | |
| "1.a", | |
| "1.", | |
| "01", | |
| "1.e1", | |
| } | |
| for _, test := range invalidTests { | |
| if isValidNumber(test) { | |
| t.Errorf("%s should be invalid", test) | |
| } | |
| var f float64 | |
| if err := Unmarshal([]byte(test), &f); err == nil { | |
| t.Errorf("%s should be invalid but unmarshal wrote %v", test, f) | |
| } | |
| if jsonNumberRegexp.MatchString(test) { | |
| t.Errorf("%s should be invalid but matches regexp", test) | |
| } | |
| } | |
| } | |
| func BenchmarkNumberIsValid(b *testing.B) { | |
| s := "-61657.61667E+61673" | |
| for i := 0; i < b.N; i++ { | |
| isValidNumber(s) | |
| } | |
| } | |
| func BenchmarkNumberIsValidRegexp(b *testing.B) { | |
| var jsonNumberRegexp = regexp.MustCompile(`^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$`) | |
| s := "-61657.61667E+61673" | |
| for i := 0; i < b.N; i++ { | |
| jsonNumberRegexp.MatchString(s) | |
| } | |
| } |