1 //===-- StringLexerTest.cpp -------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Utility/StringLexer.h"
11 #include "gtest/gtest.h"
12 
13 using namespace lldb_utility;
14 
15 TEST(StringLexerTest, GetUnlexed) {
16   StringLexer l("foo");
17   EXPECT_EQ("foo", l.GetUnlexed());
18   l.Next();
19   EXPECT_EQ("oo", l.GetUnlexed());
20   l.Next();
21   l.Next();
22   EXPECT_EQ("", l.GetUnlexed());
23 }
24 
25 TEST(StringLexerTest, HasAtLeast) {
26   StringLexer l("foo");
27   EXPECT_FALSE(l.HasAtLeast(5));
28   EXPECT_FALSE(l.HasAtLeast(4));
29   EXPECT_TRUE(l.HasAtLeast(3));
30   EXPECT_TRUE(l.HasAtLeast(2));
31   EXPECT_TRUE(l.HasAtLeast(1));
32 
33   l.Next();
34   EXPECT_FALSE(l.HasAtLeast(5));
35   EXPECT_FALSE(l.HasAtLeast(4));
36   EXPECT_FALSE(l.HasAtLeast(3));
37   EXPECT_TRUE(l.HasAtLeast(2));
38   EXPECT_TRUE(l.HasAtLeast(1));
39 
40   l.Next();
41   l.Next();
42   EXPECT_FALSE(l.HasAtLeast(5));
43   EXPECT_FALSE(l.HasAtLeast(4));
44   EXPECT_FALSE(l.HasAtLeast(3));
45   EXPECT_FALSE(l.HasAtLeast(2));
46   EXPECT_FALSE(l.HasAtLeast(1));
47 }
48 
49 TEST(StringLexerTest, AdvanceIf) {
50   StringLexer l("foobar");
51 
52   EXPECT_FALSE(l.AdvanceIf("oo"));
53   // Skip the "fo" part.
54   EXPECT_TRUE(l.AdvanceIf("fo"));
55   EXPECT_FALSE(l.AdvanceIf("obarz"));
56   // Skip the remaining string.
57   EXPECT_TRUE(l.AdvanceIf("obar"));
58 
59   EXPECT_FALSE(l.AdvanceIf("obarz"));
60   EXPECT_FALSE(l.AdvanceIf("foo"));
61   EXPECT_FALSE(l.AdvanceIf("o"));
62   EXPECT_FALSE(l.AdvanceIf(" "));
63 }
64 
65 TEST(StringLexerTest, PutBack) {
66   StringLexer l("foo");
67 
68   l.Next();
69   l.PutBack(1);
70   EXPECT_EQ("foo", l.GetUnlexed());
71 
72   l.Next();
73   l.Next();
74   l.Next();
75   l.PutBack(2);
76   EXPECT_EQ("oo", l.GetUnlexed());
77 
78   l.PutBack(1);
79   EXPECT_EQ("foo", l.GetUnlexed());
80 }
81 
82 TEST(StringLexerTest, Peek) {
83   StringLexer l("foo");
84 
85   EXPECT_EQ('f', l.Peek());
86   l.Next();
87   EXPECT_EQ('o', l.Peek());
88   l.Next();
89   EXPECT_EQ('o', l.Peek());
90 }
91 
92 TEST(StringLexerTest, Next) {
93   StringLexer l("foo");
94   EXPECT_EQ('f', l.Next());
95   EXPECT_EQ('o', l.Next());
96   EXPECT_EQ('o', l.Next());
97 }
98 
99 TEST(StringLexerTest, NextIf) {
100   StringLexer l("foo");
101 
102   EXPECT_FALSE(l.NextIf('\0'));
103   EXPECT_FALSE(l.NextIf(' '));
104   EXPECT_FALSE(l.NextIf('o'));
105 
106   EXPECT_TRUE(l.NextIf('f'));
107 
108   EXPECT_FALSE(l.NextIf('\0'));
109   EXPECT_FALSE(l.NextIf(' '));
110   EXPECT_FALSE(l.NextIf('f'));
111 
112   EXPECT_TRUE(l.NextIf('o'));
113 
114   EXPECT_FALSE(l.NextIf('\0'));
115   EXPECT_FALSE(l.NextIf(' '));
116   EXPECT_FALSE(l.NextIf('f'));
117 
118   EXPECT_TRUE(l.NextIf('o'));
119 }
120 
121 TEST(StringLexerTest, NextIfList) {
122   StringLexer l("foo");
123 
124   EXPECT_FALSE(l.NextIf({'\0', ' ', 'o'}).first);
125 
126   auto r = l.NextIf({'f'});
127   EXPECT_TRUE(r.first);
128   EXPECT_EQ('f', r.second);
129 
130   EXPECT_FALSE(l.NextIf({'\0', ' ', 'f'}).first);
131 
132   r = l.NextIf({'f', 'o'});
133   EXPECT_TRUE(r.first);
134   EXPECT_EQ('o', r.second);
135 
136   EXPECT_FALSE(l.NextIf({'\0', ' ', 'f'}).first);
137 
138   r = l.NextIf({'*', 'f', 'o', 'o'});
139   EXPECT_TRUE(r.first);
140   EXPECT_EQ('o', r.second);
141 }
142