10#include "gtest/gtest.h"
24static bool text_is(
const token &tok,
const char *expected) {
25 size_t len = strlen(expected);
30 return memcmp(tok.
text.
begin(), expected, len) == 0;
43static void expect_token(
const token &tok,
token_kind kind,
const char *text) {
44 EXPECT_EQ(tok.
kind, kind);
45 EXPECT_TRUE(text_is(tok, text))
46 <<
"expected token text \"" << text <<
"\" but got \""
54TEST(LexerTest, EmptyInput) {
59TEST(LexerTest, WhitespaceOnly) {
64TEST(LexerTest, EndIsSticky) {
72TEST(LexerTest, Punctuation) {
75 ASSERT_EQ(tokens.
size(), 8u);
86TEST(LexerTest, DoubleColon) {
90 ASSERT_EQ(tokens.
size(), 2u);
95TEST(LexerTest, AndOperator) {
98 ASSERT_EQ(tokens.
size(), 1u);
102TEST(LexerTest, OrOperator) {
105 ASSERT_EQ(tokens.
size(), 1u);
116TEST(LexerTest, SingleDigitNumber) {
119 ASSERT_EQ(tokens.
size(), 1u);
123TEST(LexerTest, MultiDigitNumber) {
126 ASSERT_EQ(tokens.
size(), 1u);
130TEST(LexerTest, NumberList) {
133 ASSERT_EQ(tokens.
size(), 5u);
145TEST(LexerTest, SimpleWord) {
148 ASSERT_EQ(tokens.
size(), 1u);
152TEST(LexerTest, WordWithDash) {
156 ASSERT_EQ(tokens.
size(), 1u);
160TEST(LexerTest, WordWithUnderscore) {
163 ASSERT_EQ(tokens.
size(), 1u);
167TEST(LexerTest, LeadingMinusIsWord) {
173 ASSERT_EQ(tokens.
size(), 1u);
177TEST(LexerTest, WhitespaceBreaksWords) {
181 ASSERT_EQ(tokens.
size(), 3u);
191TEST(LexerTest, UidTrait) {
194 ASSERT_EQ(tokens.
size(), 4u);
201TEST(LexerTest, NegatedUidTrait) {
204 ASSERT_EQ(tokens.
size(), 5u);
212TEST(LexerTest, AndGroup) {
215 ASSERT_EQ(tokens.
size(), 11u);
229TEST(LexerTest, OrGroup) {
232 ASSERT_EQ(tokens.
size(), 9u);
244TEST(LexerTest, WildcardWithLiterals) {
247 ASSERT_EQ(tokens.
size(), 5u);
255TEST(LexerTest, IndexExpression) {
258 ASSERT_EQ(tokens.
size(), 7u);
272TEST(LexerTest, LeadingAndTrailingWhitespace) {
275 ASSERT_EQ(tokens.
size(), 4u);
282TEST(LexerTest, WhitespaceAroundOperators) {
285 ASSERT_EQ(tokens.
size(), 9u);
293TEST(LexerTest, UnknownCharacter) {
296 ASSERT_EQ(tokens.
size(), 1u);
300TEST(LexerTest, LoneAmpersandIsUnknown) {
303 ASSERT_EQ(tokens.
size(), 1u);
307TEST(LexerTest, LonePipeIsUnknown) {
310 ASSERT_EQ(tokens.
size(), 1u);
314TEST(LexerTest, TripleAmpersand) {
318 ASSERT_EQ(tokens.
size(), 2u);
327TEST(LexerTest, PeekDoesNotAdvance) {
332 EXPECT_TRUE(text_is(lex.
peek(),
"uid"));
342TEST(LexerTest, PeekAtEnd) {
#define TEST(test_suite_name, test_name)
kmp_str_ref is a non-owning string class (similar to llvm::StringRef).
size_t length() const
Get the length of the string.
const char * begin() const
Iterator support (raw pointers work as iterators for contiguous storage)
kmp_vector is a vector class for managing small vectors.
void push_back(const T &value)
Add a new element to the end of the vector.