111 lines
2.3 KiB
Gleam
111 lines
2.3 KiB
Gleam
import exercism/should
|
|
import exercism/test_runner
|
|
import go.{type Game, Black, Game, White}
|
|
|
|
pub fn main() {
|
|
test_runner.main()
|
|
}
|
|
|
|
fn identity(x: Game) -> Game {
|
|
x
|
|
}
|
|
|
|
fn identity_rule(game: Game) -> Result(Game, String) {
|
|
Ok(game)
|
|
}
|
|
|
|
fn error_rule(_game: Game, message: String) -> Result(Game, String) {
|
|
Error(message)
|
|
}
|
|
|
|
fn new_game() -> Game {
|
|
Game(0, 0, White, "")
|
|
}
|
|
|
|
fn ko_rule() -> String {
|
|
"Cannot repeat a previously played board position"
|
|
}
|
|
|
|
fn liberty_rule() -> String {
|
|
"Cannot place a stone with no liberties"
|
|
}
|
|
|
|
fn one_stone_per_point_rule() -> String {
|
|
"You can't put a stone on top of another stone"
|
|
}
|
|
|
|
fn add_white_captured_stone(game: Game) -> Game {
|
|
Game(..game, white_captured_stones: 1)
|
|
}
|
|
|
|
pub fn change_player_if_all_rules_pass_test() {
|
|
new_game()
|
|
|> go.apply_rules(identity_rule, identity, identity_rule, identity_rule)
|
|
|> should.equal(change_player(new_game()))
|
|
}
|
|
|
|
pub fn retain_error_and_player_if_ko_rule_fails_test() {
|
|
new_game()
|
|
|> go.apply_rules(identity_rule, identity, identity_rule, error_rule(
|
|
_,
|
|
ko_rule(),
|
|
))
|
|
|> should.equal(Game(..new_game(), error: ko_rule()))
|
|
}
|
|
|
|
pub fn retain_error_and_player_if_liberty_rule_fails_test() {
|
|
new_game()
|
|
|> go.apply_rules(
|
|
identity_rule,
|
|
identity,
|
|
error_rule(_, liberty_rule()),
|
|
identity_rule,
|
|
)
|
|
|> should.equal(Game(..new_game(), error: liberty_rule()))
|
|
}
|
|
|
|
pub fn retain_error_and_player_if_one_stone_per_point_rule_fails_test() {
|
|
new_game()
|
|
|> go.apply_rules(
|
|
error_rule(_, one_stone_per_point_rule()),
|
|
identity,
|
|
identity_rule,
|
|
identity_rule,
|
|
)
|
|
|> should.equal(Game(..new_game(), error: one_stone_per_point_rule()))
|
|
}
|
|
|
|
pub fn retain_changes_from_capture_rule_and_change_player_test() {
|
|
new_game()
|
|
|> go.apply_rules(
|
|
identity_rule,
|
|
add_white_captured_stone,
|
|
identity_rule,
|
|
identity_rule,
|
|
)
|
|
|> should.equal(
|
|
new_game()
|
|
|> add_white_captured_stone
|
|
|> change_player,
|
|
)
|
|
}
|
|
|
|
pub fn discard_changes_from_capture_rule_if_subsequent_rule_fails_test() {
|
|
new_game()
|
|
|> go.apply_rules(
|
|
identity_rule,
|
|
add_white_captured_stone,
|
|
identity_rule,
|
|
error_rule(_, ko_rule()),
|
|
)
|
|
|> should.equal(Game(..new_game(), error: ko_rule()))
|
|
}
|
|
|
|
fn change_player(game: Game) -> Game {
|
|
let new_player = case game.player {
|
|
White -> Black
|
|
Black -> White
|
|
}
|
|
Game(..game, player: new_player)
|
|
}
|