#include "bnf.h" #include "cpp.h" #include "cppbnf.h" #include "lexer.h" #include "grammer.h" #include "minicc.h" #include "debug.h" #include #include "gmock/gmock.h" #include "gtest/gtest.h" #include #include #include #include #include #include #include #include class CppTest: public ::testing::Test { protected: CppTest() { //debug = true; } ~CppTest() { } }; TEST_F(CppTest, preprocessing_tokenize) { CPP cpp; auto pp_tokens = cpp.preprocessing_tokenize("int main() { return 1; }"); ASSERT_EQ(pp_tokens.size(), 9); auto tokens = cpp.tokens_from_pptokens(pp_tokens); ASSERT_EQ(tokens.size(), 9); auto nodes = cpp.analysis(tokens); ASSERT_EQ(nodes.size(), 43); } TEST_F(CppTest, preprocessing_tokenize_empty) { CPP cpp; auto pp_tokens = cpp.preprocessing_tokenize(""); ASSERT_EQ(pp_tokens.size(), 0); auto tokens = cpp.tokens_from_pptokens(pp_tokens); ASSERT_EQ(tokens.size(), 0); auto nodes = cpp.analysis(tokens); ASSERT_EQ(nodes.size(), 1); ASSERT_EQ(nodes[0].type, "translation-unit"); } TEST_F(CppTest, preprocessing_tokenize_compile_error) { CPP cpp; auto ppTree = cpp.preprocessing_tokenize("in ma"); auto tokens = cpp.tokens_from_pptokens(ppTree); ASSERT_EQ(tokens.size(), 2); try { auto nodes = cpp.analysis(tokens); } catch (const std::exception& ex) { EXPECT_EQ(ex.what(), "Compile error"s); return; } FAIL() << "Exception expected"; } TEST_F(CppTest, compile_1) { CPP cpp; cpp.compile("int main() { return 1; }"); } TEST_F(CppTest, compile_add) { CPP cpp; cpp.compile("int main() { return 1 + 2; }"); } TEST_F(CppTest, compile_123) { CPP cpp; cpp.compile("int main() { return 1 + 2 + 3; }"); } TEST_F(CppTest, compile_parentheses_left) { CPP cpp; cpp.compile("int main() { return (3 + 1) + 2; }"); } TEST_F(CppTest, compile_parentheses_right) { CPP cpp; cpp.compile("int main() { return 3 + (1 + 2); }"); } TEST_F(CppTest, compile_add_mul) { CPP cpp; cpp.compile("int main() { return 1 + (2 * 2); }"); } TEST_F(CppTest, compile_2_times) { CPP cpp; cpp.compile("int main() { return (1 + 2) * 2; }"); cpp.compile("int main() { return 1 + 2 * 2; }"); }