diff options
Diffstat (limited to 'src/pastify-test.cc')
-rw-r--r-- | src/pastify-test.cc | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/pastify-test.cc b/src/pastify-test.cc new file mode 100644 index 00000000..1a4c7f56 --- /dev/null +++ b/src/pastify-test.cc @@ -0,0 +1,198 @@ +/* + * Copyright © 2021 Christian Persch + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <config.h> + +#include <glib.h> + +#include "pastify.hh" + +using namespace std::literals; + +static bool +assert_streq(std::string_view const& str1, + std::string_view const& str2) +{ + auto s1 = std::string{str1}; + auto s2 = std::string{str2}; + + g_assert_cmpstr(s1.c_str(), ==, s2.c_str()); + return true; +} + +static void +test_pastify(std::string_view const& str, + std::string_view const& expected, + bool insert_brackets = false, + bool c1 = false) +{ + auto rv = vte::terminal::pastify_string(str, insert_brackets, c1); + assert_streq(rv, expected); + + /* Check idempotence */ + if (!insert_brackets) { + auto rv2 = vte::terminal::pastify_string(rv, false, false); + assert_streq(rv, rv2); + } +} + +static void +test_pastify_brackets_c0(void) +{ + test_pastify("0"sv, "\e[200~0\e[201~"sv, true, false); +} + +static void +test_pastify_brackets_c1(void) +{ + test_pastify("0"sv, "\xc2\x9b" "200~0\xc2\x9b" "201~"sv, true, true); +} + +static void +test_pastify_control(std::string const& ctrl) +{ + test_pastify(ctrl, ""sv); + test_pastify(ctrl + ctrl, ""sv); + test_pastify("abc"s + ctrl, "abc"sv); + test_pastify("abc"s + ctrl + ctrl, "abc"sv); + test_pastify(ctrl + "abc"s, "abc"sv); + test_pastify(ctrl + ctrl + "abc"s, "abc"sv); + test_pastify("abc"s + ctrl + "abc"s, "abcabc"sv); + test_pastify("abc"s + ctrl + ctrl + "abc"s, "abcabc"sv); +} + +static void +test_pastify_control_c0(void const* ptr) +{ + auto const c = *reinterpret_cast<unsigned char const*>(ptr); + auto ctrl = ""s; + ctrl.push_back(c); + + test_pastify_control(ctrl); +} + +static void +test_pastify_control_c1(void const* ptr) +{ + auto const c = *reinterpret_cast<unsigned char const*>(ptr); + + auto ctrl = ""s; + ctrl.push_back(0xc2); + ctrl.push_back(c); + + test_pastify_control(ctrl); +} + +struct TestString { +public: + char const* m_str; + char const* m_expected; + int m_line; + + TestString() = default; + consteval TestString(char const* str, + char const* expected, + int line = __builtin_LINE()) noexcept : + m_str(str), + m_expected(expected), + m_line(line) + { + } +}; + +consteval auto +identity_test(char const *str, + int line = __builtin_LINE()) noexcept +{ + return TestString(str, str, line); +} + +static void +test_pastify_string(void const* ptr) +{ + auto str = reinterpret_cast<TestString const*>(ptr); + test_pastify(str->m_str, str->m_expected); +} + +static constinit TestString const test_strings[] = { + /* Controls */ + identity_test("\x09"), /* HT passes through */ + identity_test("\x0d"), /* CR passes through */ + + /* Non-C1 but starting with a 0xC2 byte */ + identity_test("abc\xc2\xa0xyz"), + + /* CR/LF conversion */ + TestString("\x0a", "\x0d"), + TestString("\x0d\x0a", "\x0d\x0d"), +}; + +int +main(int argc, + char* argv[]) +{ + g_test_init(&argc, &argv, nullptr); + + g_test_add_func("/vte/pastify/brackets/c0", test_pastify_brackets_c0); + g_test_add_func("/vte/pastify/brackets/c1", test_pastify_brackets_c1); + + /* C0 controls */ + for (auto c = 0; c < 0x20; ++c) { + /* NUL, HT, CR, LF */ + if (c == 0 || c == 0x09 || c == 0x0a || c == 0x0d) + continue; + + char path[64]; + g_snprintf(path, sizeof(path), "/vte/pastify/controls/c0/%02x", c); + + auto ptr = g_new(unsigned char, 1); + *ptr = c; + + g_test_add_data_func_full(path, ptr, test_pastify_control_c0, g_free); + } + + /* DEL too */ + { + auto const path = "/vte/pastify/controls/c0/7f"; + auto ptr = g_new(unsigned char, 1); + *ptr = 0x7f; + + g_test_add_data_func_full(path, ptr, test_pastify_control_c0, g_free); + } + + /* C1 controls */ + for (auto c = 0x80; c < 0xa0; ++c) { + char path[64]; + g_snprintf(path, sizeof(path), "/vte/pastify/controls/c1/%02x", c); + + auto ptr = g_new(unsigned char, 1); + *ptr = c; + + g_test_add_data_func_full(path, ptr, test_pastify_control_c1, g_free); + } + + /* Extra test strings */ + for (auto i = 0u; i < G_N_ELEMENTS (test_strings); ++i) { + auto const* str = &test_strings[i]; + + char path[64]; + g_snprintf(path, sizeof(path), "/vte/pastify/string/%d", str->m_line); + g_test_add_data_func(path, str, test_pastify_string); + } + + return g_test_run(); +} |