winprint_ext/ticket/
page_media_size.rs1use 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 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}