Skip to content

Commit

Permalink
Add solution for Health Statistics exercise (#1172)
Browse files Browse the repository at this point in the history
  • Loading branch information
fw-immunant authored Sep 26, 2023
1 parent fc38857 commit 7586391
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 46 deletions.
4 changes: 4 additions & 0 deletions src/exercises/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ path = "day-1/luhn.rs"
name = "book-library"
path = "day-2/book-library.rs"

[[bin]]
name = "health-statistics"
path = "../../third_party/rust-on-exercism/health-statistics.rs"

[[bin]]
name = "strings-iterators"
path = "day-2/strings-iterators.rs"
Expand Down
72 changes: 34 additions & 38 deletions src/exercises/day-2/health-statistics.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,45 +9,41 @@ methods:
// TODO: remove this when you're done with your implementation.
#![allow(unused_variables, dead_code)]
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs}}
fn main() {
let bob = User::new(String::from("Bob"), 32, 155.2);
println!("I'm {} and my age is {}", bob.name(), bob.age());
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:setup}}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_new}}
todo!("Create a new User instance")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_name}}
todo!("Return the user's name")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_age}}
todo!("Return the user's age")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_height}}
todo!("Return the user's height")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_doctor_visits}}
todo!("Return the number of time the user has visited the doctor")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_set_age}}
todo!("Set the user's age")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_set_height}}
todo!("Set the user's height")
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:User_visit_doctor}}
todo!("Update a user's statistics based on measurements from a visit to the doctor")
}
}
#[test]
fn test_height() {
let bob = User::new(String::from("Bob"), 32, 155.2);
assert_eq!(bob.height(), 155.2);
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:main}}
#[test]
fn test_set_age() {
let mut bob = User::new(String::from("Bob"), 32, 155.2);
assert_eq!(bob.age(), 32);
bob.set_age(33);
assert_eq!(bob.age(), 33);
}
#[test]
fn test_visit() {
let mut bob = User::new(String::from("Bob"), 32, 155.2);
assert_eq!(bob.doctor_visits(), 0);
let report = bob.visit_doctor(Measurements {
height: 156.1,
blood_pressure: (120, 80),
});
assert_eq!(report.patient_name, "Bob");
assert_eq!(report.visit_count, 1);
assert_eq!(report.blood_pressure_change, None);
let report = bob.visit_doctor(Measurements {
height: 156.1,
blood_pressure: (115, 76),
});
assert_eq!(report.visit_count, 2);
assert_eq!(report.blood_pressure_change, Some((-5, -4)));
}
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:tests}}
```
8 changes: 8 additions & 0 deletions src/exercises/day-2/solutions-morning.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,11 @@
```rust
{{#include book-library.rs:solution}}
```

## Health Statistics

([back to exercise](health-statistics.md))

```rust
{{#include ../../../third_party/rust-on-exercism/health-statistics.rs:solution}}
```
101 changes: 93 additions & 8 deletions third_party/rust-on-exercism/health-statistics.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// ANCHOR: solution
// ANCHOR: setup
pub struct User {
name: String,
age: u32,
Expand All @@ -19,35 +21,118 @@ pub struct HealthReport<'a> {
}

impl User {
// ANCHOR_END: setup
// ANCHOR: User_new
pub fn new(name: String, age: u32, height: f32) -> Self {
unimplemented!()
// ANCHOR_END: User_new
Self {
name,
age,
height,
visit_count: 0,
last_blood_pressure: None,
}
}

// ANCHOR: User_name
pub fn name(&self) -> &str {
unimplemented!()
// ANCHOR_END: User_name
&self.name
}

// ANCHOR: User_age
pub fn age(&self) -> u32 {
unimplemented!()
// ANCHOR_END: User_age
self.age
}

// ANCHOR: User_height
pub fn height(&self) -> f32 {
unimplemented!()
// ANCHOR_END: User_height
self.height
}

// ANCHOR: User_doctor_visits
pub fn doctor_visits(&self) -> u32 {
unimplemented!()
// ANCHOR_END: User_doctor_visits
self.visit_count as u32
}

// ANCHOR: User_set_age
pub fn set_age(&mut self, new_age: u32) {
unimplemented!()
// ANCHOR_END: User_set_age
self.age = new_age
}

// ANCHOR: User_set_height
pub fn set_height(&mut self, new_height: f32) {
unimplemented!()
// ANCHOR_END: User_set_height
self.height = new_height
}

// ANCHOR: User_visit_doctor
pub fn visit_doctor(&mut self, measurements: Measurements) -> HealthReport {
unimplemented!()
// ANCHOR_END: User_visit_doctor
self.visit_count += 1;
let bp = measurements.blood_pressure;
let report = HealthReport {
patient_name: &self.name,
visit_count: self.visit_count as u32,
height_change: measurements.height - self.height,
blood_pressure_change: match self.last_blood_pressure {
Some(lbp) => Some((
bp.0 as i32 - lbp.0 as i32,
bp.1 as i32 - lbp.1 as i32
)),
None => None,
}
};
self.height = measurements.height;
self.last_blood_pressure = Some(bp);
report
}
}

// ANCHOR: main
fn main() {
let bob = User::new(String::from("Bob"), 32, 155.2);
println!("I'm {} and my age is {}", bob.name(), bob.age());
}
// ANCHOR_END: main

// ANCHOR: tests
#[test]
fn test_height() {
let bob = User::new(String::from("Bob"), 32, 155.2);
assert_eq!(bob.height(), 155.2);
}

#[test]
fn test_set_age() {
let mut bob = User::new(String::from("Bob"), 32, 155.2);
assert_eq!(bob.age(), 32);
bob.set_age(33);
assert_eq!(bob.age(), 33);
}

#[test]
fn test_visit() {
let mut bob = User::new(String::from("Bob"), 32, 155.2);
assert_eq!(bob.doctor_visits(), 0);
let report = bob.visit_doctor(Measurements {
height: 156.1,
blood_pressure: (120, 80),
});
assert_eq!(report.patient_name, "Bob");
assert_eq!(report.visit_count, 1);
assert_eq!(report.blood_pressure_change, None);

let report = bob.visit_doctor(Measurements {
height: 156.1,
blood_pressure: (115, 76),
});

assert_eq!(report.visit_count, 2);
assert_eq!(report.blood_pressure_change, Some((-5, -4)));
}
// ANCHOR_END: tests

0 comments on commit 7586391

Please sign in to comment.