int256_test.gno
4.33 Kb ยท 213 lines
1package int256
2
3import (
4 "testing"
5
6 "gno.land/p/demo/uint256"
7)
8
9func TestInitializers(t *testing.T) {
10 tests := []struct {
11 name string
12 fn func() *Int
13 wantSign int
14 wantStr string
15 }{
16 {"Zero", Zero, 0, "0"},
17 {"New", New, 0, "0"},
18 {"One", One, 1, "1"},
19 }
20
21 for _, tt := range tests {
22 t.Run(tt.name, func(t *testing.T) {
23 z := tt.fn()
24 if z.Sign() != tt.wantSign {
25 t.Errorf("%s() = %d, want %d", tt.name, z.Sign(), tt.wantSign)
26 }
27 if z.String() != tt.wantStr {
28 t.Errorf("%s() = %s, want %s", tt.name, z.String(), tt.wantStr)
29 }
30 })
31 }
32}
33
34func TestNewInt(t *testing.T) {
35 tests := []struct {
36 input int64
37 expected int
38 }{
39 {0, 0},
40 {1, 1},
41 {-1, -1},
42 {9223372036854775807, 1}, // max int64
43 {-9223372036854775808, -1}, // min int64
44 }
45
46 for _, tt := range tests {
47 z := NewInt(tt.input)
48 if z.Sign() != tt.expected {
49 t.Errorf("NewInt(%d) = %d, want %d", tt.input, z.Sign(), tt.expected)
50 }
51 }
52}
53
54func TestFromDecimal(t *testing.T) {
55 tests := []struct {
56 input string
57 expected int
58 isError bool
59 }{
60 {"0", 0, false},
61 {"1", 1, false},
62 {"-1", -1, false},
63 {"123456789", 1, false},
64 {"-123456789", -1, false},
65 {"invalid", 0, true},
66 }
67
68 for _, tt := range tests {
69 z, err := FromDecimal(tt.input)
70 if tt.isError {
71 if err == nil {
72 t.Errorf("FromDecimal(%s) expected error, but got nil", tt.input)
73 }
74 } else {
75 if err != nil {
76 t.Errorf("FromDecimal(%s) unexpected error: %v", tt.input, err)
77 } else if z.Sign() != tt.expected {
78 t.Errorf("FromDecimal(%s) sign is incorrect. Expected: %d, Actual: %d", tt.input, tt.expected, z.Sign())
79 }
80 }
81 }
82}
83
84func TestMustFromDecimal(t *testing.T) {
85 tests := []struct {
86 input string
87 expected int
88 shouldPanic bool
89 }{
90 {"0", 0, false},
91 {"1", 1, false},
92 {"-1", -1, false},
93 {"123", 1, false},
94 {"invalid", 0, true},
95 }
96
97 for _, tt := range tests {
98 if tt.shouldPanic {
99 defer func() {
100 if r := recover(); r == nil {
101 t.Errorf("MustFromDecimal(%q) expected panic, but got nil", tt.input)
102 }
103 }()
104 }
105
106 z := MustFromDecimal(tt.input)
107 if !tt.shouldPanic && z.Sign() != tt.expected {
108 t.Errorf("MustFromDecimal(%q) sign is incorrect. Expected: %d, Actual: %d", tt.input, tt.expected, z.Sign())
109 }
110 }
111}
112
113func TestSetUint64(t *testing.T) {
114 tests := []uint64{
115 0,
116 1,
117 18446744073709551615, // max uint64
118 }
119
120 for _, tt := range tests {
121 z := New().SetUint64(tt)
122 if z.Sign() < 0 {
123 t.Errorf("SetUint64(%d) result is negative", tt)
124 }
125 if tt == 0 && z.Sign() != 0 {
126 t.Errorf("SetUint64(0) result is not zero")
127 }
128 if tt > 0 && z.Sign() != 1 {
129 t.Errorf("SetUint64(%d) result is not positive", tt)
130 }
131 }
132}
133
134func TestFromUint256(t *testing.T) {
135 tests := []struct {
136 input *uint256.Uint
137 expected int
138 }{
139 {uint256.NewUint(0), 0},
140 {uint256.NewUint(1), 1},
141 {uint256.NewUint(18446744073709551615), 1},
142 }
143
144 for _, tt := range tests {
145 z := New().FromUint256(tt.input)
146 if z.Sign() != tt.expected {
147 t.Errorf("FromUint256(%v) = %d, want %d", tt.input, z.Sign(), tt.expected)
148 }
149 }
150}
151
152func TestSign(t *testing.T) {
153 tests := []struct {
154 x string
155 want int
156 }{
157 {"0", 0},
158 {"-0", 0},
159 {"+0", 0},
160 {"1", 1},
161 {"-1", -1},
162 {"9223372036854775807", 1},
163 {"-9223372036854775808", -1},
164 }
165
166 for _, tt := range tests {
167 z := MustFromDecimal(tt.x)
168 got := z.Sign()
169 if got != tt.want {
170 t.Errorf("Sign(%s) = %d, want %d", tt.x, got, tt.want)
171 }
172 }
173}
174
175func BenchmarkSign(b *testing.B) {
176 z := New()
177 for i := 0; i < b.N; i++ {
178 z.SetUint64(uint64(i))
179 z.Sign()
180 }
181}
182
183func TestSetAndToString(t *testing.T) {
184 tests := []struct {
185 input string
186 expected int
187 isError bool
188 }{
189 {"0", 0, false},
190 {"1", 1, false},
191 {"-1", -1, false},
192 {"123456789", 1, false},
193 {"-123456789", -1, false},
194 {"invalid", 0, true},
195 }
196
197 for _, tt := range tests {
198 z, err := New().SetString(tt.input)
199 if tt.isError {
200 if err == nil {
201 t.Errorf("SetString(%s) expected error, but got nil", tt.input)
202 }
203 } else {
204 if err != nil {
205 t.Errorf("SetString(%s) unexpected error: %v", tt.input, err)
206 } else if z.Sign() != tt.expected {
207 t.Errorf("SetString(%s) sign is incorrect. Expected: %d, Actual: %d", tt.input, tt.expected, z.Sign())
208 } else if z.String() != tt.input {
209 t.Errorf("SetString(%s) string representation is incorrect. Expected: %s, Actual: %s", tt.input, tt.input, z.String())
210 }
211 }
212 }
213}