freya-core 0.3.4

Internal core funcionatilies for Freya.
Documentation
use freya_core::{
    parsing::Parse,
    values::{
        Border,
        BorderAlignment,
        BorderWidth,
        Fill,
        GradientStop,
        LinearGradient,
    },
};
use freya_engine::prelude::*;

#[test]
fn parse_basic_border() {
    let border = Border::parse("1 inner red");

    assert_eq!(
        border,
        Ok(Border {
            width: BorderWidth {
                top: 1.0,
                right: 1.0,
                bottom: 1.0,
                left: 1.0,
            },
            fill: Fill::Color(Color::RED),
            alignment: BorderAlignment::Inner
        })
    );
}

#[test]
fn parse_border_widths() {
    let one_width = Border::parse("2 inner red");
    let two_widths = Border::parse("1 2 inner red");
    let three_widths = Border::parse("1 2 3 inner red");
    let four_widths = Border::parse("1 2 3 4 inner red");

    assert_eq!(
        one_width,
        Ok(Border {
            width: BorderWidth {
                top: 2.0,
                right: 2.0,
                bottom: 2.0,
                left: 2.0,
            },
            fill: Fill::Color(Color::RED),
            alignment: BorderAlignment::Inner
        })
    );

    assert_eq!(
        two_widths,
        Ok(Border {
            width: BorderWidth {
                top: 1.0,
                right: 2.0,
                bottom: 1.0,
                left: 2.0,
            },
            fill: Fill::Color(Color::RED),
            alignment: BorderAlignment::Inner
        })
    );

    assert_eq!(
        three_widths,
        Ok(Border {
            width: BorderWidth {
                top: 1.0,
                right: 2.0,
                bottom: 3.0,
                left: 2.0,
            },
            fill: Fill::Color(Color::RED),
            alignment: BorderAlignment::Inner
        })
    );

    assert_eq!(
        four_widths,
        Ok(Border {
            width: BorderWidth {
                top: 1.0,
                right: 2.0,
                bottom: 3.0,
                left: 4.0,
            },
            fill: Fill::Color(Color::RED),
            alignment: BorderAlignment::Inner
        })
    );
}

#[test]
fn parse_gradient_border() {
    let shadow = Border::parse("1 inner linear-gradient(red 0%, blue 100%)");
    assert_eq!(
        shadow,
        Ok(Border {
            width: BorderWidth {
                top: 1.0,
                right: 1.0,
                bottom: 1.0,
                left: 1.0,
            },
            fill: Fill::LinearGradient(Box::new(LinearGradient {
                angle: 0.0,
                stops: vec![
                    GradientStop {
                        color: Color::RED,
                        offset: 0.0,
                    },
                    GradientStop {
                        color: Color::BLUE,
                        offset: 1.0,
                    }
                ]
            })),
            alignment: BorderAlignment::Inner
        })
    );
}

#[test]
fn parse_border_alignments() {
    let inner = BorderAlignment::parse("inner");
    let outer = BorderAlignment::parse("outer");
    let center = BorderAlignment::parse("center");
    let invalid = BorderAlignment::parse("invalid");

    assert_eq!(inner, Ok(BorderAlignment::Inner));
    assert_eq!(outer, Ok(BorderAlignment::Outer));
    assert_eq!(center, Ok(BorderAlignment::Center));
    assert_eq!(invalid, Ok(BorderAlignment::Inner));
}