tomo/test/text.tm

317 lines
6.4 KiB
Plaintext
Raw Normal View History

2024-04-28 11:58:55 -07:00
func main():
2025-03-10 21:09:17 -07:00
str := "Hello Amélie!"
!! Testing strings like $str
2024-07-04 13:23:05 -07:00
2024-04-12 10:09:31 -07:00
>> str:upper()
= "HELLO AMÉLIE!"
>> str:lower()
= "hello amélie!"
>> str:lower():title()
= "Hello Amélie!"
2024-12-26 14:31:33 -08:00
>> str[1]
= "H"
2024-03-03 14:49:40 -08:00
>> "I":lower()
= "i"
>> "I":lower(language="tr_TR")
= "ı"
>> "i":upper()
= "I"
>> "i":upper(language="tr_TR")
= "İ"
>> "ian":title()
= "Ian"
>> "ian":title(language="tr_TR")
= "İan"
>> "I":caseless_equals("ı")
= no
>> "I":caseless_equals("ı", language="tr_TR")
= yes
2024-12-26 14:31:33 -08:00
>> str[9]
= "é"
2024-07-04 13:23:05 -07:00
2024-04-12 10:09:31 -07:00
>> \UE9
= "é"
2024-04-12 10:09:31 -07:00
>> \U65\U301
= "é"
>> \{Penguin}:codepoint_names()
2024-09-06 22:43:36 -07:00
= ["PENGUIN"]
>> \[31;1]
= "$\e[31;1m"
2024-04-12 10:09:31 -07:00
>> \UE9 == \U65\U301
= yes
2025-03-10 21:09:17 -07:00
amelie := "Am$(\UE9)lie"
>> amelie:split()
= ["A", "m", "é", "l", "i", "e"]
2024-09-02 17:22:13 -07:00
>> amelie:utf32_codepoints()
= [:Int32, 65, 109, 233, 108, 105, 101]
>> amelie:bytes()
= [:Byte, 0x41, 0x6D, 0xC3, 0xA9, 0x6C, 0x69, 0x65]
>> Text.from_bytes([:Byte 0x41, 0x6D, 0xC3, 0xA9, 0x6C, 0x69, 0x65])!
2024-09-15 12:33:47 -07:00
= "Amélie"
>> Text.from_bytes([Byte(0xFF)])
= none:Text
2025-03-10 21:09:17 -07:00
amelie2 := "Am$(\U65\U301)lie"
>> amelie2:split()
= ["A", "m", "é", "l", "i", "e"]
2024-09-02 17:22:13 -07:00
>> amelie2:utf32_codepoints()
= [:Int32, 65, 109, 233, 108, 105, 101]
>> amelie2:bytes()
= [:Byte, 0x41, 0x6D, 0xC3, 0xA9, 0x6C, 0x69, 0x65]
2024-09-02 17:22:13 -07:00
>> amelie:codepoint_names()
2024-09-02 18:18:15 -07:00
= ["LATIN CAPITAL LETTER A", "LATIN SMALL LETTER M", "LATIN SMALL LETTER E WITH ACUTE", "LATIN SMALL LETTER L", "LATIN SMALL LETTER I", "LATIN SMALL LETTER E"]
2024-09-02 17:22:13 -07:00
>> amelie2:codepoint_names()
2024-09-02 18:18:15 -07:00
= ["LATIN CAPITAL LETTER A", "LATIN SMALL LETTER M", "LATIN SMALL LETTER E WITH ACUTE", "LATIN SMALL LETTER L", "LATIN SMALL LETTER I", "LATIN SMALL LETTER E"]
2024-03-09 15:22:12 -08:00
2025-04-01 11:05:10 -07:00
>> "Hello":replace("e", "X")
2024-04-12 10:09:31 -07:00
= "HXllo"
2025-04-01 11:05:10 -07:00
>> "Hello":has("l")
= yes
2025-04-01 11:05:10 -07:00
>> "Hello":has("x")
= no
2025-04-01 11:05:10 -07:00
>> "Hello":replace("l", "")
= "Heo"
2025-04-01 11:05:10 -07:00
>> "xxxx":replace("x", "")
= ""
2025-04-01 11:05:10 -07:00
>> "xxxx":replace("y", "")
= "xxxx"
2025-04-01 11:05:10 -07:00
>> "One two three four five six":replace("e ", "")
= "Ontwo threfour fivsix"
2025-04-01 11:05:10 -07:00
>> amelie:has(amelie2)
2025-03-10 21:09:17 -07:00
= yes
2024-07-01 10:09:26 -07:00
>> multiline := "
line one
line two
"
= "line one$\nline two"
2024-07-01 10:09:26 -07:00
!! Interpolation tests:
>> "A $(1+2)"
= "A 3"
>> 'A $(1+2)'
= 'A $(1+2)'
>> `A $(1+2)`
= "A 3"
>> $"A $(1+2)"
= "A 3"
>> $$"A $(1+2)"
= 'A $(1+2)'
>> $="A =(1+2)"
= "A 3"
2024-09-06 09:17:43 -07:00
>> ${one {nested} two $(1+2)}
= "one {nested} two 3"
2025-03-10 21:09:17 -07:00
c := "É̩"
>> c:codepoint_names()
= ["LATIN CAPITAL LETTER E WITH ACUTE", "COMBINING VERTICAL LINE BELOW"]
>> c == Text.from_codepoint_names(c:codepoint_names())!
= yes
>> c == Text.from_codepoints(c:utf32_codepoints())
= yes
>> c == Text.from_bytes(c:bytes())!
= yes
2024-09-02 19:57:49 -07:00
>> "one$(\n)two$(\n)three":lines()
= ["one", "two", "three"]
>> "one$(\n)two$(\n)three$(\n)":lines()
= ["one", "two", "three"]
>> "one$(\n)two$(\n)three$(\n\n)":lines()
= ["one", "two", "three", ""]
>> "one$(\r\n)two$(\r\n)three$(\r\n)":lines()
= ["one", "two", "three"]
2024-09-02 21:54:48 -07:00
>> "":lines()
= [:Text]
!! Test splitting and joining text:
2025-04-01 11:05:10 -07:00
>> "one,, two,three":split(",")
= ["one", "", " two", "three"]
>> [t for t in "one,, two,three":by_split(",")]
= ["one", "", " two", "three"]
>> "one,, two,three":split_any(", ")
= ["one", "two", "three"]
2025-04-01 11:05:10 -07:00
>> [t for t in "one,, two,three":by_split_any(", ")]
= ["one", "two", "three"]
2025-04-01 11:05:10 -07:00
>> ",one,, two,three,":split(",")
= ["", "one", "", " two", "three", ""]
>> [t for t in ",one,, two,three,":by_split(",")]
= ["", "one", "", " two", "three", ""]
>> ",one,, two,three,":split_any(", ")
= ["", "one", "two", "three", ""]
>> [t for t in ",one,, two,three,":by_split_any(", ")]
= ["", "one", "two", "three", ""]
>> "abc":split()
= ["a", "b", "c"]
2024-09-02 20:13:02 -07:00
2025-04-01 11:05:10 -07:00
>> "one two three":split_any()
= ["one", "two", "three"]
2024-09-02 20:13:02 -07:00
>> ", ":join(["one", "two", "three"])
= "one, two, three"
>> "":join(["one", "two", "three"])
= "onetwothree"
>> "+":join(["one"])
= "one"
>> "+":join([:Text])
= ""
2024-09-02 20:24:16 -07:00
>> "":split()
= [:Text]
2024-09-02 20:26:55 -07:00
!! Test text slicing:
2024-09-02 20:56:08 -07:00
>> "abcdef":slice()
= "abcdef"
>> "abcdef":slice(from=3)
= "cdef"
>> "abcdef":slice(to=-2)
= "abcde"
>> "abcdef":slice(from=2, to=4)
= "bcd"
>> "abcdef":slice(from=5, to=1)
= ""
2024-09-02 22:20:36 -07:00
>> house := "家"
= "家"
>> house.length
= 1
>> house:codepoint_names()
= ["CJK Unified Ideographs-5BB6"]
2024-09-02 22:20:36 -07:00
>> house:utf32_codepoints()
= [:Int32, 23478]
>> "🐧":codepoint_names()
= ["PENGUIN"]
>> Text.from_codepoint_names(["not a valid name here buddy"])
= none : Text
2025-04-01 11:05:10 -07:00
>> "Hello":replace("ello", "i")
= "Hi"
2025-04-01 11:05:10 -07:00
>> "<tag>":translate({"<"="&lt;", ">"="&gt;"})
= "&lt;tag&gt;"
2024-09-04 18:22:03 -07:00
>> "Abc":repeat(3)
= "AbcAbcAbc"
2024-09-05 00:47:15 -07:00
>> "abcde":starts_with("ab")
= yes
>> "abcde":starts_with("bc")
= no
>> "abcde":ends_with("de")
= yes
>> "abcde":starts_with("cd")
= no
2025-04-01 11:05:10 -07:00
>> "abcde":without_prefix("ab")
= "cde"
>> "abcde":without_suffix("ab")
= "abcde"
>> "abcde":without_prefix("de")
= "abcde"
>> "abcde":without_suffix("de")
= "abc"
2024-12-19 12:32:19 -08:00
>> ("hello" ++ " " ++ "Amélie"):reversed()
= "eilémA olleh"
2024-12-19 12:32:19 -08:00
2024-09-05 00:47:15 -07:00
do:
!! Testing concatenation-stability:
2025-03-10 21:09:17 -07:00
ab := Text.from_codepoint_names(["LATIN SMALL LETTER E", "COMBINING VERTICAL LINE BELOW"])!
2024-09-05 00:47:15 -07:00
>> ab:codepoint_names()
= ["LATIN SMALL LETTER E", "COMBINING VERTICAL LINE BELOW"]
>> ab.length
= 1
2025-03-10 21:09:17 -07:00
a := Text.from_codepoint_names(["LATIN SMALL LETTER E"])!
b := Text.from_codepoint_names(["COMBINING VERTICAL LINE BELOW"])!
2024-09-05 00:47:15 -07:00
>> (a++b):codepoint_names()
= ["LATIN SMALL LETTER E", "COMBINING VERTICAL LINE BELOW"]
>> (a++b) == ab
= yes
>> (a++b).length
= 1
do:
2025-03-10 21:09:17 -07:00
concat := "e" ++ Text.from_codepoints([Int32(0x300)])
>> concat.length
= 1
2025-03-10 21:09:17 -07:00
concat2 := concat ++ Text.from_codepoints([Int32(0x302)])
>> concat2.length
= 1
2025-03-10 21:09:17 -07:00
concat3 := concat2 ++ Text.from_codepoints([Int32(0x303)])
>> concat3.length
= 1
2025-03-10 21:09:17 -07:00
final := Text.from_codepoints([Int32(0x65), Int32(0x300), Int32(0x302), Int32(0x303)])
>> final.length
= 1
>> concat3 == final
= yes
2025-03-10 21:09:17 -07:00
concat4 := Text.from_codepoints([Int32(0x65), Int32(0x300)]) ++ Text.from_codepoints([Int32(0x302), Int32(0x303)])
>> concat4.length
= 1
>> concat4 == final
= yes
>> "x":left_pad(5)
= " x"
>> "x":right_pad(5)
= "x "
>> "x":middle_pad(5)
= " x "
>> "1234":left_pad(8, "XYZ")
= "XYZX1234"
>> "1234":right_pad(8, "XYZ")
= "1234XYZX"
>> "1234":middle_pad(9, "XYZ")
= "XY1234XYZ"
>> amelie:width()
= 6
cowboy := "🤠"
>> cowboy:width()
= 2
>> cowboy:left_pad(4)
= " 🤠"
>> cowboy:right_pad(4)
= "🤠 "
>> cowboy:middle_pad(4)
= " 🤠 "
2025-04-01 11:05:10 -07:00
>> " one, ":trim(" ,")
= "one"
>> " one, ":trim(" ,", left=no)
= " one"
>> " one, ":trim(" ,", right=no)
= "one, "
>> " ":trim(" ,")
= ""
>> " ":trim(" ,", left=no)
= ""