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