aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/RPCSession.cpp2
-rw-r--r--test/RPCSession.h1
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp36
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp73
4 files changed, 85 insertions, 27 deletions
diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp
index be8774bc..f8b364d1 100644
--- a/test/RPCSession.cpp
+++ b/test/RPCSession.cpp
@@ -207,7 +207,7 @@ void RPCSession::personal_unlockAccount(string const& _address, string const& _p
string RPCSession::personal_newAccount(string const& _password)
{
string addr = rpcCall("personal_newAccount", { quote(_password) }).asString();
- BOOST_MESSAGE("Created account " + addr);
+ BOOST_TEST_MESSAGE("Created account " + addr);
return addr;
}
diff --git a/test/RPCSession.h b/test/RPCSession.h
index 843036e1..b37cc322 100644
--- a/test/RPCSession.h
+++ b/test/RPCSession.h
@@ -30,6 +30,7 @@
#include <json/value.h>
+#include <boost/noncopyable.hpp>
#include <boost/test/unit_test.hpp>
#include <string>
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index cb0cc168..130b0d3a 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -9119,24 +9119,24 @@ BOOST_AUTO_TEST_CASE(invalid_instruction)
BOOST_CHECK(callContractFunction("f()") == encodeArgs());
}
-BOOST_AUTO_TEST_CASE(assert)
-{
- char const* sourceCode = R"(
- contract C {
- function f() {
- assert(false);
- }
- function g(bool val) returns (bool) {
- assert(val == true);
- return true;
- }
- }
- )";
- compileAndRun(sourceCode, 0, "C");
- BOOST_CHECK(callContractFunction("f()") == encodeArgs());
- BOOST_CHECK(callContractFunction("g(bool)", false) == encodeArgs());
- BOOST_CHECK(callContractFunction("g(bool)", true) == encodeArgs(true));
-}
+//BOOST_AUTO_TEST_CASE(assert)
+//{
+// char const* sourceCode = R"(
+// contract C {
+// function f() {
+// assert(false);
+// }
+// function g(bool val) returns (bool) {
+// assert(val == true);
+// return true;
+// }
+// }
+// )";
+// compileAndRun(sourceCode, 0, "C");
+// BOOST_CHECK(callContractFunction("f()") == encodeArgs());
+// BOOST_CHECK(callContractFunction("g(bool)", false) == encodeArgs());
+// BOOST_CHECK(callContractFunction("g(bool)", true) == encodeArgs(true));
+//}
BOOST_AUTO_TEST_CASE(revert)
{
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 3b137572..3d82fc70 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -20,19 +20,23 @@
* Unit tests for the name and type resolution of the solidity parser.
*/
-#include <string>
+#include <test/libsolidity/ErrorCheck.h>
+
+#include <test/TestHelper.h>
-#include <libdevcore/SHA3.h>
#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/parsing/Parser.h>
#include <libsolidity/analysis/NameAndTypeResolver.h>
#include <libsolidity/analysis/StaticAnalyzer.h>
+#include <libsolidity/analysis/PostTypeChecker.h>
#include <libsolidity/analysis/SyntaxChecker.h>
#include <libsolidity/interface/Exceptions.h>
#include <libsolidity/analysis/GlobalContext.h>
#include <libsolidity/analysis/TypeChecker.h>
-#include "../TestHelper.h"
-#include "ErrorCheck.h"
+
+#include <libdevcore/SHA3.h>
+
+#include <string>
using namespace std;
@@ -93,10 +97,11 @@ parseAnalyseAndReturnError(string const& _source, bool _reportWarnings = false,
BOOST_CHECK(success || !errors.empty());
}
if (success)
- {
- StaticAnalyzer staticAnalyzer(errors);
- staticAnalyzer.analyze(*sourceUnit);
- }
+ if (!PostTypeChecker(errors).check(*sourceUnit))
+ success = false;
+ if (success)
+ if (!StaticAnalyzer(errors).analyze(*sourceUnit))
+ success = false;
if (errors.size() > 1 && !_allowMultipleErrors)
BOOST_FAIL("Multiple errors found");
for (auto const& currentError: errors)
@@ -2501,6 +2506,30 @@ BOOST_AUTO_TEST_CASE(storage_assign_to_different_local_variable)
CHECK_ERROR(sourceCode, TypeError, "");
}
+BOOST_AUTO_TEST_CASE(uninitialized_mapping_variable)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function f() {
+ mapping(uint => uint) x;
+ }
+ }
+ )";
+ CHECK_ERROR(sourceCode, TypeError, "Uninitialized mapping. Mappings cannot be created dynamically, you have to assign them from a state variable");
+}
+
+BOOST_AUTO_TEST_CASE(uninitialized_mapping_array_variable)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function f() {
+ mapping(uint => uint)[] x;
+ }
+ }
+ )";
+ CHECK_WARNING(sourceCode, "Uninitialized storage pointer");
+}
+
BOOST_AUTO_TEST_CASE(no_delete_on_storage_pointers)
{
char const* sourceCode = R"(
@@ -5156,6 +5185,34 @@ BOOST_AUTO_TEST_CASE(address_methods)
CHECK_SUCCESS(text);
}
+BOOST_AUTO_TEST_CASE(cyclic_dependency_for_constants)
+{
+ char const* text = R"(
+ contract C {
+ uint constant a = a;
+ }
+ )";
+ CHECK_ERROR(text, TypeError, "cyclic dependency via a");
+ text = R"(
+ contract C {
+ uint constant a = b * c;
+ uint constant b = 7;
+ uint constant c = b + uint(sha3(d));
+ uint constant d = 2 + a;
+ }
+ )";
+ CHECK_ERROR_ALLOW_MULTI(text, TypeError, "a has a cyclic dependency via c");
+ text = R"(
+ contract C {
+ uint constant a = b * c;
+ uint constant b = 7;
+ uint constant c = 4 + uint(sha3(d));
+ uint constant d = 2 + b;
+ }
+ )";
+ CHECK_SUCCESS(text);
+}
+
BOOST_AUTO_TEST_SUITE_END()
}