Skip to content

Commit 2a74be0

Browse files
committed
Refactor to simpler interface
As discussed here: http://doc.rust-lang.org/std/result/enum.Result.html#variant.Err I like the `queen.can_attack(queen2)` API a lot better. It has a downside of `Queen::new` returning a Result, so all tests that check for valid attacks have to call `unwrap` Though that might just be because there's a better way to do this that I am unaware of. I'm still quite new to Rust, especially the error-handling part of it. The us of `is_err` was recommended by Manishearth in this thread https://users.rust-lang.org/t/what-am-i-not-understanding-about-result/5143/11?u=ianwhitney
1 parent 9e00097 commit 2a74be0

File tree

2 files changed

+44
-67
lines changed

2 files changed

+44
-67
lines changed

exercises/queen-attack/example.rs

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,40 @@
11
#[derive(Debug, PartialEq)]
2-
pub struct Queen {
3-
position: (i8, i8)
4-
}
5-
6-
#[derive(Debug, PartialEq)]
7-
pub struct InvalidQueen;
2+
pub struct Queen { position: (i8, i8) }
83

94
impl Queen {
10-
pub fn new(position: (i8, i8)) -> Result<Queen, InvalidQueen> {
11-
if (position.0 < 0 || position.0 > 7) || (position.1 < 0 || position.1 >7 ) {
12-
Err(InvalidQueen)
5+
pub fn new(position: (i8, i8)) -> Queen {
6+
Queen { position: position }
7+
}
8+
9+
pub fn can_attack(&self, piece: Queen) -> Result<bool, ()> {
10+
if self.position_valid() && piece.position_valid() {
11+
Ok(self.rank() == piece.rank() ||
12+
self.file() == piece.file() ||
13+
self.sum() == piece.sum() ||
14+
self.difference() == piece.difference())
1315
} else {
14-
Ok(Queen {position: position})
16+
Err(())
1517
}
1618
}
17-
}
1819

19-
pub struct Queens {
20-
first: Queen,
21-
second: Queen
22-
}
20+
fn position_valid(&self) -> bool {
21+
(self.rank() >= 0 && self.rank() <= 7) &&
22+
(self.file() >= 0 && self.file() <= 7)
23+
}
2324

24-
impl Queens {
25-
pub fn new(first: Result<Queen, InvalidQueen>, second: Result<Queen, InvalidQueen>) -> Queens {
26-
Queens {
27-
first: first.unwrap(),
28-
second: second.unwrap()
29-
}
25+
fn rank(&self) -> i8 {
26+
self.position.0
3027
}
3128

32-
pub fn can_attack(&self) -> bool {
33-
self.first.position.0 == self.second.position.0 ||
34-
self.first.position.1 == self.second.position.1 ||
35-
(
36-
(self.first.position.0 + self.first.position.1)
37-
==
38-
(self.second.position.0 + self.second.position.1)
39-
)
40-
||
41-
(
42-
(self.first.position.0 - self.first.position.1)
43-
==
44-
(self.second.position.0 - self.second.position.1)
45-
)
29+
fn file(&self) -> i8 {
30+
self.position.1
31+
}
32+
33+
fn sum(&self) -> i8 {
34+
self.rank() + self.file()
35+
}
4636

37+
fn difference(&self) -> i8 {
38+
self.rank() - self.file()
4739
}
4840
}

exercises/queen-attack/tests/queen-attack.rs

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,88 +6,73 @@ use queen_attack::*;
66
fn test_can_not_attack() {
77
let white_queen = Queen::new((2,4));
88
let black_queen = Queen::new((6,6));
9-
let queens = Queens::new(white_queen, black_queen);
10-
assert_eq!(false, queens.can_attack());
9+
assert_eq!(false, white_queen.can_attack(black_queen).unwrap());
1110
}
1211

1312
#[test]
1413
#[ignore]
1514
fn test_can_attack_on_same_rank() {
1615
let white_queen = Queen::new((2,4));
1716
let black_queen = Queen::new((2,6));
18-
let queens = Queens::new(white_queen, black_queen);
19-
assert!(queens.can_attack());
17+
assert!(white_queen.can_attack(black_queen).unwrap());
2018
}
2119

2220
#[test]
2321
#[ignore]
2422
fn test_can_attack_on_same_file() {
2523
let white_queen = Queen::new((4,5));
2624
let black_queen = Queen::new((3,5));
27-
let queens = Queens::new(white_queen, black_queen);
28-
assert!(queens.can_attack());
25+
assert!(white_queen.can_attack(black_queen).unwrap());
2926
}
3027

3128
#[test]
3229
#[ignore]
3330
fn test_can_attack_on_first_diagonal() {
3431
let white_queen = Queen::new((2,2));
3532
let black_queen = Queen::new((0,4));
36-
let queens = Queens::new(white_queen, black_queen);
37-
assert!(queens.can_attack());
33+
assert!(white_queen.can_attack(black_queen).unwrap());
3834
}
3935

4036
#[test]
4137
#[ignore]
4238
fn test_can_attack_on_second_diagonal() {
4339
let white_queen = Queen::new((2,2));
4440
let black_queen = Queen::new((3,1));
45-
let queens = Queens::new(white_queen, black_queen);
46-
assert!(queens.can_attack());
41+
assert!(white_queen.can_attack(black_queen).unwrap());
4742
}
4843

4944
#[test]
5045
#[ignore]
5146
fn test_can_attack_on_third_diagonal() {
5247
let white_queen = Queen::new((2,2));
5348
let black_queen = Queen::new((1,1));
54-
let queens = Queens::new(white_queen, black_queen);
55-
assert!(queens.can_attack());
49+
assert!(white_queen.can_attack(black_queen).unwrap());
5650
}
5751

5852
#[test]
5953
#[ignore]
6054
fn test_can_attack_on_fourth_diagonal() {
6155
let white_queen = Queen::new((2,2));
6256
let black_queen = Queen::new((5,5));
63-
let queens = Queens::new(white_queen, black_queen);
64-
assert!(queens.can_attack());
57+
assert!(white_queen.can_attack(black_queen).unwrap());
6558
}
6659

6760
#[test]
6861
#[ignore]
6962
fn test_queen_with_invalid_position() {
7063
let white_queen = Queen::new((-1,2));
71-
match white_queen {
72-
Ok(_) => panic!("This queen should be invalid"),
73-
Err(_) => assert!(true)
74-
}
64+
let black_queen = Queen::new((5,5));
65+
assert!(white_queen.can_attack(black_queen).is_err());
7566

7667
let white_queen = Queen::new((8,2));
77-
match white_queen {
78-
Ok(_) => panic!("This queen should be invalid"),
79-
Err(_) => assert!(true)
80-
}
68+
let black_queen = Queen::new((5,5));
69+
assert!(white_queen.can_attack(black_queen).is_err());
8170

82-
let white_queen = Queen::new((2,-1));
83-
match white_queen {
84-
Ok(_) => panic!("This queen should be invalid"),
85-
Err(_) => assert!(true)
86-
}
71+
let white_queen = Queen::new((2,2));
72+
let black_queen = Queen::new((5,-1));
73+
assert!(white_queen.can_attack(black_queen).is_err());
8774

88-
let white_queen = Queen::new((2,8));
89-
match white_queen {
90-
Ok(_) => panic!("This queen should be invalid"),
91-
Err(_) => assert!(true)
92-
}
75+
let white_queen = Queen::new((2,2));
76+
let black_queen = Queen::new((5,8));
77+
assert!(white_queen.can_attack(black_queen).is_err());
9378
}

0 commit comments

Comments
 (0)