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. Each4
// writes a tiny .purr that calls a single string function, compiles it with5
// 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 the7
// per-module system-level test (StdlibE2E.String).8
//9
// List-returning functions (split/splitlines) are joined back into a single10
// deterministic string before printing. Booleans print as True/False.11
#include "e2e_harness.hpp"13
TEST(StringCompileRun, Upper) {14
e2e::expect_e2e("string_upper", R"PURR(import io15
import string16
io.print(string.upper("meow"))17
)PURR", "MEOW\n");18
}20
TEST(StringCompileRun, Lower) {21
e2e::expect_e2e("string_lower", R"PURR(import io22
import string23
io.print(string.lower("MeOw"))24
)PURR", "meow\n");25
}27
TEST(StringCompileRun, Capitalize) {28
e2e::expect_e2e("string_capitalize", R"PURR(import io29
import string30
io.print(string.capitalize("hello world"))31
)PURR", "Hello world\n");32
}34
TEST(StringCompileRun, Title) {35
e2e::expect_e2e("string_title", R"PURR(import io36
import string37
io.print(string.title("hello world"))38
)PURR", "Hello World\n");39
}41
TEST(StringCompileRun, Swapcase) {42
e2e::expect_e2e("string_swapcase", R"PURR(import io43
import string44
io.print(string.swapcase("Meow"))45
)PURR", "mEOW\n");46
}48
TEST(StringCompileRun, Strip) {49
e2e::expect_e2e("string_strip", R"PURR(import io50
import string51
io.print(string.strip(" meow \t"))52
)PURR", "meow\n");53
}55
TEST(StringCompileRun, Lstrip) {56
e2e::expect_e2e("string_lstrip", R"PURR(import io57
import string58
io.print(string.lstrip("xxmeow", "x"))59
)PURR", "meow\n");60
}62
TEST(StringCompileRun, Rstrip) {63
e2e::expect_e2e("string_rstrip", R"PURR(import io64
import string65
io.print(string.rstrip("meowyy", "y"))66
)PURR", "meow\n");67
}69
TEST(StringCompileRun, Startswith) {70
e2e::expect_e2e("string_startswith", R"PURR(import io71
import string72
io.print(string.startswith("meow", "me"))73
)PURR", "True\n");74
}76
TEST(StringCompileRun, Endswith) {77
e2e::expect_e2e("string_endswith", R"PURR(import io78
import string79
io.print(string.endswith("meow", "ow"))80
)PURR", "True\n");81
}83
TEST(StringCompileRun, Contains) {84
e2e::expect_e2e("string_contains", R"PURR(import io85
import string86
io.print(string.contains("meow", "eo"))87
)PURR", "True\n");88
}90
TEST(StringCompileRun, Find) {91
e2e::expect_e2e("string_find", R"PURR(import io92
import string93
io.print(string.find("meow meow", "meow"))94
)PURR", "0\n");95
}97
TEST(StringCompileRun, Rfind) {98
e2e::expect_e2e("string_rfind", R"PURR(import io99
import string100
io.print(string.rfind("meow meow", "meow"))101
)PURR", "5\n");102
}104
TEST(StringCompileRun, Count) {105
e2e::expect_e2e("string_count", R"PURR(import io106
import string107
io.print(string.count("meow meow meow", "meow"))108
)PURR", "3\n");109
}111
TEST(StringCompileRun, Replace) {112
e2e::expect_e2e("string_replace", R"PURR(import io113
import string114
io.print(string.replace("meow meow", "e", "3"))115
)PURR", "m3ow m3ow\n");116
}118
TEST(StringCompileRun, Split) {119
e2e::expect_e2e("string_split", R"PURR(import io120
import string121
io.print(string.join("|", string.split("a,b,c", ",")))122
)PURR", "a|b|c\n");123
}125
TEST(StringCompileRun, SplitWhitespace) {126
e2e::expect_e2e("string_split_ws", R"PURR(import io127
import string128
io.print(string.join("|", string.split(" a b ")))129
)PURR", "a|b\n");130
}132
TEST(StringCompileRun, Splitlines) {133
e2e::expect_e2e("string_splitlines", R"PURR(import io134
import string135
io.print(string.join("|", string.splitlines("a\nb\nc")))136
)PURR", "a|b|c\n");137
}139
TEST(StringCompileRun, Capwords) {140
e2e::expect_e2e("string_capwords", R"PURR(import io141
import string142
io.print(string.capwords("the quick brown"))143
)PURR", "The Quick Brown\n");144
}146
TEST(StringCompileRun, Join) {147
e2e::expect_e2e("string_join", R"PURR(import io148
import string149
io.print(string.join("-", ["a", "b", "c"]))150
)PURR", "a-b-c\n");151
}153
TEST(StringCompileRun, Ljust) {154
e2e::expect_e2e("string_ljust", R"PURR(import io155
import string156
io.print(string.ljust("cat", 5))157
)PURR", "cat \n");158
}160
TEST(StringCompileRun, Rjust) {161
e2e::expect_e2e("string_rjust", R"PURR(import io162
import string163
io.print(string.rjust("cat", 5))164
)PURR", " cat\n");165
}167
TEST(StringCompileRun, Center) {168
e2e::expect_e2e("string_center", R"PURR(import io169
import string170
io.print(string.center("cat", 9, "*"))171
)PURR", "***cat***\n");172
}174
TEST(StringCompileRun, Zfill) {175
e2e::expect_e2e("string_zfill", R"PURR(import io176
import string177
io.print(string.zfill("-42", 5))178
)PURR", "-0042\n");179
}181
TEST(StringCompileRun, Isdigit) {182
e2e::expect_e2e("string_isdigit", R"PURR(import io183
import string184
io.print(string.isdigit("123"))185
)PURR", "True\n");186
}188
TEST(StringCompileRun, Isalpha) {189
e2e::expect_e2e("string_isalpha", R"PURR(import io190
import string191
io.print(string.isalpha("abc"))192
)PURR", "True\n");193
}195
TEST(StringCompileRun, Isalnum) {196
e2e::expect_e2e("string_isalnum", R"PURR(import io197
import string198
io.print(string.isalnum("abc123"))199
)PURR", "True\n");200
}202
TEST(StringCompileRun, Isspace) {203
e2e::expect_e2e("string_isspace", R"PURR(import io204
import string205
io.print(string.isspace(" \t\n"))206
)PURR", "True\n");207
}209
TEST(StringCompileRun, Isupper) {210
e2e::expect_e2e("string_isupper", R"PURR(import io211
import string212
io.print(string.isupper("MEOW"))213
)PURR", "True\n");214
}216
TEST(StringCompileRun, Islower) {217
e2e::expect_e2e("string_islower", R"PURR(import io218
import string219
io.print(string.islower("meow"))220
)PURR", "True\n");221
}