kr580 1.1.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
#![cfg(windows)]

use k580_ui::devices::printer::{
    PrinterPropertyChange, apply_native_printer_property, list_native_printers,
    load_native_printer_configuration, load_native_printer_properties,
};

#[test]
#[ignore = "requires an installed Windows printer driver"]
fn native_print_ticket_properties_round_trip() {
    let printers = list_native_printers().unwrap();
    let printer = printers
        .iter()
        .find(|printer| printer.name.contains("HP Laser"))
        .or_else(|| printers.first())
        .expect("no installed printers");
    let configuration = load_native_printer_configuration(printer).unwrap();
    let sheet = load_native_printer_properties(printer, &configuration.settings).unwrap();
    assert_eq!(sheet.configuration.settings.printer_name, printer.name);
    assert_eq!(sheet.provider_error, None);
    assert!(!sheet.features.is_empty());
    println!(
        "{}: {} features, {} parameters",
        printer.name,
        sheet.features.len(),
        sheet.parameters.len()
    );
    if std::env::var_os("KR580_DUMP_PRINTER_PROPERTIES").is_some() {
        for feature in &sheet.features {
            println!("FEATURE\t{}\t{}", feature.name, feature.display_name);
            for option in &feature.options {
                println!(
                    "OPTION\t{}\t{}\t{}",
                    option.name, option.display_name, option.constrained
                );
            }
        }
        for parameter in &sheet.parameters {
            println!(
                "PARAMETER\t{}\t{}\t{}\t{}",
                parameter.name, parameter.display_name, parameter.value_type, parameter.value
            );
        }
    }
    if let Some((feature, option)) = sheet.features.iter().find_map(|feature| {
        let selected = feature.selected_option.as_ref()?;
        feature
            .options
            .iter()
            .find(|option| &option.name == selected)
            .map(|option| (feature, option))
    }) {
        let applied = apply_native_printer_property(
            printer,
            &sheet.configuration.settings,
            &PrinterPropertyChange::Feature {
                feature_name: feature.name.clone(),
                option_name: option.name.clone(),
            },
        )
        .unwrap();
        assert_eq!(applied.configuration.settings.printer_name, printer.name);
        assert!(!applied.configuration.settings.devmode.is_empty());
    }
}