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