xref: /llvm-project/mlir/unittests/Support/IndentedOstreamTest.cpp (revision 123e8c735d0765a12e65f1daefcbe23a059e26fd)
1 //===- IndentedOstreamTest.cpp - Indented raw ostream 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 
9 #include "mlir/Support/IndentedOstream.h"
10 #include "gmock/gmock.h"
11 
12 using namespace mlir;
13 using ::testing::StrEq;
14 
15 TEST(FormatTest, SingleLine) {
16   std::string str;
17   llvm::raw_string_ostream os(str);
18   raw_indented_ostream ros(os);
19   ros << 10;
20   EXPECT_THAT(str, StrEq("10"));
21 }
22 
23 TEST(FormatTest, SimpleMultiLine) {
24   std::string str;
25   llvm::raw_string_ostream os(str);
26   raw_indented_ostream ros(os);
27   ros << "a";
28   ros << "b";
29   ros << "\n";
30   ros << "c";
31   ros << "\n";
32   EXPECT_THAT(str, StrEq("ab\nc\n"));
33 }
34 
35 TEST(FormatTest, SimpleMultiLineIndent) {
36   std::string str;
37   llvm::raw_string_ostream os(str);
38   raw_indented_ostream ros(os);
39   ros.indent(2) << "a";
40   ros.indent(4) << "b";
41   ros << "\n";
42   ros << "c";
43   ros << "\n";
44   EXPECT_THAT(str, StrEq("  a    b\n    c\n"));
45 }
46 
47 TEST(FormatTest, SingleRegion) {
48   std::string str;
49   llvm::raw_string_ostream os(str);
50   raw_indented_ostream ros(os);
51   ros << "before\n";
52   {
53     raw_indented_ostream::DelimitedScope scope(ros);
54     ros << "inside " << 10;
55     ros << "\n   two\n";
56     {
57       raw_indented_ostream::DelimitedScope scope(ros, "{\n", "\n}\n");
58       ros << "inner inner";
59     }
60   }
61   ros << "after";
62   const auto *expected =
63       R"(before
64   inside 10
65      two
66   {
67     inner inner
68   }
69 after)";
70   EXPECT_THAT(str, StrEq(expected));
71 
72   // Repeat the above with inline form.
73   str.clear();
74   ros << "before\n";
75   ros.scope().os << "inside " << 10 << "\n   two\n";
76   ros.scope().os.scope("{\n", "\n}\n").os << "inner inner";
77   ros << "after";
78   EXPECT_THAT(os.str(), StrEq(expected));
79 }
80 
81 TEST(FormatTest, Reindent) {
82   std::string str;
83   llvm::raw_string_ostream os(str);
84   raw_indented_ostream ros(os);
85 
86   // String to print with some additional empty lines at the start and lines
87   // with just spaces.
88   const auto *desc = R"(
89 
90 
91          First line
92                  second line
93 
94 
95   )";
96   ros.printReindented(desc);
97   const auto *expected =
98       R"(First line
99         second line
100 
101 
102 )";
103   EXPECT_THAT(str, StrEq(expected));
104 }
105 
106 TEST(FormatTest, ReindentLineEndings) {
107   std::string str;
108   llvm::raw_string_ostream os(str);
109   raw_indented_ostream ros(os);
110 
111   // Similar string as the previous test, but with \r\n (Windows style) line
112   // breaks. Note that C++'s internal string representation uses \n, so just
113   // running the previous test as-is on Windows is not sufficient.
114   const auto *desc =
115       "\r\n\r\n\r\n         First line\r\n                 second line";
116   ros.printReindented(desc);
117   const auto *expected = "First line\r\n        second line";
118   EXPECT_THAT(str, StrEq(expected));
119 }
120