🐐 String uppercase/lowercase functions

This commit is contained in:
2026-04-24 18:10:50 +02:00
parent 37050e3e3b
commit dbaf01b6a3
10 changed files with 109 additions and 3 deletions

View File

@@ -740,6 +740,36 @@ builtin_tests = [
('SCINDE(",a,", ",")', Program([], [ExpressionStatement(BuiltIn("SCINDE", [String(",a,"), String(",")]))]), ValList([ValStr(""), ValStr("a"), ValStr("")])),
# SCINDE: empty delimiter (split into chars)
('SCINDE("abc", "")', Program([], [ExpressionStatement(BuiltIn("SCINDE", [String("abc"), String("")]))]), ValList([ValStr("a"), ValStr("b"), ValStr("c")])),
# MAIVSCVLA: basic lowercase→uppercase
('MAIVSCVLA("hello")', Program([], [ExpressionStatement(BuiltIn("MAIVSCVLA", [String("hello")]))]), ValStr("HELLO")),
# MAIVSCVLA: mixed case
('MAIVSCVLA("HeLLo")', Program([], [ExpressionStatement(BuiltIn("MAIVSCVLA", [String("HeLLo")]))]), ValStr("HELLO")),
# MAIVSCVLA: already uppercase (idempotence)
('MAIVSCVLA("HELLO")', Program([], [ExpressionStatement(BuiltIn("MAIVSCVLA", [String("HELLO")]))]), ValStr("HELLO")),
# MAIVSCVLA: empty string
('MAIVSCVLA("")', Program([], [ExpressionStatement(BuiltIn("MAIVSCVLA", [String("")]))]), ValStr("")),
# MAIVSCVLA: Roman-numeral-shaped ASCII (case-only, not numeral-aware)
('MAIVSCVLA("xii")', Program([], [ExpressionStatement(BuiltIn("MAIVSCVLA", [String("xii")]))]), ValStr("XII")),
# MAIVSCVLA: non-alphabetic chars unchanged
('MAIVSCVLA("a,b!1")', Program([], [ExpressionStatement(BuiltIn("MAIVSCVLA", [String("a,b!1")]))]), ValStr("A,B!1")),
# MAIVSCVLA: via variable
('DESIGNA s VT "foo"\nDIC(MAIVSCVLA(s))', Program([], [Designa(ID("s"), String("foo")), ExpressionStatement(BuiltIn("DIC", [BuiltIn("MAIVSCVLA", [ID("s")])]))]), ValStr("FOO"), "FOO\n"),
# MAIVSCVLA: concatenated with &
('MAIVSCVLA("hi") & "!"', Program([], [ExpressionStatement(BinOp(BuiltIn("MAIVSCVLA", [String("hi")]), String("!"), "SYMBOL_AMPERSAND"))]), ValStr("HI!")),
# MINVSCVLA: basic uppercase→lowercase
('MINVSCVLA("HELLO")', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [String("HELLO")]))]), ValStr("hello")),
# MINVSCVLA: mixed case
('MINVSCVLA("HeLLo")', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [String("HeLLo")]))]), ValStr("hello")),
# MINVSCVLA: already lowercase (idempotence)
('MINVSCVLA("hello")', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [String("hello")]))]), ValStr("hello")),
# MINVSCVLA: empty string
('MINVSCVLA("")', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [String("")]))]), ValStr("")),
# MINVSCVLA: Roman-numeral-shaped ASCII (case-only, not numeral-aware)
('MINVSCVLA("XII")', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [String("XII")]))]), ValStr("xii")),
# MINVSCVLA: non-alphabetic chars unchanged
('MINVSCVLA("A,B!1")', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [String("A,B!1")]))]), ValStr("a,b!1")),
# MINVSCVLA round-trips MAIVSCVLA on lowercase input
('MINVSCVLA(MAIVSCVLA("hi"))', Program([], [ExpressionStatement(BuiltIn("MINVSCVLA", [BuiltIn("MAIVSCVLA", [String("hi")])]))]), ValStr("hi")),
]
class TestBuiltins(unittest.TestCase):
@@ -850,6 +880,12 @@ error_tests = [
("QVAERE('a{3}', 'aaa')", CentvrionError), # Arabic quantifier in pattern
('SCINDE(I, ",")', CentvrionError), # SCINDE requires strings, not int
('SCINDE("a", I)', CentvrionError), # SCINDE requires strings, not int delimiter
('MAIVSCVLA(I)', CentvrionError), # MAIVSCVLA requires a string, not int
('MAIVSCVLA()', CentvrionError), # MAIVSCVLA requires exactly 1 arg
('MAIVSCVLA("a", "b")', CentvrionError), # MAIVSCVLA too many args
('MINVSCVLA(I)', CentvrionError), # MINVSCVLA requires a string, not int
('MINVSCVLA()', CentvrionError), # MINVSCVLA requires exactly 1 arg
('MINVSCVLA("a", "b")', CentvrionError), # MINVSCVLA too many args
('PETE("http://example.com")', CentvrionError), # RETE required for PETE
('CVM RETE\nPETE(I)', CentvrionError), # PETE requires a string URL
('PETITVR("/", FVNCTIO (r) VT {\nREDI("hi")\n})', CentvrionError), # RETE required for PETITVR