Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to write tests that depend on specific parameter values? #171

Open
universalhandle opened this issue Nov 3, 2024 · 0 comments
Open

Comments

@universalhandle
Copy link

Hello. I'm new to Rust and audio plugin development, so forgive me if my questions are... basic? academic?

Anyway, while user-testing my plugin I discovered some behavior that suggested some of my functions were not returning what I expected. I wrote a few unit tests and found the problem. Encouraged by the immediate return on investment, I decided to write a bunch more tests.

For some of the tests, I don't need the plugin at all. For others, it suffices to call MyPlugin::default(). But I couldn't figure out how to instantiate the plugin with parameter values other than the default.

Here's a use case: MyPlugin has a chance parameter. If the user sets it to the minimum value, input will never be processed. I thought it would be useful to short-circuit some of the logic in my process method, so I wrote some code like this (abridged):

impl MyPlugin {
    fn is_configured_to_act(&self) -> bool {
        // If the probability of intervention is set to zero...
        if self.params.chance.value() == self.params.chance.default_plain_value()
        // ...then there is nothing for this plugin to do, because the output would always exactly match the input.
        {
            false
        } else {
            true
        }
    }
}

impl Plugin for MyPlugin {
    fn process(
        &mut self,
        _buffer: &mut Buffer,
        _aux: &mut AuxiliaryBuffers,
        context: &mut impl ProcessContext<Self>,
    ) -> ProcessStatus {
        while let Some(event) = context.next_event() {
            match event {
                NoteEvent::NoteOn {
                    timing,
                    voice_id,
                    channel,
                    note,
                    velocity,
                } => {
                    if self.is_configured_to_act() {
                       // do stuff
                    }
            }
            // ...
       }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn does_act_if_chance_is_nonzero() {
        let plugin = MyPlugin::default();
        // somehow change the param values programmatically?
        assert!(plugin.is_configured_to_act());
    }
}

How would I write this test?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant