blob: ea2d21e95b7de38dfb4c2f2c7f9cba58811d1af6 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <sstream>
#include <gtest/gtest.h>
#include "lib/fostr/indent.h"
namespace fostr {
namespace {
// Tests basic indentation with the default 'indent by' value.
TEST(Indent, Basics) {
std::ostringstream os;
EXPECT_EQ(0, fostr::GetIdentLevel(os));
os << "items:";
os << fostr::Indent;
EXPECT_EQ(1, fostr::GetIdentLevel(os));
os << fostr::NewLine << "item 1";
os << fostr::NewLine << "item 2";
os << fostr::Indent;
EXPECT_EQ(2, fostr::GetIdentLevel(os));
os << fostr::NewLine << "item 2A";
os << fostr::NewLine << "item 2B";
os << fostr::Outdent;
EXPECT_EQ(1, fostr::GetIdentLevel(os));
os << fostr::NewLine << "item 3";
os << fostr::Outdent;
EXPECT_EQ(0, fostr::GetIdentLevel(os));
EXPECT_EQ(
"items:"
"\n item 1"
"\n item 2"
"\n item 2A"
"\n item 2B"
"\n item 3",
os.str());
}
// Tests indentation with an initial non-zero level.
TEST(Indent, InitialLevel) {
std::ostringstream os;
os << fostr::IdentLevel(2);
EXPECT_EQ(2, fostr::GetIdentLevel(os));
os << "items:";
os << fostr::Indent;
EXPECT_EQ(3, fostr::GetIdentLevel(os));
os << fostr::NewLine << "item 1";
os << fostr::NewLine << "item 2";
os << fostr::Indent;
EXPECT_EQ(4, fostr::GetIdentLevel(os));
os << fostr::NewLine << "item 2A";
os << fostr::NewLine << "item 2B";
os << fostr::Outdent;
EXPECT_EQ(3, fostr::GetIdentLevel(os));
os << fostr::NewLine << "item 3";
os << fostr::Outdent;
EXPECT_EQ(2, fostr::GetIdentLevel(os));
EXPECT_EQ(
"items:"
"\n item 1"
"\n item 2"
"\n item 2A"
"\n item 2B"
"\n item 3",
os.str());
}
// Tests indentation with a specific 'indent by' value.
TEST(Indent, IndentBy) {
std::ostringstream os;
os << fostr::IdentBy(2);
os << "items:";
os << fostr::Indent;
os << fostr::NewLine << "item 1";
os << fostr::NewLine << "item 2";
os << fostr::Indent;
os << fostr::NewLine << "item 2A";
os << fostr::NewLine << "item 2B";
os << fostr::Outdent;
os << fostr::NewLine << "item 3";
os << fostr::Outdent;
EXPECT_EQ(
"items:"
"\n item 1"
"\n item 2"
"\n item 2A"
"\n item 2B"
"\n item 3",
os.str());
}
// Tests that level underflow works as expected.
TEST(Indent, Underflow) {
std::ostringstream os;
os << fostr::Outdent;
EXPECT_EQ(-1, fostr::GetIdentLevel(os));
os << fostr::Outdent;
EXPECT_EQ(-2, fostr::GetIdentLevel(os));
os << fostr::Outdent;
EXPECT_EQ(-3, fostr::GetIdentLevel(os));
os << fostr::NewLine << "should not be indented";
os << fostr::Indent;
EXPECT_EQ(-2, fostr::GetIdentLevel(os));
os << fostr::NewLine << "should not be indented";
os << fostr::Indent;
EXPECT_EQ(-1, fostr::GetIdentLevel(os));
os << fostr::NewLine << "should not be indented";
os << fostr::Indent;
EXPECT_EQ(0, fostr::GetIdentLevel(os));
os << fostr::NewLine << "should not be indented";
os << fostr::Indent;
EXPECT_EQ(1, fostr::GetIdentLevel(os));
os << fostr::NewLine << "should be indented";
EXPECT_EQ(
"\nshould not be indented"
"\nshould not be indented"
"\nshould not be indented"
"\nshould not be indented"
"\n should be indented",
os.str());
}
} // namespace
} // namespace fostr