mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge branch 'develop' into build_enhancement
This commit is contained in:
		
						commit
						c6ac7dd315
					
				| @ -23,6 +23,7 @@ | ||||
| #include <boost/test/unit_test.hpp> | ||||
| #include <libsolidity/CompilerStack.h> | ||||
| #include <jsonrpc/json/json.h> | ||||
| #include <libdevcore/Exceptions.h> | ||||
| 
 | ||||
| namespace dev | ||||
| { | ||||
| @ -34,23 +35,37 @@ namespace test | ||||
| class InterfaceChecker | ||||
| { | ||||
| public: | ||||
| 	bool checkInterface(std::string const& _code, std::string const& _expectedInterfaceString) | ||||
| 	void checkInterface(std::string const& _code, std::string const& _expectedInterfaceString) | ||||
| 	{ | ||||
| 		m_compilerStack.parse(_code); | ||||
| 		std::string generatedInterfaceString = m_compilerStack.getInterface(); | ||||
| 		try | ||||
| 		{ | ||||
| 			m_compilerStack.parse(_code); | ||||
| 		} | ||||
| 		catch (const std::exception& e) | ||||
| 		{ | ||||
| 			std::string const* extra = boost::get_error_info<errinfo_comment>(e); | ||||
| 			std::string msg = std::string("Parsing contract failed with: ") + | ||||
| 				e.what() + std::string("\n"); | ||||
| 			if (extra) | ||||
| 				msg += *extra; | ||||
| 			BOOST_FAIL(msg); | ||||
| 		} | ||||
| 		std::string generatedInterfaceString = m_compilerStack.getJsonDocumentation(DocumentationType::ABI_INTERFACE); | ||||
| 		Json::Value generatedInterface; | ||||
| 		m_reader.parse(generatedInterfaceString, generatedInterface); | ||||
| 		Json::Value expectedInterface; | ||||
| 		m_reader.parse(_expectedInterfaceString, expectedInterface); | ||||
| 		return expectedInterface == generatedInterface; | ||||
| 		BOOST_CHECK_MESSAGE(expectedInterface == generatedInterface, | ||||
| 							"Expected " << _expectedInterfaceString << | ||||
| 							"\n but got:\n" << generatedInterfaceString); | ||||
| 	} | ||||
| 	 | ||||
| 
 | ||||
| private: | ||||
| 	CompilerStack m_compilerStack; | ||||
| 	Json::Reader m_reader; | ||||
| }; | ||||
| 
 | ||||
| BOOST_FIXTURE_TEST_SUITE(SolidityCompilerJSONInterfaceOutput, InterfaceChecker) | ||||
| BOOST_FIXTURE_TEST_SUITE(SolidityABIJSON, InterfaceChecker) | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(basic_test) | ||||
| { | ||||
| @ -76,7 +91,7 @@ BOOST_AUTO_TEST_CASE(basic_test) | ||||
| 	} | ||||
| 	])"; | ||||
| 
 | ||||
| 	BOOST_CHECK(checkInterface(sourceCode, interface)); | ||||
| 	checkInterface(sourceCode, interface); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(empty_contract) | ||||
| @ -86,7 +101,7 @@ BOOST_AUTO_TEST_CASE(empty_contract) | ||||
| 
 | ||||
| 	char const* interface = "[]"; | ||||
| 
 | ||||
| 	BOOST_CHECK(checkInterface(sourceCode, interface)); | ||||
| 	checkInterface(sourceCode, interface); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(multiple_methods) | ||||
| @ -95,7 +110,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* interface = R"([ | ||||
| 	{ | ||||
| 		"name": "f", | ||||
| @ -129,7 +144,7 @@ BOOST_AUTO_TEST_CASE(multiple_methods) | ||||
| 	} | ||||
| 	])"; | ||||
| 
 | ||||
| 	BOOST_CHECK(checkInterface(sourceCode, interface)); | ||||
| 	checkInterface(sourceCode, interface); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(multiple_params) | ||||
| @ -160,7 +175,7 @@ BOOST_AUTO_TEST_CASE(multiple_params) | ||||
| 	} | ||||
| 	])"; | ||||
| 
 | ||||
| 	BOOST_CHECK(checkInterface(sourceCode, interface)); | ||||
| 	checkInterface(sourceCode, interface); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(multiple_methods_order) | ||||
| @ -170,7 +185,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* interface = R"([ | ||||
| 	{ | ||||
| 		"name": "c", | ||||
| @ -203,8 +218,8 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order) | ||||
| 		] | ||||
| 	} | ||||
| 	])"; | ||||
| 	 | ||||
| 	BOOST_CHECK(checkInterface(sourceCode, interface)); | ||||
| 
 | ||||
