4#include <gtest/gtest.h>
17class ParserAnalysis :
public ::testing::Test {
23 std::vector<std::string> m_postlex;
25 Logger::FuncCallback *m_log_callback_save;
26 void *m_log_callback_arg_save;
29 static void LoggerCallback(
void *param,
Logger::LogLevelType level,
const char * str,
bool flush) {
30 ParserAnalysis *p =
static_cast<ParserAnalysis *
> (param);
31 fprintf(stdout,
"%s", str);
42 Logger::Instance()->SaveCallback(m_log_callback_save, m_log_callback_arg_save);
43 Logger::Instance()->SetCallback(&LoggerCallback,
this);
49 Logger::Instance()->SetCallback(m_log_callback_save, m_log_callback_arg_save);
60 ast = m_parser->
Parse(str);
64 int Count(
TermID token_id) {
66 for (
int c = 0; c < ast->size(); c++) {
67 if ((*ast)[c].second->m_id == token_id) {
74 std::string LexOut() {
76 for (
int i = 0; i < m_postlex.size(); i++) {
134TEST_F(ParserAnalysis, ErrorLimit1) {
137 AstAnalysis analysis(*rt_default, rt_default->m_diag.get());
139 ASSERT_EQ(10, rt_default->m_diag->m_error_limit);
143 ASSERT_NO_THROW(term = Parse(
"1\\1 + 1:Int8; 1\\1 + 1:Int8; 1\\1 + 1:Int8",
nullptr,
nullptr, rt_default));
144 ASSERT_TRUE(analysis.Analyze(term, term));
146 ASSERT_TRUE(m_output.find(
"fatal error") == std::string::npos) << m_output;
149TEST_F(ParserAnalysis, ErrorLimit2) {
152 AstAnalysis analysis(*rt_default, rt_default->m_diag.get());
154 ASSERT_EQ(10, rt_default->m_diag->m_error_limit);
158 ASSERT_NO_THROW(term = Parse(
"1:Int8 + 1\\1; 1:Int8 + 1\\1; 1:Int8 + 1\\1",
nullptr,
nullptr, rt_default));
159 ASSERT_FALSE(analysis.Analyze(term, term));
161 ASSERT_TRUE(m_output.find(
"fatal error: 3 generated") != std::string::npos) << m_output;
165TEST_F(ParserAnalysis, ErrorLimit3) {
169 RuntimePtr rt = RunTime::Init({
"--nlc-error-limit=1"});
172 ASSERT_EQ(1, rt->m_diag->m_error_limit);
174 ASSERT_NO_THROW(term = Parse(
"1\\1 + 1:Int8; 1\\1 + 1:Int8; 1\\1 + 1:Int8",
nullptr,
nullptr, rt));
175 ASSERT_TRUE(analysis.Analyze(term, term));
177 ASSERT_TRUE(m_output.find(
"fatal error") == std::string::npos) << m_output;
180TEST_F(ParserAnalysis, ErrorLimit4) {
184 RuntimePtr rt = RunTime::Init({
"--nlc-error-limit=1"});
187 ASSERT_EQ(1, rt->m_diag->m_error_limit);
189 ASSERT_NO_THROW(term = Parse(
"1:Int8 + 1\\1; 1:Int8 + 1\\1; 1:Int8 + 1\\1",
nullptr,
nullptr, rt));
190 ASSERT_FALSE(analysis.Analyze(term, term));
191 ASSERT_TRUE(m_output.find(
"fatal error: too many errors emitted 1, stopping now [-nlc-error-limit=]") != std::string::npos) << m_output;
TermPtr Parse(const std::string str, bool expand_module=false)
std::shared_ptr< Term > TermPtr
std::shared_ptr< RunTime > RuntimePtr
std::shared_ptr< Macro > MacroPtr
std::shared_ptr< Diag > DiagPtr
std::string & trim(std::string &s, const char *t=ws)