Files
exercism-workspace/secure-treasure-chest/test/secure_treasure_chest_test.gleam
2025-11-08 20:54:55 +01:00

56 lines
1.6 KiB
Gleam

import exercism/should
import exercism/test_runner
import gleam/string
import secure_treasure_chest
import simplifile
pub fn main() {
test_runner.main()
}
fn compact_whitespace(graphemes: List(String), acc: String) -> String {
case graphemes {
[] -> acc
[" ", " ", ..rest] -> compact_whitespace([" ", ..rest], acc)
[grapheme, ..rest] -> compact_whitespace(rest, acc <> grapheme)
}
}
fn read_source() -> String {
let assert Ok(src) = simplifile.read("src/secure_treasure_chest.gleam")
compact_whitespace(string.to_graphemes(src), "")
}
pub fn type_must_be_opaque_test() {
let src = read_source()
case string.contains(src, "pub opaque type TreasureChest") {
True -> Nil
False -> panic as "The TreasureChest type must exist and be opaque"
}
}
pub fn create_is_ok_with_long_password_test() {
let assert Ok(_) = secure_treasure_chest.create("12345678", "My treasure")
}
pub fn create_is_error_with_short_password_test() {
secure_treasure_chest.create("1234567", "My treasure")
|> should.equal(Error("Password must be at least 8 characters long"))
}
pub fn open_is_ok_with_the_correct_password_test() {
let assert Ok(chest) = secure_treasure_chest.create("wwwibble", 100)
secure_treasure_chest.open(chest, "wwwibble")
|> should.equal(Ok(100))
let assert Ok(chest) = secure_treasure_chest.create("wwwobble", 1.5)
secure_treasure_chest.open(chest, "wwwobble")
|> should.equal(Ok(1.5))
}
pub fn open_is_an_error_with_an_incorrect_password_test() {
let assert Ok(chest) = secure_treasure_chest.create("wwwibble", 100)
secure_treasure_chest.open(chest, "wwwobble")
|> should.equal(Error("Incorrect password"))
}