| 	checkInterface(sourceCode, interface); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
|  | ||||
							
								
								
									
										400
									
								
								solidityNatspecJSON.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								solidityNatspecJSON.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,400 @@ | ||||
| /*
 | ||||
| 	This file is part of cpp-ethereum. | ||||
| 
 | ||||
| 	cpp-ethereum is free software: you can redistribute it and/or modify | ||||
| 	it under the terms of the GNU General Public License as published by | ||||
| 	the Free Software Foundation, either version 3 of the License, or | ||||
| 	(at your option) any later version. | ||||
| 
 | ||||
| 	cpp-ethereum is distributed in the hope that it will be useful, | ||||
| 	but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| 	GNU General Public License for more details. | ||||
| 
 | ||||
| 	You should have received a copy of the GNU General Public License | ||||
| 	along with cpp-ethereum.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| /**
 | ||||
|  * @author Lefteris Karapetsas <lefteris@ethdev.com> | ||||
|  * @date 2014 | ||||
|  * Unit tests for the solidity compiler JSON Interface output. | ||||
|  */ | ||||
| 
 | ||||
| #include <boost/test/unit_test.hpp> | ||||
| #include <libsolidity/CompilerStack.h> | ||||
| #include <jsonrpc/json/json.h> | ||||
| #include <libdevcore/Exceptions.h> | ||||
| 
 | ||||
