Support compilation fail scenarios in ASTJSON tests

This commit is contained in:
wechman 2022-02-22 12:29:29 +01:00 committed by wechman
parent 38639417e1
commit f431c6f058
3 changed files with 24 additions and 2 deletions

View File

@ -6,3 +6,4 @@ contract C is NotExisting.X
}
// ----
// failAfter: Parsed

View File

@ -27,6 +27,7 @@
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/trim.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/throw_exception.hpp>
@ -49,6 +50,15 @@ namespace
string const sourceDelimiter("==== Source: ");
const map<string, CompilerStack::State> compilerStateMap = {
{"Empty", CompilerStack::State::Empty},
{"SourcesSet", CompilerStack::State::SourcesSet},
{"Parsed", CompilerStack::State::Parsed},
{"ParsedAndImported", CompilerStack::State::ParsedAndImported},
{"AnalysisPerformed", CompilerStack::State::AnalysisPerformed},
{"CompilationSuccessful", CompilerStack::State::CompilationSuccessful}
};
void replaceVersionWithTag(string& _input)
{
boost::algorithm::replace_all(
@ -92,6 +102,7 @@ ASTJSONTest::ASTJSONTest(string const& _filename)
string source;
string line;
string const delimiter("// ----");
string const failMarker("// failAfter:");
while (getline(file, line))
{
if (boost::algorithm::starts_with(line, sourceDelimiter))
@ -105,6 +116,16 @@ ASTJSONTest::ASTJSONTest(string const& _filename)
);
source = string();
}
else if (boost::algorithm::starts_with(line, failMarker))
{
string state = line.substr(failMarker.size());
boost::algorithm::trim(state);
if (compilerStateMap.find(state) == compilerStateMap.end())
BOOST_THROW_EXCEPTION(runtime_error("Unsupported compiler state (" + state + ") in test contract file"));
if (m_expectedFailAfter.has_value())
BOOST_THROW_EXCEPTION(runtime_error("Duplicated \"failAfter\" directive"));
m_expectedFailAfter = compilerStateMap.at(state);
}
else if (!line.empty() && !boost::algorithm::starts_with(line, delimiter))
source += line + "\n";
}
@ -141,8 +162,7 @@ TestCase::TestResult ASTJSONTest::run(ostream& _stream, string const& _linePrefi
if (!c.parseAndAnalyze(variant.stopAfter))
{
// We just want to export so raise fatal analysis errors only
if (c.state() < CompilerStack::State::ParsedAndImported)
if (!m_expectedFailAfter.has_value() || m_expectedFailAfter.value() + 1 != c.state())
{
SourceReferenceFormatter formatter(_stream, c, _formatted, false);
formatter.printErrorInformation(c.errors());

View File

@ -90,6 +90,7 @@ private:
) const;
std::vector<TestVariant> m_variants;
std::optional<CompilerStack::State> m_expectedFailAfter;
std::vector<std::pair<std::string, std::string>> m_sources;
};