9 "github.com/bytom/bytom/common"
10 "github.com/bytom/bytom/protocol/vm/mocks"
11 "github.com/bytom/bytom/testutil"
14 func TestNumericOps(t *testing.T) {
15 type testStruct struct {
17 startVM *virtualMachine
19 wantVM *virtualMachine
21 cases := []testStruct{{
23 startVM: &virtualMachine{
25 dataStack: [][]byte{{0x02}},
27 wantVM: &virtualMachine{
29 dataStack: [][]byte{{0x03}},
33 startVM: &virtualMachine{
35 dataStack: [][]byte{{2}},
37 wantVM: &virtualMachine{
39 dataStack: [][]byte{{1}},
43 startVM: &virtualMachine{
45 dataStack: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
47 wantVM: &virtualMachine{
50 dataStack: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
54 startVM: &virtualMachine{
56 dataStack: [][]byte{{2}},
58 wantVM: &virtualMachine{
60 dataStack: [][]byte{{4}},
64 startVM: &virtualMachine{
66 dataStack: [][]byte{{0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
68 wantVM: &virtualMachine{
70 dataStack: [][]byte{{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}},
74 startVM: &virtualMachine{
76 dataStack: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
78 wantVM: &virtualMachine{
81 dataStack: [][]byte{{0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}},
85 startVM: &virtualMachine{
87 dataStack: [][]byte{{2}},
89 wantVM: &virtualMachine{
91 dataStack: [][]byte{{1}},
95 startVM: &virtualMachine{
97 dataStack: [][]byte{{2}},
99 wantVM: &virtualMachine{
102 dataStack: [][]byte{{}},
106 startVM: &virtualMachine{
108 dataStack: [][]byte{{2}},
110 wantVM: &virtualMachine{
112 dataStack: [][]byte{{1}},
116 startVM: &virtualMachine{
118 dataStack: [][]byte{{2}, {1}},
120 wantVM: &virtualMachine{
123 dataStack: [][]byte{{3}},
127 startVM: &virtualMachine{
129 dataStack: [][]byte{{2}, {1}},
131 wantVM: &virtualMachine{
134 dataStack: [][]byte{{1}},
138 startVM: &virtualMachine{
140 dataStack: [][]byte{{2}, {1}},
142 wantVM: &virtualMachine{
145 dataStack: [][]byte{{2}},
149 startVM: &virtualMachine{
151 dataStack: [][]byte{{2}, {1}},
153 wantVM: &virtualMachine{
156 dataStack: [][]byte{{2}},
160 startVM: &virtualMachine{
162 dataStack: [][]byte{{2}, {}},
167 startVM: &virtualMachine{
169 dataStack: [][]byte{{2}, {1}},
171 wantVM: &virtualMachine{
174 dataStack: [][]byte{{}},
178 startVM: &virtualMachine{
180 dataStack: [][]byte{{2}, {0}},
185 startVM: &virtualMachine{
187 dataStack: [][]byte{{2}, {1}},
189 wantVM: &virtualMachine{
192 dataStack: [][]byte{{4}},
196 startVM: &virtualMachine{
198 dataStack: [][]byte{{2}, {1}},
200 wantVM: &virtualMachine{
203 dataStack: [][]byte{{1}},
207 startVM: &virtualMachine{
209 dataStack: [][]byte{{2}, {1}},
211 wantVM: &virtualMachine{
214 dataStack: [][]byte{{1}},
218 startVM: &virtualMachine{
220 dataStack: [][]byte{{2}, {1}},
222 wantVM: &virtualMachine{
225 dataStack: [][]byte{{1}},
229 startVM: &virtualMachine{
231 dataStack: [][]byte{{2}, {1}},
233 wantVM: &virtualMachine{
236 dataStack: [][]byte{{}},
239 op: OP_NUMEQUALVERIFY,
240 startVM: &virtualMachine{
242 dataStack: [][]byte{{2}, {2}},
244 wantVM: &virtualMachine{
247 dataStack: [][]byte{},
250 op: OP_NUMEQUALVERIFY,
251 startVM: &virtualMachine{
253 dataStack: [][]byte{{1}, {2}},
255 wantErr: ErrVerifyFailed,
258 startVM: &virtualMachine{
260 dataStack: [][]byte{{2}, {1}},
262 wantVM: &virtualMachine{
265 dataStack: [][]byte{{1}},
269 startVM: &virtualMachine{
271 dataStack: [][]byte{{2}, {1}},
273 wantVM: &virtualMachine{
276 dataStack: [][]byte{{}},
279 op: OP_LESSTHANOREQUAL,
280 startVM: &virtualMachine{
282 dataStack: [][]byte{{2}, {1}},
284 wantVM: &virtualMachine{
287 dataStack: [][]byte{{}},
291 startVM: &virtualMachine{
293 dataStack: [][]byte{{2}, {1}},
295 wantVM: &virtualMachine{
298 dataStack: [][]byte{{1}},
301 op: OP_GREATERTHANOREQUAL,
302 startVM: &virtualMachine{
304 dataStack: [][]byte{{2}, {1}},
306 wantVM: &virtualMachine{
309 dataStack: [][]byte{{1}},
313 startVM: &virtualMachine{
315 dataStack: [][]byte{{2}, {1}},
317 wantVM: &virtualMachine{
320 dataStack: [][]byte{{1}},
324 startVM: &virtualMachine{
326 dataStack: [][]byte{{1}, {2}},
328 wantVM: &virtualMachine{
331 dataStack: [][]byte{{1}},
335 startVM: &virtualMachine{
337 dataStack: [][]byte{{2}, {1}},
339 wantVM: &virtualMachine{
342 dataStack: [][]byte{{2}},
346 startVM: &virtualMachine{
348 dataStack: [][]byte{{1}, {2}},
350 wantVM: &virtualMachine{
353 dataStack: [][]byte{{2}},
357 startVM: &virtualMachine{
359 dataStack: [][]byte{{1}, {1}, {2}},
361 wantVM: &virtualMachine{
364 dataStack: [][]byte{{1}},
369 OP_1ADD, OP_1SUB, OP_2MUL, OP_2DIV, OP_NOT, OP_0NOTEQUAL,
370 OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT, OP_RSHIFT, OP_BOOLAND,
371 OP_BOOLOR, OP_NUMEQUAL, OP_NUMEQUALVERIFY, OP_NUMNOTEQUAL, OP_LESSTHAN,
372 OP_LESSTHANOREQUAL, OP_GREATERTHAN, OP_GREATERTHANOREQUAL, OP_MIN, OP_MAX, OP_WITHIN,
375 for _, op := range numops {
376 cases = append(cases, testStruct{
378 startVM: &virtualMachine{
380 dataStack: [][]byte{{2}, {2}, {2}},
382 wantErr: ErrRunLimitExceeded,
386 for i, c := range cases {
387 err := ops[c.op].fn(c.startVM)
389 if err != c.wantErr {
390 t.Errorf("case %d, op %s: got err = %v want %v", i, ops[c.op].name, err, c.wantErr)
393 if c.wantErr != nil {
397 if !testutil.DeepEqual(c.startVM, c.wantVM) {
398 t.Errorf("case %d, op %s: unexpected vm result\n\tgot: %+v\n\twant: %+v\n", i, ops[c.op].name, c.startVM, c.wantVM)
403 func TestRangeErrs(t *testing.T) {
409 {fmt.Sprintf("%d 1ADD", int64(math.MinInt64)), true},
410 {fmt.Sprintf("%d 1ADD", int64(math.MaxInt64)-1), false},
411 {fmt.Sprintf("%s 1ADD", big.NewInt(0).SetBytes(common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")).String()), true},
412 {fmt.Sprintf("%s 1ADD", big.NewInt(0).SetBytes(common.Hex2Bytes("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")).String()), true},
415 for i, c := range cases {
416 prog, _ := Assemble(c.prog)
417 vm := &virtualMachine{
424 if c.expectRangeErr {
425 t.Errorf("case %d (%s): expected range error, got none", i, c.prog)
428 if !c.expectRangeErr {
429 t.Errorf("case %d (%s): got unexpected range error", i, c.prog)
432 if c.expectRangeErr {
433 t.Errorf("case %d (%s): expected range error, got %s", i, c.prog, err)
435 t.Errorf("case %d (%s): got unexpected error %s", i, c.prog, err)
441 func TestNumCompare(t *testing.T) {
453 name: "test 2 > 1 for cmpLess",
456 dataStack: [][]byte{{0x02}, {0x01}},
465 name: "test 2 > 1 for cmpLessEqual",
468 dataStack: [][]byte{{0x02}, {0x01}},
477 name: "test 2 > 1 for cmpGreater",
480 dataStack: [][]byte{{0x02}, {0x01}},
489 name: "test 2 > 1 for cmpGreaterEqual",
492 dataStack: [][]byte{{0x02}, {0x01}},
501 name: "test 2 > 1 for cmpEqual",
504 dataStack: [][]byte{{0x02}, {0x01}},
513 name: "test 2 > 1 for cmpNotEqual",
516 dataStack: [][]byte{{0x02}, {0x01}},
525 name: "test 2 == 2 for cmpLess",
528 dataStack: [][]byte{{0x02}, {0x02}},
537 name: "test 2 == 2 for cmpLessEqual",
540 dataStack: [][]byte{{0x02}, {0x02}},
549 name: "test 2 == 2 for cmpGreater",
552 dataStack: [][]byte{{0x02}, {0x02}},
561 name: "test 2 == 2 for cmpGreaterEqual",
564 dataStack: [][]byte{{0x02}, {0x02}},
573 name: "test 2 == 2 for cmpEqual",
576 dataStack: [][]byte{{0x02}, {0x02}},
585 name: "test 2 == 2 for cmpNotEqual",
588 dataStack: [][]byte{{0x02}, {0x02}},
597 name: "test 1 < 2 for cmpLess",
600 dataStack: [][]byte{{0x01}, {0x02}},
609 name: "test 1 < 2 for cmpLessEqual",
612 dataStack: [][]byte{{0x01}, {0x02}},
621 name: "test 1 < 2 for cmpGreater",
624 dataStack: [][]byte{{0x01}, {0x02}},
633 name: "test 1 < 2 for cmpGreaterEqual",
636 dataStack: [][]byte{{0x01}, {0x02}},
645 name: "test 1 < 2 for cmpEqual",
648 dataStack: [][]byte{{0x01}, {0x02}},
657 name: "test 1 < 2 for cmpNotEqual",
660 dataStack: [][]byte{{0x01}, {0x02}},
669 for _, tt := range tests {
670 t.Run(tt.name, func(t *testing.T) {
671 if err := doNumCompare(tt.args.vm, tt.args.op); (err != nil) != tt.wantErr {
672 t.Errorf("doNumCompare() error = %v, wantErr %v", err, tt.wantErr)
678 func TestOpMinMax(t *testing.T) {
681 f func(vm *virtualMachine) error
691 name: "min of (2, 3)",
695 dataStack: [][]byte{{0x02}, {0x03}},
699 want: [][]byte{{0x02}},
704 name: "max of (2, 3)",
708 dataStack: [][]byte{{0x02}, {0x03}},
712 want: [][]byte{{0x03}},
716 name: "max of (two number, one number)",
720 dataStack: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0xff}},
724 want: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
728 name: "min of (0, -1) got error",
732 dataStack: [][]byte{{}, mocks.U256NumNegative1},
740 name: "max of (-1, -1) got error",
744 dataStack: [][]byte{mocks.U256NumNegative1, mocks.U256NumNegative1},
752 for _, tt := range tests {
753 t.Run(tt.name, func(t *testing.T) {
754 if err := tt.args.f(tt.args.vm); err != nil {
756 t.Errorf("opAdd() error = %v, wantErr %v", err, tt.wantErr)
760 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
761 t.Errorf("opAdd() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
767 func Test_op2Mul(t *testing.T) {
777 name: "test normal mul op",
781 dataStack: [][]byte{{2}},
787 name: "test normal mul op of big number",
791 dataStack: [][]byte{{0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
797 name: "test error of mul op negative",
801 dataStack: [][]byte{mocks.U256NumNegative1},
807 name: "test error of mul op out range",
811 dataStack: [][]byte{mocks.MaxU256},
817 name: "test error of mul op out range which result is min number",
821 dataStack: [][]byte{{0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
827 for _, tt := range tests {
828 t.Run(tt.name, func(t *testing.T) {
829 if err := op2Mul(tt.args.vm); (err != nil) != tt.wantErr {
830 t.Errorf("op2Mul() error = %v, wantErr %v", err, tt.wantErr)
836 func Test_opMul(t *testing.T) {
847 name: "test normal mul op",
851 dataStack: [][]byte{{2}, {2}},
858 name: "test normal mul op of big number",
862 dataStack: [][]byte{{0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0x02}},
865 want: [][]byte{{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}},
869 name: "test error of mul op negative",
873 dataStack: [][]byte{mocks.U256NumNegative1, {0x02}},
879 name: "test error of mul op out range",
883 dataStack: [][]byte{mocks.MaxU256},
889 name: "test error of mul op out range which result is min number",
893 dataStack: [][]byte{{0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x02}},
899 for _, tt := range tests {
900 t.Run(tt.name, func(t *testing.T) {
901 if err := opMul(tt.args.vm); err != nil {
903 t.Errorf("opMul() error = %v, wantErr %v", err, tt.wantErr)
907 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
908 t.Errorf("opMul() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
914 func Test_op1Sub(t *testing.T) {
925 name: "Test 2 - 1 = 1",
929 dataStack: [][]byte{{0x02}},
932 want: [][]byte{{0x01}},
936 name: "Test that two number become one number after op sub",
940 dataStack: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
943 want: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
947 name: "Test for 0 - 1 got error",
951 dataStack: [][]byte{{}},
958 name: "Test for -1 - 1 got error",
962 dataStack: [][]byte{mocks.U256NumNegative1},
969 for _, tt := range tests {
970 t.Run(tt.name, func(t *testing.T) {
971 if err := op1Sub(tt.args.vm); (err != nil) != tt.wantErr {
972 t.Errorf("op1Sub() error = %v, wantErr %v", err, tt.wantErr)
974 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
975 t.Errorf("op1Sub() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
981 func Test_opSub(t *testing.T) {
992 name: "Test 2 - 1 = 1",
996 dataStack: [][]byte{{0x02}, {0x01}},
999 want: [][]byte{{0x01}},
1003 name: "Test that two number become one number",
1005 vm: &virtualMachine{
1007 dataStack: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x01}},
1010 want: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1014 name: "Test for 0 - 1 got error",
1016 vm: &virtualMachine{
1018 dataStack: [][]byte{{}, {0x01}},
1025 name: "Test for -1 - 1 got error",
1027 vm: &virtualMachine{
1029 dataStack: [][]byte{mocks.U256NumNegative1, {0x01}},
1036 for _, tt := range tests {
1037 t.Run(tt.name, func(t *testing.T) {
1038 if err := opSub(tt.args.vm); (err != nil) != tt.wantErr {
1039 t.Errorf("opSub() error = %v, wantErr %v", err, tt.wantErr)
1041 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
1042 t.Errorf("opSub() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
1048 func Test_op2Div(t *testing.T) {
1059 name: "Test 2 div 2 = 1",
1061 vm: &virtualMachine{
1063 dataStack: [][]byte{{0x02}},
1066 want: [][]byte{{0x01}},
1070 name: "Test that two number become one number after op div",
1072 vm: &virtualMachine{
1074 dataStack: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1077 want: [][]byte{{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1081 name: "Test for 0 div 2 got 0",
1083 vm: &virtualMachine{
1085 dataStack: [][]byte{{}},
1092 name: "Test for -1 div 2 got error",
1094 vm: &virtualMachine{
1096 dataStack: [][]byte{mocks.U256NumNegative1},
1103 for _, tt := range tests {
1104 t.Run(tt.name, func(t *testing.T) {
1105 if err := op2Div(tt.args.vm); err != nil {
1107 t.Errorf("op2Div() error = %v, wantErr %v", err, tt.wantErr)
1111 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
1112 t.Errorf("op2Div() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
1118 func Test_opDiv(t *testing.T) {
1129 name: "Test 2 div 2 = 1",
1131 vm: &virtualMachine{
1133 dataStack: [][]byte{{0x02}, {0x02}},
1136 want: [][]byte{{0x01}},
1140 name: "Test 2 div 1 = 2",
1142 vm: &virtualMachine{
1144 dataStack: [][]byte{{0x02}, {0x01}},
1147 want: [][]byte{{0x02}},
1151 name: "Test that two number become one number after op div",
1153 vm: &virtualMachine{
1155 dataStack: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x02}},
1158 want: [][]byte{{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1162 name: "Test for 0 div 2 got 0",
1164 vm: &virtualMachine{
1166 dataStack: [][]byte{{}, {0x02}},
1173 name: "Test for -1 div 2 got error",
1175 vm: &virtualMachine{
1177 dataStack: [][]byte{mocks.U256NumNegative1, {0x02}},
1184 name: "Test for 1 div 0 got error",
1186 vm: &virtualMachine{
1188 dataStack: [][]byte{{0x01}, {}},
1195 for _, tt := range tests {
1196 t.Run(tt.name, func(t *testing.T) {
1197 if err := opDiv(tt.args.vm); err != nil {
1199 t.Errorf("opDiv() error = %v, wantErr %v", err, tt.wantErr)
1203 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
1204 t.Errorf("opDiv() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
1210 func Test_opAdd(t *testing.T) {
1222 name: "Test 2 + 2 = 4",
1224 vm: &virtualMachine{
1226 dataStack: [][]byte{{0x02}, {0x02}},
1229 want: [][]byte{{0x04}},
1233 name: "Test that one number become two number",
1235 vm: &virtualMachine{
1237 dataStack: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0x01}},
1240 want: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
1244 name: "Test for 0 + -1 got error",
1246 vm: &virtualMachine{
1248 dataStack: [][]byte{{}, mocks.U256NumNegative1},
1255 name: "Test for -1 + -1 got error",
1257 vm: &virtualMachine{
1259 dataStack: [][]byte{mocks.U256NumNegative1, mocks.U256NumNegative1},
1266 for _, tt := range tests {
1267 t.Run(tt.name, func(t *testing.T) {
1268 if err := opAdd(tt.args.vm); err != nil {
1270 t.Errorf("opAdd() error = %v, wantErr %v", err, tt.wantErr)
1274 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
1275 t.Errorf("opAdd() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
1281 func Test_opMod(t *testing.T) {
1292 name: "Test 2 mod 2 = 0",
1294 vm: &virtualMachine{
1296 dataStack: [][]byte{{0x02}, {0x02}},
1303 name: "Test 2 mod 1 = 0",
1305 vm: &virtualMachine{
1307 dataStack: [][]byte{{0x02}, {0x01}},
1314 name: "Test 255 mod 4 = 3",
1316 vm: &virtualMachine{
1318 dataStack: [][]byte{{0xff}, {0x04}},
1321 want: [][]byte{{0x03}},
1325 name: "Test that two number become one number",
1327 vm: &virtualMachine{
1329 dataStack: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x03}},
1332 want: [][]byte{{0x01}},
1336 name: "Test for 0 mod 2 got 0",
1338 vm: &virtualMachine{
1340 dataStack: [][]byte{{}, {0x02}},
1347 name: "Test for -1 div 2 got error",
1349 vm: &virtualMachine{
1351 dataStack: [][]byte{mocks.U256NumNegative1, {0x02}},
1358 name: "Test for 1 div 0 got error",
1360 vm: &virtualMachine{
1362 dataStack: [][]byte{{0x01}, {}},
1369 for _, tt := range tests {
1370 t.Run(tt.name, func(t *testing.T) {
1371 if err := opMod(tt.args.vm); err != nil {
1373 t.Errorf("opMod() error = %v, wantErr %v", err, tt.wantErr)
1377 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
1378 t.Errorf("opMod() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)
1384 func TestOpShift(t *testing.T) {
1387 f func(vm *virtualMachine) error
1397 name: "2 left shift 0",
1399 vm: &virtualMachine{
1401 dataStack: [][]byte{{0x02}, {}},
1405 want: [][]byte{{0x02}},
1409 name: "2 right shift 0",
1411 vm: &virtualMachine{
1413 dataStack: [][]byte{{0x02}, {}},
1417 want: [][]byte{{0x02}},
1421 name: "2 left shift 3",
1423 vm: &virtualMachine{
1425 dataStack: [][]byte{{0x02}, {0x03}},
1429 want: [][]byte{{0x10}},
1433 name: "2 right shift 3",
1435 vm: &virtualMachine{
1437 dataStack: [][]byte{{0x02}, {0x03}},
1445 name: "two number right shift become one number",
1447 vm: &virtualMachine{
1449 dataStack: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0x0f}},
1453 want: [][]byte{{0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1457 name: "two number left shift become overflow",
1459 vm: &virtualMachine{
1461 dataStack: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, {0xff}},
1468 name: "left shift not uint64",
1470 vm: &virtualMachine{
1472 dataStack: [][]byte{{0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1480 name: "right shift not uint64",
1482 vm: &virtualMachine{
1484 dataStack: [][]byte{{0xff}, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
1492 name: "0 left shift -1 got error",
1494 vm: &virtualMachine{
1496 dataStack: [][]byte{{}, mocks.U256NumNegative1},
1504 name: "-1 right shift -1 got error",
1506 vm: &virtualMachine{
1508 dataStack: [][]byte{mocks.U256NumNegative1, mocks.U256NumNegative1},
1516 for _, tt := range tests {
1517 t.Run(tt.name, func(t *testing.T) {
1518 if err := tt.args.f(tt.args.vm); err != nil {
1520 t.Errorf("opShift() error = %v, wantErr %v", err, tt.wantErr)
1524 if !testutil.DeepEqual(tt.args.vm.dataStack, tt.want) {
1525 t.Errorf("opShift() error, got %v and wantErr %v", tt.args.vm.dataStack, tt.want)