| namespace dev | ||||
| { | ||||
| namespace solidity | ||||
| { | ||||
| namespace test | ||||
| { | ||||
| 
 | ||||
| class DocumentationChecker | ||||
| { | ||||
| public: | ||||
| 	void checkNatspec(std::string const& _code, | ||||
| 					  std::string const& _expectedDocumentationString, | ||||
| 					  bool _userDocumentation) | ||||
| 	{ | ||||
| 		std::string generatedDocumentationString; | ||||
| 		try | ||||
| 		{ | ||||
| 			m_compilerStack.parse(_code); | ||||
| 		} | ||||
| 		catch (const std::exception& e) | ||||
| 		{ | ||||
| 			std::string const* extra = boost::get_error_info<errinfo_comment>(e); | ||||
| 			std::string msg = std::string("Parsing contract failed with: ") + | ||||
| 				e.what() + std::string("\n"); | ||||
| 			if (extra) | ||||
| 				msg += *extra; | ||||
| 			BOOST_FAIL(msg); | ||||
| 		} | ||||
| 
 | ||||
| 		if (_userDocumentation) | ||||
| 			generatedDocumentationString = m_compilerStack.getJsonDocumentation(DocumentationType::NATSPEC_USER); | ||||
| 		else | ||||
| 			generatedDocumentationString = m_compilerStack.getJsonDocumentation(DocumentationType::NATSPEC_DEV); | ||||
| 		Json::Value generatedDocumentation; | ||||
| 		m_reader.parse(generatedDocumentationString, generatedDocumentation); | ||||
| 		Json::Value expectedDocumentation; | ||||
| 		m_reader.parse(_expectedDocumentationString, expectedDocumentation); | ||||
| 		BOOST_CHECK_MESSAGE(expectedDocumentation == generatedDocumentation, | ||||
| 							"Expected " << _expectedDocumentationString << | ||||
| 							"\n but got:\n" << generatedDocumentationString); | ||||
| 	} | ||||
| 
 | ||||
| private: | ||||
| 	CompilerStack m_compilerStack; | ||||
| 	Json::Reader m_reader; | ||||
| }; | ||||
| 
 | ||||
| BOOST_FIXTURE_TEST_SUITE(SolidityNatspecJSON, DocumentationChecker) | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(user_basic_test) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @notice Multiplies `a` by 7\n" | ||||
| 	"  function mul(uint a) returns(uint d) { return a * 7; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \"notice\": \"Multiplies `a` by 7\"}" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, true); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_and_user_basic_test) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @notice Multiplies `a` by 7\n" | ||||
| 	"  /// @dev Multiplies a number by 7\n" | ||||
| 	"  function mul(uint a) returns(uint d) { return a * 7; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* devNatspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7\"\n" | ||||
| 	"        }\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	char const* userNatspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \"notice\": \"Multiplies `a` by 7\"}" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, devNatspec, false); | ||||
| 	checkNatspec(sourceCode, userNatspec, true); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(user_multiline_comment) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @notice Multiplies `a` by 7\n" | ||||
| 	"  /// and then adds `b`\n" | ||||
| 	"  function mul_and_add(uint a, uint256 b) returns(uint256 d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return (a * 7) + b;\n" | ||||
| 	"  }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul_and_add\":{ \"notice\": \"Multiplies `a` by 7 and then adds `b`\"}" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, true); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(user_multiple_functions) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @notice Multiplies `a` by 7 and then adds `b`\n" | ||||
| 	"  function mul_and_add(uint a, uint256 b) returns(uint256 d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return (a * 7) + b;\n" | ||||
| 	"  }\n" | ||||
| 	"\n" | ||||
| 	"  /// @notice Divides `input` by `div`\n" | ||||
| 	"  function divide(uint input, uint div) returns(uint d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return input / div;\n" | ||||
| 	"  }\n" | ||||
| 	"  /// @notice Subtracts 3 from `input`\n" | ||||
| 	"  function sub(int input) returns(int d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return input - 3;\n" | ||||
| 	"  }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul_and_add\":{ \"notice\": \"Multiplies `a` by 7 and then adds `b`\"}," | ||||
| 	"    \"divide\":{ \"notice\": \"Divides `input` by `div`\"}," | ||||
| 	"    \"sub\":{ \"notice\": \"Subtracts 3 from `input`\"}" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, true); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(user_empty_contract) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{\"methods\":{} }"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, true); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_and_user_no_doc) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  function mul(uint a) returns(uint d) { return a * 7; }\n" | ||||
| 	"  function sub(int input) returns(int d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return input - 3;\n" | ||||
| 	"  }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* devNatspec = "{\"methods\":{}}"; | ||||
| 
 | ||||
| 	char const* userNatspec = "{\"methods\":{}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, devNatspec, false); | ||||
| 	checkNatspec(sourceCode, userNatspec, true); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_desc_after_nl) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev\n" | ||||
| 	"  /// Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \" Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        }\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_multiple_params) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        }\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_mutiline_param_description) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter starts here.\n" | ||||
| 	"  /// Since it's a really complicated parameter we need 2 lines\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        }\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_multiple_functions) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"  \n" | ||||
| 	"  /// @dev Divides 2 numbers\n" | ||||
| 	"  /// @param input Documentation for the input parameter\n" | ||||
| 	"  /// @param div Documentation for the div parameter\n" | ||||
| 	"  function divide(uint input, uint div) returns(uint d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return input / div;\n" | ||||
| 	"  }\n" | ||||
| 	"  /// @dev Subtracts 3 from `input`\n" | ||||
| 	"  /// @param input Documentation for the input parameter\n" | ||||
| 	"  function sub(int input) returns(int d)\n" | ||||
| 	"  {\n" | ||||
| 	"      return input - 3;\n" | ||||
| 	"  }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        }\n" | ||||
| 	"    },\n" | ||||
| 	"    \"divide\":{ \n" | ||||
| 	"        \"details\": \"Divides 2 numbers\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"input\": \"Documentation for the input parameter\",\n" | ||||
| 	"            \"div\": \"Documentation for the div parameter\"\n" | ||||
| 	"        }\n" | ||||
| 	"    },\n" | ||||
| 	"    \"sub\":{ \n" | ||||
| 	"        \"details\": \"Subtracts 3 from `input`\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"input\": \"Documentation for the input parameter\"\n" | ||||
| 	"        }\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_return) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter starts here.\n" | ||||
| 	"  /// Since it's a really complicated parameter we need 2 lines\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  /// @return The result of the multiplication\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        },\n" | ||||
| 	"        \"return\": \"The result of the multiplication\"\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| BOOST_AUTO_TEST_CASE(dev_return_desc_after_nl) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter starts here.\n" | ||||
| 	"  /// Since it's a really complicated parameter we need 2 lines\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  /// @return\n" | ||||
| 	"  /// The result of the multiplication\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        },\n" | ||||
| 	"        \"return\": \" The result of the multiplication\"\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(dev_multiline_return) | ||||
| { | ||||
| 	char const* sourceCode = "contract test {\n" | ||||
| 	"  /// @dev Multiplies a number by 7 and adds second parameter\n" | ||||
| 	"  /// @param a Documentation for the first parameter starts here.\n" | ||||
| 	"  /// Since it's a really complicated parameter we need 2 lines\n" | ||||
| 	"  /// @param second Documentation for the second parameter\n" | ||||
| 	"  /// @return The result of the multiplication\n" | ||||
| 	"  /// and cookies with nutella\n" | ||||
| 	"  function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n" | ||||
| 	"}\n"; | ||||
| 
 | ||||
| 	char const* natspec = "{" | ||||
| 	"\"methods\":{" | ||||
| 	"    \"mul\":{ \n" | ||||
| 	"        \"details\": \"Multiplies a number by 7 and adds second parameter\",\n" | ||||
| 	"        \"params\": {\n" | ||||
| 	"            \"a\": \"Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines\",\n" | ||||
| 	"            \"second\": \"Documentation for the second parameter\"\n" | ||||
| 	"        },\n" | ||||
| 	"        \"return\": \"The result of the multiplication and cookies with nutella\"\n" | ||||
| 	"    }\n" | ||||
| 	"}}"; | ||||
| 
 | ||||
| 	checkNatspec(sourceCode, natspec, false); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
| 
 | ||||
| } | ||||
| } | ||||
| } | ||||
| @ -33,6 +33,41 @@ | ||||
|         } | ||||
|      }, | ||||
| 
 | ||||
