aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2015-10-14 04:32:27 +0800
committerchriseth <c@ethdev.com>2015-10-14 04:32:27 +0800
commite11e10f8176cd6f866e78b5d12c86fe77367c64a (patch)
treebaed9ab43931470a8c60b73e6593de605223ee32 /test
parent23865e39295dd9199769727b037c1d126807b20e (diff)
parent72f7792f8e09b41987ddd493984402891d49238f (diff)
downloaddexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.tar
dexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.tar.gz
dexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.tar.bz2
dexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.tar.lz
dexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.tar.xz
dexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.tar.zst
dexon-solidity-e11e10f8176cd6f866e78b5d12c86fe77367c64a.zip
Merge pull request #126 from chriseth/destructuringAssignment
Multi-variable declarations.
Diffstat (limited to 'test')
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp24
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp97
-rw-r--r--test/libsolidity/SolidityParser.cpp20
3 files changed, 139 insertions, 2 deletions
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 3126c1cc..08f62963 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -5613,6 +5613,30 @@ BOOST_AUTO_TEST_CASE(reject_ether_sent_to_library)
BOOST_CHECK_EQUAL(m_state.balance(libraryAddress), 0);
}
+BOOST_AUTO_TEST_CASE(multi_variable_declaration)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function g() returns (uint a, uint b, uint c) {
+ a = 1; b = 2; c = 3;
+ }
+ function f() returns (bool) {
+ var (x, y, z) = g();
+ if (x != 1 || y != 2 || z != 3) return false;
+ var (, a,) = g();
+ if (a != 2) return false;
+ var (b,) = g();
+ if (b != 1) return false;
+ var (,c) = g();
+ if (c != 3) return false;
+ return true;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ BOOST_CHECK(callContractFunction("f()", encodeArgs()) == encodeArgs(true));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index b55c92f0..cc990c1e 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -1285,7 +1285,7 @@ BOOST_AUTO_TEST_CASE(empty_name_return_parameter_with_named_one)
BOOST_AUTO_TEST_CASE(disallow_declaration_of_void_type)
{
- char const* sourceCode = "contract c { function f() { var x = f(); } }";
+ char const* sourceCode = "contract c { function f() { var (x) = f(); } }";
SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(sourceCode), TypeError);
}
@@ -2134,7 +2134,7 @@ BOOST_AUTO_TEST_CASE(dynamic_return_types_not_possible)
contract C {
function f(uint) returns (string);
function g() {
- var x = this.f(2);
+ var (x,) = this.f(2);
}
}
)";
@@ -2397,6 +2397,99 @@ BOOST_AUTO_TEST_CASE(cyclic_binary_dependency_via_inheritance)
SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
}
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_fail)
+{
+ char const* text = R"(
+ contract C { function f() { var (x,y); } }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fine)
+{
+ char const* text = R"(
+ contract C {
+ function three() returns (uint, uint, uint);
+ function two() returns (uint, uint);
+ function none();
+ function f() {
+ var (a,) = three();
+ var (b,c,) = two();
+ var (,d) = three();
+ var (,e,g) = two();
+ var (,,) = three();
+ var () = none();
+ }
+ }
+ )";
+ BOOST_CHECK_NO_THROW(parseAndAnalyse(text));
+}
+
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_1)
+{
+ char const* text = R"(
+ contract C {
+ function one() returns (uint);
+ function f() { var (a, b, ) = one(); }
+ }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_2)
+{
+ char const* text = R"(
+ contract C {
+ function one() returns (uint);
+ function f() { var (a, , ) = one(); }
+ }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_3)
+{
+ char const* text = R"(
+ contract C {
+ function one() returns (uint);
+ function f() { var (, , a) = one(); }
+ }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_4)
+{
+ char const* text = R"(
+ contract C {
+ function one() returns (uint);
+ function f() { var (, a, b) = one(); }
+ }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_5)
+{
+ char const* text = R"(
+ contract C {
+ function one() returns (uint);
+ function f() { var (,) = one(); }
+ }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(multi_variable_declaration_wildcards_fail_6)
+{
+ char const* text = R"(
+ contract C {
+ function two() returns (uint, uint);
+ function f() { var (a, b, c) = two(); }
+ }
+ )";
+ SOLIDITY_CHECK_ERROR_TYPE(parseAndAnalyseReturnError(text), TypeError);
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp
index 1e034863..03930479 100644
--- a/test/libsolidity/SolidityParser.cpp
+++ b/test/libsolidity/SolidityParser.cpp
@@ -934,6 +934,26 @@ BOOST_AUTO_TEST_CASE(library_simple)
BOOST_CHECK_NO_THROW(parseText(text));
}
+BOOST_AUTO_TEST_CASE(multi_variable_declaration)
+{
+ char const* text = R"(
+ library Lib {
+ function f() {
+ var (a,b,c) = g();
+ var (d) = 2;
+ var (,e) = 3;
+ var (f,) = 4;
+ var (x,,) = g();
+ var (,y,) = g();
+ var () = g();
+ var (,,) = g();
+ }
+ function g() returns (uint, uint, uint) {}
+ }
+ )";
+ BOOST_CHECK_NO_THROW(parseText(text));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}