use crate::stylesheet::{ComputedStyle, CssValue};
pub fn resolve(parent: &ComputedStyle, child: &mut ComputedStyle) {
if matches!(child.color, Some(CssValue::Inherit)) || child.color.is_none() {
child.color = parent.color.clone();
}
if matches!(child.color, Some(CssValue::Initial) | Some(CssValue::Unset)) {
child.color = None;
}
if child.font_size.is_none() {
child.font_size = parent.font_size;
}
if child.font_weight.is_none() {
child.font_weight = parent.font_weight;
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::stylesheet::CssValue;
use oxiui_core::Color;
fn color_val(r: u8, g: u8, b: u8) -> CssValue {
CssValue::Color(Color(r, g, b, 255))
}
#[test]
fn color_flows_from_parent_when_child_has_none() {
let parent = ComputedStyle {
color: Some(color_val(255, 0, 0)),
..Default::default()
};
let mut child = ComputedStyle::default();
resolve(&parent, &mut child);
assert_eq!(child.color, Some(color_val(255, 0, 0)));
}
#[test]
fn color_inherit_keyword_copies_parent() {
let parent = ComputedStyle {
color: Some(color_val(0, 255, 0)),
..Default::default()
};
let mut child = ComputedStyle {
color: Some(CssValue::Inherit),
..Default::default()
};
resolve(&parent, &mut child);
assert_eq!(child.color, Some(color_val(0, 255, 0)));
}
#[test]
fn color_initial_clears_to_none() {
let parent = ComputedStyle {
color: Some(color_val(0, 0, 255)),
..Default::default()
};
let mut child = ComputedStyle {
color: Some(CssValue::Initial),
..Default::default()
};
resolve(&parent, &mut child);
assert!(child.color.is_none());
}
#[test]
fn padding_not_inherited() {
let parent = ComputedStyle {
padding: Some(16.0),
..Default::default()
};
let mut child = ComputedStyle::default();
resolve(&parent, &mut child);
assert!(child.padding.is_none(), "padding must not be inherited");
}
#[test]
fn font_size_flows_from_parent() {
let parent = ComputedStyle {
font_size: Some(18.0),
..Default::default()
};
let mut child = ComputedStyle::default();
resolve(&parent, &mut child);
assert_eq!(child.font_size, Some(18.0));
}
#[test]
fn font_weight_flows_from_parent() {
let parent = ComputedStyle {
font_weight: Some(700.0),
..Default::default()
};
let mut child = ComputedStyle::default();
resolve(&parent, &mut child);
assert_eq!(child.font_weight, Some(700.0));
}
#[test]
fn own_font_size_not_overridden_by_parent() {
let parent = ComputedStyle {
font_size: Some(18.0),
..Default::default()
};
let mut child = ComputedStyle {
font_size: Some(12.0),
..Default::default()
};
resolve(&parent, &mut child);
assert_eq!(child.font_size, Some(12.0));
}
}