#[cfg(test)]
mod tests {
use crate::style;
use crate::variable::var;
use crate::values::{
AlignItems, BorderStyle, BoxShadow, Color, Cursor, Display, FlexDirection, FontSize,
FontWeight, JustifyContent, LineHeight, Overflow, Position, Size, TextAlign, TextDecoration,
Transition, Visibility, ZIndex,
};
#[test]
fn test_example_from_issue_description() {
let css = style()
.color(Color::White)
.background_color(Color::Rgba(255, 0, 0, 0.5))
.font_size(Size::Px(16))
.display(Display::Flex)
.apply();
assert_eq!(
css,
"color: white; background-color: rgba(255, 0, 0, 0.5); font-size: 16px; display: flex;"
);
}
#[test]
fn test_complex_style() {
let css = style()
.display(Display::Flex)
.flex_direction(FlexDirection::Column)
.justify_content(JustifyContent::Center)
.align_items(AlignItems::Center)
.width(Size::Percent(100.0))
.height(Size::Vh(100.0))
.background_color(Color::Rgb(240, 240, 240))
.color(Color::Hex("333333".to_string()))
.font_size(Size::Rem(1.2))
.font_family("Arial, sans-serif")
.padding(Size::Px(20))
.margin(Size::Auto)
.border_radius(Size::Px(8))
.apply();
assert!(css.contains("display: flex;"));
assert!(css.contains("flex-direction: column;"));
assert!(css.contains("justify-content: center;"));
assert!(css.contains("align-items: center;"));
assert!(css.contains("width: 100%;"));
assert!(css.contains("height: 100vh;"));
assert!(css.contains("background-color: rgb(240, 240, 240);"));
assert!(css.contains("color: #333333;"));
assert!(css.contains("font-size: 1.2rem;"));
assert!(css.contains("font-family: Arial, sans-serif;"));
assert!(css.contains("padding: 20px;"));
assert!(css.contains("margin: auto;"));
assert!(css.contains("border-radius: 8px;"));
}
#[test]
fn test_build_alias() {
let css1 = style()
.color(Color::Blue)
.font_size(Size::Px(14))
.apply();
let css2 = style()
.color(Color::Blue)
.font_size(Size::Px(14))
.build();
assert_eq!(css1, css2);
}
#[test]
fn test_all_properties_from_issue_description() {
let shadow = BoxShadow {
h_offset: Size::Px(0),
v_offset: Size::Px(2),
blur: Some(Size::Px(4)),
spread: None,
color: Some(Color::Rgba(0, 0, 0, 0.1)),
inset: false,
};
let transition = Transition {
property: "all".to_string(),
duration: 0.3,
timing_function: Some("ease".to_string()),
delay: None,
};
let css = style()
.color(Color::Red)
.color(Color::Hex("fff".to_string()))
.color(Color::Rgb(255, 0, 0))
.color(Color::Hsl(0, 100, 50))
.color(Color::CurrentColor)
.background_color(Color::Transparent)
.background_color(Color::Hex("000".to_string()))
.background_color(Color::Rgba(0, 0, 0, 0.5))
.background_color(Color::Inherit)
.font_size(Size::Px(16))
.font_size(Size::Rem(1.0))
.font_size_enum(FontSize::Smaller)
.font_size_enum(FontSize::Larger)
.font_size_enum(FontSize::Calc("100% + 16px".to_string()))
.font_weight(FontWeight::Normal)
.font_weight(FontWeight::Bold)
.font_weight(FontWeight::Lighter)
.font_weight(FontWeight::Bolder)
.font_weight(FontWeight::Weight(500))
.font_family("Arial")
.font_family("Helvetica")
.font_family("sans-serif")
.font_family("Times New Roman")
.line_height(Size::Px(24))
.line_height_enum(LineHeight::Normal)
.line_height_enum(LineHeight::Percent(120.0))
.line_height_enum(LineHeight::Calc("1em + 0.5em".to_string()))
.text_align(TextAlign::Left)
.text_align(TextAlign::Right)
.text_align(TextAlign::Center)
.text_align(TextAlign::Justify)
.text_align(TextAlign::Start)
.text_align(TextAlign::End)
.display(Display::Block)
.display(Display::Inline)
.display(Display::InlineBlock)
.display(Display::Flex)
.display(Display::Grid)
.display(Display::None)
.position(Position::Static)
.position(Position::Relative)
.position(Position::Absolute)
.position(Position::Fixed)
.position(Position::Sticky)
.top(Size::Px(0))
.right(Size::Px(10))
.bottom(Size::Auto)
.left(Size::Percent(50.0))
.margin(Size::Px(0))
.margin(Size::Px(10))
.margin(Size::Em(1.0))
.margin(Size::Auto)
.padding(Size::Px(0))
.padding(Size::Px(8))
.padding(Size::Rem(1.0))
.width(Size::Auto)
.width(Size::Px(100))
.width(Size::Percent(100.0))
.height(Size::Auto)
.height(Size::Vh(100.0))
.height(Size::Percent(50.0))
.max_width(Size::Px(600))
.min_width(Size::Percent(100.0))
.max_width(Size::Auto)
.border(Size::Px(1), BorderStyle::Solid, Color::Hex("000".to_string()))
.border_top(Size::Px(2), BorderStyle::Solid, Color::Red)
.border_right(Size::Px(3), BorderStyle::Dashed, Color::Blue)
.border_bottom(Size::Px(4), BorderStyle::Dotted, Color::Green)
.border_left(Size::Px(5), BorderStyle::Double, Color::Black)
.border_style(BorderStyle::None)
.border_style(BorderStyle::Dashed)
.border_style(BorderStyle::Double)
.border_radius(Size::Px(0))
.border_radius(Size::Px(4))
.border_radius(Size::Percent(50.0))
.border_radius(Size::Em(1.0))
.box_shadow_none()
.box_shadow(shadow)
.text_decoration(TextDecoration::None)
.text_decoration(TextDecoration::Underline)
.text_decoration(TextDecoration::LineThrough)
.text_decoration(TextDecoration::Overline)
.overflow(Overflow::Visible)
.overflow(Overflow::Hidden)
.overflow(Overflow::Scroll)
.overflow(Overflow::Auto)
.overflow(Overflow::Clip)
.cursor(Cursor::Pointer)
.cursor(Cursor::Default)
.cursor(Cursor::Text)
.cursor(Cursor::NotAllowed)
.z_index(ZIndex::Auto)
.z_index(ZIndex::Index(0))
.z_index(ZIndex::Index(10))
.z_index(ZIndex::Index(9999))
.opacity(1.0)
.opacity(0.5)
.opacity(0.0)
.opacity(0.75)
.transition_none()
.transition(transition)
.transition_all(0.3, Some("ease"), None)
.flex_direction(FlexDirection::Row)
.flex_direction(FlexDirection::RowReverse)
.flex_direction(FlexDirection::Column)
.flex_direction(FlexDirection::ColumnReverse)
.justify_content(JustifyContent::FlexStart)
.justify_content(JustifyContent::Center)
.justify_content(JustifyContent::SpaceBetween)
.justify_content(JustifyContent::SpaceAround)
.justify_content(JustifyContent::SpaceEvenly)
.align_items(AlignItems::Stretch)
.align_items(AlignItems::Center)
.align_items(AlignItems::FlexStart)
.align_items(AlignItems::FlexEnd)
.align_items(AlignItems::Baseline)
.gap(Size::Px(0))
.gap(Size::Px(8))
.gap(Size::Rem(1.0))
.grid_template_columns("repeat(3, 1fr)")
.grid_template_columns("200px auto")
.grid_template_columns("1fr 2fr")
.visibility(Visibility::Visible)
.visibility(Visibility::Hidden)
.visibility(Visibility::Collapse)
.apply();
assert!(css.contains("color: red;"));
assert!(css.contains("color: #fff;"));
assert!(css.contains("color: rgb(255, 0, 0);"));
assert!(css.contains("color: hsl(0, 100%, 50%);"));
assert!(css.contains("color: currentColor;"));
assert!(css.contains("background-color: transparent;"));
assert!(css.contains("background-color: #000;"));
assert!(css.contains("background-color: rgba(0, 0, 0, 0.5);"));
assert!(css.contains("background-color: inherit;"));
assert!(css.contains("font-size: 16px;"));
assert!(css.contains("font-size: 1rem;"));
assert!(css.contains("font-size: smaller;"));
assert!(css.contains("font-size: larger;"));
assert!(css.contains("font-size: calc(100% + 16px);"));
assert!(css.contains("font-weight: normal;"));
assert!(css.contains("font-weight: bold;"));
assert!(css.contains("font-weight: lighter;"));
assert!(css.contains("font-weight: bolder;"));
assert!(css.contains("font-weight: 500;"));
assert!(css.contains("font-family: Arial;"));
assert!(css.contains("font-family: Helvetica;"));
assert!(css.contains("font-family: sans-serif;"));
assert!(css.contains("font-family: Times New Roman;"));
assert!(css.contains("line-height: 24px;"));
assert!(css.contains("line-height: normal;"));
assert!(css.contains("line-height: 120%;"));
assert!(css.contains("line-height: calc(1em + 0.5em);"));
assert!(css.contains("text-align: left;"));
assert!(css.contains("text-align: right;"));
assert!(css.contains("text-align: center;"));
assert!(css.contains("text-align: justify;"));
assert!(css.contains("text-align: start;"));
assert!(css.contains("text-align: end;"));
assert!(css.contains("display: block;"));
assert!(css.contains("display: inline;"));
assert!(css.contains("display: inline-block;"));
assert!(css.contains("display: flex;"));
assert!(css.contains("display: grid;"));
assert!(css.contains("display: none;"));
assert!(css.contains("position: static;"));
assert!(css.contains("position: relative;"));
assert!(css.contains("position: absolute;"));
assert!(css.contains("position: fixed;"));
assert!(css.contains("position: sticky;"));
assert!(css.contains("top: 0px;"));
assert!(css.contains("right: 10px;"));
assert!(css.contains("bottom: auto;"));
assert!(css.contains("left: 50%;"));
assert!(css.contains("margin: 0px;"));
assert!(css.contains("margin: 10px;"));
assert!(css.contains("margin: 1em;"));
assert!(css.contains("margin: auto;"));
assert!(css.contains("padding: 0px;"));
assert!(css.contains("padding: 8px;"));
assert!(css.contains("padding: 1rem;"));
assert!(css.contains("width: auto;"));
assert!(css.contains("width: 100px;"));
assert!(css.contains("width: 100%;"));
assert!(css.contains("height: auto;"));
assert!(css.contains("height: 100vh;"));
assert!(css.contains("height: 50%;"));
assert!(css.contains("max-width: 600px;"));
assert!(css.contains("min-width: 100%;"));
assert!(css.contains("max-width: auto;"));
assert!(css.contains("border: 1px solid #000;"));
assert!(css.contains("border-top: 2px solid red;"));
assert!(css.contains("border-right: 3px dashed blue;"));
assert!(css.contains("border-bottom: 4px dotted green;"));
assert!(css.contains("border-left: 5px double black;"));
assert!(css.contains("border-style: none;"));
assert!(css.contains("border-style: dashed;"));
assert!(css.contains("border-style: double;"));
assert!(css.contains("border-radius: 0px;"));
assert!(css.contains("border-radius: 4px;"));
assert!(css.contains("border-radius: 50%;"));
assert!(css.contains("border-radius: 1em;"));
assert!(css.contains("box-shadow: none;"));
assert!(css.contains("box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);"));
assert!(css.contains("text-decoration: none;"));
assert!(css.contains("text-decoration: underline;"));
assert!(css.contains("text-decoration: line-through;"));
assert!(css.contains("text-decoration: overline;"));
assert!(css.contains("overflow: visible;"));
assert!(css.contains("overflow: hidden;"));
assert!(css.contains("overflow: scroll;"));
assert!(css.contains("overflow: auto;"));
assert!(css.contains("overflow: clip;"));
assert!(css.contains("cursor: pointer;"));
assert!(css.contains("cursor: default;"));
assert!(css.contains("cursor: text;"));
assert!(css.contains("cursor: not-allowed;"));
assert!(css.contains("z-index: auto;"));
assert!(css.contains("z-index: 0;"));
assert!(css.contains("z-index: 10;"));
assert!(css.contains("z-index: 9999;"));
assert!(css.contains("opacity: 1;"));
assert!(css.contains("opacity: 0.5;"));
assert!(css.contains("opacity: 0;"));
assert!(css.contains("opacity: 0.75;"));
assert!(css.contains("transition: none;"));
assert!(css.contains("transition: all 0.3s ease;"));
assert!(css.contains("transition: all 0.3s ease;"));
assert!(css.contains("flex-direction: row;"));
assert!(css.contains("flex-direction: row-reverse;"));
assert!(css.contains("flex-direction: column;"));
assert!(css.contains("flex-direction: column-reverse;"));
assert!(css.contains("justify-content: flex-start;"));
assert!(css.contains("justify-content: center;"));
assert!(css.contains("justify-content: space-between;"));
assert!(css.contains("justify-content: space-around;"));
assert!(css.contains("justify-content: space-evenly;"));
assert!(css.contains("align-items: stretch;"));
assert!(css.contains("align-items: center;"));
assert!(css.contains("align-items: flex-start;"));
assert!(css.contains("align-items: flex-end;"));
assert!(css.contains("align-items: baseline;"));
assert!(css.contains("gap: 0px;"));
assert!(css.contains("gap: 8px;"));
assert!(css.contains("gap: 1rem;"));
assert!(css.contains("grid-template-columns: repeat(3, 1fr);"));
assert!(css.contains("grid-template-columns: 200px auto;"));
assert!(css.contains("grid-template-columns: 1fr 2fr;"));
assert!(css.contains("visibility: visible;"));
assert!(css.contains("visibility: hidden;"));
assert!(css.contains("visibility: collapse;"));
}
#[test]
fn test_css_variables() {
let css = style()
.set_var("primary", Color::Blue)
.custom_property("color", var("primary"))
.apply();
assert!(css.contains("--primary: blue;"));
assert!(css.contains("color: var(--primary);"));
}
}