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 
TEST(FormatTest,SingleLine)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;
209b851527SJacques Pienaar   ros.flush();
219b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq("10"));
229b851527SJacques Pienaar }
239b851527SJacques Pienaar 
TEST(FormatTest,SimpleMultiLine)249b851527SJacques Pienaar TEST(FormatTest, SimpleMultiLine) {
259b851527SJacques Pienaar   std::string str;
269b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
279b851527SJacques Pienaar   raw_indented_ostream ros(os);
289b851527SJacques Pienaar   ros << "a";
299b851527SJacques Pienaar   ros << "b";
309b851527SJacques Pienaar   ros << "\n";
319b851527SJacques Pienaar   ros << "c";
329b851527SJacques Pienaar   ros << "\n";
339b851527SJacques Pienaar   ros.flush();
349b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq("ab\nc\n"));
359b851527SJacques Pienaar }
369b851527SJacques Pienaar 
TEST(FormatTest,SimpleMultiLineIndent)379b851527SJacques Pienaar TEST(FormatTest, SimpleMultiLineIndent) {
389b851527SJacques Pienaar   std::string str;
399b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
409b851527SJacques Pienaar   raw_indented_ostream ros(os);
419b851527SJacques Pienaar   ros.indent(2) << "a";
429b851527SJacques Pienaar   ros.indent(4) << "b";
439b851527SJacques Pienaar   ros << "\n";
449b851527SJacques Pienaar   ros << "c";
459b851527SJacques Pienaar   ros << "\n";
469b851527SJacques Pienaar   ros.flush();
479b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq("  a    b\n    c\n"));
489b851527SJacques Pienaar }
499b851527SJacques Pienaar 
TEST(FormatTest,SingleRegion)509b851527SJacques Pienaar TEST(FormatTest, SingleRegion) {
519b851527SJacques Pienaar   std::string str;
529b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
539b851527SJacques Pienaar   raw_indented_ostream ros(os);
549b851527SJacques Pienaar   ros << "before\n";
559b851527SJacques Pienaar   {
569b851527SJacques Pienaar     raw_indented_ostream::DelimitedScope scope(ros);
579b851527SJacques Pienaar     ros << "inside " << 10;
589b851527SJacques Pienaar     ros << "\n   two\n";
599b851527SJacques Pienaar     {
609b851527SJacques Pienaar       raw_indented_ostream::DelimitedScope scope(ros, "{\n", "\n}\n");
619b851527SJacques Pienaar       ros << "inner inner";
629b851527SJacques Pienaar     }
639b851527SJacques Pienaar   }
649b851527SJacques Pienaar   ros << "after";
659b851527SJacques Pienaar   ros.flush();
669b851527SJacques Pienaar   const auto *expected =
679b851527SJacques Pienaar       R"(before
689b851527SJacques Pienaar   inside 10
699b851527SJacques Pienaar      two
709b851527SJacques Pienaar   {
719b851527SJacques Pienaar     inner inner
729b851527SJacques Pienaar   }
739b851527SJacques Pienaar after)";
749b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq(expected));
759b851527SJacques Pienaar 
769b851527SJacques Pienaar   // Repeat the above with inline form.
779b851527SJacques Pienaar   str.clear();
789b851527SJacques Pienaar   ros << "before\n";
799b851527SJacques Pienaar   ros.scope().os << "inside " << 10 << "\n   two\n";
809b851527SJacques Pienaar   ros.scope().os.scope("{\n", "\n}\n").os << "inner inner";
819b851527SJacques Pienaar   ros << "after";
829b851527SJacques Pienaar   ros.flush();
839b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq(expected));
849b851527SJacques Pienaar }
859b851527SJacques Pienaar 
TEST(FormatTest,Reindent)869b851527SJacques Pienaar TEST(FormatTest, Reindent) {
879b851527SJacques Pienaar   std::string str;
889b851527SJacques Pienaar   llvm::raw_string_ostream os(str);
899b851527SJacques Pienaar   raw_indented_ostream ros(os);
909b851527SJacques Pienaar 
919b851527SJacques Pienaar   // String to print with some additional empty lines at the start and lines
929b851527SJacques Pienaar   // with just spaces.
939b851527SJacques Pienaar   const auto *desc = R"(
949b851527SJacques Pienaar 
959b851527SJacques Pienaar 
969b851527SJacques Pienaar          First line
979b851527SJacques Pienaar                  second line
989b851527SJacques Pienaar 
999b851527SJacques Pienaar 
1009b851527SJacques Pienaar   )";
101*ca6bd9cdSMogball   ros.printReindented(desc);
1029b851527SJacques Pienaar   ros.flush();
1039b851527SJacques Pienaar   const auto *expected =
1049b851527SJacques Pienaar       R"(First line
1059b851527SJacques Pienaar         second line
1069b851527SJacques Pienaar 
1079b851527SJacques Pienaar 
1089b851527SJacques Pienaar )";
1099b851527SJacques Pienaar   EXPECT_THAT(os.str(), StrEq(expected));
1109b851527SJacques Pienaar }
111