Files
rose-ash/lib/haskell/tests/program-partial.sx
giles 29542ba9d2
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 1m4s
haskell: Phase 9 conformance — partial.hs (7/7), Phase 9 complete
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 05:40:03 +00:00

59 lines
1.8 KiB
Plaintext

;; partial.hs — exercises Phase 9 partial functions caught at the top level.
;;
;; Each program calls a partial function on bad input; hk-run-io catches the
;; raise and appends the error message to io-lines so tests can inspect.
(hk-test
"partial.hs — main = print (head [])"
(let
((lines (hk-run-io "main = print (head [])")))
(>= (index-of (str lines) "Prelude.head: empty list") 0))
true)
(hk-test
"partial.hs — main = print (tail [])"
(let
((lines (hk-run-io "main = print (tail [])")))
(>= (index-of (str lines) "Prelude.tail: empty list") 0))
true)
(hk-test
"partial.hs — main = print (fromJust Nothing)"
(let
((lines (hk-run-io "main = print (fromJust Nothing)")))
(>= (index-of (str lines) "Maybe.fromJust: Nothing") 0))
true)
(hk-test
"partial.hs — putStrLn before error preserves prior output"
(let
((lines (hk-run-io "main = do { putStrLn \"step 1\"; putStrLn (show (head [])); putStrLn \"never\" }")))
(and
(>= (index-of (str lines) "step 1") 0)
(>= (index-of (str lines) "Prelude.head: empty list") 0)
(= (index-of (str lines) "never") -1)))
true)
(hk-test
"partial.hs — undefined as IO action"
(let
((lines (hk-run-io "main = print undefined")))
(>= (index-of (str lines) "Prelude.undefined") 0))
true)
(hk-test
"partial.hs — catches error from a user-thrown error"
(let
((lines (hk-run-io "main = error \"boom from main\"")))
(>= (index-of (str lines) "boom from main") 0))
true)
;; Negative case: when no error is raised, io-lines doesn't contain
;; "Prelude" prefixes from our error path.
(hk-test
"partial.hs — happy path: head [42] succeeds, no error in output"
(hk-run-io "main = print (head [42])")
(list "42"))
{:fails hk-test-fails :pass hk-test-pass :fail hk-test-fail}