summaryrefslogtreecommitdiffhomepage
path: root/test-grammer.cpp
blob: 1734da2279218ab80ade57a3a301cc1efe3ea72b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "bnf.h"
#include "cpp.h"
#include "cppbnf.h"
#include "lexer.h"
#include "grammer.h"
#include "minicc.h"
#include "debug.h"

#include <boost/algorithm/string.hpp>

#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include <algorithm>
#include <cctype>
#include <deque>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>

using namespace std::string_literals;

class GrammerTest: public ::testing::Test
{
protected:
 GrammerTest() {
  //debug = true;
 }
 ~GrammerTest() {
 }

 // Accessors for friend
 size_t minimumSymbolsNeeded(Gram::Compiler& compiler, std::vector<std::string> list) {
  return compiler.minimumSymbolsNeeded(list);
 }
 size_t minimumSymbolsNeeded(Gram::Compiler& compiler, std::string s) {
  return compiler.minimumSymbolsNeeded(s);
 }
};

TEST_F(GrammerTest, minimumSymbolsNeeded) {
 auto bnf = SubBNF(CPPBNF::GetCppBNFGram(), "translation-unit");

 Gram::Compiler compiler(bnf, "translation-unit");

 EXPECT_EQ(minimumSymbolsNeeded(compiler, std::vector<std::string>{}), 0);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "translation-unit"), 0);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "logical-or-expression"), 1);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "assignment-expression"), 1);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "declaration"), 1);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "block-declaration"), 3);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "simple-declaration"), 2);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "asm-declaration"), 5);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "namespace-alias-definition"), 5);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "using-declaration"), 4);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "using-enum-declaration"), 4);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "using-directive"), 4);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "static_assert-declaration"), 5);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "alias-declaration"), 7);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "opaque-enum-declaration"), 3);
 EXPECT_EQ(minimumSymbolsNeeded(compiler, "function-definition"), 4);
}