Browse Source

Add the subject and test for the exercise tic_tac_toe

content-update
Augusto 3 years ago
parent
commit
2b8aba943d
  1. 12
      rust/tests/tic_tac_toe_test/Cargo.lock
  2. 10
      rust/tests/tic_tac_toe_test/Cargo.toml
  3. 340
      rust/tests/tic_tac_toe_test/src/main.rs
  4. 78
      subjects/tic_tac_toe/README.md

12
rust/tests/tic_tac_toe_test/Cargo.lock diff.generated

@ -0,0 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "tic_tac_toe"
version = "0.1.0"
[[package]]
name = "tic_tac_toe_test"
version = "0.1.0"
dependencies = [
"tic_tac_toe",
]

10
rust/tests/tic_tac_toe_test/Cargo.toml

@ -0,0 +1,10 @@
[package]
name = "tic_tac_toe_test"
version = "0.1.0"
authors = ["lee <lee-dasilva@hotmail.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tic_tac_toe = { path = "../../../../rust-piscine-solutions/tic_tac_toe"}

340
rust/tests/tic_tac_toe_test/src/main.rs

@ -0,0 +1,340 @@
/*
## tic_tac_toe
### Instructions
You must create a tic tac toe checker.
Create the following functions:
- `tic_tac_toe` that receives a table of vectors (Vec<Vec<&str>>) and returns a string : `player O won` or `player X won` or `Tie`
- `diagonals` that will receive a player and a table. It should return a boolean, this must return true if all the diagonals are completed by the player
- `horizontal` that will receive a player and a table. It should return a boolean, this must return true if one of the horizontal lines are completed by the player
- `vertical` that will receive a player and a table. It should return a boolean, this must return true if one of the vertical lines are completed by the player
### Example
```
### Notions
- https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
*/
// fn check(player: &str, table: &Vec<Vec<&str>>) -> bool {
// diagonals(player, &table) || horizontal(player, &table) || vertical(player, &table)
// }
// fn tic_tac_toe(table: Vec<Vec<&str>>) -> String {
// let player1 = "X";
// let player2 = "O";
// if check(player2, &table) {
// return format!("player {} won", player2);
// } else if check(player1, &table) {
// return format!("player {} won", player1);
// } else {
// return "Tie".to_string();
// }
// }
// fn diagonals(player: &str, table: &Vec<Vec<&str>>) -> bool {
// let mut count = 0;
// let mut count_inv = 0;
// for (i, v) in table.iter().enumerate() {
// if v.get(i).unwrap() == &player {
// count += 1;
// }
// if v.get((table.len() - 1) - i).unwrap() == &player {
// count_inv += 1;
// }
// }
// return count == table.len() || count_inv == table.len();
// }
// // not good will change the solution
// fn horizontal(player: &str, table: &Vec<Vec<&str>>) -> bool {
// let mut count = 0;
// for v in table.iter() {
// for value in v.iter() {
// if value == &player {
// count += 1
// }
// }
// if count == table.len() {
// return true;
// }
// count = 0;
// }
// return false;
// }
// // not good will change the solution
// fn vertical(player: &str, table: &Vec<Vec<&str>>) -> bool {
// let mut count = 0;
// for (i, _) in table.iter().enumerate() {
// for v in table.iter() {
// if v.get(i).unwrap() == &player {
// count += 1;
// }
// }
// if count == table.len() {
// return true;
// }
// count = 0;
// }
// return false;
// }
use tic_tac_toe::*;
fn main() {
println!(
"{:?}",
tic_tac_toe(vec![
vec!["O", "X", "O"],
vec!["O", "P", "X"],
vec!["X", "#", "X"]
])
);
// "Tie"
println!(
"{:?}",
tic_tac_toe(vec![
vec!["X", "O", "O"],
vec!["X", "O", "O"],
vec!["#", "O", "X"]
])
);
// "player O won"
let dig = vec![
vec!["O", "O", "X"],
vec!["O", "X", "O"],
vec!["X", "#", "X"],
];
println!("{:?}", tic_tac_toe(dig));
// "player X won"
}
#[cfg(test)]
mod tests {
use super::*;
struct Test<'a> {
player: &'a str,
table: Vec<Vec<&'a str>>,
result: &'a str,
}
impl Test<'_> {
fn init_horizontal() -> Vec<Test<'static>> {
vec![
Test {
player: "O",
table: vec![
vec!["O", "O", "O"],
vec!["X", "X", "O"],
vec!["O", "#", "X"],
],
result: "player O won",
},
Test {
player: "O",
table: vec![
vec!["X", "X", "O"],
vec!["O", "O", "O"],
vec!["O", "#", "X"],
],
result: "player O won",
},
Test {
player: "X",
table: vec![
vec!["O", "X", "O"],
vec!["O", "#", "O"],
vec!["X", "X", "X"],
],
result: "player X won",
},
Test {
player: "X",
table: vec![
vec!["O", "X", "O", "O"],
vec!["X", "X", "X", "X"],
vec!["X", "#", "O", "X"],
vec!["X", "X", "O", "O"],
],
result: "player X won",
},
]
}
fn init_tie() -> Vec<Test<'static>> {
vec![
Test {
player: "none",
table: vec![
vec!["O", "X", "O"],
vec!["O", "X", "O"],
vec!["X", "#", "X"],
],
result: "Tie",
},
Test {
player: "none",
table: vec![
vec!["O", "X", "O"],
vec!["X", "X", "O"],
vec!["X", "#", "X"],
],
result: "Tie",
},
Test {
player: "none",
table: vec![
vec!["O", "X", "O", "O"],
vec!["X", "O", "X", "X"],
vec!["X", "#", "X", "X"],
vec!["X", "X", "O", "O"],
],
result: "Tie",
},
]
}
fn init_vertical() -> Vec<Test<'static>> {
vec![
Test {
player: "O",
table: vec![
vec!["O", "X", "O"],
vec!["O", "X", "O"],
vec!["O", "#", "X"],
],
result: "player O won",
},
Test {
player: "O",
table: vec![
vec!["X", "O", "O"],
vec!["X", "O", "O"],
vec!["#", "O", "X"],
],
result: "player O won",
},
Test {
player: "X",
table: vec![
vec!["O", "X", "X"],
vec!["O", "X", "X"],
vec!["X", "#", "X"],
],
result: "player X won",
},
]
}
fn init_diagonals() -> Vec<Test<'static>> {
vec![
Test {
player: "X",
table: vec![
vec!["O", "O", "X"],
vec!["O", "X", "O"],
vec!["X", "#", "X"],
],
result: "player X won",
},
Test {
player: "O",
table: vec![
vec!["O", "X", "O"],
vec!["X", "O", "O"],
vec!["X", "#", "O"],
],
result: "player O won",
},
Test {
player: "O",
table: vec![
vec!["O", "X", "O", "O"],
vec!["X", "O", "X", "O"],
vec!["X", "#", "O", "X"],
vec!["X", "X", "O", "O"],
],
result: "player O won",
},
]
}
}
#[test]
fn test_diagonals() {
let new_tests = Test::init_diagonals();
for v in new_tests {
assert_eq!(diagonals(v.player, &v.table), true)
}
assert_eq!(
diagonals(
"O",
&vec![
vec!["O", "X", "X"],
vec!["O", "X", "X"],
vec!["X", "#", "X"]
]
),
false
);
}
#[test]
fn test_horizontal() {
let new_tests = Test::init_horizontal();
for v in new_tests {
assert_eq!(horizontal(v.player, &v.table), true)
}
assert_eq!(
horizontal(
"O",
&vec![
vec!["O", "X", "X"],
vec!["O", "O", "X"],
vec!["X", "#", "O"]
]
),
false
);
}
#[test]
fn test_vertical() {
let new_tests = Test::init_vertical();
for v in new_tests {
assert_eq!(vertical(v.player, &v.table), true)
}
assert_eq!(
vertical(
"O",
&vec![
vec!["O", "X", "X"],
vec!["O", "O", "X"],
vec!["X", "#", "O"]
]
),
false
);
}
#[test]
fn test_tic_tac_toe() {
let mut new_tests = Test::init_diagonals();
new_tests.append(&mut Test::init_horizontal());
new_tests.append(&mut Test::init_vertical());
new_tests.append(&mut Test::init_tie());
for v in new_tests {
assert_eq!(tic_tac_toe(v.table), v.result.to_string());
}
}
}

