Skip to content

Commit b4c0208

Browse files
committed
Add evmmax unit test
1 parent 59ff113 commit b4c0208

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

test/unittests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ target_sources(
3434
evm_benchmark_test.cpp
3535
evmmax_bn254_add_test.cpp
3636
evmmax_bn254_mul_test.cpp
37+
evmmax_execution_tests.cpp
3738
evmmax_test.cpp
3839
evmmax_secp256k1_test.cpp
3940
evmone_test.cpp
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// evmone: Fast Ethereum Virtual Machine implementation
2+
// Copyright 2019-2020 The evmone Authors.
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
/// This file contains EVMMAX execution tests.
6+
7+
#include "evm_fixture.hpp"
8+
9+
using namespace evmc::literals;
10+
using evmone::test::evm;
11+
using namespace intx;
12+
13+
TEST_P(evm, evmmax_smoke_test)
14+
{
15+
if (is_advanced())
16+
return;
17+
18+
rev = EVMC_PRAGUE; /// TODO: Use EVMC_EVMMAX
19+
// Modulus == 7
20+
auto code = mstore(0, 0x07);
21+
// 3 values slots
22+
// Modulus size in bytes
23+
// Modulus offset in EVM memory
24+
// Modulus ID
25+
code += setupx(3, 32, 0, 1);
26+
// value 3
27+
code += mstore(32, 0x03);
28+
// value 6
29+
code += mstore(64, 0x06);
30+
// num values
31+
// values offset
32+
// store values
33+
code += storex(2, 32, 0);
34+
// ADDMODX for values in slots 0 and 1 save result in slot 2
35+
code += addmodx(2, 1, 0);
36+
// MULMODX for values in slots 1 and 2 save result in slot 2
37+
code += mulmodx(2, 2, 1);
38+
// SUBMODX for values in slots 1 and 2 save result in slot 2
39+
code += submodx(2, 2, 1);
40+
// load values from slot 2 into EVM memory
41+
code += loadx(1, 2, 96);
42+
// return loaded result
43+
code += ret(96, 32);
44+
45+
execute(1000, code);
46+
EXPECT_EQ(result.status_code, EVMC_SUCCESS);
47+
EXPECT_OUTPUT_INT(6);
48+
}
49+
50+
TEST_P(evm, evmmax_smoke_test_1byte_modulus)
51+
{
52+
if (is_advanced())
53+
return;
54+
55+
rev = EVMC_PRAGUE; /// TODO: Use EVMC_EVMMAX
56+
// Modulus == 7
57+
auto code = mstore8(0, 0x07);
58+
// 3 values slots
59+
// Modulus size in bytes
60+
// Modulus offset in EVM memory
61+
// Modulus ID
62+
code += setupx(3, 1, 0, 1);
63+
// value 3
64+
code += mstore8(8, 0x03);
65+
// value 6
66+
code += mstore8(16, 0x06);
67+
// num values
68+
// values offset
69+
// store values
70+
code += storex(2, 1, 0);
71+
// ADDMODX for values in slots 0 and 1 save result in slot 2
72+
code += addmodx(2, 1, 0);
73+
// MULMODX for values in slots 1 and 2 save result in slot 2
74+
code += mulmodx(2, 2, 1);
75+
// SUBMODX for values in slots 1 and 2 save result in slot 2
76+
code += submodx(2, 2, 1);
77+
// load values from slot 2 into EVM memory
78+
code += loadx(1, 2, 17);
79+
// return loaded result
80+
code += ret(17, 8);
81+
82+
execute(1000, code);
83+
EXPECT_EQ(result.status_code, EVMC_SUCCESS);
84+
85+
ASSERT_EQ(result.output_size, 8);
86+
EXPECT_EQ(hex({result.output_data, result.output_size}), "0000000000000006");
87+
}
88+
89+
TEST_P(evm, evmmax_smoke_test_2byte_modulus)
90+
{
91+
if (is_advanced())
92+
return;
93+
94+
rev = EVMC_PRAGUE; /// TODO: Use EVMC_EVMMAX
95+
// Modulus == 263 (0x0107)
96+
auto code = mstore8(0, 0x01);
97+
code += mstore8(1, 0x07);
98+
// 3 values slots
99+
// Modulus size in bytes
100+
// Modulus offset in EVM memory
101+
// Modulus ID
102+
code += setupx(3, 2, 0, 1);
103+
// value 258
104+
code += mstore8(8, 0x01);
105+
code += mstore8(9, 0x02);
106+
// value 254
107+
code += mstore8(16, 0x00);
108+
code += mstore8(17, 0xfe);
109+
// num values
110+
// values offset
111+
// store values
112+
code += storex(2, 2, 0);
113+
// ADDMODX for values in slots 0 and 1 save result in slot 2
114+
code += addmodx(2, 1, 0); // 258 + 254 = 249 mod 263
115+
// MULMODX for values in slots 1 and 2 save result in slot 2
116+
code += mulmodx(2, 2, 1); // 249 * 254 = 126 mod 263
117+
// SUBMODX for values in slots 1 and 2 save result in slot 2
118+
code += submodx(2, 2, 1); // 126 - 254 = 135 mod 263
119+
// load values from slot 2 into EVM memory
120+
code += loadx(1, 2, 18);
121+
// return loaded result
122+
code += ret(18, 8);
123+
124+
execute(1000, code);
125+
EXPECT_EQ(result.status_code, EVMC_SUCCESS);
126+
127+
ASSERT_EQ(result.output_size, 8);
128+
EXPECT_EQ(hex({result.output_data, result.output_size}), "0000000000000087");
129+
}

0 commit comments

Comments
 (0)