gout

A static git page generator
git clone https://git.bracken.jp/gout.git
Log | Files | Refs | README | LICENSE

commit 80ac051dd10bb13b189f700f0361bcfe80a80eb4
parent 2b0888c8135bcfa41bc6e661a5b69a9c2a9deb72
Author: Chris Bracken <chris@bracken.jp>
Date:   Fri, 25 Jul 2025 07:11:15 -0700

Add tests for print_gopher_link_padded

Diffstat:
Mformat_tests.c | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+), 0 deletions(-)

diff --git a/format_tests.c b/format_tests.c @@ -377,3 +377,125 @@ UTEST(print_gopher_link, EmptyString) { free(buf); } + +UTEST(print_gopher_link_padded, BasicPadding) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "hello", 10, ' '); + fclose(out); + + EXPECT_STREQ("hello ", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, NoPadding) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "hello", 5, ' '); + fclose(out); + + EXPECT_STREQ("hello", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, Truncation) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "hello world", 10, ' '); + fclose(out); + + EXPECT_STREQ("hello wor…", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, SpecialChars) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "a|\t\r\nb", 20, '.'); + fclose(out); + + EXPECT_STREQ("a\\| b.........", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, MultiByte) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "こんにちは", 10, ' '); + fclose(out); + + EXPECT_STREQ("こんにちは ", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, ZeroWidth) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "hello", 0, ' '); + fclose(out); + + EXPECT_STREQ("", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, NoPadChar) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + print_gopher_link_padded(out, "hello", 10, '\0'); + fclose(out); + + EXPECT_STREQ("hello", buf); + + free(buf); +} + +UTEST(print_gopher_link_padded, ComplexEmoji) { + char* buf = NULL; + size_t size = 0; + FILE* out = open_memstream(&buf, &size); + ASSERT_NE(NULL, out); + + /* UTF-8 encoding of Unicode extended grapheme cluster for woman health worker + with medium-dark skin tone. This emoji is a Unicode emoji ZWJ sequence + composed of 5 code points. */ + const char* emoji = // 👩🏾‍⚕️ + "\xF0\x9F\x91\xA9" // U+1F469: Woman 👩 + "\xF0\x9F\x8F\xBE" // U+1F3FE: Emoji modifier Fitzpatrick type 5 🏾 + "\xE2\x80\x8D" // U+200D: Zero-width joiner + "\xE2\x9A\x95" // U+2695: Staff of Aesculapius ⚕ + "\xEF\xB8\x8F"; // U+FE0F: Variation selector 16 (colour emoji) + print_gopher_link_padded(out, emoji, 10, ' '); + fclose(out); + + /* Expect 1 emoji, 9 spaces. */ + EXPECT_STREQ("👩🏾‍⚕️ ", buf); + + free(buf); +}