Skip to main content

css_ast/rules/media/features/
resolution.rs

1use super::prelude::*;
2use crate::units::Resolution;
3
4ranged_feature!(
5	#[node]
6	#[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
7	#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
8	#[derive(csskit_derives::FeatureMetadata)]
9	#[feature_metadata(CssAtomSet::Resolution)]
10	#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
11	#[derive(csskit_derives::NodeWithMetadata)]
12	pub enum ResolutionMediaFeature{CssAtomSet::Resolution | CssAtomSet::MinResolution | CssAtomSet::MaxResolution, ResolutionMediaFeatureValue}
13);
14
15/// <https://drafts.csswg.org/mediaqueries-5/#resolution>
16///
17/// ```text,ignore
18/// <resolution> | infinite
19/// ```
20#[node]
21#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
23#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
24#[derive(csskit_derives::NodeWithMetadata)]
25pub enum ResolutionMediaFeatureValue {
26	#[atom(CssAtomSet::Infinite)]
27	Infinite(T![Ident]),
28	Resolution(Resolution),
29}
30
31#[cfg(test)]
32mod tests {
33	use super::*;
34	use crate::CssAtomSet;
35	use css_parse::{assert_parse, assert_parse_error};
36
37	#[test]
38	fn test_writes() {
39		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution:2dppx)");
40		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution:1x)");
41		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution:96dpi)");
42		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution:infinite)");
43		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(min-resolution:96dpi)");
44		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(max-resolution:300dpi)");
45		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution<=2dppx)");
46		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution>=96dpi)");
47		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution=1x)");
48		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(96dpi=resolution)");
49		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(1x<=resolution)");
50		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(1x<resolution<3x)");
51		assert_parse!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(1x>=resolution<=3x)");
52	}
53
54	#[test]
55	fn test_errors() {
56		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution:)");
57		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution: > 1x)");
58		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(max-resolution > 1x)");
59		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(min-resolution > 1x)");
60		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution: 1px)");
61		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(resolution: 10)");
62		assert_parse_error!(CssAtomSet::ATOMS, ResolutionMediaFeature, "(pointer: 1x)");
63	}
64}