aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-07-26 20:41:24 +0800
committerGitHub <noreply@github.com>2017-07-26 20:41:24 +0800
commit0d701c945604569af96f033a708705876f6c9bbf (patch)
tree7f3b499a1acc26aeaa2e8c001da4d9cdefb5bfa6 /test
parent7ad42aeeafe9f6d47ef5890add06b51d005b32ca (diff)
parent55600f2c519bcafc657c73197f502f30be632743 (diff)
downloaddexon-solidity-0d701c945604569af96f033a708705876f6c9bbf.tar.gz
dexon-solidity-0d701c945604569af96f033a708705876f6c9bbf.tar.zst
dexon-solidity-0d701c945604569af96f033a708705876f6c9bbf.zip
Merge pull request #2603 from ethereum/test-jsoncompiler
Comprehensive tests for jsonCompiler
Diffstat (limited to 'test')
-rw-r--r--test/libsolidity/JSONCompiler.cpp97
1 files changed, 95 insertions, 2 deletions
diff --git a/test/libsolidity/JSONCompiler.cpp b/test/libsolidity/JSONCompiler.cpp
index a6a7bc5b..536ba730 100644
--- a/test/libsolidity/JSONCompiler.cpp
+++ b/test/libsolidity/JSONCompiler.cpp
@@ -35,7 +35,10 @@ extern "C"
{
extern char const* version();
extern char const* license();
+extern char const* compileJSON(char const* _input, bool _optimize);
extern char const* compileJSONMulti(char const* _input, bool _optimize);
+extern char const* compileJSONCallback(char const* _input, bool _optimize, void* _readCallback);
+extern char const* compileStandard(char const* _input, void* _readCallback);
}
namespace dev
@@ -48,9 +51,29 @@ namespace test
namespace
{
+Json::Value compileSingle(string const& _input)
+{
+ string output(compileJSON(_input.c_str(), dev::test::Options::get().optimize));
+ Json::Value ret;
+ BOOST_REQUIRE(Json::Reader().parse(output, ret, false));
+ return ret;
+}
+
+Json::Value compileMulti(string const& _input, bool _callback)
+{
+ string output(
+ _callback ?
+ compileJSONCallback(_input.c_str(), dev::test::Options::get().optimize, NULL) :
+ compileJSONMulti(_input.c_str(), dev::test::Options::get().optimize)
+ );
+ Json::Value ret;
+ BOOST_REQUIRE(Json::Reader().parse(output, ret, false));
+ return ret;
+}
+
Json::Value compile(string const& _input)
{
- string output(compileJSONMulti(_input.c_str(), dev::test::Options::get().optimize));
+ string output(compileStandard(_input.c_str(), NULL));
Json::Value ret;
BOOST_REQUIRE(Json::Reader().parse(output, ret, false));
return ret;
@@ -81,8 +104,15 @@ BOOST_AUTO_TEST_CASE(basic_compilation)
}
}
)";
- Json::Value result = compile(input);
+ Json::Value result = compileMulti(input, false);
BOOST_CHECK(result.isObject());
+
+ // Compare with compileJSONCallback
+ BOOST_CHECK_EQUAL(
+ dev::jsonCompactPrint(result),
+ dev::jsonCompactPrint(compileMulti(input, true))
+ );
+
BOOST_CHECK(result["contracts"].isObject());
BOOST_CHECK(result["contracts"]["fileA:A"].isObject());
Json::Value contract = result["contracts"]["fileA:A"];
@@ -119,6 +149,69 @@ BOOST_AUTO_TEST_CASE(basic_compilation)
"\"src\":\"0:14:0\"}],\"id\":2,\"name\":\"SourceUnit\",\"src\":\"0:14:0\"}"
);
}
+
+BOOST_AUTO_TEST_CASE(single_compilation)
+{
+ Json::Value result = compileSingle("contract A { }");
+ BOOST_CHECK(result.isObject());
+
+ BOOST_CHECK(result["contracts"].isObject());
+ BOOST_CHECK(result["contracts"][":A"].isObject());
+ Json::Value contract = result["contracts"][":A"];
+ BOOST_CHECK(contract.isObject());
+ BOOST_CHECK(contract["interface"].isString());
+ BOOST_CHECK_EQUAL(contract["interface"].asString(), "[]");
+ BOOST_CHECK(contract["bytecode"].isString());
+ BOOST_CHECK_EQUAL(
+ dev::test::bytecodeSansMetadata(contract["bytecode"].asString()),
+ "60606040523415600e57600080fd5b5b603680601c6000396000f30060606040525b600080fd00"
+ );
+ BOOST_CHECK(contract["runtimeBytecode"].isString());
+ BOOST_CHECK_EQUAL(
+ dev::test::bytecodeSansMetadata(contract["runtimeBytecode"].asString()),
+ "60606040525b600080fd00"
+ );
+ BOOST_CHECK(contract["functionHashes"].isObject());
+ BOOST_CHECK(contract["gasEstimates"].isObject());
+ BOOST_CHECK_EQUAL(
+ dev::jsonCompactPrint(contract["gasEstimates"]),
+ "{\"creation\":[62,10800],\"external\":{},\"internal\":{}}"
+ );
+ BOOST_CHECK(contract["metadata"].isString());
+ BOOST_CHECK(dev::test::isValidMetadata(contract["metadata"].asString()));
+ BOOST_CHECK(result["sources"].isObject());
+ BOOST_CHECK(result["sources"][""].isObject());
+ BOOST_CHECK(result["sources"][""]["AST"].isObject());
+ BOOST_CHECK_EQUAL(
+ dev::jsonCompactPrint(result["sources"][""]["AST"]),
+ "{\"attributes\":{\"absolutePath\":\"\",\"exportedSymbols\":{\"A\":[1]}},"
+ "\"children\":[{\"attributes\":{\"baseContracts\":[null],\"contractDependencies\":[null],"
+ "\"contractKind\":\"contract\",\"documentation\":null,\"fullyImplemented\":true,\"linearizedBaseContracts\":[1],"
+ "\"name\":\"A\",\"nodes\":[null],\"scope\":2},\"id\":1,\"name\":\"ContractDefinition\","
+ "\"src\":\"0:14:0\"}],\"id\":2,\"name\":\"SourceUnit\",\"src\":\"0:14:0\"}"
+ );
+}
+
+BOOST_AUTO_TEST_CASE(standard_compilation)
+{
+ char const* input = R"(
+ {
+ "language": "Solidity",
+ "sources": {
+ "fileA": {
+ "content": "contract A { }"
+ }
+ }
+ }
+ )";
+ Json::Value result = compile(input);
+ BOOST_CHECK(result.isObject());
+
+ // Only tests some assumptions. The StandardCompiler is tested properly in another suite.
+ BOOST_CHECK(result.isMember("sources"));
+ BOOST_CHECK(result.isMember("contracts"));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}