From 99bfdf930a8ae7900f0f7d04a01aee1dd9e1774c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 9 Aug 2023 18:16:14 +0200 Subject: [PATCH] SolidityNatspecJSON: Convert Boost-based test cases into natspectJSON/*.sol tests --- test/CMakeLists.txt | 1 - test/libsolidity/SolidityNatspecJSON.cpp | 3297 ----------------- test/libsolidity/natspecJSON/custom.sol | 34 + .../natspecJSON/custom_inheritance.sol | 25 + .../natspecJSON/dev_and_user_basic_test.sol | 29 + .../natspecJSON/dev_and_user_no_doc.sol | 20 + .../natspecJSON/dev_author_at_function.sol | 9 + .../natspecJSON/dev_constructor.sol | 22 + .../dev_constructor_and_function.sol | 44 + .../natspecJSON/dev_constructor_return.sol | 8 + .../natspecJSON/dev_contract_doc.sol | 21 + .../natspecJSON/dev_contract_no_doc.sol | 17 + .../natspecJSON/dev_default_inherit.sol | 72 + .../dev_default_inherit_variable.sol | 36 + .../natspecJSON/dev_desc_after_nl.sol | 25 + .../natspecJSON/dev_different_return_name.sol | 38 + .../dev_different_return_name_multiple.sol | 41 + ...nt_return_name_multiple_partly_unnamed.sol | 41 + ...different_return_name_multiple_unnamed.sol | 41 + .../dev_documenting_no_param_description.sol | 8 + .../dev_documenting_no_param_name.sol | 8 + .../dev_documenting_no_param_name_end.sol | 8 + .../dev_documenting_no_return_param_name.sol | 9 + .../dev_documenting_nonexistent_param.sol | 8 + .../natspecJSON/dev_explicit_inherit.sol | 54 + .../natspecJSON/dev_explicit_inherit2.sol | 70 + .../dev_explicit_inherit_partial.sol | 56 + .../dev_explicit_inherit_partial2.sol | 56 + .../dev_explicit_inherit_variable.sol | 43 + .../dev_inherit_parameter_mismatch.sol | 58 + .../natspecJSON/dev_multiline_comment.sol | 35 + .../natspecJSON/dev_multiline_return.sol | 33 + .../natspecJSON/dev_multiple_functions.sol | 54 + .../natspecJSON/dev_multiple_params.sol | 24 + .../dev_mutiline_param_description.sol | 25 + test/libsolidity/natspecJSON/dev_return.sol | 30 + .../natspecJSON/dev_return_desc_after_nl.sol | 33 + .../natspecJSON/dev_return_desc_multiple.sol | 35 + .../dev_return_desc_multiple_unamed.sol | 35 + .../dev_return_desc_multiple_unamed_mixed.sol | 35 + ...ev_return_desc_multiple_unamed_mixed_2.sol | 38 + .../dev_return_name_no_description.sol | 38 + .../natspecJSON/dev_return_no_params.sol | 20 + .../dev_struct_getter_override.sol | 47 + ...rride_different_return_parameter_names.sol | 47 + ..._struct_getter_override_no_return_name.sol | 44 + .../dev_title_at_function_error.sol | 9 + .../emit_event_from_foreign_contract.sol | 41 + ...t_from_foreign_contract_no_inheritance.sol | 31 + ...m_foreign_contract_with_same_signature.sol | 74 + ...me_signature_event_different_libraries.sol | 66 + ...nt_different_libraries_missing_natspec.sol | 34 + ..._same_signature_event_library_contract.sol | 68 + ...event_library_contract_missing_natspec.sol | 53 + ...same_signature_event_library_inherited.sol | 46 + ...vent_library_inherited_missing_natspec.sol | 30 + .../libsolidity/natspecJSON/empty_comment.sol | 10 + test/libsolidity/natspecJSON/enum_no_docs.sol | 26 + test/libsolidity/natspecJSON/error.sol | 42 + .../natspecJSON/error_multiple.sol | 66 + test/libsolidity/natspecJSON/event.sol | 40 + .../natspecJSON/event_inheritance.sol | 104 + .../event_inheritance_interface.sol | 104 + .../multiline_notice_without_tag.sol | 18 + .../natspecJSON/notice_without_tag.sol | 17 + .../natspecJSON/private_state_variable.sol | 23 + .../natspecJSON/public_state_variable.sol | 36 + .../public_state_variable_struct.sol | 40 + .../public_state_variable_struct_repeated.sol | 13 + .../libsolidity/natspecJSON/slash3_slash3.sol | 18 + .../libsolidity/natspecJSON/slash3_slash4.sol | 18 + test/libsolidity/natspecJSON/slash4.sol | 11 + test/libsolidity/natspecJSON/star3.sol | 13 + .../natspecJSON/struct_no_docs.sol | 27 + .../natspecJSON/user_basic_test.sol | 17 + .../natspecJSON/user_constructor.sol | 17 + .../user_constructor_and_function.sol | 23 + .../natspecJSON/user_default_inherit.sol | 57 + .../user_default_inherit_variable.sol | 35 + .../natspecJSON/user_empty_contract.sol | 8 + .../natspecJSON/user_empty_natspec_test.sol | 13 + .../natspecJSON/user_explicit_inherit.sol | 44 + .../natspecJSON/user_explicit_inherit2.sol | 55 + .../user_explicit_inherit_partial.sol | 46 + .../user_explicit_inherit_partial2.sol | 46 + .../user_explicit_inherit_variable.sol | 42 + .../user_inherit_parameter_mismatch.sol | 48 + .../natspecJSON/user_multiline_comment.sol | 20 + .../user_multiline_empty_lines.sol | 22 + .../natspecJSON/user_multiple_functions.sol | 37 + .../natspecJSON/user_newline_break.sol | 21 + 91 files changed, 3103 insertions(+), 3298 deletions(-) delete mode 100644 test/libsolidity/SolidityNatspecJSON.cpp create mode 100644 test/libsolidity/natspecJSON/custom.sol create mode 100644 test/libsolidity/natspecJSON/custom_inheritance.sol create mode 100644 test/libsolidity/natspecJSON/dev_and_user_basic_test.sol create mode 100644 test/libsolidity/natspecJSON/dev_and_user_no_doc.sol create mode 100644 test/libsolidity/natspecJSON/dev_author_at_function.sol create mode 100644 test/libsolidity/natspecJSON/dev_constructor.sol create mode 100644 test/libsolidity/natspecJSON/dev_constructor_and_function.sol create mode 100644 test/libsolidity/natspecJSON/dev_constructor_return.sol create mode 100644 test/libsolidity/natspecJSON/dev_contract_doc.sol create mode 100644 test/libsolidity/natspecJSON/dev_contract_no_doc.sol create mode 100644 test/libsolidity/natspecJSON/dev_default_inherit.sol create mode 100644 test/libsolidity/natspecJSON/dev_default_inherit_variable.sol create mode 100644 test/libsolidity/natspecJSON/dev_desc_after_nl.sol create mode 100644 test/libsolidity/natspecJSON/dev_different_return_name.sol create mode 100644 test/libsolidity/natspecJSON/dev_different_return_name_multiple.sol create mode 100644 test/libsolidity/natspecJSON/dev_different_return_name_multiple_partly_unnamed.sol create mode 100644 test/libsolidity/natspecJSON/dev_different_return_name_multiple_unnamed.sol create mode 100644 test/libsolidity/natspecJSON/dev_documenting_no_param_description.sol create mode 100644 test/libsolidity/natspecJSON/dev_documenting_no_param_name.sol create mode 100644 test/libsolidity/natspecJSON/dev_documenting_no_param_name_end.sol create mode 100644 test/libsolidity/natspecJSON/dev_documenting_no_return_param_name.sol create mode 100644 test/libsolidity/natspecJSON/dev_documenting_nonexistent_param.sol create mode 100644 test/libsolidity/natspecJSON/dev_explicit_inherit.sol create mode 100644 test/libsolidity/natspecJSON/dev_explicit_inherit2.sol create mode 100644 test/libsolidity/natspecJSON/dev_explicit_inherit_partial.sol create mode 100644 test/libsolidity/natspecJSON/dev_explicit_inherit_partial2.sol create mode 100644 test/libsolidity/natspecJSON/dev_explicit_inherit_variable.sol create mode 100644 test/libsolidity/natspecJSON/dev_inherit_parameter_mismatch.sol create mode 100644 test/libsolidity/natspecJSON/dev_multiline_comment.sol create mode 100644 test/libsolidity/natspecJSON/dev_multiline_return.sol create mode 100644 test/libsolidity/natspecJSON/dev_multiple_functions.sol create mode 100644 test/libsolidity/natspecJSON/dev_multiple_params.sol create mode 100644 test/libsolidity/natspecJSON/dev_mutiline_param_description.sol create mode 100644 test/libsolidity/natspecJSON/dev_return.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_desc_after_nl.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_desc_multiple.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed_2.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_name_no_description.sol create mode 100644 test/libsolidity/natspecJSON/dev_return_no_params.sol create mode 100644 test/libsolidity/natspecJSON/dev_struct_getter_override.sol create mode 100644 test/libsolidity/natspecJSON/dev_struct_getter_override_different_return_parameter_names.sol create mode 100644 test/libsolidity/natspecJSON/dev_struct_getter_override_no_return_name.sol create mode 100644 test/libsolidity/natspecJSON/dev_title_at_function_error.sol create mode 100644 test/libsolidity/natspecJSON/emit_event_from_foreign_contract.sol create mode 100644 test/libsolidity/natspecJSON/emit_event_from_foreign_contract_no_inheritance.sol create mode 100644 test/libsolidity/natspecJSON/emit_event_from_foreign_contract_with_same_signature.sol create mode 100644 test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries.sol create mode 100644 test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries_missing_natspec.sol create mode 100644 test/libsolidity/natspecJSON/emit_same_signature_event_library_contract.sol create mode 100644 test/libsolidity/natspecJSON/emit_same_signature_event_library_contract_missing_natspec.sol create mode 100644 test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited.sol create mode 100644 test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited_missing_natspec.sol create mode 100644 test/libsolidity/natspecJSON/empty_comment.sol create mode 100644 test/libsolidity/natspecJSON/enum_no_docs.sol create mode 100644 test/libsolidity/natspecJSON/error.sol create mode 100644 test/libsolidity/natspecJSON/error_multiple.sol create mode 100644 test/libsolidity/natspecJSON/event.sol create mode 100644 test/libsolidity/natspecJSON/event_inheritance.sol create mode 100644 test/libsolidity/natspecJSON/event_inheritance_interface.sol create mode 100644 test/libsolidity/natspecJSON/multiline_notice_without_tag.sol create mode 100644 test/libsolidity/natspecJSON/notice_without_tag.sol create mode 100644 test/libsolidity/natspecJSON/private_state_variable.sol create mode 100644 test/libsolidity/natspecJSON/public_state_variable.sol create mode 100644 test/libsolidity/natspecJSON/public_state_variable_struct.sol create mode 100644 test/libsolidity/natspecJSON/public_state_variable_struct_repeated.sol create mode 100644 test/libsolidity/natspecJSON/slash3_slash3.sol create mode 100644 test/libsolidity/natspecJSON/slash3_slash4.sol create mode 100644 test/libsolidity/natspecJSON/slash4.sol create mode 100644 test/libsolidity/natspecJSON/star3.sol create mode 100644 test/libsolidity/natspecJSON/struct_no_docs.sol create mode 100644 test/libsolidity/natspecJSON/user_basic_test.sol create mode 100644 test/libsolidity/natspecJSON/user_constructor.sol create mode 100644 test/libsolidity/natspecJSON/user_constructor_and_function.sol create mode 100644 test/libsolidity/natspecJSON/user_default_inherit.sol create mode 100644 test/libsolidity/natspecJSON/user_default_inherit_variable.sol create mode 100644 test/libsolidity/natspecJSON/user_empty_contract.sol create mode 100644 test/libsolidity/natspecJSON/user_empty_natspec_test.sol create mode 100644 test/libsolidity/natspecJSON/user_explicit_inherit.sol create mode 100644 test/libsolidity/natspecJSON/user_explicit_inherit2.sol create mode 100644 test/libsolidity/natspecJSON/user_explicit_inherit_partial.sol create mode 100644 test/libsolidity/natspecJSON/user_explicit_inherit_partial2.sol create mode 100644 test/libsolidity/natspecJSON/user_explicit_inherit_variable.sol create mode 100644 test/libsolidity/natspecJSON/user_inherit_parameter_mismatch.sol create mode 100644 test/libsolidity/natspecJSON/user_multiline_comment.sol create mode 100644 test/libsolidity/natspecJSON/user_multiline_empty_lines.sol create mode 100644 test/libsolidity/natspecJSON/user_multiple_functions.sol create mode 100644 test/libsolidity/natspecJSON/user_newline_break.sol diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b3b678983..f8242db7a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -97,7 +97,6 @@ set(libsolidity_sources libsolidity/SolidityExecutionFramework.h libsolidity/SolidityExpressionCompiler.cpp libsolidity/SolidityNameAndTypeResolution.cpp - libsolidity/SolidityNatspecJSON.cpp libsolidity/SolidityOptimizer.cpp libsolidity/SolidityParser.cpp libsolidity/SolidityTypes.cpp diff --git a/test/libsolidity/SolidityNatspecJSON.cpp b/test/libsolidity/SolidityNatspecJSON.cpp deleted file mode 100644 index fd0ffd0fd..000000000 --- a/test/libsolidity/SolidityNatspecJSON.cpp +++ /dev/null @@ -1,3297 +0,0 @@ -/* - This file is part of solidity. - - solidity 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. - - solidity 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 solidity. If not, see . - */ -/** - * @author Lefteris Karapetsas - * @date 2014 - * Unit tests for the solidity compiler JSON Interface output. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace solidity::langutil; - -namespace solidity::frontend::test -{ - -class DocumentationChecker -{ -public: - void checkNatspec( - std::string const& _code, - std::string const& _contractName, - std::string const& _expectedDocumentationString, - bool _userDocumentation - ) - { - m_compilerStack.reset(); - m_compilerStack.setSources({{"", "pragma solidity >=0.0;\n" + _code}}); - m_compilerStack.setEVMVersion(solidity::test::CommonOptions::get().evmVersion()); - BOOST_REQUIRE_MESSAGE(m_compilerStack.parseAndAnalyze(), "Parsing contract failed"); - - Json::Value generatedDocumentation; - if (_userDocumentation) - generatedDocumentation = m_compilerStack.natspecUser(_contractName); - else - generatedDocumentation = m_compilerStack.natspecDev(_contractName); - Json::Value expectedDocumentation; - std::string parseError; - BOOST_REQUIRE_MESSAGE(util::jsonParseStrict(_expectedDocumentationString, expectedDocumentation, &parseError), parseError); - - expectedDocumentation["version"] = Json::Value(Natspec::c_natspecVersion); - expectedDocumentation["kind"] = Json::Value(_userDocumentation ? "user" : "dev"); - - BOOST_CHECK_MESSAGE( - expectedDocumentation == generatedDocumentation, - "Expected:\n" << util::jsonPrettyPrint(expectedDocumentation) << - "\n but got:\n" << util::jsonPrettyPrint(generatedDocumentation) - ); - } - - void expectNatspecError(std::string const& _code) - { - m_compilerStack.reset(); - m_compilerStack.setSources({{"", "pragma solidity >=0.0;\n" + _code}}); - m_compilerStack.setEVMVersion(solidity::test::CommonOptions::get().evmVersion()); - BOOST_CHECK(!m_compilerStack.parseAndAnalyze()); - BOOST_REQUIRE(Error::containsErrorOfType(m_compilerStack.errors(), Error::Type::DocstringParsingError)); - } - -protected: - CompilerStack m_compilerStack; -}; - -BOOST_FIXTURE_TEST_SUITE(SolidityNatspecJSON, DocumentationChecker) - -BOOST_AUTO_TEST_CASE(user_empty_natspec_test) -{ - char const* sourceCode = R"( - contract test { - /// - /// - function f() public { - } - } - )"; - - char const* natspec = R"( - { - "methods": {} - } - )"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(user_newline_break) -{ - char const* sourceCode = R"( - contract test { - /// - /// @notice hello - - /// @notice world - function f() public { - } - } - )"; - - char const* natspec = R"ABCDEF( - { - "methods": - { - "f()": - { - "notice": "world" - } - } - } - )ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(user_multiline_empty_lines) -{ - char const* sourceCode = R"( - contract test { - /** - * - * - * @notice hello world - */ - function f() public { - } - } - )"; - - char const* natspec = R"ABCDEF( - { - "methods": - { - "f()": - { - "notice": "hello world" - } - } - } - )ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - - -BOOST_AUTO_TEST_CASE(user_basic_test) -{ - char const* sourceCode = R"( - contract test { - /// @notice Multiplies `a` by 7 - function mul(uint a) public returns(uint d) { return a * 7; } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256)\":{ \"notice\": \"Multiplies `a` by 7\"}" - "}}"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_and_user_basic_test) -{ - char const* sourceCode = R"( - contract test { - /// @notice Multiplies `a` by 7 - /// @dev Multiplies a number by 7 - function mul(uint a) public returns (uint d) { return a * 7; } - } - )"; - - char const* devNatspec = R"R( - { - "methods": - { - "mul(uint256)": - { - "details": "Multiplies a number by 7" - } - } - })R"; - - char const* userNatspec = R"R( - { - "methods": - { - "mul(uint256)": - { - "notice": "Multiplies `a` by 7" - } - } - })R"; - - checkNatspec(sourceCode, "test", devNatspec, false); - checkNatspec(sourceCode, "test", userNatspec, true); -} - -BOOST_AUTO_TEST_CASE(user_multiline_comment) -{ - char const* sourceCode = R"( - contract test { - /// @notice Multiplies `a` by 7 - /// and then adds `b` - function mul_and_add(uint a, uint256 b) public returns (uint256 d) { - return (a * 7) + b; - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul_and_add(uint256,uint256)\":{ \"notice\": \"Multiplies `a` by 7 and then adds `b`\"}" - "}}"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(user_multiple_functions) -{ - char const* sourceCode = R"( - contract test { - /// @notice Multiplies `a` by 7 and then adds `b` - function mul_and_add(uint a, uint256 b) public returns (uint256 d) { - return (a * 7) + b; - } - - /// @notice Divides `input` by `div` - function divide(uint input, uint div) public returns (uint d) { - return input / div; - } - - /// @notice Subtracts 3 from `input` - function sub(int input) public returns (int d) { - return input - 3; - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul_and_add(uint256,uint256)\":{ \"notice\": \"Multiplies `a` by 7 and then adds `b`\"}," - " \"divide(uint256,uint256)\":{ \"notice\": \"Divides `input` by `div`\"}," - " \"sub(int256)\":{ \"notice\": \"Subtracts 3 from `input`\"}" - "}}"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(user_empty_contract) -{ - char const* sourceCode = R"( - contract test { } - )"; - - char const* natspec = "{\"methods\":{} }"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_and_user_no_doc) -{ - char const* sourceCode = R"( - contract test { - function mul(uint a) public returns (uint d) { - return a * 7; - } - function sub(int input) public returns (int d) { - return input - 3; - } - } - )"; - - char const* devNatspec = "{\"methods\":{}}"; - char const* userNatspec = "{\"methods\":{}}"; - - checkNatspec(sourceCode, "test", devNatspec, false); - checkNatspec(sourceCode, "test", userNatspec, true); -} - -BOOST_AUTO_TEST_CASE(public_state_variable) -{ - char const* sourceCode = R"( - contract test { - /// @notice example of notice - /// @dev example of dev - /// @return returns state - uint public state; - } - )"; - - char const* devDoc = R"R( - { - "methods": {}, - "stateVariables": - { - "state": - { - "details": "example of dev", - "return": "returns state", - "returns": - { - "_0": "returns state" - } - } - } - } - )R"; - checkNatspec(sourceCode, "test", devDoc, false); - - char const* userDoc = R"R( - { - "methods": - { - "state()": - { - "notice": "example of notice" - } - } - } - )R"; - checkNatspec(sourceCode, "test", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(public_state_variable_struct) -{ - char const* sourceCode = R"( - contract Bank { - struct Coin { - string observeGraphicURL; - string reverseGraphicURL; - } - - /// @notice Get the n-th coin I own - /// @return observeGraphicURL Front pic - /// @return reverseGraphicURL Back pic - Coin[] public coinStack; - } - )"; - - char const* devDoc = R"R( - { - "methods": {}, - "stateVariables": - { - "coinStack": - { - "returns": - { - "observeGraphicURL": "Front pic", - "reverseGraphicURL": "Back pic" - } - } - } - } - )R"; - checkNatspec(sourceCode, "Bank", devDoc, false); - - char const* userDoc = R"R( - { - "methods": - { - "coinStack(uint256)": - { - "notice": "Get the n-th coin I own" - } - } - } - )R"; - checkNatspec(sourceCode, "Bank", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(public_state_variable_struct_repeated) -{ - char const* sourceCode = R"( - contract Bank { - struct Coin { - string obverseGraphicURL; - string reverseGraphicURL; - } - - /// @notice Get the n-th coin I own - /// @return obverseGraphicURL Front pic - /// @return obverseGraphicURL Front pic - Coin[] public coinStack; - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(private_state_variable) -{ - char const* sourceCode = R"( - contract test { - /// @dev example of dev - uint private state; - } - )"; - - char const* devDoc = R"( - { - "methods": {}, - "stateVariables": - { - "state": - { - "details": "example of dev" - } - } - } - )"; - checkNatspec(sourceCode, "test", devDoc, false); - - char const* userDoc = R"( - { - "methods":{} - } - )"; - checkNatspec(sourceCode, "test", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(event) -{ - char const* sourceCode = R"( - contract ERC20 { - /// @notice This event is emitted when a transfer occurs. - /// @param from The source account. - /// @param to The destination account. - /// @param amount The amount. - /// @dev A test case! - event Transfer(address indexed from, address indexed to, uint amount); - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "Transfer(address,address,uint256)": - { - "details": "A test case!", - "params": - { - "amount": "The amount.", "from": "The source account.", "to": "The destination account." - } - } - }, - "methods": {} - } - )ABCDEF"; - checkNatspec(sourceCode, "ERC20", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "Transfer(address,address,uint256)": - { - "notice": "This event is emitted when a transfer occurs." - } - }, - "methods": {} - } - )ABCDEF"; - checkNatspec(sourceCode, "ERC20", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_event_from_foreign_contract) -{ - char const* sourceCode = R"( - contract X { - /// @notice Userdoc for event E. - /// @dev Devdoc for event E. - event E(); - } - - contract C { - function g() public { - emit X.E(); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "E()": - { - "details": "Devdoc for event E." - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "E()": - { - "notice": "Userdoc for event E." - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_event_from_foreign_contract_with_same_signature) -{ - char const* sourceCode = R"( - contract C { - /// @notice C.E event - /// @dev C.E event - event E(uint256 value); - } - - contract D { - /// @notice D.E event - /// @dev D.E event - event E(uint256 value); - - function test() public { - emit C.E(1); - emit E(2); - } - } - )"; - - char const* devDocC = R"ABCDEF( - { - "events": - { - "E(uint256)": - { - "details": "C.E event" - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDocC, false); - - char const* devDocD = R"ABCDEF( - { - "events": - { - "E(uint256)": - { - "details": "D.E event" - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "D", devDocD, false); - - char const* userDocC = R"ABCDEF( - { - "events": - { - "E(uint256)": - { - "notice": "C.E event" - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDocC, true); - - char const* userDocD = R"ABCDEF( - { - "events": - { - "E(uint256)": - { - "notice": "D.E event" - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "D", userDocD, true); -} - -// Tests that emitting an event from contract C in contract D does not inherit natspec from C.E -BOOST_AUTO_TEST_CASE(emit_event_from_foreign_contract_no_inheritance) -{ - char const* sourceCode = R"( - contract C { - /// @notice C.E event - /// @dev C.E event - event E(); - } - - contract D { - event E(); - - function test() public { - emit C.E(); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "D", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "D", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_same_signature_event_library_contract) -{ - char const* sourceCode = R"( - library L { - /// @notice This event is defined in Library L - /// @dev This should not appear in Contract C dev doc - event SameSignatureEvent(uint16); - /// @notice This event is defined in Library L - /// @dev This should appear in Contract C dev doc - event LibraryEvent(uint32); - } - contract C { - /// @notice This event is defined in Contract C - /// @dev This should appear in Contract C dev doc - event SameSignatureEvent(uint16); - /// @notice This event is defined in Contract C - /// @dev This should appear in contract C dev doc - event ContractEvent(uint32); - function f() public { - emit L.SameSignatureEvent(0); - emit SameSignatureEvent(1); - emit L.LibraryEvent(2); - emit ContractEvent(3); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "ContractEvent(uint32)": - { - "details": "This should appear in contract C dev doc" - }, - "LibraryEvent(uint32)": - { - "details": "This should appear in Contract C dev doc" - }, - "SameSignatureEvent(uint16)": - { - "details": "This should appear in Contract C dev doc" - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "ContractEvent(uint32)": - { - "notice": "This event is defined in Contract C" - }, - "LibraryEvent(uint32)": - { - "notice": "This event is defined in Library L" - }, - "SameSignatureEvent(uint16)": - { - "notice": "This event is defined in Contract C" - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_same_signature_event_different_libraries) -{ - char const* sourceCode = R"( - library L1 { - /// @notice This event is defined in Library L1 - /// @dev This should not appear in Contract C dev doc - event SameSignatureEvent(uint16); - } - library L2 { - /// @notice This event is defined in Library L2 - /// @dev This should not appear in Contract C dev doc - event SameSignatureEvent(uint16); - } - library L3 { - /// @notice This event is defined in Library L3 - /// @dev This should not appear in Contract C dev doc - event SameSignatureEvent(uint16); - } - contract C { - function f() public { - emit L1.SameSignatureEvent(0); - emit L2.SameSignatureEvent(1); - emit L3.SameSignatureEvent(2); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); - - char const* libraryDevDoc = R"ABCDEF( - { - "events": - { - "SameSignatureEvent(uint16)": - { - "details": "This should not appear in Contract C dev doc" - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "L1", libraryDevDoc, false); - - char const* libraryUserDoc = R"ABCDEF( - { - "events": - { - "SameSignatureEvent(uint16)": - { - "notice": "This event is defined in Library L1" - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "L1", libraryUserDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_same_signature_event_library_inherited) -{ - char const* sourceCode = R"( - contract D { - /// @notice This event is defined in contract D - /// @dev This should appear in Contract C dev doc - event SameSignatureEvent(uint16); - } - library L { - /// @notice This event is defined in Library L - /// @dev This should not appear in Contract C - event SameSignatureEvent(uint16); - } - contract C is D { - function f() public { - emit L.SameSignatureEvent(0); - emit D.SameSignatureEvent(1); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "SameSignatureEvent(uint16)": - { - "details": "This should appear in Contract C dev doc" - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "SameSignatureEvent(uint16)": - { - "notice": "This event is defined in contract D" - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_same_signature_event_library_contract_missing_natspec) -{ - char const* sourceCode = R"( - library L { - /// @notice This event is defined in library L - /// @dev This should not appear in contract C devdoc - event SameSignatureEvent(uint16); - /// @notice This event is defined in library L - /// @dev This should appear in contract C devdoc - event LibraryEvent(uint32); - } - contract C { - event SameSignatureEvent(uint16); - /// @notice This event is defined in contract C - event ContractEvent(uint32); - function f() public { - emit L.SameSignatureEvent(0); - emit SameSignatureEvent(1); - emit L.LibraryEvent(2); - emit ContractEvent(3); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "LibraryEvent(uint32)": - { - "details": "This should appear in contract C devdoc" - } - }, - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "ContractEvent(uint32)": - { - "notice": "This event is defined in contract C" - }, - "LibraryEvent(uint32)": - { - "notice": "This event is defined in library L" - } - }, - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_same_signature_event_different_libraries_missing_natspec) -{ - char const* sourceCode = R"( - library L1 { - event SameSignatureEvent(uint16); - } - library L2 { - /// @notice This event is defined in library L2 - /// @dev This should not appear in Contract C devdoc - event SameSignatureEvent(uint16); - } - library L3 { - event SameSignatureEvent(uint16); - } - contract C { - function f() public { - emit L1.SameSignatureEvent(0); - emit L2.SameSignatureEvent(1); - emit L3.SameSignatureEvent(2); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(emit_same_signature_event_library_inherited_missing_natspec) -{ - char const* sourceCode = R"( - contract D { - event SameSignatureEvent(uint16); - } - library L { - /// @notice This event is defined in library L - /// @dev This should not appear in contract C devdoc - event SameSignatureEvent(uint16); - } - contract C is D { - function f() public { - emit L.SameSignatureEvent(0); - emit D.SameSignatureEvent(1); - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "kind": "dev", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "kind": "user", - "methods": {}, - "version": 1 - } - )ABCDEF"; - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(event_inheritance_interface) -{ - char const* sourceCode = R"( - interface ERC20 { - /// @notice This event is emitted when a transfer occurs. - /// @param from The source account. - /// @param to The destination account. - /// @param amount The amount. - /// @dev A test case! - event Transfer(address indexed from, address indexed to, uint amount); - } - contract A is ERC20 { - } - contract B is A { - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "Transfer(address,address,uint256)": - { - "details": "A test case!", - "params": - { - "amount": "The amount.", - "from": "The source account.", - "to": "The destination account." - } - } - }, - "methods": {} - } - )ABCDEF"; - checkNatspec(sourceCode, "A", devDoc, false); - checkNatspec(sourceCode, "B", devDoc, false); - checkNatspec(sourceCode, "ERC20", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "Transfer(address,address,uint256)": - { - "notice": "This event is emitted when a transfer occurs." - } - }, - "methods": {} - } - )ABCDEF"; - checkNatspec(sourceCode, "A", userDoc, true); - checkNatspec(sourceCode, "B", userDoc, true); - checkNatspec(sourceCode, "ERC20", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(event_inheritance) -{ - char const* sourceCode = R"( - contract ERC20 { - /// @notice This event is emitted when a transfer occurs. - /// @param from The source account. - /// @param to The destination account. - /// @param amount The amount. - /// @dev A test case! - event Transfer(address indexed from, address indexed to, uint amount); - } - contract A is ERC20 { - } - contract B is A { - } - )"; - - char const* devDoc = R"ABCDEF( - { - "events": - { - "Transfer(address,address,uint256)": - { - "details": "A test case!", - "params": - { - "amount": "The amount.", - "from": "The source account.", - "to": "The destination account." - } - } - }, - "methods": {} - } - )ABCDEF"; - checkNatspec(sourceCode, "A", devDoc, false); - checkNatspec(sourceCode, "B", devDoc, false); - checkNatspec(sourceCode, "ERC20", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "events": - { - "Transfer(address,address,uint256)": - { - "notice": "This event is emitted when a transfer occurs." - } - }, - "methods": {} - } - )ABCDEF"; - checkNatspec(sourceCode, "A", userDoc, true); - checkNatspec(sourceCode, "B", userDoc, true); - checkNatspec(sourceCode, "ERC20", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(dev_desc_after_nl) -{ - char const* sourceCode = R"( - contract test { - /// @dev - /// Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param second Documentation for the second parameter - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_multiple_params) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param second Documentation for the second parameter - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_mutiline_param_description) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_multiple_functions) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param second Documentation for the second parameter - function mul(uint a, uint second) public returns (uint d) { - return a * 7 + second; - } - /// @dev Divides 2 numbers - /// @param input Documentation for the input parameter - /// @param div Documentation for the div parameter - function divide(uint input, uint div) public returns (uint d) { - return input / div; - } - /// @dev Subtracts 3 from `input` - /// @param input Documentation for the input parameter - function sub(int input) public returns (int d) { - return input - 3; - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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(uint256,uint256)\":{ \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(int256)\":{ \n" - " \"details\": \"Subtracts 3 from `input`\",\n" - " \"params\": {\n" - " \"input\": \"Documentation for the input parameter\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_no_params) -{ - char const* sourceCode = R"( - contract test { - /// @return d The result of the multiplication - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = R"ABCDEF( - { - "methods": - { - "mul(uint256,uint256)": - { - "returns": { "d": "The result of the multiplication" } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return d The result of the multiplication - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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" - " \"returns\": {\n" - " \"d\": \"The result of the multiplication\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_desc_after_nl) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return - /// d The result of the multiplication - function mul(uint a, uint second) public returns (uint d) { - return a * 7 + second; - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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" - " \"returns\": {\n" - " \"d\": \"The result of the multiplication\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_desc_multiple_unamed_mixed) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return The result of the multiplication - /// @return _cookies And cookies with nutella - function mul(uint a, uint second) public returns (uint, uint _cookies) { - uint mul = a * 7; - return (mul, second); - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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" - " \"returns\": {\n" - " \"_0\": \"The result of the multiplication\",\n" - " \"_cookies\": \"And cookies with nutella\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_desc_multiple_unamed_mixed_2) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return _cookies And cookies with nutella - /// @return The result of the multiplication - /// @return _milk And milk with nutella - function mul(uint a, uint second) public returns (uint _cookies, uint, uint _milk) { - uint mul = a * 7; - uint milk = 4; - return (mul, second, milk); - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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" - " \"returns\": {\n" - " \"_cookies\": \"And cookies with nutella\",\n" - " \"_1\": \"The result of the multiplication\",\n" - " \"_milk\": \"And milk with nutella\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_desc_multiple_unamed) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return The result of the multiplication - /// @return And cookies with nutella - function mul(uint a, uint second) public returns (uint, uint) { - uint mul = a * 7; - return (mul, second); - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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" - " \"returns\": {\n" - " \"_0\": \"The result of the multiplication\",\n" - " \"_1\": \"And cookies with nutella\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_desc_multiple) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return d The result of the multiplication - /// @return f And cookies with nutella - function mul(uint a, uint second) public returns (uint d, uint f) { - uint mul = a * 7; - return (mul, second); - } - } - )"; - - char const* natspec = "{" - "\"methods\":{" - " \"mul(uint256,uint256)\":{ \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" - " \"returns\": {\n" - " \"d\": \"The result of the multiplication\",\n" - " \"f\": \"And cookies with nutella\"\n" - " }\n" - " }\n" - "}}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_multiline_return) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return d The result of the multiplication - /// and cookies with nutella - function mul(uint a, uint second) public returns (uint d) { - return a * 7 + second; - } - } - )"; - - char const* natspec = R"R({ - "methods": - { - "mul(uint256,uint256)": - { - "details": "Multiplies a number by 7 and adds second parameter", - "params": - { - "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", - "second": "Documentation for the second parameter" - }, - "returns": - { - "d": "The result of the multiplication and cookies with nutella" - } - } - } - })R"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_multiline_comment) -{ - char const* sourceCode = R"( - contract test { - /** - * @dev Multiplies a number by 7 and adds second parameter - * @param a Documentation for the first parameter starts here. - * Since it's a really complicated parameter we need 2 lines - * @param second Documentation for the second parameter - * @return d The result of the multiplication - * and cookies with nutella - */ - function mul(uint a, uint second) public returns (uint d) { - return a * 7 + second; - } - } - )"; - - char const* natspec = R"R( - { - "methods": - { - "mul(uint256,uint256)": - { - "details": "Multiplies a number by 7 and adds second parameter", - "params": - { - "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", - "second": "Documentation for the second parameter" - }, - "returns": - { - "d": "The result of the multiplication and cookies with nutella" - } - } - } - })R"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_documenting_no_return_param_name) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param second Documentation for the second parameter - /// @return - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(dev_contract_no_doc) -{ - char const* sourceCode = R"( - contract test { - /// @dev Mul function - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = "{" - " \"methods\":{" - " \"mul(uint256,uint256)\":{ \n" - " \"details\": \"Mul function\"\n" - " }\n" - " }\n" - "}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_contract_doc) -{ - char const* sourceCode = R"( - /// @author Lefteris - /// @title Just a test contract - contract test { - /// @dev Mul function - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = "{" - " \"author\": \"Lefteris\"," - " \"title\": \"Just a test contract\"," - " \"methods\":{" - " \"mul(uint256,uint256)\":{ \n" - " \"details\": \"Mul function\"\n" - " }\n" - " }\n" - "}"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_author_at_function) -{ - char const* sourceCode = R"( - /// @author Lefteris - /// @title Just a test contract - contract test { - /// @dev Mul function - /// @author John Doe - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(struct_no_docs) -{ - char const* sourceCode = R"( - contract C { - /// @title example of title - /// @author example of author - /// @notice example of notice - /// @dev example of dev - struct Example { - string text; - bool valid; - uint256 value; - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "kind": "dev", - "methods": {}, - "version": 1 - })ABCDEF"; - - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "kind": "user", - "methods": {}, - "version": 1 - })ABCDEF"; - - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(enum_no_docs) -{ - char const* sourceCode = R"( - contract C { - /// @title example of title - /// @author example of author - /// @notice example of notice - /// @dev example of dev - enum Color { - Red, - Green - } - } - )"; - - char const* devDoc = R"ABCDEF( - { - "kind": "dev", - "methods": {}, - "version": 1 - })ABCDEF"; - - checkNatspec(sourceCode, "C", devDoc, false); - - char const* userDoc = R"ABCDEF( - { - "kind": "user", - "methods": {}, - "version": 1 - })ABCDEF"; - - checkNatspec(sourceCode, "C", userDoc, true); -} - -BOOST_AUTO_TEST_CASE(notice_without_tag) -{ - char const* sourceCode = R"( - contract test { - /// I do something awesome - function mul(uint a) public returns (uint d) { return a * 7; } - } - )"; - - - char const* natspec = R"ABCDEF( - { - "methods": - { - "mul(uint256)": - { - "notice": "I do something awesome" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(multiline_notice_without_tag) -{ - char const* sourceCode = R"( - contract test { - /// I do something awesome - /// which requires two lines to explain - function mul(uint a) public returns (uint d) { return a * 7; } - } - )"; - - char const* natspec = R"ABCDEF( - { - "methods": - { - "mul(uint256)": - { - "notice": "I do something awesome which requires two lines to explain" - } - } - } - )ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(empty_comment) -{ - char const* sourceCode = R"( - // - contract test - {} - )"; - char const* natspec = R"ABCDEF( - { - "methods": {} - } - )ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_title_at_function_error) -{ - char const* sourceCode = R"( - /// @author Lefteris - /// @title Just a test contract - contract test { - /// @dev Mul function - /// @title I really should not be here - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(dev_documenting_nonexistent_param) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param not_existing Documentation for the second parameter - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(dev_documenting_no_param_name) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(dev_documenting_no_param_name_end) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param se - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(dev_documenting_no_param_description) -{ - char const* sourceCode = R"( - contract test { - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter - /// @param second - function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(user_constructor) -{ - char const* sourceCode = R"( - contract test { - /// @notice this is a really nice constructor - constructor(uint a, uint second) { } - } - )"; - - char const* natspec = R"ABCDEF({ - "methods": - { - "constructor": - { - "notice": "this is a really nice constructor" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(user_constructor_and_function) -{ - char const* sourceCode = R"( - contract test { - /// @notice this is a really nice constructor - constructor(uint a, uint second) { } - /// another multiplier - function mul(uint a, uint second) public returns(uint d) { return a * 7 + second; } - } - )"; - - char const* natspec = R"ABCDEF({ - "methods": - { - "mul(uint256,uint256)": - { - "notice": "another multiplier" - }, - "constructor": - { - "notice": "this is a really nice constructor" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_constructor) -{ - char const *sourceCode = R"( - contract test { - /// @param a the parameter a is really nice and very useful - /// @param second the second parameter is not very useful, it just provides additional confusion - constructor(uint a, uint second) { } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "constructor": - { - "params": - { - "a": "the parameter a is really nice and very useful", - "second": "the second parameter is not very useful, it just provides additional confusion" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(dev_constructor_return) -{ - char const* sourceCode = R"( - contract test { - /// @param a the parameter a is really nice and very useful - /// @param second the second parameter is not very useful, it just provides additional confusion - /// @return return should not work within constructors - constructor(uint a, uint second) { } - } - )"; - - expectNatspecError(sourceCode); -} - -BOOST_AUTO_TEST_CASE(dev_constructor_and_function) -{ - char const *sourceCode = R"( - contract test { - /// @param a the parameter a is really nice and very useful - /// @param second the second parameter is not very useful, it just provides additional confusion - constructor(uint a, uint second) { } - /// @dev Multiplies a number by 7 and adds second parameter - /// @param a Documentation for the first parameter starts here. - /// Since it's a really complicated parameter we need 2 lines - /// @param second Documentation for the second parameter - /// @return d The result of the multiplication - /// and cookies with nutella - function mul(uint a, uint second) public returns(uint d) { - return a * 7 + second; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "mul(uint256,uint256)": - { - "details": "Multiplies a number by 7 and adds second parameter", - "params": - { - "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", - "second": "Documentation for the second parameter" - }, - "returns": - { - "d": "The result of the multiplication and cookies with nutella" - } - }, - "constructor": - { - "params": - { - "a": "the parameter a is really nice and very useful", - "second": "the second parameter is not very useful, it just provides additional confusion" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, false); -} - -BOOST_AUTO_TEST_CASE(slash4) -{ - char const* sourceCode = R"( - contract test { - //// @notice lorem ipsum - function f() public { } - } - )"; - - char const* natspec = R"( { "methods": {} } )"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(star3) -{ - char const* sourceCode = R"( - contract test { - /*** - * @notice lorem ipsum - */ - function f() public { } - } - )"; - - char const* natspec = R"( { "methods": {} } )"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(slash3_slash3) -{ - char const* sourceCode = R"( - contract test { - /// @notice lorem - /// ipsum - function f() public { } - } - )"; - - char const* natspec = R"ABCDEF({ - "methods": - { - "f()": { "notice": "lorem ipsum" } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(slash3_slash4) -{ - char const* sourceCode = R"( - contract test { - /// @notice lorem - //// ipsum - function f() public { } - } - )"; - - char const* natspec = R"ABCDEF({ - "methods": - { - "f()": { "notice": "lorem" } - } - })ABCDEF"; - - checkNatspec(sourceCode, "test", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_default_inherit_variable) -{ - char const *sourceCode = R"( - contract C { - /// @notice Hello world - /// @dev test - function x() virtual external returns (uint) { - return 1; - } - } - - contract D is C { - uint public override x; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": { "x()": { "details": "test" } } - })ABCDEF"; - - char const *natspec1 = R"ABCDEF({ - "methods": {}, - "stateVariables": - { - "x": - { - "details": "test" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "C", natspec, false); - checkNatspec(sourceCode, "D", natspec1, false); -} - -BOOST_AUTO_TEST_CASE(user_default_inherit_variable) -{ - char const *sourceCode = R"( - contract C { - /// @notice Hello world - /// @dev test - function x() virtual external returns (uint) { - return 1; - } - } - - contract D is C { - uint public override x; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": { "x()": { "notice": "Hello world" } } - })ABCDEF"; - - checkNatspec(sourceCode, "C", natspec, true); - checkNatspec(sourceCode, "D", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_explicit_inherit_variable) -{ - char const *sourceCode = R"( - contract B { - function x() virtual external returns (uint) { - return 1; - } - } - - contract C { - /// @notice Hello world - /// @dev test - function x() virtual external returns (uint) { - return 1; - } - } - - contract D is C, B { - /// @inheritdoc C - uint public override(C, B) x; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": { "x()": { "details": "test" } } - })ABCDEF"; - - char const *natspec1 = R"ABCDEF({ - "methods": {}, - "stateVariables": - { - "x": - { - "details": "test" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "C", natspec, false); - checkNatspec(sourceCode, "D", natspec1, false); -} - -BOOST_AUTO_TEST_CASE(user_explicit_inherit_variable) -{ - char const *sourceCode = R"( - contract B { - function x() virtual external returns (uint) { - return 1; - } - } - - contract C { - /// @notice Hello world - /// @dev test - function x() virtual external returns (uint) { - return 1; - } - } - - contract D is C, B { - /// @inheritdoc C - uint public override(C, B) x; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": { "x()": { "notice": "Hello world" } } - })ABCDEF"; - - checkNatspec(sourceCode, "C", natspec, true); - checkNatspec(sourceCode, "D", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_default_inherit) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// Second line. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract Middle is ERC20 { - function transfer(address to, uint amount) virtual override external returns (bool) - { - return false; - } - } - - contract Token is Middle { - function transfer(address to, uint amount) override external returns (bool) - { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "test", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, false); - checkNatspec(sourceCode, "Middle", natspec, false); - checkNatspec(sourceCode, "Token", natspec, false); -} - -BOOST_AUTO_TEST_CASE(user_default_inherit) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// Second line. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract Middle is ERC20 { - function transfer(address to, uint amount) virtual override external returns (bool) - { - return false; - } - } - - contract Token is Middle { - function transfer(address to, uint amount) override external returns (bool) - { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``. Second line." - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, true); - checkNatspec(sourceCode, "Middle", natspec, true); - checkNatspec(sourceCode, "Token", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_explicit_inherit) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 { - function transfer(address to, uint amount) virtual external returns (bool) { - return false; - } - } - - contract Token is ERC21, ERC20 { - /// @inheritdoc ERC20 - function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "test", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, false); - checkNatspec(sourceCode, "Token", natspec, false); -} - -BOOST_AUTO_TEST_CASE(user_explicit_inherit) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 { - function transfer(address to, uint amount) virtual external returns (bool) { - return false; - } - } - - contract Token is ERC21, ERC20 { - /// @inheritdoc ERC20 - function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, true); - checkNatspec(sourceCode, "Token", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_explicit_inherit2) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 is ERC20 { - function transfer(address to, uint amount) virtual override external returns (bool) { - return false; - } - } - - contract Token is ERC20 { - /// @inheritdoc ERC20 - function transfer(address to, uint amount) override external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "test", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, false); - checkNatspec(sourceCode, "ERC21", natspec, false); - checkNatspec(sourceCode, "Token", natspec, false); -} - -BOOST_AUTO_TEST_CASE(user_explicit_inherit2) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 is ERC20 { - function transfer(address to, uint amount) virtual override external returns (bool) { - return false; - } - } - - contract Token is ERC20 { - /// @inheritdoc ERC20 - function transfer(address to, uint amount) override external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, true); - checkNatspec(sourceCode, "ERC21", natspec, true); - checkNatspec(sourceCode, "Token", natspec, true); -} - -BOOST_AUTO_TEST_CASE(dev_explicit_inherit_partial2) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 is ERC20 { - /// @inheritdoc ERC20 - /// @dev override dev comment - /// @notice override notice - function transfer(address to, uint amount) virtual override external returns (bool) { - return false; - } - } - - contract Token is ERC21 { - function transfer(address to, uint amount) override external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "test", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "override dev comment", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, false); - checkNatspec(sourceCode, "Token", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(user_explicit_inherit_partial2) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 is ERC20 { - /// @inheritdoc ERC20 - /// @dev override dev comment - /// @notice override notice - function transfer(address to, uint amount) virtual override external returns (bool) { - return false; - } - } - - contract Token is ERC21 { - function transfer(address to, uint amount) override external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "override notice" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, true); - checkNatspec(sourceCode, "Token", natspec2, true); -} - -BOOST_AUTO_TEST_CASE(dev_explicit_inherit_partial) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 { - function transfer(address to, uint amount) virtual external returns (bool) { - return false; - } - } - - contract Token is ERC21, ERC20 { - /// @inheritdoc ERC20 - /// @dev override dev comment - /// @notice override notice - function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "test", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "override dev comment", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, false); - checkNatspec(sourceCode, "Token", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(user_explicit_inherit_partial) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract ERC21 { - function transfer(address to, uint amount) virtual external returns (bool) { - return false; - } - } - - contract Token is ERC21, ERC20 { - /// @inheritdoc ERC20 - /// @dev override dev comment - /// @notice override notice - function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "override notice" - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, true); - checkNatspec(sourceCode, "Token", natspec2, true); -} - -BOOST_AUTO_TEST_CASE(dev_inherit_parameter_mismatch) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract Middle is ERC20 { - function transfer(address to, uint amount) override virtual external returns (bool) { - return false; - } - } - - contract Token is Middle { - function transfer(address too, uint amount) override external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "details": "test", - "params": - { - "amount": "amount to transfer", - "to": "address to transfer to" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": { } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, false); - checkNatspec(sourceCode, "Middle", natspec, false); - checkNatspec(sourceCode, "Token", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(user_inherit_parameter_mismatch) -{ - char const *sourceCode = R"( - interface ERC20 { - /// Transfer ``amount`` from ``msg.sender`` to ``to``. - /// @dev test - /// @param to address to transfer to - /// @param amount amount to transfer - function transfer(address to, uint amount) external returns (bool); - } - - contract Middle is ERC20 { - function transfer(address to, uint amount) override virtual external returns (bool) { - return false; - } - } - - contract Token is Middle { - function transfer(address too, uint amount) override external returns (bool) { - return false; - } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "transfer(address,uint256)": - { - "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": { } - })ABCDEF"; - - checkNatspec(sourceCode, "ERC20", natspec, true); - checkNatspec(sourceCode, "Middle", natspec, true); - checkNatspec(sourceCode, "Token", natspec2, true); -} - -BOOST_AUTO_TEST_CASE(dev_different_return_name) -{ - char const *sourceCode = R"( - contract A { - /// @return y value - function g(int x) public pure virtual returns (int y) { return x; } - } - - contract B is A { - function g(int x) public pure override returns (int z) { return x; } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "y": "value" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "z": "value" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspec, false); - checkNatspec(sourceCode, "B", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(dev_different_return_name_multiple) -{ - char const *sourceCode = R"( - contract A { - /// @return a value A - /// @return b value B - function g(int x) public pure virtual returns (int a, int b) { return (1, 2); } - } - - contract B is A { - function g(int x) public pure override returns (int z, int y) { return (1, 2); } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "a": "value A", - "b": "value B" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "z": "value A", - "y": "value B" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspec, false); - checkNatspec(sourceCode, "B", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(dev_different_return_name_multiple_partly_unnamed) -{ - char const *sourceCode = R"( - contract A { - /// @return value A - /// @return b value B - function g(int x) public pure virtual returns (int, int b) { return (1, 2); } - } - - contract B is A { - function g(int x) public pure override returns (int z, int) { return (1, 2); } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "_0": "value A", - "b": "value B" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "z": "value A", - "_1": "value B" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspec, false); - checkNatspec(sourceCode, "B", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(dev_different_return_name_multiple_unnamed) -{ - char const *sourceCode = R"( - contract A { - /// @return value A - /// @return value B - function g(int x) public pure virtual returns (int, int) { return (1, 2); } - } - - contract B is A { - function g(int x) public pure override returns (int z, int y) { return (1, 2); } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "_0": "value A", - "_1": "value B" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "z": "value A", - "y": "value B" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspec, false); - checkNatspec(sourceCode, "B", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(dev_return_name_no_description) -{ - char const *sourceCode = R"( - contract A { - /// @return a - function g(int x) public pure virtual returns (int a) { return 2; } - } - - contract B is A { - function g(int x) public pure override returns (int b) { return 2; } - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "a": "a" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": - { - "g(int256)": - { - "returns": - { - "b": "a" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspec, false); - checkNatspec(sourceCode, "B", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(error) -{ - char const* sourceCode = R"( - contract test { - /// Something failed. - /// @dev an error. - /// @param a first parameter - /// @param b second parameter - error E(uint a, uint b); - } - )"; - - char const* devdoc = R"X({ - "errors":{ - "E(uint256,uint256)": [{ - "details": "an error.", - "params": - { - "a": "first parameter", - "b": "second parameter" - } - }] - }, - "methods": {} - })X"; - - checkNatspec(sourceCode, "test", devdoc, false); - - char const* userdoc = R"X({ - "errors":{ - "E(uint256,uint256)": [{ - "notice": "Something failed." - }] - }, - "methods": {} - })X"; - checkNatspec(sourceCode, "test", userdoc, true); -} - -BOOST_AUTO_TEST_CASE(error_multiple) -{ - char const* sourceCode = R"( - contract A { - /// Something failed. - /// @dev an error. - /// @param x first parameter - /// @param y second parameter - error E(uint x, uint y); - } - contract test { - /// X Something failed. - /// @dev X an error. - /// @param a X first parameter - /// @param b X second parameter - error E(uint a, uint b); - function f(bool a) public pure { - if (a) - revert E(1, 2); - else - revert A.E(5, 6); - } - } - )"; - - char const* devdoc = R"X({ - "methods": {}, - "errors": - { - "E(uint256,uint256)": [ - { - "details": "an error.", - "params": - { - "x": "first parameter", - "y": "second parameter" - } - }, - { - "details": "X an error.", - "params": - { - "a": "X first parameter", - "b": "X second parameter" - } - } - ] - } - })X"; - - checkNatspec(sourceCode, "test", devdoc, false); - - char const* userdoc = R"X({ - "errors":{ - "E(uint256,uint256)": [ - { "notice": "Something failed." }, - { "notice": "X Something failed." } - ] - }, - "methods": {} - })X"; - checkNatspec(sourceCode, "test", userdoc, true); -} - -BOOST_AUTO_TEST_CASE(custom) -{ - char const* sourceCode = R"( - /// @custom:x one two three - /// @custom:y line - /// break - /// @custom:t one - /// @custom:t two - contract A { - /// @custom:note statevar - uint x; - /// @custom:since 2014 - function g(int x) public pure virtual returns (int, int) { return (1, 2); } - } - )"; - - char const* natspec = R"ABCDEF({ - "custom:t": "onetwo", - "custom:x": "one two three", - "custom:y": "line break", - "methods": - { - "g(int256)": - { - "custom:since": "2014" - } - }, - "stateVariables": { "x": { "custom:note": "statevar" } } - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspec, false); -} - -BOOST_AUTO_TEST_CASE(custom_inheritance) -{ - char const *sourceCode = R"( - contract A { - /// @custom:since 2014 - function g(uint x) public pure virtual {} - } - contract B is A { - function g(uint x) public pure override {} - } - )"; - - char const* natspecA = R"ABCDEF( - { - "methods": - { - "g(uint256)": - { - "custom:since": "2014" - } - } - })ABCDEF"; - char const* natspecB = R"ABCDEF( - { - "methods": {} - })ABCDEF"; - - checkNatspec(sourceCode, "A", natspecA, false); - checkNatspec(sourceCode, "B", natspecB, false); -} - -BOOST_AUTO_TEST_CASE(dev_struct_getter_override) -{ - char const *sourceCode = R"( - interface IThing { - /// @return x a number - /// @return y another number - function value() external view returns (uint128 x, uint128 y); - } - - contract Thing is IThing { - struct Value { - uint128 x; - uint128 y; - } - - Value public override value; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "value()": - { - "returns": - { - "x": "a number", - "y": "another number" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": {}, - "stateVariables": - { - "value": - { - "returns": - { - "x": "a number", - "y": "another number" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "IThing", natspec, false); - checkNatspec(sourceCode, "Thing", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(dev_struct_getter_override_no_return_name) -{ - char const *sourceCode = R"( - interface IThing { - ///@return - function value(uint) external returns (uint128,uint128); - } - - contract Thing is IThing { - struct Value { - uint128 x; - uint128 A; - } - mapping(uint=>Value) public override value; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "value(uint256)": - { - "returns": - { - "_0": "" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": {}, - "stateVariables": - { - "value": - { - "return": "x ", - "returns": - { - "x": "" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "IThing", natspec, false); - checkNatspec(sourceCode, "Thing", natspec2, false); -} - -BOOST_AUTO_TEST_CASE(dev_struct_getter_override_different_return_parameter_names) -{ - char const *sourceCode = R"( - interface IThing { - /// @return x a number - /// @return y another number - function value() external view returns (uint128 x, uint128 y); - } - - contract Thing is IThing { - struct Value { - uint128 a; - uint128 b; - } - - Value public override value; - } - )"; - - char const *natspec = R"ABCDEF({ - "methods": - { - "value()": - { - "returns": - { - "x": "a number", - "y": "another number" - } - } - } - })ABCDEF"; - - char const *natspec2 = R"ABCDEF({ - "methods": {}, - "stateVariables": - { - "value": - { - "returns": - { - "a": "a number", - "b": "another number" - } - } - } - })ABCDEF"; - - checkNatspec(sourceCode, "IThing", natspec, false); - checkNatspec(sourceCode, "Thing", natspec2, false); -} - -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/test/libsolidity/natspecJSON/custom.sol b/test/libsolidity/natspecJSON/custom.sol new file mode 100644 index 000000000..8aa780e75 --- /dev/null +++ b/test/libsolidity/natspecJSON/custom.sol @@ -0,0 +1,34 @@ +/// @custom:x one two three +/// @custom:y line +/// break +/// @custom:t one +/// @custom:t two +contract A { + /// @custom:note statevar + uint x; + /// @custom:since 2014 + function g(int x) public pure virtual returns (int, int) { return (1, 2); } +} + +// ---- +// ---- +// :A devdoc +// { +// "custom:t": "onetwo", +// "custom:x": "one two three", +// "custom:y": "line break", +// "methods": +// { +// "g(int256)": +// { +// "custom:since": "2014" +// } +// }, +// "stateVariables": +// { +// "x": +// { +// "custom:note": "statevar" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/custom_inheritance.sol b/test/libsolidity/natspecJSON/custom_inheritance.sol new file mode 100644 index 000000000..815e4deeb --- /dev/null +++ b/test/libsolidity/natspecJSON/custom_inheritance.sol @@ -0,0 +1,25 @@ +contract A { + /// @custom:since 2014 + function g(uint x) public pure virtual {} +} +contract B is A { + function g(uint x) public pure override {} +} + +// ---- +// ---- +// :A devdoc +// { +// "methods": +// { +// "g(uint256)": +// { +// "custom:since": "2014" +// } +// } +// } +// +// :B devdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/dev_and_user_basic_test.sol b/test/libsolidity/natspecJSON/dev_and_user_basic_test.sol new file mode 100644 index 000000000..6b9d75ba7 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_and_user_basic_test.sol @@ -0,0 +1,29 @@ +contract test { + /// @notice Multiplies `a` by 7 + /// @dev Multiplies a number by 7 + function mul(uint a) public returns (uint d) { return a * 7; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256)": +// { +// "details": "Multiplies a number by 7" +// } +// } +// } +// +// :test userdoc +// { +// "methods": +// { +// "mul(uint256)": +// { +// "notice": "Multiplies `a` by 7" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_and_user_no_doc.sol b/test/libsolidity/natspecJSON/dev_and_user_no_doc.sol new file mode 100644 index 000000000..aaf9ec315 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_and_user_no_doc.sol @@ -0,0 +1,20 @@ +contract test { + function mul(uint a) public returns (uint d) { + return a * 7; + } + function sub(int input) public returns (int d) { + return input - 3; + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": {} +// } +// +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/dev_author_at_function.sol b/test/libsolidity/natspecJSON/dev_author_at_function.sol new file mode 100644 index 000000000..7ea25a3e5 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_author_at_function.sol @@ -0,0 +1,9 @@ +/// @author Lefteris +/// @title Just a test contract +contract test { + /// @dev Mul function + /// @author John Doe + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_constructor.sol b/test/libsolidity/natspecJSON/dev_constructor.sol new file mode 100644 index 000000000..01fa9cb41 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_constructor.sol @@ -0,0 +1,22 @@ +contract test { + /// @param a the parameter a is really nice and very useful + /// @param second the second parameter is not very useful, it just provides additional confusion + constructor(uint a, uint second) { } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "constructor": +// { +// "params": +// { +// "a": "the parameter a is really nice and very useful", +// "second": "the second parameter is not very useful, it just provides additional confusion" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_constructor_and_function.sol b/test/libsolidity/natspecJSON/dev_constructor_and_function.sol new file mode 100644 index 000000000..ea954827a --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_constructor_and_function.sol @@ -0,0 +1,44 @@ +contract test { + /// @param a the parameter a is really nice and very useful + /// @param second the second parameter is not very useful, it just provides additional confusion + constructor(uint a, uint second) { } + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return d The result of the multiplication + /// and cookies with nutella + function mul(uint a, uint second) public returns(uint d) { + return a * 7 + second; + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "constructor": +// { +// "params": +// { +// "a": "the parameter a is really nice and very useful", +// "second": "the second parameter is not very useful, it just provides additional confusion" +// } +// }, +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "d": "The result of the multiplication and cookies with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_constructor_return.sol b/test/libsolidity/natspecJSON/dev_constructor_return.sol new file mode 100644 index 000000000..bee9a9d6e --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_constructor_return.sol @@ -0,0 +1,8 @@ +contract test { + /// @param a the parameter a is really nice and very useful + /// @param second the second parameter is not very useful, it just provides additional confusion + /// @return return should not work within constructors + constructor(uint a, uint second) { } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_contract_doc.sol b/test/libsolidity/natspecJSON/dev_contract_doc.sol new file mode 100644 index 000000000..22c45dfb8 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_contract_doc.sol @@ -0,0 +1,21 @@ +/// @author Lefteris +/// @title Just a test contract +contract test { + /// @dev Mul function + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "author": "Lefteris", +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Mul function" +// } +// }, +// "title": "Just a test contract" +// } diff --git a/test/libsolidity/natspecJSON/dev_contract_no_doc.sol b/test/libsolidity/natspecJSON/dev_contract_no_doc.sol new file mode 100644 index 000000000..6e7d587d1 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_contract_no_doc.sol @@ -0,0 +1,17 @@ +contract test { + /// @dev Mul function + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Mul function" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_default_inherit.sol b/test/libsolidity/natspecJSON/dev_default_inherit.sol new file mode 100644 index 000000000..6a106fbf0 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_default_inherit.sol @@ -0,0 +1,72 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// Second line. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract Middle is ERC20 { + function transfer(address to, uint amount) virtual override external returns (bool) + { + return false; + } +} + +contract Token is Middle { + function transfer(address to, uint amount) override external returns (bool) + { + return false; + } +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Middle devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Token devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_default_inherit_variable.sol b/test/libsolidity/natspecJSON/dev_default_inherit_variable.sol new file mode 100644 index 000000000..7e75d30f8 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_default_inherit_variable.sol @@ -0,0 +1,36 @@ +contract C { + /// @notice Hello world + /// @dev test + function x() virtual external returns (uint) { + return 1; + } +} + +contract D is C { + uint public override x; +} + +// ---- +// ---- +// :C devdoc +// { +// "methods": +// { +// "x()": +// { +// "details": "test" +// } +// } +// } +// +// :D devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "x": +// { +// "details": "test" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_desc_after_nl.sol b/test/libsolidity/natspecJSON/dev_desc_after_nl.sol new file mode 100644 index 000000000..745ab190b --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_desc_after_nl.sol @@ -0,0 +1,25 @@ +contract test { + /// @dev + /// Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param second Documentation for the second parameter + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter", +// "second": "Documentation for the second parameter" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_different_return_name.sol b/test/libsolidity/natspecJSON/dev_different_return_name.sol new file mode 100644 index 000000000..3a1606dc5 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_different_return_name.sol @@ -0,0 +1,38 @@ +contract A { + /// @return y value + function g(int x) public pure virtual returns (int y) { return x; } +} + +contract B is A { + function g(int x) public pure override returns (int z) { return x; } +} + +// ---- +// ---- +// :A devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "y": "value" +// } +// } +// } +// } +// +// :B devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "z": "value" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_different_return_name_multiple.sol b/test/libsolidity/natspecJSON/dev_different_return_name_multiple.sol new file mode 100644 index 000000000..8dc76fb70 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_different_return_name_multiple.sol @@ -0,0 +1,41 @@ +contract A { + /// @return a value A + /// @return b value B + function g(int x) public pure virtual returns (int a, int b) { return (1, 2); } +} + +contract B is A { + function g(int x) public pure override returns (int z, int y) { return (1, 2); } +} + +// ---- +// ---- +// :A devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "a": "value A", +// "b": "value B" +// } +// } +// } +// } +// +// :B devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "y": "value B", +// "z": "value A" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_different_return_name_multiple_partly_unnamed.sol b/test/libsolidity/natspecJSON/dev_different_return_name_multiple_partly_unnamed.sol new file mode 100644 index 000000000..1fa8eb9fb --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_different_return_name_multiple_partly_unnamed.sol @@ -0,0 +1,41 @@ +contract A { + /// @return value A + /// @return b value B + function g(int x) public pure virtual returns (int, int b) { return (1, 2); } +} + +contract B is A { + function g(int x) public pure override returns (int z, int) { return (1, 2); } +} + +// ---- +// ---- +// :A devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "_0": "value A", +// "b": "value B" +// } +// } +// } +// } +// +// :B devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "_1": "value B", +// "z": "value A" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_different_return_name_multiple_unnamed.sol b/test/libsolidity/natspecJSON/dev_different_return_name_multiple_unnamed.sol new file mode 100644 index 000000000..c0ce38726 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_different_return_name_multiple_unnamed.sol @@ -0,0 +1,41 @@ +contract A { + /// @return value A + /// @return value B + function g(int x) public pure virtual returns (int, int) { return (1, 2); } +} + +contract B is A { + function g(int x) public pure override returns (int z, int y) { return (1, 2); } +} + +// ---- +// ---- +// :A devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "_0": "value A", +// "_1": "value B" +// } +// } +// } +// } +// +// :B devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "y": "value B", +// "z": "value A" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_documenting_no_param_description.sol b/test/libsolidity/natspecJSON/dev_documenting_no_param_description.sol new file mode 100644 index 000000000..84a2f532d --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_documenting_no_param_description.sol @@ -0,0 +1,8 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param second + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_documenting_no_param_name.sol b/test/libsolidity/natspecJSON/dev_documenting_no_param_name.sol new file mode 100644 index 000000000..75b4fe5c0 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_documenting_no_param_name.sol @@ -0,0 +1,8 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_documenting_no_param_name_end.sol b/test/libsolidity/natspecJSON/dev_documenting_no_param_name_end.sol new file mode 100644 index 000000000..4ddeb7f9b --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_documenting_no_param_name_end.sol @@ -0,0 +1,8 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param se + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_documenting_no_return_param_name.sol b/test/libsolidity/natspecJSON/dev_documenting_no_return_param_name.sol new file mode 100644 index 000000000..e0b90bed0 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_documenting_no_return_param_name.sol @@ -0,0 +1,9 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param second Documentation for the second parameter + /// @return + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_documenting_nonexistent_param.sol b/test/libsolidity/natspecJSON/dev_documenting_nonexistent_param.sol new file mode 100644 index 000000000..977833e00 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_documenting_nonexistent_param.sol @@ -0,0 +1,8 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param not_existing Documentation for the second parameter + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/dev_explicit_inherit.sol b/test/libsolidity/natspecJSON/dev_explicit_inherit.sol new file mode 100644 index 000000000..f665035b9 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_explicit_inherit.sol @@ -0,0 +1,54 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 { + function transfer(address to, uint amount) virtual external returns (bool) { + return false; + } +} + +contract Token is ERC21, ERC20 { + /// @inheritdoc ERC20 + function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Token devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_explicit_inherit2.sol b/test/libsolidity/natspecJSON/dev_explicit_inherit2.sol new file mode 100644 index 000000000..c251f678e --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_explicit_inherit2.sol @@ -0,0 +1,70 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 is ERC20 { + function transfer(address to, uint amount) virtual override external returns (bool) { + return false; + } +} + +contract Token is ERC20 { + /// @inheritdoc ERC20 + function transfer(address to, uint amount) override external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :ERC21 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Token devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_explicit_inherit_partial.sol b/test/libsolidity/natspecJSON/dev_explicit_inherit_partial.sol new file mode 100644 index 000000000..bbe44ad7d --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_explicit_inherit_partial.sol @@ -0,0 +1,56 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 { + function transfer(address to, uint amount) virtual external returns (bool) { + return false; + } +} + +contract Token is ERC21, ERC20 { + /// @inheritdoc ERC20 + /// @dev override dev comment + /// @notice override notice + function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Token devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "override dev comment", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_explicit_inherit_partial2.sol b/test/libsolidity/natspecJSON/dev_explicit_inherit_partial2.sol new file mode 100644 index 000000000..40a852a1e --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_explicit_inherit_partial2.sol @@ -0,0 +1,56 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 is ERC20 { + /// @inheritdoc ERC20 + /// @dev override dev comment + /// @notice override notice + function transfer(address to, uint amount) virtual override external returns (bool) { + return false; + } +} + +contract Token is ERC21 { + function transfer(address to, uint amount) override external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Token devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "override dev comment", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_explicit_inherit_variable.sol b/test/libsolidity/natspecJSON/dev_explicit_inherit_variable.sol new file mode 100644 index 000000000..f868453d0 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_explicit_inherit_variable.sol @@ -0,0 +1,43 @@ +contract B { + function x() virtual external returns (uint) { + return 1; + } +} + +contract C { + /// @notice Hello world + /// @dev test + function x() virtual external returns (uint) { + return 1; + } +} + +contract D is C, B { + /// @inheritdoc C + uint public override(C, B) x; +} + +// ---- +// ---- +// :C devdoc +// { +// "methods": +// { +// "x()": +// { +// "details": "test" +// } +// } +// } +// +// :D devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "x": +// { +// "details": "test" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_inherit_parameter_mismatch.sol b/test/libsolidity/natspecJSON/dev_inherit_parameter_mismatch.sol new file mode 100644 index 000000000..a395fc051 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_inherit_parameter_mismatch.sol @@ -0,0 +1,58 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract Middle is ERC20 { + function transfer(address to, uint amount) override virtual external returns (bool) { + return false; + } +} + +contract Token is Middle { + function transfer(address too, uint amount) override external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Middle devdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "details": "test", +// "params": +// { +// "amount": "amount to transfer", +// "to": "address to transfer to" +// } +// } +// } +// } +// +// :Token devdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/dev_multiline_comment.sol b/test/libsolidity/natspecJSON/dev_multiline_comment.sol new file mode 100644 index 000000000..9eb06e5c9 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_multiline_comment.sol @@ -0,0 +1,35 @@ +contract test { + /** + * @dev Multiplies a number by 7 and adds second parameter + * @param a Documentation for the first parameter starts here. + * Since it's a really complicated parameter we need 2 lines + * @param second Documentation for the second parameter + * @return d The result of the multiplication + * and cookies with nutella + */ + function mul(uint a, uint second) public returns (uint d) { + return a * 7 + second; + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "d": "The result of the multiplication and cookies with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_multiline_return.sol b/test/libsolidity/natspecJSON/dev_multiline_return.sol new file mode 100644 index 000000000..88169fbf1 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_multiline_return.sol @@ -0,0 +1,33 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return d The result of the multiplication + /// and cookies with nutella + function mul(uint a, uint second) public returns (uint d) { + return a * 7 + second; + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "d": "The result of the multiplication and cookies with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_multiple_functions.sol b/test/libsolidity/natspecJSON/dev_multiple_functions.sol new file mode 100644 index 000000000..2be5dae5a --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_multiple_functions.sol @@ -0,0 +1,54 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param second Documentation for the second parameter + function mul(uint a, uint second) public returns (uint d) { + return a * 7 + second; + } + /// @dev Divides 2 numbers + /// @param input Documentation for the input parameter + /// @param div Documentation for the div parameter + function divide(uint input, uint div) public returns (uint d) { + return input / div; + } + /// @dev Subtracts 3 from `input` + /// @param input Documentation for the input parameter + function sub(int input) public returns (int d) { + return input - 3; + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "divide(uint256,uint256)": +// { +// "details": "Divides 2 numbers", +// "params": +// { +// "div": "Documentation for the div parameter", +// "input": "Documentation for the input parameter" +// } +// }, +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter", +// "second": "Documentation for the second parameter" +// } +// }, +// "sub(int256)": +// { +// "details": "Subtracts 3 from `input`", +// "params": +// { +// "input": "Documentation for the input parameter" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_multiple_params.sol b/test/libsolidity/natspecJSON/dev_multiple_params.sol new file mode 100644 index 000000000..de3c57cf5 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_multiple_params.sol @@ -0,0 +1,24 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter + /// @param second Documentation for the second parameter + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter", +// "second": "Documentation for the second parameter" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_mutiline_param_description.sol b/test/libsolidity/natspecJSON/dev_mutiline_param_description.sol new file mode 100644 index 000000000..0ed4d08cb --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_mutiline_param_description.sol @@ -0,0 +1,25 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return.sol b/test/libsolidity/natspecJSON/dev_return.sol new file mode 100644 index 000000000..ffe36c863 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return.sol @@ -0,0 +1,30 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return d The result of the multiplication + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "d": "The result of the multiplication" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_desc_after_nl.sol b/test/libsolidity/natspecJSON/dev_return_desc_after_nl.sol new file mode 100644 index 000000000..0ef904347 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_desc_after_nl.sol @@ -0,0 +1,33 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return + /// d The result of the multiplication + function mul(uint a, uint second) public returns (uint d) { + return a * 7 + second; + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "d": "The result of the multiplication" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_desc_multiple.sol b/test/libsolidity/natspecJSON/dev_return_desc_multiple.sol new file mode 100644 index 000000000..b8d167d2c --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_desc_multiple.sol @@ -0,0 +1,35 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return d The result of the multiplication + /// @return f And cookies with nutella + function mul(uint a, uint second) public returns (uint d, uint f) { + uint mul = a * 7; + return (mul, second); + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "d": "The result of the multiplication", +// "f": "And cookies with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed.sol b/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed.sol new file mode 100644 index 000000000..fc48d1f66 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed.sol @@ -0,0 +1,35 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return The result of the multiplication + /// @return And cookies with nutella + function mul(uint a, uint second) public returns (uint, uint) { + uint mul = a * 7; + return (mul, second); + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "_0": "The result of the multiplication", +// "_1": "And cookies with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed.sol b/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed.sol new file mode 100644 index 000000000..84d55a1f5 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed.sol @@ -0,0 +1,35 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return The result of the multiplication + /// @return _cookies And cookies with nutella + function mul(uint a, uint second) public returns (uint, uint _cookies) { + uint mul = a * 7; + return (mul, second); + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "_0": "The result of the multiplication", +// "_cookies": "And cookies with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed_2.sol b/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed_2.sol new file mode 100644 index 000000000..9847c3ac2 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_desc_multiple_unamed_mixed_2.sol @@ -0,0 +1,38 @@ +contract test { + /// @dev Multiplies a number by 7 and adds second parameter + /// @param a Documentation for the first parameter starts here. + /// Since it's a really complicated parameter we need 2 lines + /// @param second Documentation for the second parameter + /// @return _cookies And cookies with nutella + /// @return The result of the multiplication + /// @return _milk And milk with nutella + function mul(uint a, uint second) public returns (uint _cookies, uint, uint _milk) { + uint mul = a * 7; + uint milk = 4; + return (mul, second, milk); + } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "details": "Multiplies a number by 7 and adds second parameter", +// "params": +// { +// "a": "Documentation for the first parameter starts here. Since it's a really complicated parameter we need 2 lines", +// "second": "Documentation for the second parameter" +// }, +// "returns": +// { +// "_1": "The result of the multiplication", +// "_cookies": "And cookies with nutella", +// "_milk": "And milk with nutella" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_name_no_description.sol b/test/libsolidity/natspecJSON/dev_return_name_no_description.sol new file mode 100644 index 000000000..555c7f925 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_name_no_description.sol @@ -0,0 +1,38 @@ +contract A { + /// @return a + function g(int x) public pure virtual returns (int a) { return 2; } +} + +contract B is A { + function g(int x) public pure override returns (int b) { return 2; } +} + +// ---- +// ---- +// :A devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "a": "a" +// } +// } +// } +// } +// +// :B devdoc +// { +// "methods": +// { +// "g(int256)": +// { +// "returns": +// { +// "b": "a" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_return_no_params.sol b/test/libsolidity/natspecJSON/dev_return_no_params.sol new file mode 100644 index 000000000..870058b07 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_return_no_params.sol @@ -0,0 +1,20 @@ +contract test { + /// @return d The result of the multiplication + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": +// { +// "mul(uint256,uint256)": +// { +// "returns": +// { +// "d": "The result of the multiplication" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_struct_getter_override.sol b/test/libsolidity/natspecJSON/dev_struct_getter_override.sol new file mode 100644 index 000000000..7cc09a183 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_struct_getter_override.sol @@ -0,0 +1,47 @@ +interface IThing { + /// @return x a number + /// @return y another number + function value() external view returns (uint128 x, uint128 y); +} + +contract Thing is IThing { + struct Value { + uint128 x; + uint128 y; + } + + Value public override value; +} + +// ---- +// ---- +// :IThing devdoc +// { +// "methods": +// { +// "value()": +// { +// "returns": +// { +// "x": "a number", +// "y": "another number" +// } +// } +// } +// } +// +// :Thing devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "value": +// { +// "returns": +// { +// "x": "a number", +// "y": "another number" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_struct_getter_override_different_return_parameter_names.sol b/test/libsolidity/natspecJSON/dev_struct_getter_override_different_return_parameter_names.sol new file mode 100644 index 000000000..050abfd7f --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_struct_getter_override_different_return_parameter_names.sol @@ -0,0 +1,47 @@ +interface IThing { + /// @return x a number + /// @return y another number + function value() external view returns (uint128 x, uint128 y); +} + +contract Thing is IThing { + struct Value { + uint128 a; + uint128 b; + } + + Value public override value; +} + +// ---- +// ---- +// :IThing devdoc +// { +// "methods": +// { +// "value()": +// { +// "returns": +// { +// "x": "a number", +// "y": "another number" +// } +// } +// } +// } +// +// :Thing devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "value": +// { +// "returns": +// { +// "a": "a number", +// "b": "another number" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_struct_getter_override_no_return_name.sol b/test/libsolidity/natspecJSON/dev_struct_getter_override_no_return_name.sol new file mode 100644 index 000000000..927037f12 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_struct_getter_override_no_return_name.sol @@ -0,0 +1,44 @@ +interface IThing { + ///@return + function value(uint) external returns (uint128,uint128); +} + +contract Thing is IThing { + struct Value { + uint128 x; + uint128 A; + } + mapping(uint=>Value) public override value; +} + +// ---- +// ---- +// :IThing devdoc +// { +// "methods": +// { +// "value(uint256)": +// { +// "returns": +// { +// "_0": "" +// } +// } +// } +// } +// +// :Thing devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "value": +// { +// "return": "x ", +// "returns": +// { +// "x": "" +// } +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/dev_title_at_function_error.sol b/test/libsolidity/natspecJSON/dev_title_at_function_error.sol new file mode 100644 index 000000000..8c9ed7bb9 --- /dev/null +++ b/test/libsolidity/natspecJSON/dev_title_at_function_error.sol @@ -0,0 +1,9 @@ +/// @author Lefteris +/// @title Just a test contract +contract test { + /// @dev Mul function + /// @title I really should not be here + function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; } +} + +// ---- diff --git a/test/libsolidity/natspecJSON/emit_event_from_foreign_contract.sol b/test/libsolidity/natspecJSON/emit_event_from_foreign_contract.sol new file mode 100644 index 000000000..7733fd432 --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_event_from_foreign_contract.sol @@ -0,0 +1,41 @@ +contract X { + /// @notice Userdoc for event E. + /// @dev Devdoc for event E. + event E(); +} + +contract C { + function g() public { + emit X.E(); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "events": +// { +// "E()": +// { +// "details": "Devdoc for event E." +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "events": +// { +// "E()": +// { +// "notice": "Userdoc for event E." +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_event_from_foreign_contract_no_inheritance.sol b/test/libsolidity/natspecJSON/emit_event_from_foreign_contract_no_inheritance.sol new file mode 100644 index 000000000..ea1d66956 --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_event_from_foreign_contract_no_inheritance.sol @@ -0,0 +1,31 @@ +// Tests that emitting an event from contract C in contract D does not inherit natspec from C.E + +contract C { + /// @notice C.E event + /// @dev C.E event + event E(); +} + +contract D { + event E(); + + function test() public { + emit C.E(); + } +} + +// ---- +// ---- +// :D devdoc +// { +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :D userdoc +// { +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_event_from_foreign_contract_with_same_signature.sol b/test/libsolidity/natspecJSON/emit_event_from_foreign_contract_with_same_signature.sol new file mode 100644 index 000000000..6030c27d9 --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_event_from_foreign_contract_with_same_signature.sol @@ -0,0 +1,74 @@ +contract C { + /// @notice C.E event + /// @dev C.E event + event E(uint256 value); +} + +contract D { + /// @notice D.E event + /// @dev D.E event + event E(uint256 value); + + function test() public { + emit C.E(1); + emit E(2); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "events": +// { +// "E(uint256)": +// { +// "details": "C.E event" +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "events": +// { +// "E(uint256)": +// { +// "notice": "C.E event" +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } +// +// :D devdoc +// { +// "events": +// { +// "E(uint256)": +// { +// "details": "D.E event" +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :D userdoc +// { +// "events": +// { +// "E(uint256)": +// { +// "notice": "D.E event" +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries.sol b/test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries.sol new file mode 100644 index 000000000..a017849c9 --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries.sol @@ -0,0 +1,66 @@ +library L1 { + /// @notice This event is defined in Library L1 + /// @dev This should not appear in Contract C dev doc + event SameSignatureEvent(uint16); +} +library L2 { + /// @notice This event is defined in Library L2 + /// @dev This should not appear in Contract C dev doc + event SameSignatureEvent(uint16); +} +library L3 { + /// @notice This event is defined in Library L3 + /// @dev This should not appear in Contract C dev doc + event SameSignatureEvent(uint16); +} +contract C { + function f() public { + emit L1.SameSignatureEvent(0); + emit L2.SameSignatureEvent(1); + emit L3.SameSignatureEvent(2); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "kind": "user", +// "methods": {}, +// "version": 1 +// } +// +// :L1 devdoc +// { +// "events": +// { +// "SameSignatureEvent(uint16)": +// { +// "details": "This should not appear in Contract C dev doc" +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :L1 userdoc +// { +// "events": +// { +// "SameSignatureEvent(uint16)": +// { +// "notice": "This event is defined in Library L1" +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries_missing_natspec.sol b/test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries_missing_natspec.sol new file mode 100644 index 000000000..06b739039 --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_same_signature_event_different_libraries_missing_natspec.sol @@ -0,0 +1,34 @@ +library L1 { + event SameSignatureEvent(uint16); +} +library L2 { + /// @notice This event is defined in library L2 + /// @dev This should not appear in Contract C devdoc + event SameSignatureEvent(uint16); +} +library L3 { + event SameSignatureEvent(uint16); +} +contract C { + function f() public { + emit L1.SameSignatureEvent(0); + emit L2.SameSignatureEvent(1); + emit L3.SameSignatureEvent(2); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_same_signature_event_library_contract.sol b/test/libsolidity/natspecJSON/emit_same_signature_event_library_contract.sol new file mode 100644 index 000000000..d5b3d91fd --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_same_signature_event_library_contract.sol @@ -0,0 +1,68 @@ +library L { + /// @notice This event is defined in Library L + /// @dev This should not appear in Contract C dev doc + event SameSignatureEvent(uint16); + /// @notice This event is defined in Library L + /// @dev This should appear in Contract C dev doc + event LibraryEvent(uint32); +} +contract C { + /// @notice This event is defined in Contract C + /// @dev This should appear in Contract C dev doc + event SameSignatureEvent(uint16); + /// @notice This event is defined in Contract C + /// @dev This should appear in contract C dev doc + event ContractEvent(uint32); + function f() public { + emit L.SameSignatureEvent(0); + emit SameSignatureEvent(1); + emit L.LibraryEvent(2); + emit ContractEvent(3); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "events": +// { +// "ContractEvent(uint32)": +// { +// "details": "This should appear in contract C dev doc" +// }, +// "LibraryEvent(uint32)": +// { +// "details": "This should appear in Contract C dev doc" +// }, +// "SameSignatureEvent(uint16)": +// { +// "details": "This should appear in Contract C dev doc" +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "events": +// { +// "ContractEvent(uint32)": +// { +// "notice": "This event is defined in Contract C" +// }, +// "LibraryEvent(uint32)": +// { +// "notice": "This event is defined in Library L" +// }, +// "SameSignatureEvent(uint16)": +// { +// "notice": "This event is defined in Contract C" +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_same_signature_event_library_contract_missing_natspec.sol b/test/libsolidity/natspecJSON/emit_same_signature_event_library_contract_missing_natspec.sol new file mode 100644 index 000000000..5da7a6c1c --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_same_signature_event_library_contract_missing_natspec.sol @@ -0,0 +1,53 @@ +library L { + /// @notice This event is defined in library L + /// @dev This should not appear in contract C devdoc + event SameSignatureEvent(uint16); + /// @notice This event is defined in library L + /// @dev This should appear in contract C devdoc + event LibraryEvent(uint32); +} +contract C { + event SameSignatureEvent(uint16); + /// @notice This event is defined in contract C + event ContractEvent(uint32); + function f() public { + emit L.SameSignatureEvent(0); + emit SameSignatureEvent(1); + emit L.LibraryEvent(2); + emit ContractEvent(3); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "events": +// { +// "LibraryEvent(uint32)": +// { +// "details": "This should appear in contract C devdoc" +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "events": +// { +// "ContractEvent(uint32)": +// { +// "notice": "This event is defined in contract C" +// }, +// "LibraryEvent(uint32)": +// { +// "notice": "This event is defined in library L" +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited.sol b/test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited.sol new file mode 100644 index 000000000..9f2ed1ce3 --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited.sol @@ -0,0 +1,46 @@ +contract D { + /// @notice This event is defined in contract D + /// @dev This should appear in Contract C dev doc + event SameSignatureEvent(uint16); +} +library L { + /// @notice This event is defined in Library L + /// @dev This should not appear in Contract C + event SameSignatureEvent(uint16); +} +contract C is D { + function f() public { + emit L.SameSignatureEvent(0); + emit D.SameSignatureEvent(1); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "events": +// { +// "SameSignatureEvent(uint16)": +// { +// "details": "This should appear in Contract C dev doc" +// } +// }, +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "events": +// { +// "SameSignatureEvent(uint16)": +// { +// "notice": "This event is defined in contract D" +// } +// }, +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited_missing_natspec.sol b/test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited_missing_natspec.sol new file mode 100644 index 000000000..106110a0f --- /dev/null +++ b/test/libsolidity/natspecJSON/emit_same_signature_event_library_inherited_missing_natspec.sol @@ -0,0 +1,30 @@ +contract D { + event SameSignatureEvent(uint16); +} +library L { + /// @notice This event is defined in library L + /// @dev This should not appear in contract C devdoc + event SameSignatureEvent(uint16); +} +contract C is D { + function f() public { + emit L.SameSignatureEvent(0); + emit D.SameSignatureEvent(1); + } +} + +// ---- +// ---- +// :C devdoc +// { +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/empty_comment.sol b/test/libsolidity/natspecJSON/empty_comment.sol new file mode 100644 index 000000000..0f7d691a2 --- /dev/null +++ b/test/libsolidity/natspecJSON/empty_comment.sol @@ -0,0 +1,10 @@ +// +contract test +{} + +// ---- +// ---- +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/enum_no_docs.sol b/test/libsolidity/natspecJSON/enum_no_docs.sol new file mode 100644 index 000000000..021f7c6b2 --- /dev/null +++ b/test/libsolidity/natspecJSON/enum_no_docs.sol @@ -0,0 +1,26 @@ +contract C { + /// @title example of title + /// @author example of author + /// @notice example of notice + /// @dev example of dev + enum Color { + Red, + Green + } +} + +// ---- +// ---- +// :C devdoc +// { +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/error.sol b/test/libsolidity/natspecJSON/error.sol new file mode 100644 index 000000000..71b6e9a62 --- /dev/null +++ b/test/libsolidity/natspecJSON/error.sol @@ -0,0 +1,42 @@ +contract test { + /// Something failed. + /// @dev an error. + /// @param a first parameter + /// @param b second parameter + error E(uint a, uint b); +} + +// ---- +// ---- +// :test devdoc +// { +// "errors": +// { +// "E(uint256,uint256)": +// [ +// { +// "details": "an error.", +// "params": +// { +// "a": "first parameter", +// "b": "second parameter" +// } +// } +// ] +// }, +// "methods": {} +// } +// +// :test userdoc +// { +// "errors": +// { +// "E(uint256,uint256)": +// [ +// { +// "notice": "Something failed." +// } +// ] +// }, +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/error_multiple.sol b/test/libsolidity/natspecJSON/error_multiple.sol new file mode 100644 index 000000000..cb47cfa6d --- /dev/null +++ b/test/libsolidity/natspecJSON/error_multiple.sol @@ -0,0 +1,66 @@ +contract A { + /// Something failed. + /// @dev an error. + /// @param x first parameter + /// @param y second parameter + error E(uint x, uint y); +} +contract test { + /// X Something failed. + /// @dev X an error. + /// @param a X first parameter + /// @param b X second parameter + error E(uint a, uint b); + function f(bool a) public pure { + if (a) + revert E(1, 2); + else + revert A.E(5, 6); + } +} + +// ---- +// ---- +// :test devdoc +// { +// "errors": +// { +// "E(uint256,uint256)": +// [ +// { +// "details": "an error.", +// "params": +// { +// "x": "first parameter", +// "y": "second parameter" +// } +// }, +// { +// "details": "X an error.", +// "params": +// { +// "a": "X first parameter", +// "b": "X second parameter" +// } +// } +// ] +// }, +// "methods": {} +// } +// +// :test userdoc +// { +// "errors": +// { +// "E(uint256,uint256)": +// [ +// { +// "notice": "Something failed." +// }, +// { +// "notice": "X Something failed." +// } +// ] +// }, +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/event.sol b/test/libsolidity/natspecJSON/event.sol new file mode 100644 index 000000000..bf719b709 --- /dev/null +++ b/test/libsolidity/natspecJSON/event.sol @@ -0,0 +1,40 @@ +contract ERC20 { + /// @notice This event is emitted when a transfer occurs. + /// @param from The source account. + /// @param to The destination account. + /// @param amount The amount. + /// @dev A test case! + event Transfer(address indexed from, address indexed to, uint amount); +} + +// ---- +// ---- +// :ERC20 devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :ERC20 userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/event_inheritance.sol b/test/libsolidity/natspecJSON/event_inheritance.sol new file mode 100644 index 000000000..e747b7175 --- /dev/null +++ b/test/libsolidity/natspecJSON/event_inheritance.sol @@ -0,0 +1,104 @@ +contract ERC20 { + /// @notice This event is emitted when a transfer occurs. + /// @param from The source account. + /// @param to The destination account. + /// @param amount The amount. + /// @dev A test case! + event Transfer(address indexed from, address indexed to, uint amount); +} +contract A is ERC20 { +} +contract B is A { +} + +// ---- +// ---- +// :A devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :A userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } +// +// :B devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :B userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } +// +// :ERC20 devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :ERC20 userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/event_inheritance_interface.sol b/test/libsolidity/natspecJSON/event_inheritance_interface.sol new file mode 100644 index 000000000..be93f9937 --- /dev/null +++ b/test/libsolidity/natspecJSON/event_inheritance_interface.sol @@ -0,0 +1,104 @@ +interface ERC20 { + /// @notice This event is emitted when a transfer occurs. + /// @param from The source account. + /// @param to The destination account. + /// @param amount The amount. + /// @dev A test case! + event Transfer(address indexed from, address indexed to, uint amount); +} +contract A is ERC20 { +} +contract B is A { +} + +// ---- +// ---- +// :A devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :A userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } +// +// :B devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :B userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } +// +// :ERC20 devdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "details": "A test case!", +// "params": +// { +// "amount": "The amount.", +// "from": "The source account.", +// "to": "The destination account." +// } +// } +// }, +// "methods": {} +// } +// +// :ERC20 userdoc +// { +// "events": +// { +// "Transfer(address,address,uint256)": +// { +// "notice": "This event is emitted when a transfer occurs." +// } +// }, +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/multiline_notice_without_tag.sol b/test/libsolidity/natspecJSON/multiline_notice_without_tag.sol new file mode 100644 index 000000000..da28d3cd7 --- /dev/null +++ b/test/libsolidity/natspecJSON/multiline_notice_without_tag.sol @@ -0,0 +1,18 @@ +contract test { + /// I do something awesome + /// which requires two lines to explain + function mul(uint a) public returns (uint d) { return a * 7; } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "mul(uint256)": +// { +// "notice": "I do something awesome which requires two lines to explain" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/notice_without_tag.sol b/test/libsolidity/natspecJSON/notice_without_tag.sol new file mode 100644 index 000000000..658f5316a --- /dev/null +++ b/test/libsolidity/natspecJSON/notice_without_tag.sol @@ -0,0 +1,17 @@ +contract test { + /// I do something awesome + function mul(uint a) public returns (uint d) { return a * 7; } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "mul(uint256)": +// { +// "notice": "I do something awesome" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/private_state_variable.sol b/test/libsolidity/natspecJSON/private_state_variable.sol new file mode 100644 index 000000000..ed4bd56cc --- /dev/null +++ b/test/libsolidity/natspecJSON/private_state_variable.sol @@ -0,0 +1,23 @@ +contract test { + /// @dev example of dev + uint private state; +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "state": +// { +// "details": "example of dev" +// } +// } +// } +// +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/public_state_variable.sol b/test/libsolidity/natspecJSON/public_state_variable.sol new file mode 100644 index 000000000..517080602 --- /dev/null +++ b/test/libsolidity/natspecJSON/public_state_variable.sol @@ -0,0 +1,36 @@ +contract test { + /// @notice example of notice + /// @dev example of dev + /// @return returns state + uint public state; +} + +// ---- +// ---- +// :test devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "state": +// { +// "details": "example of dev", +// "return": "returns state", +// "returns": +// { +// "_0": "returns state" +// } +// } +// } +// } +// +// :test userdoc +// { +// "methods": +// { +// "state()": +// { +// "notice": "example of notice" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/public_state_variable_struct.sol b/test/libsolidity/natspecJSON/public_state_variable_struct.sol new file mode 100644 index 000000000..a8dff229d --- /dev/null +++ b/test/libsolidity/natspecJSON/public_state_variable_struct.sol @@ -0,0 +1,40 @@ +contract Bank { + struct Coin { + string observeGraphicURL; + string reverseGraphicURL; + } + + /// @notice Get the n-th coin I own + /// @return observeGraphicURL Front pic + /// @return reverseGraphicURL Back pic + Coin[] public coinStack; +} + +// ---- +// ---- +// :Bank devdoc +// { +// "methods": {}, +// "stateVariables": +// { +// "coinStack": +// { +// "returns": +// { +// "observeGraphicURL": "Front pic", +// "reverseGraphicURL": "Back pic" +// } +// } +// } +// } +// +// :Bank userdoc +// { +// "methods": +// { +// "coinStack(uint256)": +// { +// "notice": "Get the n-th coin I own" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/public_state_variable_struct_repeated.sol b/test/libsolidity/natspecJSON/public_state_variable_struct_repeated.sol new file mode 100644 index 000000000..a6b4f7f84 --- /dev/null +++ b/test/libsolidity/natspecJSON/public_state_variable_struct_repeated.sol @@ -0,0 +1,13 @@ +contract Bank { + struct Coin { + string obverseGraphicURL; + string reverseGraphicURL; + } + + /// @notice Get the n-th coin I own + /// @return obverseGraphicURL Front pic + /// @return obverseGraphicURL Front pic + Coin[] public coinStack; +} + +// ---- diff --git a/test/libsolidity/natspecJSON/slash3_slash3.sol b/test/libsolidity/natspecJSON/slash3_slash3.sol new file mode 100644 index 000000000..ea40cdaa9 --- /dev/null +++ b/test/libsolidity/natspecJSON/slash3_slash3.sol @@ -0,0 +1,18 @@ +contract test { + /// @notice lorem + /// ipsum + function f() public { } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "f()": +// { +// "notice": "lorem ipsum" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/slash3_slash4.sol b/test/libsolidity/natspecJSON/slash3_slash4.sol new file mode 100644 index 000000000..b8b5dc33e --- /dev/null +++ b/test/libsolidity/natspecJSON/slash3_slash4.sol @@ -0,0 +1,18 @@ +contract test { + /// @notice lorem + //// ipsum + function f() public { } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "f()": +// { +// "notice": "lorem" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/slash4.sol b/test/libsolidity/natspecJSON/slash4.sol new file mode 100644 index 000000000..1016d6204 --- /dev/null +++ b/test/libsolidity/natspecJSON/slash4.sol @@ -0,0 +1,11 @@ +contract test { + //// @notice lorem ipsum + function f() public { } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/star3.sol b/test/libsolidity/natspecJSON/star3.sol new file mode 100644 index 000000000..965ce1e66 --- /dev/null +++ b/test/libsolidity/natspecJSON/star3.sol @@ -0,0 +1,13 @@ +contract test { + /*** + * @notice lorem ipsum + */ + function f() public { } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/struct_no_docs.sol b/test/libsolidity/natspecJSON/struct_no_docs.sol new file mode 100644 index 000000000..e29a4b8e9 --- /dev/null +++ b/test/libsolidity/natspecJSON/struct_no_docs.sol @@ -0,0 +1,27 @@ +contract C { + /// @title example of title + /// @author example of author + /// @notice example of notice + /// @dev example of dev + struct Example { + string text; + bool valid; + uint256 value; + } +} + +// ---- +// ---- +// :C devdoc +// { +// "kind": "dev", +// "methods": {}, +// "version": 1 +// } +// +// :C userdoc +// { +// "kind": "user", +// "methods": {}, +// "version": 1 +// } diff --git a/test/libsolidity/natspecJSON/user_basic_test.sol b/test/libsolidity/natspecJSON/user_basic_test.sol new file mode 100644 index 000000000..27df4c616 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_basic_test.sol @@ -0,0 +1,17 @@ +contract test { + /// @notice Multiplies `a` by 7 + function mul(uint a) public returns(uint d) { return a * 7; } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "mul(uint256)": +// { +// "notice": "Multiplies `a` by 7" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_constructor.sol b/test/libsolidity/natspecJSON/user_constructor.sol new file mode 100644 index 000000000..bd49a376c --- /dev/null +++ b/test/libsolidity/natspecJSON/user_constructor.sol @@ -0,0 +1,17 @@ +contract test { + /// @notice this is a really nice constructor + constructor(uint a, uint second) { } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "constructor": +// { +// "notice": "this is a really nice constructor" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_constructor_and_function.sol b/test/libsolidity/natspecJSON/user_constructor_and_function.sol new file mode 100644 index 000000000..0dd1b33fb --- /dev/null +++ b/test/libsolidity/natspecJSON/user_constructor_and_function.sol @@ -0,0 +1,23 @@ +contract test { + /// @notice this is a really nice constructor + constructor(uint a, uint second) { } + /// another multiplier + function mul(uint a, uint second) public returns(uint d) { return a * 7 + second; } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "constructor": +// { +// "notice": "this is a really nice constructor" +// }, +// "mul(uint256,uint256)": +// { +// "notice": "another multiplier" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_default_inherit.sol b/test/libsolidity/natspecJSON/user_default_inherit.sol new file mode 100644 index 000000000..ab92e6bc6 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_default_inherit.sol @@ -0,0 +1,57 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// Second line. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract Middle is ERC20 { + function transfer(address to, uint amount) virtual override external returns (bool) + { + return false; + } +} + +contract Token is Middle { + function transfer(address to, uint amount) override external returns (bool) + { + return false; + } +} + +// ---- +// ---- +// :ERC20 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``. Second line." +// } +// } +// } +// +// :Middle userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``. Second line." +// } +// } +// } +// +// :Token userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``. Second line." +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_default_inherit_variable.sol b/test/libsolidity/natspecJSON/user_default_inherit_variable.sol new file mode 100644 index 000000000..eee21cd91 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_default_inherit_variable.sol @@ -0,0 +1,35 @@ +contract C { + /// @notice Hello world + /// @dev test + function x() virtual external returns (uint) { + return 1; + } +} + +contract D is C { + uint public override x; +} + +// ---- +// ---- +// :C userdoc +// { +// "methods": +// { +// "x()": +// { +// "notice": "Hello world" +// } +// } +// } +// +// :D userdoc +// { +// "methods": +// { +// "x()": +// { +// "notice": "Hello world" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_empty_contract.sol b/test/libsolidity/natspecJSON/user_empty_contract.sol new file mode 100644 index 000000000..be7bc2a2f --- /dev/null +++ b/test/libsolidity/natspecJSON/user_empty_contract.sol @@ -0,0 +1,8 @@ +contract test { } + +// ---- +// ---- +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/user_empty_natspec_test.sol b/test/libsolidity/natspecJSON/user_empty_natspec_test.sol new file mode 100644 index 000000000..08c438952 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_empty_natspec_test.sol @@ -0,0 +1,13 @@ +contract test { + /// + /// + function f() public { + } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/user_explicit_inherit.sol b/test/libsolidity/natspecJSON/user_explicit_inherit.sol new file mode 100644 index 000000000..96ab8effe --- /dev/null +++ b/test/libsolidity/natspecJSON/user_explicit_inherit.sol @@ -0,0 +1,44 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 { + function transfer(address to, uint amount) virtual external returns (bool) { + return false; + } +} + +contract Token is ERC21, ERC20 { + /// @inheritdoc ERC20 + function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :Token userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_explicit_inherit2.sol b/test/libsolidity/natspecJSON/user_explicit_inherit2.sol new file mode 100644 index 000000000..5be6140f0 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_explicit_inherit2.sol @@ -0,0 +1,55 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 is ERC20 { + function transfer(address to, uint amount) virtual override external returns (bool) { + return false; + } +} + +contract Token is ERC20 { + /// @inheritdoc ERC20 + function transfer(address to, uint amount) override external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :ERC21 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :Token userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_explicit_inherit_partial.sol b/test/libsolidity/natspecJSON/user_explicit_inherit_partial.sol new file mode 100644 index 000000000..5a865d822 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_explicit_inherit_partial.sol @@ -0,0 +1,46 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 { + function transfer(address to, uint amount) virtual external returns (bool) { + return false; + } +} + +contract Token is ERC21, ERC20 { + /// @inheritdoc ERC20 + /// @dev override dev comment + /// @notice override notice + function transfer(address to, uint amount) override(ERC21, ERC20) external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :Token userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "override notice" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_explicit_inherit_partial2.sol b/test/libsolidity/natspecJSON/user_explicit_inherit_partial2.sol new file mode 100644 index 000000000..460c90dd9 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_explicit_inherit_partial2.sol @@ -0,0 +1,46 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract ERC21 is ERC20 { + /// @inheritdoc ERC20 + /// @dev override dev comment + /// @notice override notice + function transfer(address to, uint amount) virtual override external returns (bool) { + return false; + } +} + +contract Token is ERC21 { + function transfer(address to, uint amount) override external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :Token userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "override notice" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_explicit_inherit_variable.sol b/test/libsolidity/natspecJSON/user_explicit_inherit_variable.sol new file mode 100644 index 000000000..9e6e96bf6 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_explicit_inherit_variable.sol @@ -0,0 +1,42 @@ +contract B { + function x() virtual external returns (uint) { + return 1; + } +} + +contract C { + /// @notice Hello world + /// @dev test + function x() virtual external returns (uint) { + return 1; + } +} + +contract D is C, B { + /// @inheritdoc C + uint public override(C, B) x; +} + +// ---- +// ---- +// :C userdoc +// { +// "methods": +// { +// "x()": +// { +// "notice": "Hello world" +// } +// } +// } +// +// :D userdoc +// { +// "methods": +// { +// "x()": +// { +// "notice": "Hello world" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_inherit_parameter_mismatch.sol b/test/libsolidity/natspecJSON/user_inherit_parameter_mismatch.sol new file mode 100644 index 000000000..a427f16af --- /dev/null +++ b/test/libsolidity/natspecJSON/user_inherit_parameter_mismatch.sol @@ -0,0 +1,48 @@ +interface ERC20 { + /// Transfer ``amount`` from ``msg.sender`` to ``to``. + /// @dev test + /// @param to address to transfer to + /// @param amount amount to transfer + function transfer(address to, uint amount) external returns (bool); +} + +contract Middle is ERC20 { + function transfer(address to, uint amount) override virtual external returns (bool) { + return false; + } +} + +contract Token is Middle { + function transfer(address too, uint amount) override external returns (bool) { + return false; + } +} + +// ---- +// ---- +// :ERC20 userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :Middle userdoc +// { +// "methods": +// { +// "transfer(address,uint256)": +// { +// "notice": "Transfer ``amount`` from ``msg.sender`` to ``to``." +// } +// } +// } +// +// :Token userdoc +// { +// "methods": {} +// } diff --git a/test/libsolidity/natspecJSON/user_multiline_comment.sol b/test/libsolidity/natspecJSON/user_multiline_comment.sol new file mode 100644 index 000000000..e8c7f61de --- /dev/null +++ b/test/libsolidity/natspecJSON/user_multiline_comment.sol @@ -0,0 +1,20 @@ +contract test { + /// @notice Multiplies `a` by 7 + /// and then adds `b` + function mul_and_add(uint a, uint256 b) public returns (uint256 d) { + return (a * 7) + b; + } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "mul_and_add(uint256,uint256)": +// { +// "notice": "Multiplies `a` by 7 and then adds `b`" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_multiline_empty_lines.sol b/test/libsolidity/natspecJSON/user_multiline_empty_lines.sol new file mode 100644 index 000000000..93f20a195 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_multiline_empty_lines.sol @@ -0,0 +1,22 @@ +contract test { + /** + * + * + * @notice hello world + */ + function f() public { + } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "f()": +// { +// "notice": "hello world" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_multiple_functions.sol b/test/libsolidity/natspecJSON/user_multiple_functions.sol new file mode 100644 index 000000000..a2ae7f058 --- /dev/null +++ b/test/libsolidity/natspecJSON/user_multiple_functions.sol @@ -0,0 +1,37 @@ +contract test { + /// @notice Multiplies `a` by 7 and then adds `b` + function mul_and_add(uint a, uint256 b) public returns (uint256 d) { + return (a * 7) + b; + } + + /// @notice Divides `input` by `div` + function divide(uint input, uint div) public returns (uint d) { + return input / div; + } + + /// @notice Subtracts 3 from `input` + function sub(int input) public returns (int d) { + return input - 3; + } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "divide(uint256,uint256)": +// { +// "notice": "Divides `input` by `div`" +// }, +// "mul_and_add(uint256,uint256)": +// { +// "notice": "Multiplies `a` by 7 and then adds `b`" +// }, +// "sub(int256)": +// { +// "notice": "Subtracts 3 from `input`" +// } +// } +// } diff --git a/test/libsolidity/natspecJSON/user_newline_break.sol b/test/libsolidity/natspecJSON/user_newline_break.sol new file mode 100644 index 000000000..97744a74f --- /dev/null +++ b/test/libsolidity/natspecJSON/user_newline_break.sol @@ -0,0 +1,21 @@ +contract test { + /// + /// @notice hello + + /// @notice world + function f() public { + } +} + +// ---- +// ---- +// :test userdoc +// { +// "methods": +// { +// "f()": +// { +// "notice": "world" +// } +// } +// }