qemu-command-builder 11.0.0-0

Type safe command line builder for qemu
Documentation
#[cfg(test)]
mod test {
    use qemu_command_builder::args::cpu::CpuX86;
    use qemu_command_builder::args::cpu_flags::CPUFlag;
    use qemu_command_builder::args::cpu_type::CpuTypeX86_64;
    use qemu_command_builder::common::{OnOff, YesNo};
    use qemu_command_builder::to_command::ToCommand;
    use std::collections::BTreeSet;
    use std::str::FromStr;

    #[test]
    fn cpu_displays_enabled_and_disabled_flags() {
        let mut cpu = CpuX86::new(CpuTypeX86_64::Base);
        cpu.migratable(YesNo::No);
        cpu.flags(BTreeSet::from([(CPUFlag::X3dnow, OnOff::Off), (CPUFlag::Vmx, OnOff::On)]));

        assert_eq!(cpu.to_command(), vec!["-cpu".to_string(), "base,migratable=no,-3dnow,vmx".to_string()]);
        assert_eq!(cpu.to_single_command(), "-cpu base,migratable=no,-3dnow,vmx");
    }

    #[test]
    fn cpu_parses_mixed_feature_states() {
        let parsed = CpuX86::from_str("host,migratable=yes,-svm,vmx,sse4.1").unwrap();

        let mut expected = CpuX86::new(CpuTypeX86_64::Host);
        expected.migratable(YesNo::Yes);
        expected.flags(BTreeSet::from([(CPUFlag::Svm, OnOff::Off), (CPUFlag::Vmx, OnOff::On), (CPUFlag::Sse4_1, OnOff::On)]));

        assert_eq!(parsed, expected);
        assert_eq!(parsed.to_command(), vec!["-cpu".to_string(), "host,migratable=yes,sse4.1,-svm,vmx".to_string()]);
    }

    #[test]
    fn cpu_parses_property_style_feature_states() {
        let parsed = CpuX86::from_str("host,migratable=yes,-vmx,-svm,invpcid=off").unwrap();

        let mut expected = CpuX86::new(CpuTypeX86_64::Host);
        expected.migratable(YesNo::Yes);
        expected.flags(BTreeSet::from([(CPUFlag::Vmx, OnOff::Off), (CPUFlag::Svm, OnOff::Off), (CPUFlag::Invpcid, OnOff::Off)]));

        assert_eq!(parsed, expected);
        assert_eq!(parsed.to_command(), vec!["-cpu".to_string(), "host,migratable=yes,-invpcid,-svm,-vmx".to_string()]);
    }

    #[test]
    fn cpu_parses_properties_and_flags_in_any_order_after_model() {
        let parsed = CpuX86::from_str("base,vmx,migratable=no,-3dnow").unwrap();

        let mut expected = CpuX86::new(CpuTypeX86_64::Base);
        expected.migratable(YesNo::No);
        expected.flags(BTreeSet::from([(CPUFlag::Vmx, OnOff::On), (CPUFlag::X3dnow, OnOff::Off)]));

        assert_eq!(parsed, expected);
    }

    #[test]
    fn cpu_duplicate_feature_modifiers_use_last_state() {
        let parsed = CpuX86::from_str("host,vmx,-vmx,vmx,-svm,svm").unwrap();

        let mut expected = CpuX86::new(CpuTypeX86_64::Host);
        expected.flags(BTreeSet::from([(CPUFlag::Vmx, OnOff::On), (CPUFlag::Svm, OnOff::On)]));

        assert_eq!(parsed, expected);
        assert_eq!(parsed.to_command(), vec!["-cpu".to_string(), "host,svm,vmx".to_string()]);
    }
}