rustlings

solving rustlings ft. dracuxan
git clone [email protected]:dracuxan/rustlings.git
Log | Files | Refs

structs3.rs (2234B)


      1 #[derive(Debug)]
      2 struct Package {
      3     sender_country: String,
      4     recipient_country: String,
      5     weight_in_grams: u32,
      6 }
      7 
      8 impl Package {
      9     fn new(sender_country: String, recipient_country: String, weight_in_grams: u32) -> Self {
     10         if weight_in_grams < 10 {
     11             // This isn't how you should handle errors in Rust, but we will
     12             // learn about error handling later.
     13             panic!("Can't ship a package with weight below 10 grams");
     14         }
     15 
     16         Self {
     17             sender_country,
     18             recipient_country,
     19             weight_in_grams,
     20         }
     21     }
     22 
     23     fn is_international(&self) -> bool {
     24         //                     ^^^^^^^ added
     25         self.sender_country != self.recipient_country
     26     }
     27 
     28     fn get_fees(&self, cents_per_gram: u32) -> u32 {
     29         //                                  ^^^^^^ added
     30         self.weight_in_grams * cents_per_gram
     31     }
     32 }
     33 
     34 fn main() {
     35     // You can optionally experiment here.
     36 }
     37 
     38 #[cfg(test)]
     39 mod tests {
     40     use super::*;
     41 
     42     #[test]
     43     #[should_panic]
     44     fn fail_creating_weightless_package() {
     45         let sender_country = String::from("Spain");
     46         let recipient_country = String::from("Austria");
     47 
     48         Package::new(sender_country, recipient_country, 5);
     49     }
     50 
     51     #[test]
     52     fn create_international_package() {
     53         let sender_country = String::from("Spain");
     54         let recipient_country = String::from("Russia");
     55 
     56         let package = Package::new(sender_country, recipient_country, 1200);
     57 
     58         assert!(package.is_international());
     59     }
     60 
     61     #[test]
     62     fn create_local_package() {
     63         let sender_country = String::from("Canada");
     64         let recipient_country = sender_country.clone();
     65 
     66         let package = Package::new(sender_country, recipient_country, 1200);
     67 
     68         assert!(!package.is_international());
     69     }
     70 
     71     #[test]
     72     fn calculate_transport_fees() {
     73         let sender_country = String::from("Spain");
     74         let recipient_country = String::from("Spain");
     75 
     76         let cents_per_gram = 3;
     77 
     78         let package = Package::new(sender_country, recipient_country, 1500);
     79 
     80         assert_eq!(package.get_fees(cents_per_gram), 4500);
     81         assert_eq!(package.get_fees(cents_per_gram * 2), 9000);
     82     }
     83 }