cheatah
Source

tests/purrc/string_cr_test.cpp

1// Copyright (c) 2026 BigBrain LLC. MIT-licensed (see LICENSE).
2// Original work; see ACKNOWLEDGMENTS.md for the open-source ideas we build upon.
3// Compile-run unit tests for the `string` module: one test per function. Each
4// writes a tiny .purr that calls a single string function, compiles it with
5// purrc, runs it under the cheatah runtime, and asserts the exact stdout.
6// Complements the in-process unit tests (stdlib/tests/string_test.cpp) and the
7// per-module system-level test (StdlibE2E.String).
8//
9// List-returning functions (split/splitlines) are joined back into a single
10// deterministic string before printing. Booleans print as True/False.
11#include "e2e_harness.hpp"
13TEST(StringCompileRun, Upper) {
14 e2e::expect_e2e("string_upper", R"PURR(import io
15import string
16io.print(string.upper("meow"))
17)PURR", "MEOW\n");
20TEST(StringCompileRun, Lower) {
21 e2e::expect_e2e("string_lower", R"PURR(import io
22import string
23io.print(string.lower("MeOw"))
24)PURR", "meow\n");
27TEST(StringCompileRun, Capitalize) {
28 e2e::expect_e2e("string_capitalize", R"PURR(import io
29import string
30io.print(string.capitalize("hello world"))
31)PURR", "Hello world\n");
34TEST(StringCompileRun, Title) {
35 e2e::expect_e2e("string_title", R"PURR(import io
36import string
37io.print(string.title("hello world"))
38)PURR", "Hello World\n");
41TEST(StringCompileRun, Swapcase) {
42 e2e::expect_e2e("string_swapcase", R"PURR(import io
43import string
44io.print(string.swapcase("Meow"))
45)PURR", "mEOW\n");
48TEST(StringCompileRun, Strip) {
49 e2e::expect_e2e("string_strip", R"PURR(import io
50import string
51io.print(string.strip(" meow \t"))
52)PURR", "meow\n");
55TEST(StringCompileRun, Lstrip) {
56 e2e::expect_e2e("string_lstrip", R"PURR(import io
57import string
58io.print(string.lstrip("xxmeow", "x"))
59)PURR", "meow\n");
62TEST(StringCompileRun, Rstrip) {
63 e2e::expect_e2e("string_rstrip", R"PURR(import io
64import string
65io.print(string.rstrip("meowyy", "y"))
66)PURR", "meow\n");
69TEST(StringCompileRun, Startswith) {
70 e2e::expect_e2e("string_startswith", R"PURR(import io
71import string
72io.print(string.startswith("meow", "me"))
73)PURR", "True\n");
76TEST(StringCompileRun, Endswith) {
77 e2e::expect_e2e("string_endswith", R"PURR(import io
78import string
79io.print(string.endswith("meow", "ow"))
80)PURR", "True\n");
83TEST(StringCompileRun, Contains) {
84 e2e::expect_e2e("string_contains", R"PURR(import io
85import string
86io.print(string.contains("meow", "eo"))
87)PURR", "True\n");
90TEST(StringCompileRun, Find) {
91 e2e::expect_e2e("string_find", R"PURR(import io
92import string
93io.print(string.find("meow meow", "meow"))
94)PURR", "0\n");
97TEST(StringCompileRun, Rfind) {
98 e2e::expect_e2e("string_rfind", R"PURR(import io
99import string
100io.print(string.rfind("meow meow", "meow"))
101)PURR", "5\n");
104TEST(StringCompileRun, Count) {
105 e2e::expect_e2e("string_count", R"PURR(import io
106import string
107io.print(string.count("meow meow meow", "meow"))
108)PURR", "3\n");
111TEST(StringCompileRun, Replace) {
112 e2e::expect_e2e("string_replace", R"PURR(import io
113import string
114io.print(string.replace("meow meow", "e", "3"))
115)PURR", "m3ow m3ow\n");
118TEST(StringCompileRun, Split) {
119 e2e::expect_e2e("string_split", R"PURR(import io
120import string
121io.print(string.join("|", string.split("a,b,c", ",")))
122)PURR", "a|b|c\n");
125TEST(StringCompileRun, SplitWhitespace) {
126 e2e::expect_e2e("string_split_ws", R"PURR(import io
127import string
128io.print(string.join("|", string.split(" a b ")))
129)PURR", "a|b\n");
132TEST(StringCompileRun, Splitlines) {
133 e2e::expect_e2e("string_splitlines", R"PURR(import io
134import string
135io.print(string.join("|", string.splitlines("a\nb\nc")))
136)PURR", "a|b|c\n");
139TEST(StringCompileRun, Capwords) {
140 e2e::expect_e2e("string_capwords", R"PURR(import io
141import string
142io.print(string.capwords("the quick brown"))
143)PURR", "The Quick Brown\n");
146TEST(StringCompileRun, Join) {
147 e2e::expect_e2e("string_join", R"PURR(import io
148import string
149io.print(string.join("-", ["a", "b", "c"]))
150)PURR", "a-b-c\n");
153TEST(StringCompileRun, Ljust) {
154 e2e::expect_e2e("string_ljust", R"PURR(import io
155import string
156io.print(string.ljust("cat", 5))
157)PURR", "cat \n");
160TEST(StringCompileRun, Rjust) {
161 e2e::expect_e2e("string_rjust", R"PURR(import io
162import string
163io.print(string.rjust("cat", 5))
164)PURR", " cat\n");
167TEST(StringCompileRun, Center) {
168 e2e::expect_e2e("string_center", R"PURR(import io
169import string
170io.print(string.center("cat", 9, "*"))
171)PURR", "***cat***\n");
174TEST(StringCompileRun, Zfill) {
175 e2e::expect_e2e("string_zfill", R"PURR(import io
176import string
177io.print(string.zfill("-42", 5))
178)PURR", "-0042\n");
181TEST(StringCompileRun, Isdigit) {
182 e2e::expect_e2e("string_isdigit", R"PURR(import io
183import string
184io.print(string.isdigit("123"))
185)PURR", "True\n");
188TEST(StringCompileRun, Isalpha) {
189 e2e::expect_e2e("string_isalpha", R"PURR(import io
190import string
191io.print(string.isalpha("abc"))
192)PURR", "True\n");
195TEST(StringCompileRun, Isalnum) {
196 e2e::expect_e2e("string_isalnum", R"PURR(import io
197import string
198io.print(string.isalnum("abc123"))
199)PURR", "True\n");
202TEST(StringCompileRun, Isspace) {
203 e2e::expect_e2e("string_isspace", R"PURR(import io
204import string
205io.print(string.isspace(" \t\n"))
206)PURR", "True\n");
209TEST(StringCompileRun, Isupper) {
210 e2e::expect_e2e("string_isupper", R"PURR(import io
211import string
212io.print(string.isupper("MEOW"))
213)PURR", "True\n");
216TEST(StringCompileRun, Islower) {
217 e2e::expect_e2e("string_islower", R"PURR(import io
218import string
219io.print(string.islower("meow"))
220)PURR", "True\n");