From 2da380e849254aa3eed949b0cb559843ccb7f3f7 Mon Sep 17 00:00:00 2001 From: arkpar Date: Sat, 31 Jan 2015 14:41:11 +0100 Subject: [PATCH] json and solidity ABI generted for events --- SolidityABIJSON.cpp | 157 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 147 insertions(+), 10 deletions(-) diff --git a/SolidityABIJSON.cpp b/SolidityABIJSON.cpp index aa5fcb0e0..1f7d35ab1 100644 --- a/SolidityABIJSON.cpp +++ b/SolidityABIJSON.cpp @@ -37,7 +37,7 @@ class InterfaceChecker public: InterfaceChecker(): m_compilerStack(false) {} - void checkInterface(std::string const& _code, std::string const& _expectedInterfaceString) + void checkInterface(std::string const& _code, std::string const& _expectedInterfaceString, std::string const& expectedSolidityInterface) { try { @@ -49,13 +49,17 @@ public: BOOST_FAIL(msg); } std::string generatedInterfaceString = m_compilerStack.getMetadata("", DocumentationType::ABI_INTERFACE); + std::string generatedSolidityInterfaceString = m_compilerStack.getMetadata("", DocumentationType::ABI_SOLIDITY_INTERFACE); Json::Value generatedInterface; m_reader.parse(generatedInterfaceString, generatedInterface); Json::Value expectedInterface; m_reader.parse(_expectedInterfaceString, expectedInterface); BOOST_CHECK_MESSAGE(expectedInterface == generatedInterface, - "Expected " << _expectedInterfaceString << - "\n but got:\n" << generatedInterfaceString); + "Expected:\n" << expectedInterface.toStyledString() << + "\n but got:\n" << generatedInterface.toStyledString()); + BOOST_CHECK_MESSAGE(expectedSolidityInterface == generatedSolidityInterfaceString, + "Expected:\n" << expectedSolidityInterface << + "\n but got:\n" << generatedSolidityInterfaceString); } private: @@ -71,6 +75,8 @@ BOOST_AUTO_TEST_CASE(basic_test) " function f(uint a) returns(uint d) { return a * 7; }\n" "}\n"; + char const* sourceInterface = "contract test{function f(uint256 a)returns(uint256 d){}}"; + char const* interface = R"([ { "name": "f", @@ -91,17 +97,18 @@ BOOST_AUTO_TEST_CASE(basic_test) } ])"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } BOOST_AUTO_TEST_CASE(empty_contract) { char const* sourceCode = "contract test {\n" "}\n"; + char const* sourceInterface = "contract test{}"; char const* interface = "[]"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } BOOST_AUTO_TEST_CASE(multiple_methods) @@ -110,6 +117,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods) " function f(uint a) returns(uint d) { return a * 7; }\n" " function g(uint b) returns(uint e) { return b * 8; }\n" "}\n"; + char const* sourceInterface = "contract test{function f(uint256 a)returns(uint256 d){}function g(uint256 b)returns(uint256 e){}}"; char const* interface = R"([ { @@ -148,7 +156,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods) } ])"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } BOOST_AUTO_TEST_CASE(multiple_params) @@ -156,6 +164,7 @@ BOOST_AUTO_TEST_CASE(multiple_params) char const* sourceCode = "contract test {\n" " function f(uint a, uint b) returns(uint d) { return a + b; }\n" "}\n"; + char const* sourceInterface = "contract test{function f(uint256 a,uint256 b)returns(uint256 d){}}"; char const* interface = R"([ { @@ -181,7 +190,7 @@ BOOST_AUTO_TEST_CASE(multiple_params) } ])"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } BOOST_AUTO_TEST_CASE(multiple_methods_order) @@ -191,6 +200,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order) " function f(uint a) returns(uint d) { return a * 7; }\n" " function c(uint b) returns(uint e) { return b * 8; }\n" "}\n"; + char const* sourceInterface = "contract test{function c(uint256 b)returns(uint256 e){}function f(uint256 a)returns(uint256 d){}}"; char const* interface = R"([ { @@ -229,7 +239,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order) } ])"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } BOOST_AUTO_TEST_CASE(const_function) @@ -238,6 +248,7 @@ BOOST_AUTO_TEST_CASE(const_function) " function foo(uint a, uint b) returns(uint d) { return a + b; }\n" " function boo(uint32 a) constant returns(uint b) { return a * 4; }\n" "}\n"; + char const* sourceInterface = "contract test{function foo(uint256 a,uint256 b)returns(uint256 d){}function boo(uint32 a)constant returns(uint256 b){}}"; char const* interface = R"([ { @@ -278,18 +289,144 @@ BOOST_AUTO_TEST_CASE(const_function) } ])"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } BOOST_AUTO_TEST_CASE(exclude_fallback_function) { char const* sourceCode = "contract test { function() {} }"; + char const* sourceInterface = "contract test{}"; char const* interface = "[]"; - checkInterface(sourceCode, interface); + checkInterface(sourceCode, interface, sourceInterface); } +BOOST_AUTO_TEST_CASE(events) +{ + char const* sourceCode = "contract test {\n" + " function f(uint a) returns(uint d) { return a * 7; }\n" + " event e1(uint b, address indexed c); \n" + " event e2(); \n" + "}\n"; + char const* sourceInterface = "contract test{function f(uint256 a)returns(uint256 d){}event e1(uint256 b,address indexed c);event e2;}"; + + char const* interface = R"([ + { + "name": "f", + "constant": false, + "type": "function", + "inputs": [ + { + "name": "a", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "d", + "type": "uint256" + } + ] + }, + { + "name": "e1", + "type": "event", + "inputs": [ + { + "indexed": false, + "name": "b", + "type": "uint256" + }, + { + "indexed": true, + "name": "c", + "type": "address" + } + ] + }, + { + "name": "e2", + "type": "event", + "inputs": [] + } + + ])"; + + checkInterface(sourceCode, interface, sourceInterface); +} + + +BOOST_AUTO_TEST_CASE(inherited) +{ + char const* sourceCode = + " contract Base { \n" + " function baseFunction(uint p) returns (uint i) { return p; } \n" + " event baseEvent(string32 indexed evtArgBase); \n" + " } \n" + " contract Derived is Base { \n" + " function derivedFunction(string32 p) returns (string32 i) { return p; } \n" + " event derivedEvent(uint indexed evtArgDerived); \n" + " }"; + char const* sourceInterface = "contract Derived{function baseFunction(uint256 p)returns(uint256 i){}function derivedFunction(string32 p)returns(string32 i){}event derivedEvent(uint256 indexed evtArgDerived);event baseEvent(string32 indexed evtArgBase);}"; + + char const* interface = R"([ + { + "name": "baseFunction", + "constant": false, + "type": "function", + "inputs": + [{ + "name": "p", + "type": "uint256" + }], + "outputs": + [{ + "name": "i", + "type": "uint256" + }] + }, + { + "name": "derivedFunction", + "constant": false, + "type": "function", + "inputs": + [{ + "name": "p", + "type": "string32" + }], + "outputs": + [{ + "name": "i", + "type": "string32" + }] + }, + { + "name": "derivedEvent", + "type": "event", + "inputs": + [{ + "indexed": true, + "name": "evtArgDerived", + "type": "uint256" + }] + }, + { + "name": "baseEvent", + "type": "event", + "inputs": + [{ + "indexed": true, + "name": "evtArgBase", + "type": "string32" + }] + }])"; + + + checkInterface(sourceCode, interface, sourceInterface); +} + + BOOST_AUTO_TEST_SUITE_END() }