|
|
|
@ -131,7 +131,8 @@ impl Board {
|
|
|
|
|
direction: Direction,
|
|
|
|
|
) -> bool {
|
|
|
|
|
let mut pos = starting_from;
|
|
|
|
|
for tile in tiles {
|
|
|
|
|
let mut it = tiles.iter();
|
|
|
|
|
while let Some(tile) = it.next() {
|
|
|
|
|
if let Some(existing) = self.get(pos.x, pos.y) {
|
|
|
|
|
if existing != *tile {
|
|
|
|
|
return false;
|
|
|
|
@ -140,7 +141,7 @@ impl Board {
|
|
|
|
|
if let Some(relative) = pos.relative(direction, self) {
|
|
|
|
|
pos = relative;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
return it.next().is_none();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
true
|
|
|
|
@ -418,4 +419,59 @@ mod tests {
|
|
|
|
|
assert_eq!(board.is_unique_chain(&positions(&[(1, 1), (2, 1)])), true);
|
|
|
|
|
assert_eq!(board.is_unique_chain(&positions(&[(1, 1), (3, 1)])), false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_is_playable() {
|
|
|
|
|
let board = Board::new(5, 5);
|
|
|
|
|
let tiles = vec![
|
|
|
|
|
Tile::Digit(Digit::new(5)),
|
|
|
|
|
Tile::Digit(Digit::new(6)),
|
|
|
|
|
Tile::Digit(Digit::new(9)),
|
|
|
|
|
];
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (1, 1).into(), Direction::Right),
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (4, 0).into(), Direction::Down),
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_is_playable_constrained() {
|
|
|
|
|
let board = Board::new(2, 2);
|
|
|
|
|
let tiles = vec![Tile::Digit(Digit::new(7)), Tile::Digit(Digit::new(8))];
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (0, 0).into(), Direction::Right),
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (0, 0).into(), Direction::Down),
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (1, 0).into(), Direction::Right),
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_is_playable_blocking_pieces() {
|
|
|
|
|
let mut board = Board::new(3, 3);
|
|
|
|
|
board.set(1, 1, Tile::Digit(Digit::new(1)));
|
|
|
|
|
let tiles = vec![Tile::Digit(Digit::new(0)), Tile::Digit(Digit::new(0))];
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (0, 0).into(), Direction::Right),
|
|
|
|
|
true
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (0, 1).into(), Direction::Right),
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
board.is_playable(&tiles, (1, 0).into(), Direction::Down),
|
|
|
|
|
false
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|