Skip to content
Snippets Groups Projects
number_test.go 2.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • // 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++ {
    
    	}
    }
    
    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)