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