1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
// Copyright 2021 Bret Jordan & Benedikt Thoma, All rights reserved.
// Copyright 2006-2019 WebPKI.org (http://webpki.org).
//
// Use of this source code is governed by an Apache 2.0 license that can be
// found in the LICENSE file in the root of the source tree.
package jcs
import (
"bufio"
"math"
"os"
"strconv"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
const testFile = "/home/test/es6testfile100m.txt"
const invalidNumber = "null"
type numberParsingTestCase struct {
desc string
ieeeHex string
expected string
}
func TestNumberToJSON(t *testing.T) {
r := require.New(t)
testCases := []numberParsingTestCase{
{
ieeeHex: "4340000000000001",
expected: "9007199254740994",
},
{
ieeeHex: "4340000000000002",
expected: "9007199254740996",
},
{
ieeeHex: "444b1ae4d6e2ef50",
expected: "1e+21",
},
{
ieeeHex: "3eb0c6f7a0b5ed8d",
expected: "0.000001",
},
{
ieeeHex: "3eb0c6f7a0b5ed8c",
expected: "9.999999999999997e-7",
},
{
ieeeHex: "8000000000000000",
expected: "0",
},
{
ieeeHex: "7fffffffffffffff",
expected: invalidNumber,
},
{
ieeeHex: "7ff0000000000000",
expected: invalidNumber,
},
{
ieeeHex: "fff0000000000000",
expected: invalidNumber,
},
}
if _, err := os.Stat(testFile); err == nil {
file, err := os.Open(testFile)
r.NoErrorf(err, "Failed at reading test sample file: %s\n", err)
scanner := bufio.NewScanner(file)
var lineCount int
for scanner.Scan() {
lineCount++
line := scanner.Text()
lineSl := strings.Split(line, ",")
r.Equalf(len(lineSl), 2, "Failed because a comma is missing in line %v\n", lineCount)
hex := lineSl[0]
expected := lineSl[1]
t.Run(expected, func(t *testing.T) {
testNumberParsing(t, r, numberParsingTestCase{
desc: expected,
ieeeHex: hex,
expected: expected,
})
})
}
r.NoErrorf(err, "Failed at scanning test file: %s\n", err)
file.Close()
} else if os.IsNotExist(err) {
} else {
r.NoErrorf(err, "Failed at testing if numbers test file exists: %s\n", err)
}
for _, tC := range testCases {
t.Run(tC.desc, func(t *testing.T) {
testNumberParsing(t, r, tC)
})
}
}
func testNumberParsing(t *testing.T, r *require.Assertions, tC numberParsingTestCase) {
for len(tC.ieeeHex) < 16 {
tC.ieeeHex = "0" + tC.ieeeHex
}
ieeeU64, err := strconv.ParseUint(tC.ieeeHex, 16, 64)
r.NoErrorf(err, "Failed at parsing tC.ieeeHex [%s]: %s\n", tC.ieeeHex, err)
ieeeF64 := math.Float64frombits(ieeeU64)
es6Created, err := NumberToJSON(ieeeF64)
if tC.expected == invalidNumber {
r.Errorf(err, "Failed because parsing number to json did not return an error even though the expected JSON is null\n")
} else {
r.NoErrorf(err, "Failed at converting float to json: %s\n", err)
}
r.Equalf(tC.expected, es6Created, "Failed because converted number [%s] (tC.ieeeHex [%s]) does not match tC.expected [%s]\n", es6Created, tC.ieeeHex, tC.expected)
}
|