|     "CallEcrecover0_overlappingInputOutput": { | ||||
|          "env" : { | ||||
|              "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|              "currentNumber" : "0", | ||||
|              "currentGasLimit" : "10000000", | ||||
|              "currentDifficulty" : "256", | ||||
|              "currentTimestamp" : 1, | ||||
|              "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||
|          }, | ||||
|          "pre" : { | ||||
|              "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { | ||||
|                  "balance" : "20000000", | ||||
|                  "nonce" : 0, | ||||
|                  "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 1000 1 0 0 128 64 32) [[ 0 ]] (MOD (MLOAD 64) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0))  }", | ||||
|                  "storage": {} | ||||
|              }, | ||||
|             "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { | ||||
|                 "balance" : "1000000000000000000", | ||||
|                 "nonce" : 0, | ||||
|                 "code" : "", | ||||
|                 "storage": {} | ||||
|             } | ||||
|         }, | ||||
|         "transaction" : { | ||||
|             "nonce" : "0", | ||||
|             "gasPrice" : "1", | ||||
|             "gasLimit" : "365224", | ||||
|             "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", | ||||
|             "value" : "100000", | ||||
|             "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", | ||||
|             "data" : "" | ||||
|         } | ||||
|      }, | ||||
| 
 | ||||
| 
 | ||||
