xref: /llvm-project/mlir/unittests/Support/IndentedOstreamTest.cpp (revision 123e8c735d0765a12e65f1daefcbe23a059e26fd)
19b851527SJacques Pienaar //===- IndentedOstreamTest.cpp - Indented raw ostream Tests ---------------===//
29b851527SJacques Pienaar //
39b851527SJacques Pienaar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49b851527SJacques Pienaar // See https://llvm.org/LICENSE.txt for license information.
59b851527SJacques Pienaar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69b851527SJacques Pienaar //
79b851527SJacques Pienaar //===----------------------------------------------------------------------===//
89b851527SJacques Pienaar 
99b851527SJacques Pienaar #include "mlir/Support/IndentedOstream.h"
109b851527SJacques Pienaar #include "gmock/gmock.h"
119b851527SJacques Pienaar 
129b851527SJacques Pienaar using namespace mlir;
139b851527SJacques Pienaar using ::testing::StrEq;
149b851527SJacques Pienaar 
159b851527SJacques Pienaar TEST(FormatTest, SingleLine) {
169b851527SJacques Pienaar   std::string str;
179b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
189b851527SJacques Pienaar   raw_indented_ostream ros(os);
199b851527SJacques Pienaar   ros << 10;
20*ffc80de8SJOE1994   EXPECT_THAT(str, StrEq("10"));
219b851527SJacques Pienaar }
229b851527SJacques Pienaar 
239b851527SJacques Pienaar TEST(FormatTest, SimpleMultiLine) {
249b851527SJacques Pienaar   std::string str;
259b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
269b851527SJacques Pienaar   raw_indented_ostream ros(os);
279b851527SJacques Pienaar   ros << "a";
289b851527SJacques Pienaar   ros << "b";
299b851527SJacques Pienaar   ros << "\n";
309b851527SJacques Pienaar   ros << "c";
319b851527SJacques Pienaar   ros << "\n";
32*ffc80de8SJOE1994   EXPECT_THAT(str, StrEq("ab\nc\n"));
339b851527SJacques Pienaar }
349b851527SJacques Pienaar 
359b851527SJacques Pienaar TEST(FormatTest, SimpleMultiLineIndent) {
369b851527SJacques Pienaar   std::string str;
379b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
389b851527SJacques Pienaar   raw_indented_ostream ros(os);
399b851527SJacques Pienaar   ros.indent(2) << "a";
409b851527SJacques Pienaar   ros.indent(4) << "b";
419b851527SJacques Pienaar   ros << "\n";
429b851527SJacques Pienaar   ros << "c";
439b851527SJacques Pienaar   ros << "\n";
44*ffc80de8SJOE1994   EXPECT_THAT(str, StrEq("  a    b\n    c\n"));
459b851527SJacques Pienaar }
469b851527SJacques Pienaar 
479b851527SJacques Pienaar TEST(FormatTest, SingleRegion) {
489b851527SJacques Pienaar   std::string str;
499b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
509b851527SJacques Pienaar   raw_indented_ostream ros(os);
519b851527SJacques Pienaar   ros << "before\n";
529b851527SJacques Pienaar   {
539b851527SJacques Pienaar     raw_indented_ostream::DelimitedScope scope(ros);
549b851527SJacques Pienaar     ros << "inside " << 10;
559b851527SJacques Pienaar     ros << "\n   two\n";
569b851527SJacques Pienaar     {
579b851527SJacques Pienaar       raw_indented_ostream::DelimitedScope scope(ros, "{\n", "\n}\n");
589b851527SJacques Pienaar       ros << "inner inner";
599b851527SJacques Pienaar     }
609b851527SJacques Pienaar   }
619b851527SJacques Pienaar   ros << "after";
629b851527SJacques Pienaar   const auto *expected =
639b851527SJacques Pienaar       R"(before
649b851527SJacques Pienaar   inside 10
659b851527SJacques Pienaar      two
669b851527SJacques Pienaar   {
679b851527SJacques Pienaar     inner inner
689b851527SJacques Pienaar   }
699b851527SJacques Pienaar after)";
70*ffc80de8SJOE1994   EXPECT_THAT(str, StrEq(expected));
719b851527SJacques Pienaar 
729b851527SJacques Pienaar   // Repeat the above with inline form.
739b851527SJacques Pienaar   str.clear();
749b851527SJacques Pienaar   ros << "before\n";
759b851527SJacques Pienaar   ros.scope().os << "inside " << 10 << "\n   two\n";
769b851527SJacques Pienaar   ros.scope().os.scope("{\n", "\n}\n").os << "inner inner";
779b851527SJacques Pienaar   ros << "after";
789b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq(expected));
799b851527SJacques Pienaar }
809b851527SJacques Pienaar 
819b851527SJacques Pienaar TEST(FormatTest, Reindent) {
829b851527SJacques Pienaar   std::string str;
839b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
849b851527SJacques Pienaar   raw_indented_ostream ros(os);
859b851527SJacques Pienaar 
869b851527SJacques Pienaar   // String to print with some additional empty lines at the start and lines
879b851527SJacques Pienaar   // with just spaces.
889b851527SJacques Pienaar   const auto *desc = R"(
899b851527SJacques Pienaar 
909b851527SJacques Pienaar 
919b851527SJacques Pienaar          First line
929b851527SJacques Pienaar                  second line
939b851527SJacques Pienaar 
949b851527SJacques Pienaar 
959b851527SJacques Pienaar   )";
96ca6bd9cdSMogball   ros.printReindented(desc);
979b851527SJacques Pienaar   const auto *expected =
989b851527SJacques Pienaar       R"(First line
999b851527SJacques Pienaar         second line
1009b851527SJacques Pienaar 
1019b851527SJacques Pienaar 
1029b851527SJacques Pienaar )";
103*ffc80de8SJOE1994   EXPECT_THAT(str, StrEq(expected));
1049b851527SJacques Pienaar }
105c304be7cSScott Todd 
106c304be7cSScott Todd TEST(FormatTest, ReindentLineEndings) {
107c304be7cSScott Todd   std::string str;
108c304be7cSScott Todd   llvm::raw_string_ostream os(str);
109c304be7cSScott Todd   raw_indented_ostream ros(os);
110c304be7cSScott Todd 
111c304be7cSScott Todd   // Similar string as the previous test, but with \r\n (Windows style) line
112c304be7cSScott Todd   // breaks. Note that C++'s internal string representation uses \n, so just
113c304be7cSScott Todd   // running the previous test as-is on Windows is not sufficient.
114c304be7cSScott Todd   const auto *desc =
115c304be7cSScott Todd       "\r\n\r\n\r\n         First line\r\n                 second line";
116c304be7cSScott Todd   ros.printReindented(desc);
117c304be7cSScott Todd   const auto *expected = "First line\r\n        second line";
118*ffc80de8SJOE1994   EXPECT_THAT(str, StrEq(expected));
119c304be7cSScott Todd }
120