@@ -15,12 +15,14 @@ std::string out_pattern(const char* rev,
1515 int gas_limit,
1616 const char * status,
1717 int gas_used,
18- const char * output = nullptr )
18+ const char * output = nullptr ,
19+ bool create = false )
1920{
2021 std::ostringstream s;
21- s << " Executing on " << rev << " with " << gas_limit << " gas limit\n\n "
22+ s << (create ? " Creating and executing on " : " Executing on " ) << rev << " with " << gas_limit
23+ << " gas limit\n\n "
2224 << " Result: " << status << " \n Gas used: " << gas_used << " \n " ;
23- if (output)
25+ if (output != nullptr )
2426 s << " Output: " << output << " \n " ;
2527 return s.str ();
2628}
@@ -31,7 +33,7 @@ TEST(tool_commands, run_empty_code)
3133 auto vm = evmc::VM{evmc_create_example_vm ()};
3234 std::ostringstream out;
3335
34- const auto exit_code = cmd::run (vm, EVMC_FRONTIER, 1 , " " , " " , out);
36+ const auto exit_code = cmd::run (vm, EVMC_FRONTIER, 1 , " " , " " , false , out);
3537 EXPECT_EQ (exit_code, 0 );
3638 EXPECT_EQ (out.str (), out_pattern (" Frontier" , 1 , " success" , 0 , " " ));
3739}
@@ -41,7 +43,7 @@ TEST(tool_commands, run_oog)
4143 auto vm = evmc::VM{evmc_create_example_vm ()};
4244 std::ostringstream out;
4345
44- const auto exit_code = cmd::run (vm, EVMC_BERLIN, 2 , " 0x6002600201" , " " , out);
46+ const auto exit_code = cmd::run (vm, EVMC_BERLIN, 2 , " 0x6002600201" , " " , false , out);
4547 EXPECT_EQ (exit_code, 0 );
4648 EXPECT_EQ (out.str (), out_pattern (" Berlin" , 2 , " out of gas" , 2 ));
4749}
@@ -51,7 +53,7 @@ TEST(tool_commands, run_return_my_address)
5153 auto vm = evmc::VM{evmc_create_example_vm ()};
5254 std::ostringstream out;
5355
54- const auto exit_code = cmd::run (vm, EVMC_HOMESTEAD, 200 , " 30600052596000f3" , " " , out);
56+ const auto exit_code = cmd::run (vm, EVMC_HOMESTEAD, 200 , " 30600052596000f3" , " " , false , out);
5557 EXPECT_EQ (exit_code, 0 );
5658 EXPECT_EQ (out.str (),
5759 out_pattern (" Homestead" , 200 , " success" , 6 ,
@@ -66,9 +68,52 @@ TEST(tool_commands, run_copy_input_to_output)
6668
6769 const auto exit_code =
6870 cmd::run (vm, EVMC_TANGERINE_WHISTLE, 200 , " 600035600052596000f3" ,
69- " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , out);
71+ " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , false , out);
7072 EXPECT_EQ (exit_code, 0 );
7173 EXPECT_EQ (out.str (),
7274 out_pattern (" Tangerine Whistle" , 200 , " success" , 7 ,
7375 " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" ));
7476}
77+
78+ TEST (tool_commands, create_return_1)
79+ {
80+ // Contract: mstore(0, 1) return(31, 1)
81+ // Create: mstore(0, 0x60016000526001601ff3) return(22, 10)
82+ auto vm = evmc::VM{evmc_create_example_vm ()};
83+ std::ostringstream out;
84+
85+ const auto exit_code = cmd::run (vm, EVMC_SPURIOUS_DRAGON, 200 ,
86+ " 6960016000526001601ff3600052600a6016f3" , " " , true , out);
87+ EXPECT_EQ (exit_code, 0 );
88+ EXPECT_EQ (out.str (), out_pattern (" Spurious Dragon" , 200 , " success" , 6 , " 01" , true ));
89+ }
90+
91+ TEST (tool_commands, create_copy_input_to_output)
92+ {
93+ // Contract: mstore(0, calldataload(0)) return(0, msize())
94+ // Create: mstore(0, 0x600035600052596000f3) return(22, 10)
95+ auto vm = evmc::VM{evmc_create_example_vm ()};
96+ std::ostringstream out;
97+
98+ const auto exit_code = cmd::run (vm, EVMC_SPURIOUS_DRAGON, 200 ,
99+ " 69600035600052596000f3600052600a6016f3" , " 0c49c4" , true , out);
100+ EXPECT_EQ (exit_code, 0 );
101+ EXPECT_EQ (
102+ out.str (),
103+ out_pattern (" Spurious Dragon" , 200 , " success" , 7 ,
104+ " 0c49c40000000000000000000000000000000000000000000000000000000000" , true ));
105+ }
106+
107+ TEST (tool_commands, create_failure_stack_underflow)
108+ {
109+ // Contract: n/a
110+ // Create: abort()
111+ auto vm = evmc::VM{evmc_create_example_vm ()};
112+ std::ostringstream out;
113+
114+ const auto exit_code = cmd::run (vm, EVMC_PETERSBURG, 0 , " fe" , " " , true , out);
115+ EXPECT_EQ (exit_code, EVMC_UNDEFINED_INSTRUCTION);
116+ EXPECT_EQ (out.str (),
117+ " Creating and executing on Petersburg with 0 gas limit\n "
118+ " Contract creation failed: undefined instruction\n " );
119+ }
0 commit comments