
This PR implements a unicode and ANSI escape code aware function to trim and pad strings. This is a break-out from #121860.
119 lines
3.9 KiB
C++
119 lines
3.9 KiB
C++
//===-- AnsiTerminalTest.cpp ----------------------------------------------===//
|
||
//
|
||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
// See https://llvm.org/LICENSE.txt for license information.
|
||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
//
|
||
//===----------------------------------------------------------------------===//
|
||
|
||
#include "gtest/gtest.h"
|
||
|
||
#include "lldb/Utility/AnsiTerminal.h"
|
||
|
||
using namespace lldb_private;
|
||
|
||
TEST(AnsiTerminal, Empty) { EXPECT_EQ("", ansi::FormatAnsiTerminalCodes("")); }
|
||
|
||
TEST(AnsiTerminal, WhiteSpace) {
|
||
EXPECT_EQ(" ", ansi::FormatAnsiTerminalCodes(" "));
|
||
EXPECT_EQ(" ", ansi::StripAnsiTerminalCodes(" "));
|
||
}
|
||
|
||
TEST(AnsiTerminal, AtEnd) {
|
||
EXPECT_EQ("abc\x1B[30m",
|
||
ansi::FormatAnsiTerminalCodes("abc${ansi.fg.black}"));
|
||
|
||
EXPECT_EQ("abc", ansi::StripAnsiTerminalCodes("abc\x1B[30m"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, AtStart) {
|
||
EXPECT_EQ("\x1B[30mabc",
|
||
ansi::FormatAnsiTerminalCodes("${ansi.fg.black}abc"));
|
||
|
||
EXPECT_EQ("abc", ansi::StripAnsiTerminalCodes("\x1B[30mabc"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, KnownPrefix) {
|
||
EXPECT_EQ("${ansi.fg.redish}abc",
|
||
ansi::FormatAnsiTerminalCodes("${ansi.fg.redish}abc"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, Unknown) {
|
||
EXPECT_EQ("${ansi.fg.foo}abc",
|
||
ansi::FormatAnsiTerminalCodes("${ansi.fg.foo}abc"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, Incomplete) {
|
||
EXPECT_EQ("abc${ansi.", ansi::FormatAnsiTerminalCodes("abc${ansi."));
|
||
}
|
||
|
||
TEST(AnsiTerminal, Twice) {
|
||
EXPECT_EQ("\x1B[30m\x1B[31mabc",
|
||
ansi::FormatAnsiTerminalCodes("${ansi.fg.black}${ansi.fg.red}abc"));
|
||
|
||
EXPECT_EQ("abc", ansi::StripAnsiTerminalCodes("\x1B[30m\x1B[31mabc"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, Basic) {
|
||
EXPECT_EQ(
|
||
"abc\x1B[31mabc\x1B[0mabc",
|
||
ansi::FormatAnsiTerminalCodes("abc${ansi.fg.red}abc${ansi.normal}abc"));
|
||
|
||
EXPECT_EQ("abcabcabc",
|
||
ansi::StripAnsiTerminalCodes("abc\x1B[31mabc\x1B[0mabc"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, InvalidEscapeCode) {
|
||
EXPECT_EQ("abc\x1B[31kabcabc",
|
||
ansi::StripAnsiTerminalCodes("abc\x1B[31kabc\x1B[0mabc"));
|
||
}
|
||
|
||
TEST(AnsiTerminal, FindNextAnsiSequenceBasic) {
|
||
auto [left, escape, right] = ansi::FindNextAnsiSequence("foo\x1B[31mbar");
|
||
EXPECT_EQ("foo", left);
|
||
EXPECT_EQ("\x1B[31m", escape);
|
||
EXPECT_EQ("bar", right);
|
||
}
|
||
|
||
TEST(AnsiTerminal, FindNextAnsiSequenceIncompleteStart) {
|
||
auto [left, escape, right] =
|
||
ansi::FindNextAnsiSequence("foo\x1B[bar\x1B[31mbaz");
|
||
EXPECT_EQ("foo\x1B[bar", left);
|
||
EXPECT_EQ("\x1B[31m", escape);
|
||
EXPECT_EQ("baz", right);
|
||
}
|
||
|
||
TEST(AnsiTerminal, FindNextAnsiSequenceEscapeStart) {
|
||
auto [left, escape, right] = ansi::FindNextAnsiSequence("\x1B[31mfoo");
|
||
EXPECT_EQ("", left);
|
||
EXPECT_EQ("\x1B[31m", escape);
|
||
EXPECT_EQ("foo", right);
|
||
}
|
||
|
||
TEST(AnsiTerminal, TrimAndPad) {
|
||
// Test basic ASCII.
|
||
EXPECT_EQ(" ", ansi::TrimAndPad("", 5));
|
||
EXPECT_EQ("foo ", ansi::TrimAndPad("foo", 5));
|
||
EXPECT_EQ("fooba", ansi::TrimAndPad("fooba", 5));
|
||
EXPECT_EQ("fooba", ansi::TrimAndPad("foobar", 5));
|
||
|
||
// Simple test that ANSI escape codes don't contribute to the visible width.
|
||
EXPECT_EQ("\x1B[30m ", ansi::TrimAndPad("\x1B[30m", 5));
|
||
EXPECT_EQ("\x1B[30mfoo ", ansi::TrimAndPad("\x1B[30mfoo", 5));
|
||
EXPECT_EQ("\x1B[30mfooba", ansi::TrimAndPad("\x1B[30mfooba", 5));
|
||
EXPECT_EQ("\x1B[30mfooba", ansi::TrimAndPad("\x1B[30mfoobar", 5));
|
||
|
||
// Test that we include as many escape codes as we can.
|
||
EXPECT_EQ("fooba\x1B[30m", ansi::TrimAndPad("fooba\x1B[30m", 5));
|
||
EXPECT_EQ("fooba\x1B[30m\x1B[34m",
|
||
ansi::TrimAndPad("fooba\x1B[30m\x1B[34m", 5));
|
||
EXPECT_EQ("fooba\x1B[30m\x1B[34m",
|
||
ansi::TrimAndPad("fooba\x1B[30m\x1B[34mr", 5));
|
||
|
||
// Test Unicode.
|
||
EXPECT_EQ("❤️ ", ansi::TrimAndPad("❤️", 5));
|
||
EXPECT_EQ(" ❤️", ansi::TrimAndPad(" ❤️", 5));
|
||
EXPECT_EQ("12❤️4❤️", ansi::TrimAndPad("12❤️4❤️", 5));
|
||
EXPECT_EQ("12❤️45", ansi::TrimAndPad("12❤️45❤️", 5));
|
||
}
|