summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDídac Sementé Fernández <didac.semente@gmail.com>2020-04-27 20:17:26 +0200
committerDídac Sementé Fernández <didac.semente@gmail.com>2020-04-27 20:26:34 +0200
commitb66e2e09622243e086a0f1258dd27e1a2d61c891 (patch)
tree0fcd69caa026fff39b6bc8e35506aaaf5001b06a
parent32721bbc83953ad9cad7784cce645892d74aa778 (diff)
feat: Added exercise structs3.rs
-rw-r--r--exercises/structs/structs3.rs67
-rw-r--r--info.toml13
2 files changed, 80 insertions, 0 deletions
diff --git a/exercises/structs/structs3.rs b/exercises/structs/structs3.rs
new file mode 100644
index 0000000..77cc154
--- /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 71bb3dd..1d0701f 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]]