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