@@ -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_return_my_address)
4143 auto vm = evmc::VM{evmc_create_example_vm ()};
4244 std::ostringstream out;
4345
44- const auto exit_code = cmd::run (vm, EVMC_HOMESTEAD, 200 , " 30600052596000f3" , " " , out);
46+ const auto exit_code = cmd::run (vm, EVMC_HOMESTEAD, 200 , " 30600052596000f3" , " " , false , out);
4547 EXPECT_EQ (exit_code, 0 );
4648 EXPECT_EQ (out.str (),
4749 out_pattern (" Homestead" , 200 , " success" , 6 ,
@@ -56,9 +58,51 @@ TEST(tool_commands, run_copy_input_to_output)
5658
5759 const auto exit_code =
5860 cmd::run (vm, EVMC_TANGERINE_WHISTLE, 200 , " 600035600052596000f3" ,
59- " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , out);
61+ " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , false , out);
6062 EXPECT_EQ (exit_code, 0 );
6163 EXPECT_EQ (out.str (),
6264 out_pattern (" Tangerine Whistle" , 200 , " success" , 7 ,
6365 " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" ));
6466}
67+
68+ TEST (tool_commands, create_return_1)
69+ {
70+ // Contract: mstore(0, 1) return(31, 1)
71+ // Create: mstore(0, 0x60016000526001601ff3) return(22, 10)
72+ auto vm = evmc::VM{evmc_create_example_vm ()};
73+ std::ostringstream out;
74+
75+ const auto exit_code = cmd::run (vm, EVMC_SPURIOUS_DRAGON, 200 ,
76+ " 6960016000526001601ff3600052600a6016f3" , " " , true , out);
77+ EXPECT_EQ (exit_code, 0 );
78+ EXPECT_EQ (out.str (), out_pattern (" Spurious Dragon" , 200 , " success" , 6 , " 01" , true ));
79+ }
80+
81+ TEST (tool_commands, create_copy_input_to_output)
82+ {
83+ // Contract: mstore(0, calldataload(0)) return(0, msize())
84+ // Create: mstore(0, 0x600035600052596000f3) return(22, 10)
85+ auto vm = evmc::VM{evmc_create_example_vm ()};
86+ std::ostringstream out;
87+
88+ const auto exit_code = cmd::run (vm, EVMC_SPURIOUS_DRAGON, 200 ,
89+ " 69600035600052596000f3600052600a6016f3" , " 0c49c4" , true , out);
90+ EXPECT_EQ (exit_code, 0 );
91+ EXPECT_EQ (
92+ out.str (),
93+ out_pattern (" Spurious Dragon" , 200 , " success" , 7 ,
94+ " 0c49c40000000000000000000000000000000000000000000000000000000000" , true ));
95+ }
96+
97+ TEST (tool_commands, create_failure_stack_underflow)
98+ {
99+ // Contract: n/a
100+ // Create: abort()
101+ auto vm = evmc::VM{evmc_create_example_vm ()};
102+ std::ostringstream out;
103+
104+ const auto exit_code = cmd::run (vm, EVMC_HOMESTEAD, 0 , " FE" , " " , true , out);
105+ EXPECT_EQ (exit_code, EVMC_UNDEFINED_INSTRUCTION);
106+ EXPECT_EQ (out.str (),
107+ " Creating and executing on Homestead with 0 gas limit\n Contract creation failed\n " );
108+ }
0 commit comments