|     "CallEcrecover0_completeReturnValue": { | ||||
|          "env" : { | ||||
|              "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|  | ||||
							
								
								
									
										20
									
								
								vm.cpp
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								vm.cpp
									
									
									
									
									
								
							| @ -488,6 +488,26 @@ BOOST_AUTO_TEST_CASE(vmLogTest) | ||||
| 	dev::test::executeTests("vmLogTest", "/VMTests", dev::test::doVMTests); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(vmPerformanceTest) | ||||
| { | ||||
| 	for (int i = 1; i < boost::unit_test::framework::master_test_suite().argc; ++i) | ||||
| 	{ | ||||
| 		string arg = boost::unit_test::framework::master_test_suite().argv[i]; | ||||
| 		if (arg == "--performance") | ||||
| 			dev::test::executeTests("vmPerformanceTest", "/VMTests", dev::test::doVMTests); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(vmArithPerformanceTest) | ||||
| { | ||||
| 	for (int i = 1; i < boost::unit_test::framework::master_test_suite().argc; ++i) | ||||
| 	{ | ||||
| 		string arg = boost::unit_test::framework::master_test_suite().argv[i]; | ||||
| 		if (arg == "--performance") | ||||
| 			dev::test::executeTests("vmArithPerformanceTest", "/VMTests", dev::test::doVMTests); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(vmRandom) | ||||
| { | ||||
| 	string testPath = getTestPath(); | ||||
|  | ||||
| @ -338,6 +338,33 @@ | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "calldataloadSizeTooHigh": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|             "currentNumber" : "0", | ||||
|             "currentGasLimit" : "1000000", | ||||
|             "currentDifficulty" : "256", | ||||
|             "currentTimestamp" : 1, | ||||
|             "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||
|         }, | ||||
|         "pre" : { | ||||
|             "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { | ||||
|                 "balance" : "1000000000000000000", | ||||
|                 "nonce" : 0, | ||||
|                 "code" : "{ [[ 0 ]] (CALLDATALOAD 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa)}", | ||||
|                 "storage": {} | ||||
|             } | ||||
|         }, | ||||
|         "exec" : { | ||||
|             "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", | ||||
|             "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "value" : "1000000000000000000", | ||||
|             "data" : "0x123456789abcdef0000000000000000000000000000000000000000000000000024", | ||||
|             "gasPrice" : "1000000000", | ||||
|             "gas" : "100000000000" | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "calldatasize0": { | ||||
|         "env" : { | ||||
| @ -451,6 +478,62 @@ | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "calldatacopy_DataIndexTooHigh": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|             "currentNumber" : "0", | ||||
|             "currentGasLimit" : "1000000", | ||||
|             "currentDifficulty" : "256", | ||||
|             "currentTimestamp" : 1, | ||||
|             "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||
|         }, | ||||
|         "pre" : { | ||||
|             "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { | ||||
|                 "balance" : "1000000000000000000", | ||||
|                 "nonce" : 0, | ||||
|                 "code" : "{ (CALLDATACOPY 0 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa 0xff ) [[ 0 ]] @0}", | ||||
|                 "storage": {} | ||||
|             } | ||||
|         }, | ||||
|         "exec" : { | ||||
|             "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", | ||||
|             "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "value" : "1000000000000000000", | ||||
|             "data" : "0x1234567890abcdef01234567890abcdef", | ||||
|             "gasPrice" : "1000000000", | ||||
|             "gas" : "100000000000" | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "calldatacopy_DataIndexTooHigh2": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|             "currentNumber" : "0", | ||||
|             "currentGasLimit" : "1000000", | ||||
|             "currentDifficulty" : "256", | ||||
|             "currentTimestamp" : 1, | ||||
|             "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||
|         }, | ||||
|         "pre" : { | ||||
|             "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { | ||||
|                 "balance" : "1000000000000000000", | ||||
|                 "nonce" : 0, | ||||
|                 "code" : "{ (CALLDATACOPY 0 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa 9 ) [[ 0 ]] @0}", | ||||
|                 "storage": {} | ||||
|             } | ||||
|         }, | ||||
|         "exec" : { | ||||
|             "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", | ||||
|             "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "value" : "1000000000000000000", | ||||
|             "data" : "0x1234567890abcdef01234567890abcdef", | ||||
|             "gasPrice" : "1000000000", | ||||
|             "gas" : "100000000000" | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "calldatacopy1": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
| @ -535,6 +618,34 @@ | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "codecopy_DataIndexTooHigh": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|             "currentNumber" : "0", | ||||
|             "currentGasLimit" : "1000000", | ||||
|             "currentDifficulty" : "256", | ||||
|             "currentTimestamp" : 1, | ||||
|             "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||
|         }, | ||||
|         "pre" : { | ||||
|             "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { | ||||
|                 "balance" : "1000000000000000000", | ||||
|                 "nonce" : 0, | ||||
|                 "code" : "{ (CODECOPY 0 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa 8 ) [[ 0 ]] @0}", | ||||
|                 "storage": {} | ||||
|             } | ||||
|         }, | ||||
|         "exec" : { | ||||
|             "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", | ||||
|             "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "value" : "1000000000000000000", | ||||
|             "data" : "0x1234567890abcdef01234567890abcdef", | ||||
|             "gasPrice" : "1000000000", | ||||
|             "gas" : "100000000000" | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "codecopy0": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
| @ -686,6 +797,35 @@ | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     "extcodecopy_DataIndexTooHigh": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|             "currentNumber" : "0", | ||||
|             "currentGasLimit" : "1000000", | ||||
|             "currentDifficulty" : "256", | ||||
|             "currentTimestamp" : 1, | ||||
|             "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" | ||||
|         }, | ||||
|         "pre" : { | ||||
|             "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { | ||||
|                 "balance" : "1000000000000000000", | ||||
|                 "nonce" : 0, | ||||
|                 "code" : "{ (EXTCODECOPY (ADDRESS) 0 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa 8 ) [[ 0 ]] @0}", | ||||
|                 "storage": {} | ||||
|             } | ||||
|         }, | ||||
|         "exec" : { | ||||
|             "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", | ||||
|             "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", | ||||
|             "value" : "1000000000000000000", | ||||
|             "data" : "0x1234567890abcdef01234567890abcdef", | ||||
|             "gasPrice" : "1000000000", | ||||
|             "gas" : "100000000000" | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
| 
 | ||||
|     "extcodecopy0": { | ||||
|         "env" : { | ||||
|             "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user