| // 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) |
| } |
| } |