78
subjects/tic_tac_toe/README.md

@ -0,0 +1,78 @@
## tic_tac_toe
### Instructions
You must create a tic tac toe checker.
Create the following functions:
- `tic_tac_toe` that receives a table of vectors (Vec<Vec<&str>>) and returns a string : `player O won` or `player X won` or `Tie`
- `diagonals` that will receive a player and a table. It should return a boolean, this must return true if all the diagonals are completed by the player
- `horizontal` that will receive a player and a table. It should return a boolean, this must return true if one of the horizontal lines are completed by the player
- `vertical` that will receive a player and a table. It should return a boolean, this must return true if one of the vertical lines are completed by the player
### Notions
- https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
### Expected Functions
```rust
fn tic_tac_toe(table: Vec<Vec<&str>>) -> String {
}
fn diagonals(player: &str, table: &Vec<Vec<&str>>) -> bool {
}
fn horizontal(player: &str, table: &Vec<Vec<&str>>) -> bool {
}
fn vertical(player: &str, table: &Vec<Vec<&str>>) -> bool {
}
```
### Usage
Here is a program to test your function
```rust
fn main() {
println!(
"{:?}",
tic_tac_toe(vec![
vec!["O", "X", "O"],
vec!["O", "P", "X"],
vec!["X", "#", "X"]
])
);
// "Tie"
println!(
"{:?}",
tic_tac_toe(vec![
vec!["X", "O", "O"],
vec!["X", "O", "O"],
vec!["#", "O", "X"]
])
);
// "player O won"
let dig = vec![
vec!["O", "O", "X"],
vec!["O", "X", "O"],
vec!["X", "#", "X"]
];
println!("{:?}",tic_tac_toe(dig));
// "player X won"
}
```
And its output
```console
student@ubuntu:~/[[ROOT]]/test$ cargo run
"Tie"
"player O won"
"player X won"
student@ubuntu:~/[[ROOT]]/test$
```
Loading…
Cancel
Save