[board] Fix algebraic square parsing

I got very confused about which one is the rank and which one is the file. 🙃
This commit is contained in:
Eryn Wells 2023-12-23 09:27:56 -07:00
parent 9bcd0b2148
commit 341d8211ad
2 changed files with 32 additions and 31 deletions

View file

@ -114,12 +114,11 @@ mod tests {
fn has_piece_at() { fn has_piece_at() {
let bb = BitBoard(0b1001100); let bb = BitBoard(0b1001100);
assert!(bb.has_piece_at( let c1 = Square::from_algebraic_string("c1").expect("Unable to get square for 'c1'");
&Square::from_algebraic_string("a3").expect("Unable to get square for 'a3'") assert!(bb.has_piece_at(&c1));
));
assert!(!bb.has_piece_at( let b1 = Square::from_algebraic_string("b1").expect("Unable to get square for 'b1'");
&Square::from_algebraic_string("a2").expect("Unable to get square for 'a2'") assert!(!bb.has_piece_at(&b1));
));
} }
#[test] #[test]

View file

@ -49,26 +49,29 @@ impl FromStr for Square {
return Err(ParseSquareError); return Err(ParseSquareError);
} }
let chars: Vec<char> = s.chars().collect(); let mut chars = s.chars();
let rank_char = chars[0].to_ascii_lowercase();
if !rank_char.is_ascii_lowercase() { let file_char = chars.next().unwrap().to_ascii_lowercase();
if !file_char.is_ascii_lowercase() {
return Err(ParseSquareError); return Err(ParseSquareError);
} }
let rank = (rank_char as u8) - ('a' as u8); let file = (file_char as u8) - ('a' as u8);
if rank >= 8 { if file >= 8 {
return Err(ParseSquareError); return Err(ParseSquareError);
} }
let converted_file_digit = chars[1] let converted_rank_digit = chars
.next()
.unwrap()
.to_digit(10) .to_digit(10)
.and_then(|x| if x != 0 { Some(x) } else { None }) .and_then(|x| if x >= 1 && x <= 8 { Some(x) } else { None })
.ok_or(ParseSquareError)?; .ok_or(ParseSquareError)?;
let file = u8::try_from(converted_file_digit).map_err(|_| ParseSquareError)? - 1; let rank = u8::try_from(converted_rank_digit).map_err(|_| ParseSquareError)? - 1;
Ok(Square { Ok(Square {
rank: rank, rank,
file: file, file,
index: rank * 8 + file, index: rank * 8 + file,
}) })
} }
@ -78,26 +81,19 @@ impl FromStr for Square {
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn indexes() {
let sq1 = Square::from_algebraic_string("c5").expect("Failed to parse 'c5' square");
assert_eq!(sq1.rank_index(), 2, "Rank doesn't match");
assert_eq!(sq1.file_index(), 4, "File doesn't match");
let sq2 = Square::from_algebraic_string("b2").expect("Failed to parse 'b2' square");
assert_eq!(sq2.rank_index(), 1, "Rank doesn't match");
assert_eq!(sq2.file_index(), 1, "File doesn't match");
}
#[test] #[test]
fn good_algebraic_input() { fn good_algebraic_input() {
let sq1 = Square::from_algebraic_string("a4").expect("Failed to parse 'a4' square"); let sq1 = Square::from_algebraic_string("a4").expect("Failed to parse 'a4' square");
assert_eq!(sq1.rank, 0); assert_eq!(sq1.file, 0);
assert_eq!(sq1.file, 3); assert_eq!(sq1.rank, 3);
let sq2 = Square::from_algebraic_string("B8").expect("Failed to parse 'B8' square"); let sq2 = Square::from_algebraic_string("B8").expect("Failed to parse 'B8' square");
assert_eq!(sq2.rank, 1); assert_eq!(sq2.file, 1);
assert_eq!(sq2.file, 7); assert_eq!(sq2.rank, 7);
let sq3 = Square::from_algebraic_string("e4").expect("Failed to parse 'B8' square");
assert_eq!(sq3.rank, 3, "Expected rank of e4 to be 3");
assert_eq!(sq3.file, 4, "Expected file of e4 to be 4");
} }
#[test] #[test]
@ -115,5 +111,11 @@ mod tests {
let sq1 = Square::from_index(4).expect("Unable to get Square from index"); let sq1 = Square::from_index(4).expect("Unable to get Square from index");
assert_eq!(sq1.rank, 0); assert_eq!(sq1.rank, 0);
assert_eq!(sq1.file, 4); assert_eq!(sq1.file, 4);
let sq1 = Square::from_index(28).expect("Unable to get Square from index");
assert_eq!(sq1.rank, 3);
assert_eq!(sq1.file, 4);
}
} }
} }