From 8b88cbad67c1272c52b6e881d1a6b1b51f9c8dcc Mon Sep 17 00:00:00 2001 From: Ian Whitney Date: Sun, 11 Sep 2016 14:02:20 -0500 Subject: [PATCH] WIP: Implement Pascals Triangle Official tests have not been merged yet, but I'm mostly following them here. https://github.com/exercism/x-common/pull/362 I thought I could use `should_panic` to test a negative row count, but no. It won't compile since I'm violating type safety. I've left that test in, but plan to remove it before merge. Example code is naive. Just enough to pass the tests. A real example solution will come later. --- exercises/pascals-triangle/.gitignore | 7 +++ exercises/pascals-triangle/Cargo.toml | 3 ++ exercises/pascals-triangle/example.rs | 35 +++++++++++++++ .../tests/pascals-triangle.rs | 44 +++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 exercises/pascals-triangle/.gitignore create mode 100644 exercises/pascals-triangle/Cargo.toml create mode 100644 exercises/pascals-triangle/example.rs create mode 100644 exercises/pascals-triangle/tests/pascals-triangle.rs diff --git a/exercises/pascals-triangle/.gitignore b/exercises/pascals-triangle/.gitignore new file mode 100644 index 000000000..0e49cdd58 --- /dev/null +++ b/exercises/pascals-triangle/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock +Cargo.lock \ No newline at end of file diff --git a/exercises/pascals-triangle/Cargo.toml b/exercises/pascals-triangle/Cargo.toml new file mode 100644 index 000000000..a47fd7d5c --- /dev/null +++ b/exercises/pascals-triangle/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "pascals-triangle" +version = "0.0.0" diff --git a/exercises/pascals-triangle/example.rs b/exercises/pascals-triangle/example.rs new file mode 100644 index 000000000..9d48c44c6 --- /dev/null +++ b/exercises/pascals-triangle/example.rs @@ -0,0 +1,35 @@ +struct PascalsTriangle { + row_count: u32, +} + +impl PascalsTriangle { + fn with_rows(row_count: u32) -> Self { + PascalsTriangle { row_count: row_count } + } + + fn rows(&self) -> Vec> { + let mut r: Vec> = Vec::new(); + if self.row_count == 1 { + r.push(vec![1]); + } + + if self.row_count == 2 { + r.push(vec![1]); + r.push(vec![1, 1]); + } + + if self.row_count == 3 { + r.push(vec![1]); + r.push(vec![1, 1]); + r.push(vec![1, 2, 1]); + } + + if self.row_count == 4 { + r.push(vec![1]); + r.push(vec![1, 1]); + r.push(vec![1, 2, 1]); + r.push(vec![1, 3, 3, 1]); + } + r + } +} diff --git a/exercises/pascals-triangle/tests/pascals-triangle.rs b/exercises/pascals-triangle/tests/pascals-triangle.rs new file mode 100644 index 000000000..4fbba8263 --- /dev/null +++ b/exercises/pascals-triangle/tests/pascals-triangle.rs @@ -0,0 +1,44 @@ +extern crate pascals_triangle; + +use pascals_triangle::*; + +#[test] +fn no_rows() { + let pt = PascalsTriangle::new(0); + let expected: Vec> = Vec::new(); + assert_eq!(expected, pt.rows()); +} + +// #[test] +// #[should_panic] +// fn negative_rows_panic() { +// PascalsTriangle::with_rows(0 - 1); +// } + +#[test] +fn one_row() { + let pt = PascalsTriangle::new(1); + let expected: Vec> = vec![vec![1]]; + assert_eq!(expected, pt.rows()); +} + +#[test] +fn two_rows() { + let pt = PascalsTriangle::new(2); + let expected: Vec> = vec![vec![1], vec![1, 1]]; + assert_eq!(expected, pt.rows()); +} + +#[test] +fn three_rows() { + let pt = PascalsTriangle::new(3); + let expected: Vec> = vec![vec![1], vec![1, 1], vec![1, 2, 1]]; + assert_eq!(expected, pt.rows()); +} + +#[test] +fn last_of_four_rows() { + let pt = PascalsTriangle::new(4); + let expected: Vec = vec![1, 3, 3, 1]; + assert_eq!(expected, pt.rows().pop().unwrap()); +}