LineIteratorTest.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //===- LineIterator.cpp - Unit tests --------------------------------------===//
  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. #include "llvm/Support/LineIterator.h"
  9. #include "llvm/Support/MemoryBuffer.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. using namespace llvm::sys;
  13. namespace {
  14. TEST(LineIteratorTest, Basic) {
  15. std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("line 1\n"
  16. "line 2\n"
  17. "line 3");
  18. line_iterator I = line_iterator(*Buffer), E;
  19. EXPECT_FALSE(I.is_at_eof());
  20. EXPECT_NE(E, I);
  21. EXPECT_EQ("line 1", *I);
  22. EXPECT_EQ(1, I.line_number());
  23. ++I;
  24. EXPECT_EQ("line 2", *I);
  25. EXPECT_EQ(2, I.line_number());
  26. ++I;
  27. EXPECT_EQ("line 3", *I);
  28. EXPECT_EQ(3, I.line_number());
  29. ++I;
  30. EXPECT_TRUE(I.is_at_eof());
  31. EXPECT_EQ(E, I);
  32. }
  33. TEST(LineIteratorTest, CommentAndBlankSkipping) {
  34. std::unique_ptr<MemoryBuffer> Buffer(
  35. MemoryBuffer::getMemBuffer("line 1\n"
  36. "line 2\n"
  37. "# Comment 1\n"
  38. "\n"
  39. "line 5\n"
  40. "\n"
  41. "# Comment 2"));
  42. line_iterator I = line_iterator(*Buffer, true, '#'), E;
  43. EXPECT_FALSE(I.is_at_eof());
  44. EXPECT_NE(E, I);
  45. EXPECT_EQ("line 1", *I);
  46. EXPECT_EQ(1, I.line_number());
  47. ++I;
  48. EXPECT_EQ("line 2", *I);
  49. EXPECT_EQ(2, I.line_number());
  50. ++I;
  51. EXPECT_EQ("line 5", *I);
  52. EXPECT_EQ(5, I.line_number());
  53. ++I;
  54. EXPECT_TRUE(I.is_at_eof());
  55. EXPECT_EQ(E, I);
  56. }
  57. TEST(LineIteratorTest, CommentSkippingKeepBlanks) {
  58. std::unique_ptr<MemoryBuffer> Buffer(
  59. MemoryBuffer::getMemBuffer("line 1\n"
  60. "line 2\n"
  61. "# Comment 1\n"
  62. "# Comment 2\n"
  63. "\n"
  64. "line 6\n"
  65. "\n"
  66. "# Comment 3"));
  67. line_iterator I = line_iterator(*Buffer, false, '#'), E;
  68. EXPECT_FALSE(I.is_at_eof());
  69. EXPECT_NE(E, I);
  70. EXPECT_EQ("line 1", *I);
  71. EXPECT_EQ(1, I.line_number());
  72. ++I;
  73. EXPECT_EQ("line 2", *I);
  74. EXPECT_EQ(2, I.line_number());
  75. ++I;
  76. EXPECT_EQ("", *I);
  77. EXPECT_EQ(5, I.line_number());
  78. ++I;
  79. EXPECT_EQ("line 6", *I);
  80. EXPECT_EQ(6, I.line_number());
  81. ++I;
  82. EXPECT_EQ("", *I);
  83. EXPECT_EQ(7, I.line_number());
  84. ++I;
  85. EXPECT_TRUE(I.is_at_eof());
  86. EXPECT_EQ(E, I);
  87. }
  88. TEST(LineIteratorTest, BlankSkipping) {
  89. std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("\n\n\n"
  90. "line 1\n"
  91. "\n\n\n"
  92. "line 2\n"
  93. "\n\n\n");
  94. line_iterator I = line_iterator(*Buffer), E;
  95. EXPECT_FALSE(I.is_at_eof());
  96. EXPECT_NE(E, I);
  97. EXPECT_EQ("line 1", *I);
  98. EXPECT_EQ(4, I.line_number());
  99. ++I;
  100. EXPECT_EQ("line 2", *I);
  101. EXPECT_EQ(8, I.line_number());
  102. ++I;
  103. EXPECT_TRUE(I.is_at_eof());
  104. EXPECT_EQ(E, I);
  105. }
  106. TEST(LineIteratorTest, BlankKeeping) {
  107. std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("\n\n"
  108. "line 3\n"
  109. "\n"
  110. "line 5\n"
  111. "\n\n");
  112. line_iterator I = line_iterator(*Buffer, false), E;
  113. EXPECT_FALSE(I.is_at_eof());
  114. EXPECT_NE(E, I);
  115. EXPECT_EQ("", *I);
  116. EXPECT_EQ(1, I.line_number());
  117. ++I;
  118. EXPECT_EQ("", *I);
  119. EXPECT_EQ(2, I.line_number());
  120. ++I;
  121. EXPECT_EQ("line 3", *I);
  122. EXPECT_EQ(3, I.line_number());
  123. ++I;
  124. EXPECT_EQ("", *I);
  125. EXPECT_EQ(4, I.line_number());
  126. ++I;
  127. EXPECT_EQ("line 5", *I);
  128. EXPECT_EQ(5, I.line_number());
  129. ++I;
  130. EXPECT_EQ("", *I);
  131. EXPECT_EQ(6, I.line_number());
  132. ++I;
  133. EXPECT_EQ("", *I);
  134. EXPECT_EQ(7, I.line_number());
  135. ++I;
  136. EXPECT_TRUE(I.is_at_eof());
  137. EXPECT_EQ(E, I);
  138. }
  139. TEST(LineIteratorTest, EmptyBuffers) {
  140. std::unique_ptr<MemoryBuffer> Buffer = MemoryBuffer::getMemBuffer("");
  141. EXPECT_TRUE(line_iterator(*Buffer).is_at_eof());
  142. EXPECT_EQ(line_iterator(), line_iterator(*Buffer));
  143. EXPECT_TRUE(line_iterator(*Buffer, false).is_at_eof());
  144. EXPECT_EQ(line_iterator(), line_iterator(*Buffer, false));
  145. Buffer = MemoryBuffer::getMemBuffer("\n\n\n");
  146. EXPECT_TRUE(line_iterator(*Buffer).is_at_eof());
  147. EXPECT_EQ(line_iterator(), line_iterator(*Buffer));
  148. Buffer = MemoryBuffer::getMemBuffer("# foo\n"
  149. "\n"
  150. "# bar");
  151. EXPECT_TRUE(line_iterator(*Buffer, true, '#').is_at_eof());
  152. EXPECT_EQ(line_iterator(), line_iterator(*Buffer, true, '#'));
  153. Buffer = MemoryBuffer::getMemBuffer("\n"
  154. "# baz\n"
  155. "\n");
  156. EXPECT_TRUE(line_iterator(*Buffer, true, '#').is_at_eof());
  157. EXPECT_EQ(line_iterator(), line_iterator(*Buffer, true, '#'));
  158. }
  159. } // anonymous namespace