aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/SolidityEndToEndTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/SolidityEndToEndTest.cpp')
-rw-r--r--libsolidity/SolidityEndToEndTest.cpp80
1 files changed, 79 insertions, 1 deletions
diff --git a/libsolidity/SolidityEndToEndTest.cpp b/libsolidity/SolidityEndToEndTest.cpp
index f12abd48..66a8f882 100644
--- a/libsolidity/SolidityEndToEndTest.cpp
+++ b/libsolidity/SolidityEndToEndTest.cpp
@@ -2420,7 +2420,7 @@ BOOST_AUTO_TEST_CASE(event_really_lots_of_data_from_storage)
callContractFunction("deposit()");
BOOST_REQUIRE_EQUAL(m_logs.size(), 1);
BOOST_CHECK_EQUAL(m_logs[0].address, m_contractAddress);
- BOOST_CHECK(m_logs[0].data == encodeArgs(10, 0x60, 15, 3) + asBytes("ABC"));
+ BOOST_CHECK(m_logs[0].data == encodeArgs(10, 0x60, 15, 3, string("ABC")));
BOOST_REQUIRE_EQUAL(m_logs[0].topics.size(), 1);
BOOST_CHECK_EQUAL(m_logs[0].topics[0], dev::sha3(string("Deposit(uint256,bytes,uint256)")));
}
@@ -4232,6 +4232,84 @@ BOOST_AUTO_TEST_CASE(reusing_memory)
BOOST_REQUIRE(callContractFunction("f(uint256)", 0x34) == encodeArgs(dev::sha3(dev::toBigEndian(u256(0x34)))));
}
+BOOST_AUTO_TEST_CASE(return_string)
+{
+ char const* sourceCode = R"(
+ contract Main {
+ string public s;
+ function set(string _s) external {
+ s = _s;
+ }
+ function get1() returns (string r) {
+ return s;
+ }
+// function get2() returns (string 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());
+ BOOST_CHECK(callContractFunction("get1()") == args);
+// BOOST_CHECK(callContractFunction("get2()") == args);
+// BOOST_CHECK(callContractFunction("s()") == args);
+}
+
+BOOST_AUTO_TEST_CASE(storage_array_ref)
+{
+ char const* sourceCode = R"(
+ contract BinarySearch {
+ /// Finds the position of _value in the sorted list _data.
+ /// Note that "internal" is important here, because storage references only work for internal or private functions
+ function find(uint[] storage _data, uint _value) internal returns (uint o_position) {
+ return find(_data, 0, _data.length, _value);
+ }
+ function find(uint[] storage _data, uint _begin, uint _len, uint _value) private returns (uint o_position) {
+ if (_len == 0 || (_len == 1 && _data[_begin] != _value))
+ return uint(-1); // failure
+ uint halfLen = _len / 2;
+ uint v = _data[_begin + halfLen];
+ if (_value < v)
+ return find(_data, _begin, halfLen, _value);
+ else if (_value > v)
+ return find(_data, _begin + halfLen + 1, halfLen - 1, _value);
+ else
+ return _begin + halfLen;
+ }
+ }
+
+ contract Store is BinarySearch {
+ uint[] data;
+ function add(uint v) {
+ data.length++;
+ data[data.length - 1] = v;
+ }
+ function find(uint v) returns (uint) {
+ return find(data, v);
+ }
+ }
+ )";
+ compileAndRun(sourceCode, 0, "Store");
+ BOOST_REQUIRE(callContractFunction("find(uint256)", u256(7)) == encodeArgs(u256(-1)));
+ BOOST_REQUIRE(callContractFunction("add(uint256)", u256(7)) == encodeArgs());
+ BOOST_REQUIRE(callContractFunction("find(uint256)", u256(7)) == encodeArgs(u256(0)));
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(11)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(17)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(27)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(31)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(32)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(66)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("add(uint256)", u256(177)) == encodeArgs());
+ BOOST_CHECK(callContractFunction("find(uint256)", u256(7)) == encodeArgs(u256(0)));
+ BOOST_CHECK(callContractFunction("find(uint256)", u256(27)) == encodeArgs(u256(3)));
+ BOOST_CHECK(callContractFunction("find(uint256)", u256(32)) == encodeArgs(u256(5)));
+ BOOST_CHECK(callContractFunction("find(uint256)", u256(176)) == encodeArgs(u256(-1)));
+ BOOST_CHECK(callContractFunction("find(uint256)", u256(0)) == encodeArgs(u256(-1)));
+ BOOST_CHECK(callContractFunction("find(uint256)", u256(400)) == encodeArgs(u256(-1)));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}