mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Test for using staticcall for view and pure functions.
This commit is contained in:
parent
b467116ea8
commit
a3593df43b
@ -21,13 +21,20 @@
|
|||||||
* Unit tests for the solidity expression compiler, testing the behaviour of the code.
|
* Unit tests for the solidity expression compiler, testing the behaviour of the code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <test/libsolidity/SolidityExecutionFramework.h>
|
||||||
|
|
||||||
|
#include <test/TestHelper.h>
|
||||||
|
|
||||||
|
#include <libsolidity/interface/Exceptions.h>
|
||||||
|
#include <libsolidity/interface/EVMVersion.h>
|
||||||
|
|
||||||
|
#include <libevmasm/Assembly.h>
|
||||||
|
|
||||||
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <boost/test/unit_test.hpp>
|
|
||||||
#include <libevmasm/Assembly.h>
|
|
||||||
#include <libsolidity/interface/Exceptions.h>
|
|
||||||
#include <test/libsolidity/SolidityExecutionFramework.h>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
@ -10778,6 +10785,51 @@ BOOST_AUTO_TEST_CASE(snark)
|
|||||||
BOOST_CHECK(callContractFunction("verifyTx()") == encodeArgs(true));
|
BOOST_CHECK(callContractFunction("verifyTx()") == encodeArgs(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(staticcall_for_view_and_pure)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
pragma experimental "v0.5.0";
|
||||||
|
contract C {
|
||||||
|
uint x;
|
||||||
|
function f() public returns (uint) {
|
||||||
|
x = 3;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
interface CView {
|
||||||
|
function f() view external returns (uint);
|
||||||
|
}
|
||||||
|
interface CPure {
|
||||||
|
function f() pure external returns (uint);
|
||||||
|
}
|
||||||
|
contract D {
|
||||||
|
function f() public returns (uint) {
|
||||||
|
return (new C()).f();
|
||||||
|
}
|
||||||
|
function fview() public returns (uint) {
|
||||||
|
return (CView(new C())).f();
|
||||||
|
}
|
||||||
|
function fpure() public returns (uint) {
|
||||||
|
return (CPure(new C())).f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode, 0, "D");
|
||||||
|
// This should work (called via CALL)
|
||||||
|
ABI_CHECK(callContractFunction("f()"), encodeArgs(1));
|
||||||
|
if (dev::test::Options::get().evmVersion().hasStaticCall())
|
||||||
|
{
|
||||||
|
// These should throw (called via STATICCALL)
|
||||||
|
ABI_CHECK(callContractFunction("fview()"), encodeArgs());
|
||||||
|
ABI_CHECK(callContractFunction("fpure()"), encodeArgs());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ABI_CHECK(callContractFunction("fview()"), encodeArgs(1));
|
||||||
|
ABI_CHECK(callContractFunction("fpure()"), encodeArgs(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user