exercism-solutions/rust/minesweeper/tests/minesweeper.rs
2023-12-14 19:32:32 -06:00

141 lines
2.1 KiB
Rust

use minesweeper::annotate;
fn remove_annotations(board: &[&str]) -> Vec<String> {
board.iter().map(|r| remove_annotations_in_row(r)).collect()
}
fn remove_annotations_in_row(row: &str) -> String {
row.chars()
.map(|ch| match ch {
'*' => '*',
_ => ' ',
})
.collect()
}
fn run_test(test_case: &[&str]) {
let cleaned = remove_annotations(test_case);
let cleaned_strs = cleaned.iter().map(|r| &r[..]).collect::<Vec<_>>();
let expected = test_case.iter().map(|&r| r.to_string()).collect::<Vec<_>>();
assert_eq!(expected, annotate(&cleaned_strs));
}
#[test]
fn no_rows() {
#[rustfmt::skip]
run_test(&[
]);
}
#[test]
fn no_columns() {
#[rustfmt::skip]
run_test(&[
"",
]);
}
#[test]
fn no_mines() {
#[rustfmt::skip]
run_test(&[
" ",
" ",
" ",
]);
}
#[test]
fn board_with_only_mines() {
#[rustfmt::skip]
run_test(&[
"***",
"***",
"***",
]);
}
#[test]
fn mine_surrounded_by_spaces() {
#[rustfmt::skip]
run_test(&[
"111",
"1*1",
"111",
]);
}
#[test]
fn space_surrounded_by_mines() {
#[rustfmt::skip]
run_test(&[
"***",
"*8*",
"***",
]);
}
#[test]
fn horizontal_line() {
#[rustfmt::skip]
run_test(&[
"1*2*1",
]);
}
#[test]
fn horizontal_line_mines_at_edges() {
#[rustfmt::skip]
run_test(&[
"*1 1*",
]);
}
#[test]
fn vertical_line() {
#[rustfmt::skip]
run_test(&[
"1",
"*",
"2",
"*",
"1",
]);
}
#[test]
fn vertical_line_mines_at_edges() {
#[rustfmt::skip]
run_test(&[
"*",
"1",
" ",
"1",
"*",
]);
}
#[test]
fn cross() {
#[rustfmt::skip]
run_test(&[
" 2*2 ",
"25*52",
"*****",
"25*52",
" 2*2 ",
]);
}
#[test]
fn large_board() {
#[rustfmt::skip]
run_test(&[
"1*22*1",
"12*322",
" 123*2",
"112*4*",
"1*22*2",
"111111",
]);
}