File: test_token.cpp

package info (click to toggle)
libpog 0.5.3-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 3,644 kB
  • sloc: cpp: 51,038; ansic: 239; makefile: 14; python: 11; sh: 11
file content (81 lines) | stat: -rw-r--r-- 2,215 bytes parent folder | download
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <gmock/gmock.h>

#include <pog/token.h>

using namespace pog;
using namespace ::testing;

class TestToken : public ::testing::Test {};

TEST_F(TestToken,
SimpleTokenWithoutSymbol) {
	Token<int> t(1, "abc", std::vector<std::string>{"s1", "s2"});

	EXPECT_EQ(t.get_index(), 1u);
	EXPECT_EQ(t.get_pattern(), "abc");
	EXPECT_EQ(t.get_active_in_states(), (std::vector<std::string>{"s1", "s2"}));
	EXPECT_EQ(t.get_symbol(), nullptr);
	EXPECT_THAT(t.get_regexp(), A<const re2::RE2*>());

	EXPECT_FALSE(t.has_symbol());
	EXPECT_FALSE(t.has_action());
	EXPECT_FALSE(t.has_transition_to_state());
}

TEST_F(TestToken,
SimpleTokenWithSymbol) {
	Symbol<int> s(1, SymbolKind::Nonterminal, "a");
	Token<int> t(1, "abc", std::vector<std::string>{"s1", "s2"}, &s);

	EXPECT_EQ(t.get_index(), 1u);
	EXPECT_EQ(t.get_pattern(), "abc");
	EXPECT_EQ(t.get_active_in_states(), (std::vector<std::string>{"s1", "s2"}));
	EXPECT_EQ(t.get_symbol(), &s);
	EXPECT_THAT(t.get_regexp(), A<const re2::RE2*>());

	EXPECT_TRUE(t.has_symbol());
	EXPECT_FALSE(t.has_action());
	EXPECT_FALSE(t.has_transition_to_state());
}

TEST_F(TestToken,
TransitionToState) {
	Token<int> t(1, "abc", std::vector<std::string>{"s1", "s2"});
	t.set_transition_to_state("dest_state");

	EXPECT_EQ(t.get_index(), 1u);
	EXPECT_EQ(t.get_pattern(), "abc");
	EXPECT_EQ(t.get_active_in_states(), (std::vector<std::string>{"s1", "s2"}));
	EXPECT_EQ(t.get_symbol(), nullptr);
	EXPECT_THAT(t.get_regexp(), A<const re2::RE2*>());

	EXPECT_FALSE(t.has_symbol());
	EXPECT_FALSE(t.has_action());
	EXPECT_TRUE(t.has_transition_to_state());
	EXPECT_EQ(t.get_transition_to_state(), "dest_state");
}

TEST_F(TestToken,
AddActiveInState) {
	Token<int> t(1, "abc", std::vector<std::string>{"s1", "s2"});

	t.add_active_in_state("s3");

	EXPECT_EQ(t.get_active_in_states(), (std::vector<std::string>{"s1", "s2", "s3"}));
}

TEST_F(TestToken,
Action) {
	bool called = false;

	Token<int> t(1, "abc", std::vector<std::string>{"s1", "s2"});
	t.set_action([&](std::string_view str) -> int {
		called = true;
		return static_cast<int>(str.length());
	});

	EXPECT_EQ(t.get_index(), 1u);
	EXPECT_TRUE(t.has_action());
	EXPECT_EQ(t.perform_action("abcdef"), 6);
	EXPECT_TRUE(called);
}