File: es6numfmt_test.go

package info (click to toggle)
golang-webpki-org-jsoncanonicalizer 1.0.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 296 kB
  • sloc: makefile: 2
file content (124 lines) | stat: -rw-r--r-- 2,991 bytes parent folder | download
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)
}