From b66e2e09622243e086a0f1258dd27e1a2d61c891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=ADdac=20Sement=C3=A9=20Fern=C3=A1ndez?= Date: Mon, 27 Apr 2020 20:17:26 +0200 Subject: [PATCH] feat: Added exercise structs3.rs --- exercises/structs/structs3.rs | 67 +++++++++++++++++++++++++++++++++++ info.toml | 13 +++++++ 2 files changed, 80 insertions(+) create mode 100644 exercises/structs/structs3.rs diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs new file mode 100644 index 0000000000..77cc154b04 --- /dev/null +++ b/exercises/structs/structs3.rs @@ -0,0 +1,67 @@ +// structs3.rs +// Structs contain more than simply some data, they can also have logic, in this +// exercise we have defined the Package struct and we want to test some logic attached to it, +// make the code compile and the tests pass! If you have issues execute `rustlings hint structs3` + +// I AM NOT DONE + +#[derive(Debug)] +struct Package { + from: String, + to: String, + weight: f32 +} + +impl Package { + fn new(from: String, to: String, weight: f32) -> Package { + if weight <= 0.0 { + // Something goes here... + } else { + return Package {from, to, weight}; + } + } + + fn is_international(&self) -> ??? { + // Something goes here... + } + + fn get_fees(&self, cost_per_kg: f32) -> ??? { + // Something goes here... + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[should_panic] + fn fail_creating_weightless_package() { + let country_from = String::from("Spain"); + let country_to = String::from("Austria"); + + Package::new(country_from, country_to, -2.21); + } + + #[test] + fn create_international_package() { + let country_from = String::from("Spain"); + let country_to = String::from("Russia"); + + let package = Package::new(country_from, country_to, 1.2); + + assert!(package.is_international()); + } + + #[test] + fn calculate_transport_fees() { + let country_from = String::from("Spain"); + let country_to = String::from("Spain"); + + let country_fee = ???; + + let package = Package::new(country_from, country_to, 22.0); + + assert_eq!(package.get_fees(country_fee), 176.0); + } +} diff --git a/info.toml b/info.toml index 71bb3ddbc2..1d0701f889 100644 --- a/info.toml +++ b/info.toml @@ -232,6 +232,19 @@ Creating instances of structs is easy, all you need to do is assign some values There is however some shortcuts that can be taken when instantiating structs. Have a look in The Book, to find out more: https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax""" +[[exercises]] +name = "structs3" +path = "exercises/structs/structs3.rs" +mode = "test" +hint = """ +The new method needs to panic if the weight is physically impossible :), how do we do that in Rust? + +For is_international: What makes a package international? Seems related to the places it goes through right? + +For calculate_transport_fees: Bigger is more expensive usually, we don't have size, but something may fit the bill here :) + +Have a look in The Book, to find out more about method implementations: https://doc.rust-lang.org/book/ch05-03-method-syntax.html""" + # STRINGS [[exercises]]