mirror of
https://github.com/rust-lang/rustlings.git
synced 2024-12-26 00:00:03 +03:00
2f4e63b443
In the instructions for hashmaps2.rs, the last sentence of the include the phrase "these fruits", which refers to fruits that were mentioned two sentences prior. Having a sentence in between the first sentence in which the fruits were described and a later sentence in which the phrase "these fruits" is used makes this confusing to read, since the phrase "these fruits" does not come immediately after the mention of the fruits that the phrase refers to. This pull request expands the last sentence to explicitly refer to the fruits being mentioned, in order to add clarity about the requirement of the exercise.
98 lines
2.8 KiB
Rust
98 lines
2.8 KiB
Rust
// We're collecting different fruits to bake a delicious fruit cake. For this,
|
|
// we have a basket, which we'll represent in the form of a hash map. The key
|
|
// represents the name of each fruit we collect and the value represents how
|
|
// many of that particular fruit we have collected. Three types of fruits -
|
|
// Apple (4), Mango (2) and Lychee (5) are already in the basket hash map. You
|
|
// must add fruit to the basket so that there is at least one of each kind and
|
|
// more than 11 in total - we have a lot of mouths to feed. You are not allowed
|
|
// to insert any more of the fruits that are already in the basket (Apple,
|
|
// Mango, and Lyche).
|
|
|
|
use std::collections::HashMap;
|
|
|
|
#[derive(Hash, PartialEq, Eq, Debug)]
|
|
enum Fruit {
|
|
Apple,
|
|
Banana,
|
|
Mango,
|
|
Lychee,
|
|
Pineapple,
|
|
}
|
|
|
|
fn fruit_basket(basket: &mut HashMap<Fruit, u32>) {
|
|
let fruit_kinds = [
|
|
Fruit::Apple,
|
|
Fruit::Banana,
|
|
Fruit::Mango,
|
|
Fruit::Lychee,
|
|
Fruit::Pineapple,
|
|
];
|
|
|
|
for fruit in fruit_kinds {
|
|
// TODO: Insert new fruits if they are not already present in the
|
|
// basket. Note that you are not allowed to put any type of fruit that's
|
|
// already present!
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
// You can optionally experiment here.
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
// Don't modify this function!
|
|
fn get_fruit_basket() -> HashMap<Fruit, u32> {
|
|
let content = [(Fruit::Apple, 4), (Fruit::Mango, 2), (Fruit::Lychee, 5)];
|
|
HashMap::from_iter(content)
|
|
}
|
|
|
|
#[test]
|
|
fn test_given_fruits_are_not_modified() {
|
|
let mut basket = get_fruit_basket();
|
|
fruit_basket(&mut basket);
|
|
assert_eq!(*basket.get(&Fruit::Apple).unwrap(), 4);
|
|
assert_eq!(*basket.get(&Fruit::Mango).unwrap(), 2);
|
|
assert_eq!(*basket.get(&Fruit::Lychee).unwrap(), 5);
|
|
}
|
|
|
|
#[test]
|
|
fn at_least_five_types_of_fruits() {
|
|
let mut basket = get_fruit_basket();
|
|
fruit_basket(&mut basket);
|
|
let count_fruit_kinds = basket.len();
|
|
assert!(count_fruit_kinds >= 5);
|
|
}
|
|
|
|
#[test]
|
|
fn greater_than_eleven_fruits() {
|
|
let mut basket = get_fruit_basket();
|
|
fruit_basket(&mut basket);
|
|
let count = basket.values().sum::<u32>();
|
|
assert!(count > 11);
|
|
}
|
|
|
|
#[test]
|
|
fn all_fruit_types_in_basket() {
|
|
let fruit_kinds = [
|
|
Fruit::Apple,
|
|
Fruit::Banana,
|
|
Fruit::Mango,
|
|
Fruit::Lychee,
|
|
Fruit::Pineapple,
|
|
];
|
|
|
|
let mut basket = get_fruit_basket();
|
|
fruit_basket(&mut basket);
|
|
|
|
for fruit_kind in fruit_kinds {
|
|
let Some(amount) = basket.get(&fruit_kind) else {
|
|
panic!("Fruit kind {fruit_kind:?} was not found in basket");
|
|
};
|
|
assert!(*amount > 0);
|
|
}
|
|
}
|
|
}
|