gitee.com/quant1x/gox@v1.7.6/fastjson/fastfloat_test.go (about)

     1  package fastjson
     2  
     3  import (
     4  	"math"
     5  	"testing"
     6  )
     7  
     8  func TestParseUint64BestEffort(t *testing.T) {
     9  	f := func(s string, expectedNum uint64) {
    10  		t.Helper()
    11  
    12  		num := ParseUint64BestEffort(s)
    13  		if num != expectedNum {
    14  			t.Fatalf("unexpected umber parsed from %q; got %v; want %v", s, num, expectedNum)
    15  		}
    16  	}
    17  
    18  	// Invalid first char
    19  	f("", 0)
    20  	f("   ", 0)
    21  	f("foo", 0)
    22  	f("-", 0)
    23  	f("-foo", 0)
    24  	f("-123", 0)
    25  
    26  	// Invalid suffix
    27  	f("1foo", 0)
    28  	f("13223 ", 0)
    29  	f("1-2", 0)
    30  
    31  	// Int
    32  	f("1", 1)
    33  	f("123", 123)
    34  	f("1234567890", 1234567890)
    35  	f("9223372036854775807", 9223372036854775807)
    36  	f("18446744073709551615", 18446744073709551615)
    37  
    38  	// Too big int
    39  	f("18446744073709551616", 0)
    40  }
    41  
    42  func TestParseInt64BestEffort(t *testing.T) {
    43  	f := func(s string, expectedNum int64) {
    44  		t.Helper()
    45  
    46  		num := ParseInt64BestEffort(s)
    47  		if num != expectedNum {
    48  			t.Fatalf("unexpected umber parsed from %q; got %v; want %v", s, num, expectedNum)
    49  		}
    50  	}
    51  
    52  	// Invalid first char
    53  	f("", 0)
    54  	f("   ", 0)
    55  	f("foo", 0)
    56  	f("-", 0)
    57  	f("-foo", 0)
    58  
    59  	// Invalid suffix
    60  	f("1foo", 0)
    61  	f("13223 ", 0)
    62  	f("1-2", 0)
    63  
    64  	// Int
    65  	f("0", 0)
    66  	f("-0", 0)
    67  	f("1", 1)
    68  	f("123", 123)
    69  	f("-123", -123)
    70  	f("1234567890", 1234567890)
    71  	f("9223372036854775807", 9223372036854775807)
    72  	f("-9223372036854775807", -9223372036854775807)
    73  
    74  	// Too big int
    75  	f("9223372036854775808", 0)
    76  	f("18446744073709551615", 0)
    77  }
    78  
    79  func TestParseBestEffort(t *testing.T) {
    80  	f := func(s string, expectedNum float64) {
    81  		t.Helper()
    82  
    83  		num := ParseBestEffort(s)
    84  		if num != expectedNum {
    85  			t.Fatalf("unexpected number parsed from %q; got %v; want %v", s, num, expectedNum)
    86  		}
    87  	}
    88  
    89  	// Invalid first char
    90  	f("", 0)
    91  	f("  ", 0)
    92  	f("foo", 0)
    93  	f(" bar ", 0)
    94  	f("-", 0)
    95  	f("--", 0)
    96  	f("-.", 0)
    97  	f("-.e", 0)
    98  	f("+112", 0)
    99  	f("++", 0)
   100  	f("e123", 0)
   101  	f("E123", 0)
   102  	f("-e12", 0)
   103  	f(".", 0)
   104  	f("..34", 0)
   105  	f("-.32", 0)
   106  	f("-.e3", 0)
   107  	f(".e+3", 0)
   108  
   109  	// Invalid suffix
   110  	f("1foo", 0)
   111  	f("1  foo", 0)
   112  	f("12.34.56", 0)
   113  	f("13e34.56", 0)
   114  	f("12.34e56e4", 0)
   115  	f("12.", 0)
   116  	f("123..45", 0)
   117  	f("123ee34", 0)
   118  	f("123e", 0)
   119  	f("123e+", 0)
   120  	f("123E-", 0)
   121  	f("123E+.", 0)
   122  	f("-123e-23foo", 0)
   123  
   124  	// Integer
   125  	f("0", 0)
   126  	f("-0", 0)
   127  	f("0123", 123)
   128  	f("-00123", -123)
   129  	f("1", 1)
   130  	f("-1", -1)
   131  	f("1234567890123456", 1234567890123456)
   132  	f("12345678901234567", 12345678901234567)
   133  	f("123456789012345678", 123456789012345678)
   134  	f("1234567890123456789", 1234567890123456789)
   135  	f("12345678901234567890", 12345678901234567890)
   136  	f("-12345678901234567890", -12345678901234567890)
   137  	f("9223372036854775807", 9223372036854775807)
   138  	f("18446744073709551615", 18446744073709551615)
   139  	f("-18446744073709551615", -18446744073709551615)
   140  
   141  	// Fractional part
   142  	f("0.0", 0)
   143  	f("0.000", 0)
   144  	f("0.1", 0.1)
   145  	f("0.3", 0.3)
   146  	f("-0.1", -0.1)
   147  	f("-0.123", -0.123)
   148  	f("12345.1234567890123456", 12345.1234567890123456)
   149  	f("12345.12345678901234567", 12345.12345678901234567)
   150  	f("12345.123456789012345678", 12345.123456789012345678)
   151  	f("12345.1234567890123456789", 12345.1234567890123456789)
   152  	f("12345.12345678901234567890", 12345.12345678901234567890)
   153  	f("-12345.12345678901234567890", -12345.12345678901234567890)
   154  	f("18446744073709551615.18446744073709551615", 18446744073709551615.18446744073709551615)
   155  	f("-18446744073709551615.18446744073709551615", -18446744073709551615.18446744073709551615)
   156  
   157  	// Exponent part
   158  	f("0e0", 0)
   159  	f("123e+001", 123e1)
   160  	f("0e12", 0)
   161  	f("-0E123", 0)
   162  	f("-0E-123", 0)
   163  	f("-0E+123", 0)
   164  	f("123e12", 123e12)
   165  	f("-123E-12", -123E-12)
   166  	f("-123e-400", 0)
   167  	f("123e456", math.Inf(1))   // too big exponent
   168  	f("-123e456", math.Inf(-1)) // too big exponent
   169  
   170  	// Fractional + exponent part
   171  	f("0.123e4", 0.123e4)
   172  	f("-123.456E-10", -123.456E-10)
   173  }