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