diff options
author | chriseth <chris@ethereum.org> | 2017-06-22 23:24:19 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-06-26 22:31:36 +0800 |
commit | 1a3066c3a1a9a9cbd16cd43e2725a4b03fc547cf (patch) | |
tree | c75ac9e14bf137909c94752f2d4d5a7185faf659 /test/libsolidity | |
parent | d0b6de0b346b319c85747fdbee76c1d204d6ced6 (diff) | |
download | dexon-solidity-1a3066c3a1a9a9cbd16cd43e2725a4b03fc547cf.tar.gz dexon-solidity-1a3066c3a1a9a9cbd16cd43e2725a4b03fc547cf.tar.zst dexon-solidity-1a3066c3a1a9a9cbd16cd43e2725a4b03fc547cf.zip |
Test about semantics of "swap" in storage.
Diffstat (limited to 'test/libsolidity')
-rw-r--r-- | test/libsolidity/SolidityEndToEndTest.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 823a8eda..ffee5e36 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -4483,6 +4483,38 @@ BOOST_AUTO_TEST_CASE(array_copy_including_mapping) BOOST_CHECK(storageEmpty(m_contractAddress)); } +BOOST_AUTO_TEST_CASE(swap_in_storage_overwrite) +{ + // This tests a swap in storage which does not work as one + // might expect because we do not have temporary storage. + // (x, y) = (y, x) is the same as + // y = x; + // x = y; + char const* sourceCode = R"( + contract c { + struct S { uint a; uint b; } + S public x; + S public y; + function set() { + x.a = 1; x.b = 2; + y.a = 3; y.b = 4; + } + function swap() { + (x, y) = (y, x); + } + } + )"; + compileAndRun(sourceCode); + BOOST_CHECK(callContractFunction("x()") == encodeArgs(u256(0), u256(0))); + BOOST_CHECK(callContractFunction("y()") == encodeArgs(u256(0), u256(0))); + BOOST_CHECK(callContractFunction("set()") == encodeArgs()); + BOOST_CHECK(callContractFunction("x()") == encodeArgs(u256(1), u256(2))); + BOOST_CHECK(callContractFunction("y()") == encodeArgs(u256(3), u256(4))); + BOOST_CHECK(callContractFunction("swap()") == encodeArgs()); + BOOST_CHECK(callContractFunction("x()") == encodeArgs(u256(1), u256(2))); + BOOST_CHECK(callContractFunction("y()") == encodeArgs(u256(1), u256(2))); +} + BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base) { char const* sourceCode = R"( |