diff options
author | chriseth <chris@ethereum.org> | 2018-02-10 06:54:05 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2018-02-12 23:41:31 +0800 |
commit | 676cf52264a5522ebdf77d096a15384336ea0566 (patch) | |
tree | 4d705e3e3519304519739ac4c134cb2d46699714 /test/libsolidity/AnalysisFramework.h | |
parent | 2095e7a32dce04f6142074bf96f14b6c7046137a (diff) | |
download | dexon-solidity-676cf52264a5522ebdf77d096a15384336ea0566.tar.gz dexon-solidity-676cf52264a5522ebdf77d096a15384336ea0566.tar.zst dexon-solidity-676cf52264a5522ebdf77d096a15384336ea0566.zip |
Support searching inside multiple errors.
Diffstat (limited to 'test/libsolidity/AnalysisFramework.h')
-rw-r--r-- | test/libsolidity/AnalysisFramework.h | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/test/libsolidity/AnalysisFramework.h b/test/libsolidity/AnalysisFramework.h index a566ba1d..6ecf4a5a 100644 --- a/test/libsolidity/AnalysisFramework.h +++ b/test/libsolidity/AnalysisFramework.h @@ -45,7 +45,7 @@ class AnalysisFramework { protected: - virtual std::pair<SourceUnit const*, std::shared_ptr<Error const>> + virtual std::pair<SourceUnit const*, ErrorList> parseAnalyseAndReturnError( std::string const& _source, bool _reportWarnings = false, @@ -55,7 +55,7 @@ protected: SourceUnit const* parseAndAnalyse(std::string const& _source); bool success(std::string const& _source); - Error expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false); + ErrorList expectError(std::string const& _source, bool _warning = false, bool _allowMultiple = false); std::string formatErrors(); std::string formatError(Error const& _error); @@ -70,34 +70,51 @@ protected: dev::solidity::CompilerStack m_compiler; }; +// Asserts that the compilation down to typechecking +// emits multiple errors of different types and messages, provided in the second argument. +#define CHECK_ALLOW_MULTI(text, expectations) \ +do \ +{ \ + ErrorList errors = expectError((text), true, true); \ + auto message = searchErrors(errors, (expectations)); \ + BOOST_CHECK_MESSAGE(message.empty(), message); \ +} while(0) -#define CHECK_ERROR_OR_WARNING(text, typ, substring, warning, allowMulti) \ +#define CHECK_ERROR_OR_WARNING(text, typ, substrings, warning, allowMulti) \ do \ { \ - Error err = expectError((text), (warning), (allowMulti)); \ - BOOST_CHECK(err.type() == (Error::Type::typ)); \ - BOOST_CHECK(searchErrorMessage(err, (substring))); \ + ErrorList errors = expectError((text), (warning), (allowMulti)); \ + std::vector<std::pair<Error::Type, std::string>> expectations; \ + for (auto const& str: substrings) \ + expectations.emplace_back((Error::Type::typ), str); \ + auto message = searchErrors(errors, expectations); \ + BOOST_CHECK_MESSAGE(message.empty(), message); \ } while(0) // [checkError(text, type, substring)] asserts that the compilation down to typechecking // emits an error of type [type] and with a message containing [substring]. #define CHECK_ERROR(text, type, substring) \ -CHECK_ERROR_OR_WARNING(text, type, substring, false, false) +CHECK_ERROR_OR_WARNING(text, type, std::vector<std::string>{(substring)}, false, false) // [checkError(text, type, substring)] asserts that the compilation down to typechecking -// emits an error of type [type] and with a message containing [substring]. -#define CHECK_ERROR_ALLOW_MULTI(text, type, substring) \ -CHECK_ERROR_OR_WARNING(text, type, substring, false, true) +// emits multiple errors of the same type [type] and with a messages containing [substrings]. +// Because of the limitations of the preprocessor, you cannot use {{T1, "abc"}, {T2, "def"}} as arguments, +// but have to replace them by (std::vector<std::pair<Error::Type, std::string>>{"abc", "def"}) +// (note the parentheses) +#define CHECK_ERROR_ALLOW_MULTI(text, type, substrings) \ +CHECK_ERROR_OR_WARNING(text, type, substrings, false, true) // [checkWarning(text, substring)] asserts that the compilation down to typechecking // emits a warning and with a message containing [substring]. #define CHECK_WARNING(text, substring) \ -CHECK_ERROR_OR_WARNING(text, Warning, substring, true, false) +CHECK_ERROR_OR_WARNING(text, Warning, std::vector<std::string>{(substring)}, true, false) // [checkWarningAllowMulti(text, substring)] aserts that the compilation down to typechecking // emits a warning and with a message containing [substring]. -#define CHECK_WARNING_ALLOW_MULTI(text, substring) \ -CHECK_ERROR_OR_WARNING(text, Warning, substring, true, true) +// Because of the limitations of the preprocessor, you cannot use {"abc", "def"} as arguments, +// but have to replace them by (std::vector<std::string>{"abc", "def"}) (note the parentheses) +#define CHECK_WARNING_ALLOW_MULTI(text, substrings) \ +CHECK_ERROR_OR_WARNING(text, Warning, substrings, true, true) // [checkSuccess(text)] asserts that the compilation down to typechecking succeeds. #define CHECK_SUCCESS(text) do { BOOST_CHECK(success((text))); } while(0) @@ -107,9 +124,9 @@ do \ { \ auto sourceAndError = parseAnalyseAndReturnError((text), true); \ std::string message; \ - if (sourceAndError.second) \ - message = formatError(*sourceAndError.second); \ - BOOST_CHECK_MESSAGE(!sourceAndError.second, message); \ + if (!sourceAndError.second.empty()) \ + message = formatErrors();\ + BOOST_CHECK_MESSAGE(sourceAndError.second.empty(), message); \ } \ while(0) |