rustlings icon indicating copy to clipboard operation
rustlings copied to clipboard

Unused warnings don't show if file compiles.

Open luckynumberke7in opened this issue 2 years ago • 0 comments

Hi, I was working on quiz2 and I accidentally skipped the use the mutable variable output. The finished code compiled but it didn't work as intended (as I didn't write the changes to the mutable variable).

The corresponding text from running the tests was unhelpful for me debugging my issue. if the unused warning was shown before the output of the test info, it would have been a lot easier to figure out.

The test output was tests::itworks panicked at 'index out of bounds: the len is 0 but the index is 0'

My code inside quiz2 was as follows:

// quiz2.rs
// This is a quiz for the following sections:
// - Strings
// - Vecs
// - Move semantics
// - Modules
// - Enums

// Let's build a little machine in the form of a function.
// As input, we're going to give a list of strings and commands. These commands
// determine what action is going to be applied to the string. It can either be:
// - Uppercase the string
// - Trim the string
// - Append "bar" to the string a specified amount of times
// The exact form of this will be:
// - The input is going to be a Vector of a 2-length tuple,
//   the first element is the string, the second one is the command.
// - The output element is going to be a Vector of strings.
// No hints this time!

// I AM NOT DONE

pub enum Command {
    Uppercase,
    Trim,
    Append(usize),
}

mod my_module {
    use super::Command;

    // TODO: Complete the function signature!
    pub fn transformer(input: Vec<(String, Command)>) -> Vec<String> {
        use crate::Command::*;
        // TODO: Complete the output declaration!
        fn add_bar(count: &usize, string: &String) -> String {
            let mut i = 0;
            let mut bard = string.to_string();
            while &i < count {
                bard += "bar";
                i += 1;
            }
            return bard;
        }
        let mut output = vec![];
        for (string, command) in input.iter() {
            // TODO: Complete the function body. You can do it!
            match command {
                Uppercase => string.to_uppercase(), // i needed to push this to output
                Trim => string.trim().to_string(), // and this
                Append(count) => add_bar(count, string), // and this
            };
        }
        return output;
    }
    fn make_test() {
        let test = transformer(vec![("hello".into(), Command::Uppercase)]);
        println!("hello in caps is: {}", test[0]);
    }
}

#[cfg(test)]
mod tests {
    // TODO: What do we need to import to have `transformer` in scope?
    use super::Command;
    use crate::my_module::transformer;

    #[test]
    fn it_works() {
        let output = transformer(vec![
            ("hello".into(), Command::Uppercase),
            (" all roads lead to rome! ".into(), Command::Trim),
            ("foo".into(), Command::Append(1)),
            ("bar".into(), Command::Append(5)),
        ]);
        assert_eq!(output[0], "HELLO");
        assert_eq!(output[1], "all roads lead to rome!");
        assert_eq!(output[2], "foobar");
        assert_eq!(output[3], "barbarbarbarbarbar");
    }
}

luckynumberke7in avatar May 30 '23 21:05 luckynumberke7in