mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #12300 from nishant-sachdeva/extracting_tests_from_solEndToEnd.cpp
Extracted test cases from SolidityEndToEnd.cpp
This commit is contained in:
commit
3dd8285cc8
@ -1607,30 +1607,6 @@ BOOST_AUTO_TEST_CASE(library_call_protection)
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(library_staticcall_delegatecall)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
library Lib {
|
|
||||||
function x() public view returns (uint) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
contract Test {
|
|
||||||
uint t;
|
|
||||||
function f() public returns (uint) {
|
|
||||||
t = 2;
|
|
||||||
return this.g();
|
|
||||||
}
|
|
||||||
function g() public view returns (uint) {
|
|
||||||
return Lib.x();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode, 0, "Lib");
|
|
||||||
compileAndRun(sourceCode, 0, "Test", bytes(), map<string, h160>{{":Lib", m_contractAddress}});
|
|
||||||
ABI_CHECK(callContractFunction("f()"), encodeArgs(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(bytes_from_calldata_to_memory)
|
BOOST_AUTO_TEST_CASE(bytes_from_calldata_to_memory)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
@ -1786,49 +1762,6 @@ BOOST_AUTO_TEST_CASE(copy_from_calldata_removes_bytes_data)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(storing_invalid_boolean)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract C {
|
|
||||||
event Ev(bool);
|
|
||||||
bool public perm;
|
|
||||||
function set() public returns(uint) {
|
|
||||||
bool tmp;
|
|
||||||
assembly {
|
|
||||||
tmp := 5
|
|
||||||
}
|
|
||||||
perm = tmp;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
function ret() public returns(bool) {
|
|
||||||
bool tmp;
|
|
||||||
assembly {
|
|
||||||
tmp := 5
|
|
||||||
}
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
function ev() public returns(uint) {
|
|
||||||
bool tmp;
|
|
||||||
assembly {
|
|
||||||
tmp := 5
|
|
||||||
}
|
|
||||||
emit Ev(tmp);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode);
|
|
||||||
ABI_CHECK(callContractFunction("set()"), encodeArgs(1));
|
|
||||||
ABI_CHECK(callContractFunction("perm()"), encodeArgs(1));
|
|
||||||
ABI_CHECK(callContractFunction("ret()"), encodeArgs(1));
|
|
||||||
ABI_CHECK(callContractFunction("ev()"), encodeArgs(1));
|
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
|
||||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
|
||||||
BOOST_CHECK(logData(0) == encodeArgs(1));
|
|
||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Ev(bool)")));
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(struct_referencing)
|
BOOST_AUTO_TEST_CASE(struct_referencing)
|
||||||
{
|
{
|
||||||
static char const* sourceCode = R"(
|
static char const* sourceCode = R"(
|
||||||
@ -2059,70 +1992,6 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_abi)
|
|||||||
// ABI_CHECK(callContractFunction("f()"), encodeArgs(5));
|
// ABI_CHECK(callContractFunction("f()"), encodeArgs(5));
|
||||||
//}
|
//}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(packed_storage_structs_delete)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract C {
|
|
||||||
struct str { uint8 a; uint16 b; uint8 c; }
|
|
||||||
uint8 x;
|
|
||||||
uint16 y;
|
|
||||||
str data;
|
|
||||||
function test() public returns (uint) {
|
|
||||||
x = 1;
|
|
||||||
y = 2;
|
|
||||||
data.a = 2;
|
|
||||||
data.b = 0xabcd;
|
|
||||||
data.c = 0xfa;
|
|
||||||
if (x != 1 || y != 2 || data.a != 2 || data.b != 0xabcd || data.c != 0xfa)
|
|
||||||
return 2;
|
|
||||||
delete y;
|
|
||||||
delete data.b;
|
|
||||||
if (x != 1 || y != 0 || data.a != 2 || data.b != 0 || data.c != 0xfa)
|
|
||||||
return 3;
|
|
||||||
delete x;
|
|
||||||
delete data;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode);
|
|
||||||
ABI_CHECK(callContractFunction("test()"), encodeArgs(1));
|
|
||||||
BOOST_CHECK(storageEmpty(m_contractAddress));
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(invalid_enum_logged)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract C {
|
|
||||||
enum X { A, B }
|
|
||||||
event Log(X);
|
|
||||||
|
|
||||||
function test_log() public returns (uint) {
|
|
||||||
X garbled = X.A;
|
|
||||||
assembly {
|
|
||||||
garbled := 5
|
|
||||||
}
|
|
||||||
emit Log(garbled);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
function test_log_ok() public returns (uint) {
|
|
||||||
X x = X.A;
|
|
||||||
emit Log(x);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode, 0, "C");
|
|
||||||
ABI_CHECK(callContractFunction("test_log_ok()"), encodeArgs(u256(1)));
|
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
|
||||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
|
||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
|
||||||
BOOST_REQUIRE_EQUAL(logTopic(0, 0), util::keccak256(string("Log(uint8)")));
|
|
||||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(0)));
|
|
||||||
|
|
||||||
ABI_CHECK(callContractFunction("test_log()"), panicData(PanicCode::EnumConversionError));
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund)
|
BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
@ -2164,31 +2033,6 @@ BOOST_AUTO_TEST_CASE(failing_send)
|
|||||||
BOOST_REQUIRE(callContractFunction("callHelper(address)", c_helperAddress) == encodeArgs(true, 20));
|
BOOST_REQUIRE(callContractFunction("callHelper(address)", c_helperAddress) == encodeArgs(true, 20));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(return_string)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract Main {
|
|
||||||
string public s;
|
|
||||||
function set(string calldata _s) external {
|
|
||||||
s = _s;
|
|
||||||
}
|
|
||||||
function get1() public returns (string memory r) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
function get2() public returns (string memory r) {
|
|
||||||
r = s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode, 0, "Main");
|
|
||||||
string s("Julia");
|
|
||||||
bytes args = encodeArgs(u256(0x20), u256(s.length()), s);
|
|
||||||
BOOST_REQUIRE(callContractFunction("set(string)", asString(args)) == encodeArgs());
|
|
||||||
ABI_CHECK(callContractFunction("get1()"), args);
|
|
||||||
ABI_CHECK(callContractFunction("get2()"), args);
|
|
||||||
ABI_CHECK(callContractFunction("s()"), args);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(return_multiple_strings_of_various_sizes)
|
BOOST_AUTO_TEST_CASE(return_multiple_strings_of_various_sizes)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
@ -2343,28 +2187,6 @@ BOOST_AUTO_TEST_CASE(return_bytes_internal)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(memory_types_initialisation)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract Test {
|
|
||||||
mapping(uint=>uint) data;
|
|
||||||
function stat() public returns (uint[5] memory)
|
|
||||||
{
|
|
||||||
data[2] = 3; // make sure to use some memory
|
|
||||||
}
|
|
||||||
function dyn() public returns (uint[] memory) { stat(); }
|
|
||||||
function nested() public returns (uint[3][] memory) { stat(); }
|
|
||||||
function nestedStat() public returns (uint[3][7] memory) { stat(); }
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
compileAndRun(sourceCode, 0, "Test");
|
|
||||||
|
|
||||||
ABI_CHECK(callContractFunction("stat()"), encodeArgs(vector<u256>(5)));
|
|
||||||
ABI_CHECK(callContractFunction("dyn()"), encodeArgs(u256(0x20), u256(0)));
|
|
||||||
ABI_CHECK(callContractFunction("nested()"), encodeArgs(u256(0x20), u256(0)));
|
|
||||||
ABI_CHECK(callContractFunction("nestedStat()"), encodeArgs(vector<u256>(3 * 7)));
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(calldata_struct_short)
|
BOOST_AUTO_TEST_CASE(calldata_struct_short)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
@ -2718,38 +2540,6 @@ BOOST_AUTO_TEST_CASE(nested_mixed_string_as_public_mapping_key)
|
|||||||
), encodeArgs(u256(i - 3)));
|
), encodeArgs(u256(i - 3)));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(constant_string_literal)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract Test {
|
|
||||||
bytes32 constant public b = "abcdefghijklmnopq";
|
|
||||||
string constant public x = "abefghijklmnopqabcdefghijklmnopqabcdefghijklmnopqabca";
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
string memory xx = x;
|
|
||||||
bytes32 bb = b;
|
|
||||||
}
|
|
||||||
function getB() public returns (bytes32) { return b; }
|
|
||||||
function getX() public returns (string memory) { return x; }
|
|
||||||
function getX2() public returns (string memory r) { r = x; }
|
|
||||||
function unused() public returns (uint) {
|
|
||||||
"unusedunusedunusedunusedunusedunusedunusedunusedunusedunusedunusedunused";
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
|
|
||||||
compileAndRun(sourceCode);
|
|
||||||
string longStr = "abefghijklmnopqabcdefghijklmnopqabcdefghijklmnopqabca";
|
|
||||||
string shortStr = "abcdefghijklmnopq";
|
|
||||||
ABI_CHECK(callContractFunction("b()"), encodeArgs(shortStr));
|
|
||||||
ABI_CHECK(callContractFunction("x()"), encodeDyn(longStr));
|
|
||||||
ABI_CHECK(callContractFunction("getB()"), encodeArgs(shortStr));
|
|
||||||
ABI_CHECK(callContractFunction("getX()"), encodeDyn(longStr));
|
|
||||||
ABI_CHECK(callContractFunction("getX2()"), encodeDyn(longStr));
|
|
||||||
ABI_CHECK(callContractFunction("unused()"), encodeArgs(2));
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(library_call)
|
BOOST_AUTO_TEST_CASE(library_call)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
|
24
test/libsolidity/semanticTests/enums/invalid_enum_logged.sol
Normal file
24
test/libsolidity/semanticTests/enums/invalid_enum_logged.sol
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
contract C {
|
||||||
|
enum X { A, B }
|
||||||
|
event Log(X);
|
||||||
|
|
||||||
|
function test_log() public returns (uint) {
|
||||||
|
X garbled = X.A;
|
||||||
|
assembly {
|
||||||
|
garbled := 5
|
||||||
|
}
|
||||||
|
emit Log(garbled);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
function test_log_ok() public returns (uint) {
|
||||||
|
X x = X.A;
|
||||||
|
emit Log(x);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// test_log_ok() -> 1
|
||||||
|
// ~ emit Log(uint8): 0x00
|
||||||
|
// test_log() -> FAILURE, hex"4e487b71", 0x21
|
@ -0,0 +1,20 @@
|
|||||||
|
library Lib {
|
||||||
|
function x() public view returns (uint) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contract Test {
|
||||||
|
uint t;
|
||||||
|
function f() public returns (uint) {
|
||||||
|
t = 2;
|
||||||
|
return this.g();
|
||||||
|
}
|
||||||
|
function g() public view returns (uint) {
|
||||||
|
return Lib.x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// library: Lib
|
||||||
|
// f() -> 1
|
@ -0,0 +1,17 @@
|
|||||||
|
contract Test {
|
||||||
|
mapping(uint=>uint) data;
|
||||||
|
function stat() public returns (uint[5] memory)
|
||||||
|
{
|
||||||
|
data[2] = 3; // make sure to use some memory
|
||||||
|
}
|
||||||
|
function dyn() public returns (uint[] memory) { stat(); }
|
||||||
|
function nested() public returns (uint[3][] memory) { stat(); }
|
||||||
|
function nestedStat() public returns (uint[3][7] memory) { stat(); }
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// stat() -> 0, 0, 0, 0, 0
|
||||||
|
// dyn() -> 0x20, 0
|
||||||
|
// nested() -> 0x20, 0
|
||||||
|
// nestedStat() -> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
@ -0,0 +1,25 @@
|
|||||||
|
contract Test {
|
||||||
|
bytes32 constant public b = "abcdefghijklmnopq";
|
||||||
|
string constant public x = "abefghijklmnopqabcdefghijklmnopqabcdefghijklmnopqabca";
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
string memory xx = x;
|
||||||
|
bytes32 bb = b;
|
||||||
|
}
|
||||||
|
function getB() public returns (bytes32) { return b; }
|
||||||
|
function getX() public returns (string memory) { return x; }
|
||||||
|
function getX2() public returns (string memory r) { r = x; }
|
||||||
|
function unused() public returns (uint) {
|
||||||
|
"unusedunusedunusedunusedunusedunusedunusedunusedunusedunusedunusedunused";
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// b() -> 0x6162636465666768696a6b6c6d6e6f7071000000000000000000000000000000
|
||||||
|
// x() -> 0x20, 0x35, 0x616265666768696a6b6c6d6e6f70716162636465666768696a6b6c6d6e6f7071, 44048183304486788312148433451363384677562177293131179093971701692629931524096
|
||||||
|
// getB() -> 0x6162636465666768696a6b6c6d6e6f7071000000000000000000000000000000
|
||||||
|
// getX() -> 0x20, 0x35, 0x616265666768696a6b6c6d6e6f70716162636465666768696a6b6c6d6e6f7071, 44048183304486788312148433451363384677562177293131179093971701692629931524096
|
||||||
|
// getX2() -> 0x20, 0x35, 0x616265666768696a6b6c6d6e6f70716162636465666768696a6b6c6d6e6f7071, 44048183304486788312148433451363384677562177293131179093971701692629931524096
|
||||||
|
// unused() -> 2
|
20
test/libsolidity/semanticTests/strings/return_string.sol
Normal file
20
test/libsolidity/semanticTests/strings/return_string.sol
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
contract Main {
|
||||||
|
string public s;
|
||||||
|
function set(string calldata _s) external {
|
||||||
|
s = _s;
|
||||||
|
}
|
||||||
|
function get1() public returns (string memory r) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
function get2() public returns (string memory r) {
|
||||||
|
r = s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileToEwasm: also
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// set(string): 0x20, 5, "Julia" ->
|
||||||
|
// get1() -> 0x20, 5, "Julia"
|
||||||
|
// get2() -> 0x20, 5, "Julia"
|
||||||
|
// s() -> 0x20, 5, "Julia"
|
@ -0,0 +1,27 @@
|
|||||||
|
contract C {
|
||||||
|
struct str { uint8 a; uint16 b; uint8 c; }
|
||||||
|
uint8 x;
|
||||||
|
uint16 y;
|
||||||
|
str data;
|
||||||
|
function test() public returns (uint) {
|
||||||
|
x = 1;
|
||||||
|
y = 2;
|
||||||
|
data.a = 2;
|
||||||
|
data.b = 0xabcd;
|
||||||
|
data.c = 0xfa;
|
||||||
|
if (x != 1 || y != 2 || data.a != 2 || data.b != 0xabcd || data.c != 0xfa)
|
||||||
|
return 2;
|
||||||
|
delete y;
|
||||||
|
delete data.b;
|
||||||
|
if (x != 1 || y != 0 || data.a != 2 || data.b != 0 || data.c != 0xfa)
|
||||||
|
return 3;
|
||||||
|
delete x;
|
||||||
|
delete data;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// test() -> 1
|
||||||
|
// storageEmpty -> 1
|
@ -0,0 +1,35 @@
|
|||||||
|
contract C {
|
||||||
|
event Ev(bool);
|
||||||
|
bool public perm;
|
||||||
|
function set() public returns(uint) {
|
||||||
|
bool tmp;
|
||||||
|
assembly {
|
||||||
|
tmp := 5
|
||||||
|
}
|
||||||
|
perm = tmp;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
function ret() public returns(bool) {
|
||||||
|
bool tmp;
|
||||||
|
assembly {
|
||||||
|
tmp := 5
|
||||||
|
}
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
function ev() public returns(uint) {
|
||||||
|
bool tmp;
|
||||||
|
assembly {
|
||||||
|
tmp := 5
|
||||||
|
}
|
||||||
|
emit Ev(tmp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// set() -> 1
|
||||||
|
// perm() -> true
|
||||||
|
// ret() -> true
|
||||||
|
// ev() -> 1
|
||||||
|
// ~ emit Ev(bool): true
|
Loading…
Reference in New Issue
Block a user