github.com/neilotoole/jsoncolor@v0.7.2-0.20231115150201-1637fae69be1/golang_number_test.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package jsoncolor 6 7 import ( 8 "regexp" 9 "testing" 10 ) 11 12 func TestNumberIsValid(t *testing.T) { 13 // From: https://stackoverflow.com/a/13340826 14 jsonNumberRegexp := regexp.MustCompile(`^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$`) 15 16 validTests := []string{ 17 "0", 18 "-0", 19 "1", 20 "-1", 21 "0.1", 22 "-0.1", 23 "1234", 24 "-1234", 25 "12.34", 26 "-12.34", 27 "12E0", 28 "12E1", 29 "12e34", 30 "12E-0", 31 "12e+1", 32 "12e-34", 33 "-12E0", 34 "-12E1", 35 "-12e34", 36 "-12E-0", 37 "-12e+1", 38 "-12e-34", 39 "1.2E0", 40 "1.2E1", 41 "1.2e34", 42 "1.2E-0", 43 "1.2e+1", 44 "1.2e-34", 45 "-1.2E0", 46 "-1.2E1", 47 "-1.2e34", 48 "-1.2E-0", 49 "-1.2e+1", 50 "-1.2e-34", 51 "0E0", 52 "0E1", 53 "0e34", 54 "0E-0", 55 "0e+1", 56 "0e-34", 57 "-0E0", 58 "-0E1", 59 "-0e34", 60 "-0E-0", 61 "-0e+1", 62 "-0e-34", 63 } 64 65 for _, test := range validTests { 66 if !isValidNumber(test) { 67 t.Errorf("%s should be valid", test) 68 } 69 70 var f float64 71 if err := Unmarshal([]byte(test), &f); err != nil { 72 t.Errorf("%s should be valid but Unmarshal failed: %v", test, err) 73 } 74 75 if !jsonNumberRegexp.MatchString(test) { 76 t.Errorf("%s should be valid but regexp does not match", test) 77 } 78 } 79 80 invalidTests := []string{ 81 "", 82 "invalid", 83 "1.0.1", 84 "1..1", 85 "-1-2", 86 "012a42", 87 "01.2", 88 "012", 89 "12E12.12", 90 "1e2e3", 91 "1e+-2", 92 "1e--23", 93 "1e", 94 "e1", 95 "1e+", 96 "1ea", 97 "1a", 98 "1.a", 99 "1.", 100 "01", 101 "1.e1", 102 } 103 104 for _, test := range invalidTests { 105 var f float64 106 if err := Unmarshal([]byte(test), &f); err == nil { 107 t.Errorf("%s should be invalid but unmarshal wrote %v", test, f) 108 } 109 110 if jsonNumberRegexp.MatchString(test) { 111 t.Errorf("%s should be invalid but matches regexp", test) 112 } 113 } 114 } 115 116 func BenchmarkNumberIsValid(b *testing.B) { 117 s := "-61657.61667E+61673" 118 for i := 0; i < b.N; i++ { 119 isValidNumber(s) 120 } 121 } 122 123 func BenchmarkNumberIsValidRegexp(b *testing.B) { 124 jsonNumberRegexp := regexp.MustCompile(`^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$`) 125 s := "-61657.61667E+61673" 126 for i := 0; i < b.N; i++ { 127 jsonNumberRegexp.MatchString(s) 128 } 129 }