Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
- hk-list-append: string ++ string via str (fixes unwords/unlines/intercalate)
- --sx-to-hk-- in words/lines builtins: use ":"/"[]" not "Cons"/"Nil"
- lines builtin: empty-string case returns ("[]") not ("Nil")
- New test file prelude-extra.sx: 47 tests covering ord, isAlpha/isDigit/
isSpace/isUpper/isLower/isAlphaNum, digitToInt, words, lines, unwords,
unlines, sort, nub, splitAt, span, break, partition, intercalate,
intersperse, isPrefixOf, isSuffixOf, isInfixOf
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
235 lines
7.3 KiB
Plaintext
235 lines
7.3 KiB
Plaintext
;; prelude-extra.sx — tests for Phase 6 prelude additions:
|
|
;; ord/isAlpha/isDigit/isSpace/isUpper/isLower/isAlphaNum/digitToInt
|
|
;; words/lines/unwords/unlines/sort/nub/splitAt/span/break
|
|
;; partition/intercalate/intersperse/isPrefixOf/isSuffixOf/isInfixOf
|
|
|
|
;; ── ord ──────────────────────────────────────────────────────
|
|
(hk-test "ord 'A'" (hk-eval-expr-source "ord 'A'") 65)
|
|
(hk-test "ord 'a'" (hk-eval-expr-source "ord 'a'") 97)
|
|
(hk-test "ord '0'" (hk-eval-expr-source "ord '0'") 48)
|
|
|
|
;; ── isAlpha / isDigit / isSpace / isUpper / isLower ──────────
|
|
(hk-test
|
|
"isAlpha 'a' True"
|
|
(hk-eval-expr-source "isAlpha 'a'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isAlpha 'Z' True"
|
|
(hk-eval-expr-source "isAlpha 'Z'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isAlpha '3' False"
|
|
(hk-eval-expr-source "isAlpha '3'")
|
|
(list "False"))
|
|
(hk-test
|
|
"isDigit '5' True"
|
|
(hk-eval-expr-source "isDigit '5'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isDigit 'a' False"
|
|
(hk-eval-expr-source "isDigit 'a'")
|
|
(list "False"))
|
|
(hk-test
|
|
"isSpace ' ' True"
|
|
(hk-eval-expr-source "isSpace ' '")
|
|
(list "True"))
|
|
(hk-test
|
|
"isSpace 'x' False"
|
|
(hk-eval-expr-source "isSpace 'x'")
|
|
(list "False"))
|
|
(hk-test
|
|
"isUpper 'A' True"
|
|
(hk-eval-expr-source "isUpper 'A'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isUpper 'a' False"
|
|
(hk-eval-expr-source "isUpper 'a'")
|
|
(list "False"))
|
|
(hk-test
|
|
"isLower 'z' True"
|
|
(hk-eval-expr-source "isLower 'z'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isLower 'Z' False"
|
|
(hk-eval-expr-source "isLower 'Z'")
|
|
(list "False"))
|
|
(hk-test
|
|
"isAlphaNum '3' True"
|
|
(hk-eval-expr-source "isAlphaNum '3'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isAlphaNum 'b' True"
|
|
(hk-eval-expr-source "isAlphaNum 'b'")
|
|
(list "True"))
|
|
(hk-test
|
|
"isAlphaNum '!' False"
|
|
(hk-eval-expr-source "isAlphaNum '!'")
|
|
(list "False"))
|
|
|
|
;; ── digitToInt ───────────────────────────────────────────────
|
|
(hk-test "digitToInt '0'" (hk-eval-expr-source "digitToInt '0'") 0)
|
|
(hk-test "digitToInt '7'" (hk-eval-expr-source "digitToInt '7'") 7)
|
|
(hk-test "digitToInt '9'" (hk-eval-expr-source "digitToInt '9'") 9)
|
|
|
|
;; ── words ────────────────────────────────────────────────────
|
|
(hk-test
|
|
"words single"
|
|
(hk-deep-force (hk-eval-expr-source "words \"hello\""))
|
|
(list ":" "hello" (list "[]")))
|
|
|
|
(hk-test
|
|
"words two"
|
|
(hk-deep-force (hk-eval-expr-source "words \"hello world\""))
|
|
(list ":" "hello" (list ":" "world" (list "[]"))))
|
|
|
|
(hk-test
|
|
"words leading/trailing spaces"
|
|
(hk-deep-force (hk-eval-expr-source "words \" foo bar \""))
|
|
(list ":" "foo" (list ":" "bar" (list "[]"))))
|
|
|
|
(hk-test
|
|
"words empty string"
|
|
(hk-deep-force (hk-eval-expr-source "words \"\""))
|
|
(list "[]"))
|
|
|
|
;; ── lines ────────────────────────────────────────────────────
|
|
(hk-test
|
|
"lines single no newline"
|
|
(hk-deep-force (hk-eval-expr-source "lines \"hello\""))
|
|
(list ":" "hello" (list "[]")))
|
|
|
|
(hk-test
|
|
"lines two lines"
|
|
(hk-deep-force (hk-eval-expr-source "lines \"a\\nb\""))
|
|
(list ":" "a" (list ":" "b" (list "[]"))))
|
|
|
|
(hk-test
|
|
"lines trailing newline"
|
|
(hk-deep-force (hk-eval-expr-source "lines \"a\\n\""))
|
|
(list ":" "a" (list "[]")))
|
|
|
|
(hk-test
|
|
"lines empty string"
|
|
(hk-deep-force (hk-eval-expr-source "lines \"\""))
|
|
(list "[]"))
|
|
|
|
;; ── unwords / unlines ────────────────────────────────────────
|
|
(hk-test
|
|
"unwords two"
|
|
(hk-eval-expr-source "unwords [\"hello\", \"world\"]")
|
|
"hello world")
|
|
|
|
(hk-test "unwords empty" (hk-eval-expr-source "unwords []") "")
|
|
|
|
(hk-test "unlines two" (hk-eval-expr-source "unlines [\"a\", \"b\"]") "a\nb\n")
|
|
|
|
;; ── sort / nub ───────────────────────────────────────────────
|
|
(hk-test
|
|
"sort ascending"
|
|
(hk-deep-force (hk-eval-expr-source "sort [3,1,2]"))
|
|
(list ":" 1 (list ":" 2 (list ":" 3 (list "[]")))))
|
|
|
|
(hk-test
|
|
"sort already sorted"
|
|
(hk-deep-force (hk-eval-expr-source "sort [1,2,3]"))
|
|
(list ":" 1 (list ":" 2 (list ":" 3 (list "[]")))))
|
|
|
|
(hk-test
|
|
"nub removes duplicates"
|
|
(hk-deep-force (hk-eval-expr-source "nub [1,2,1,3,2]"))
|
|
(list ":" 1 (list ":" 2 (list ":" 3 (list "[]")))))
|
|
|
|
(hk-test
|
|
"nub no duplicates unchanged"
|
|
(hk-deep-force (hk-eval-expr-source "nub [1,2,3]"))
|
|
(list ":" 1 (list ":" 2 (list ":" 3 (list "[]")))))
|
|
|
|
;; ── splitAt ──────────────────────────────────────────────────
|
|
(hk-test
|
|
"splitAt 2"
|
|
(hk-deep-force (hk-eval-expr-source "splitAt 2 [1,2,3,4]"))
|
|
(list
|
|
"Tuple"
|
|
(list ":" 1 (list ":" 2 (list "[]")))
|
|
(list ":" 3 (list ":" 4 (list "[]")))))
|
|
|
|
(hk-test
|
|
"splitAt 0"
|
|
(hk-deep-force (hk-eval-expr-source "splitAt 0 [1,2,3]"))
|
|
(list
|
|
"Tuple"
|
|
(list "[]")
|
|
(list ":" 1 (list ":" 2 (list ":" 3 (list "[]"))))))
|
|
|
|
;; ── span / break ─────────────────────────────────────────────
|
|
(hk-test
|
|
"span digits"
|
|
(hk-deep-force (hk-eval-expr-source "span (\\x -> x < 3) [1,2,3,4]"))
|
|
(list
|
|
"Tuple"
|
|
(list ":" 1 (list ":" 2 (list "[]")))
|
|
(list ":" 3 (list ":" 4 (list "[]")))))
|
|
|
|
(hk-test
|
|
"break digits"
|
|
(hk-deep-force (hk-eval-expr-source "break (\\x -> x >= 3) [1,2,3,4]"))
|
|
(list
|
|
"Tuple"
|
|
(list ":" 1 (list ":" 2 (list "[]")))
|
|
(list ":" 3 (list ":" 4 (list "[]")))))
|
|
|
|
;; ── partition ────────────────────────────────────────────────
|
|
(hk-test
|
|
"partition even/odd"
|
|
(hk-deep-force
|
|
(hk-eval-expr-source "partition (\\x -> x `mod` 2 == 0) [1,2,3,4,5]"))
|
|
(list
|
|
"Tuple"
|
|
(list ":" 2 (list ":" 4 (list "[]")))
|
|
(list ":" 1 (list ":" 3 (list ":" 5 (list "[]"))))))
|
|
|
|
;; ── intercalate / intersperse ────────────────────────────────
|
|
(hk-test
|
|
"intercalate"
|
|
(hk-eval-expr-source "intercalate \", \" [\"a\", \"b\", \"c\"]")
|
|
"a, b, c")
|
|
|
|
(hk-test
|
|
"intersperse"
|
|
(hk-deep-force (hk-eval-expr-source "intersperse 0 [1,2,3]"))
|
|
(list
|
|
":"
|
|
1
|
|
(list
|
|
":"
|
|
0
|
|
(list ":" 2 (list ":" 0 (list ":" 3 (list "[]")))))))
|
|
|
|
;; ── isPrefixOf / isSuffixOf / isInfixOf ──────────────────────
|
|
(hk-test
|
|
"isPrefixOf True"
|
|
(hk-deep-force (hk-eval-expr-source "isPrefixOf [1,2] [1,2,3]"))
|
|
(list "True"))
|
|
|
|
(hk-test
|
|
"isPrefixOf False"
|
|
(hk-deep-force (hk-eval-expr-source "isPrefixOf [2,3] [1,2,3]"))
|
|
(list "False"))
|
|
|
|
(hk-test
|
|
"isSuffixOf True"
|
|
(hk-deep-force (hk-eval-expr-source "isSuffixOf [2,3] [1,2,3]"))
|
|
(list "True"))
|
|
|
|
(hk-test
|
|
"isInfixOf True"
|
|
(hk-deep-force (hk-eval-expr-source "isInfixOf [2,3] [1,2,3,4]"))
|
|
(list "True"))
|
|
|
|
(hk-test
|
|
"isInfixOf False"
|
|
(hk-deep-force (hk-eval-expr-source "isInfixOf [5,6] [1,2,3,4]"))
|
|
(list "False"))
|
|
|
|
{:fails hk-test-fails :pass hk-test-pass :fail hk-test-fail}
|