Skip to main content

winprint_ext/ticket/
page_media_size.rs

1use super::{
2    define_feature_option_pack,
3    document::{ParameterInit, PrintFeatureOption, WithScoredProperties, NS_PSK},
4    MediaSizeTuple, PredefinedMediaName,
5};
6use xml::name::OwnedName;
7
8define_feature_option_pack!(
9    OwnedName::qualified("PageMediaSize", NS_PSK, Some("psk")),
10    PageMediaSize,
11    PredefinedMediaName
12);
13
14impl PageMediaSize {
15    /// Get the size of the media.
16    pub fn size(&self) -> MediaSizeTuple {
17        let width = self
18            .option
19            .get_scored_property("MediaSizeWidth", Some(NS_PSK))
20            .and_then(|x| x.value_with(&self.parameters))
21            .and_then(|x| x.integer())
22            .unwrap_or_default();
23        let height = self
24            .option
25            .get_scored_property("MediaSizeHeight", Some(NS_PSK))
26            .and_then(|x| x.value_with(&self.parameters))
27            .and_then(|x| x.integer())
28            .unwrap_or_default();
29        MediaSizeTuple::micron(width as u32, height as u32)
30    }
31}
32
33#[cfg(all(test, feature = "test-utils"))]
34mod tests {
35    use crate::{
36        test_utils::null_device,
37        ticket::{
38            FeatureOptionPack, FeatureOptionPackWithPredefined, PredefinedMediaName,
39            PrintCapabilities, PrintTicketBuilder,
40        },
41    };
42
43    #[test]
44    fn use_page_media_size() {
45        let device = null_device::thread_local();
46        let capabilities = PrintCapabilities::fetch(&device).unwrap();
47        for media in capabilities.page_media_sizes() {
48            let mut builder = PrintTicketBuilder::new(&device).unwrap();
49            builder.merge(media).unwrap();
50        }
51    }
52
53    #[test]
54    fn get_size() {
55        let device = null_device::thread_local();
56        let capabilities = PrintCapabilities::fetch(&device).unwrap();
57        for media in capabilities.page_media_sizes() {
58            let size = media.size();
59            assert!(
60                size.width_in_micron() | size.height_in_micron() > 0,
61                "Size is zero for {:#?}",
62                media
63            );
64        }
65    }
66
67    #[test]
68    fn get_display_name() {
69        let device = null_device::thread_local();
70        let capabilities = PrintCapabilities::fetch(&device).unwrap();
71        for media in capabilities.page_media_sizes() {
72            let display_name = media.display_name();
73            assert!(
74                display_name.is_some(),
75                "Display name is not found for {:#?}",
76                media
77            );
78        }
79    }
80
81    #[test]
82    fn a4_should_be_found() {
83        let device = null_device::thread_local();
84        let capabilities = PrintCapabilities::fetch(&device).unwrap();
85        capabilities
86            .page_media_sizes()
87            .find(|x| x.as_predefined_name() == Some(PredefinedMediaName::ISOA4))
88            .unwrap();
89    }
90}