freya-core 0.3.4

Internal core funcionatilies for Freya.
Documentation
use freya_core::{
    parsing::Parse,
    values::{
        ConicGradient,
        GradientStop,
        LinearGradient,
        RadialGradient,
    },
};
use freya_engine::prelude::*;

#[test]
fn parse_basic_linear_gradient() {
    assert_eq!(
        LinearGradient::parse("linear-gradient(red 0%, blue 100%)"),
        Ok(LinearGradient {
            angle: 0.0,
            stops: vec![
                GradientStop {
                    color: Color::RED,
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::BLUE,
                    offset: 1.0,
                }
            ]
        })
    );
}

#[test]
fn parse_basic_radial_gradient() {
    assert_eq!(
        RadialGradient::parse("radial-gradient(red 0%, blue 100%)"),
        Ok(RadialGradient {
            stops: vec![
                GradientStop {
                    color: Color::RED,
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::BLUE,
                    offset: 1.0,
                }
            ]
        })
    );
}

#[test]
fn parse_basic_conic_gradient() {
    assert_eq!(
        ConicGradient::parse("conic-gradient(red 0%, blue 100%)"),
        Ok(ConicGradient {
            angle: None,
            angles: None,
            stops: vec![
                GradientStop {
                    color: Color::RED,
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::BLUE,
                    offset: 1.0,
                }
            ]
        })
    );
}

#[test]
fn parse_conic_gradient_variants() {
    assert_eq!(
        ConicGradient::parse("conic-gradient(45deg, red 0%, blue 100%)"),
        Ok(ConicGradient {
            angle: Some(45.0),
            angles: None,
            stops: vec![
                GradientStop {
                    color: Color::RED,
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::BLUE,
                    offset: 1.0,
                }
            ]
        })
    );

    assert_eq!(
        ConicGradient::parse("conic-gradient(45deg, from 40deg, red 0%, blue 100%)"),
        Ok(ConicGradient {
            angle: Some(45.0),
            angles: Some((40.0, 360.0)),
            stops: vec![
                GradientStop {
                    color: Color::RED,
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::BLUE,
                    offset: 1.0,
                }
            ]
        })
    );

    assert_eq!(
        ConicGradient::parse("conic-gradient(45deg, from 40deg to 120deg, red 0%, blue 100%)"),
        Ok(ConicGradient {
            angle: Some(45.0),
            angles: Some((40.0, 120.0)),
            stops: vec![
                GradientStop {
                    color: Color::RED,
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::BLUE,
                    offset: 1.0,
                }
            ]
        })
    );
}

#[test]
fn parse_rgb_hsl_gradient() {
    assert_eq!(
        LinearGradient::parse("linear-gradient(0deg, rgb(255, 0, 0) 0%, blue 100%)"),
        Ok(LinearGradient {
            angle: 0.0,
            stops: vec![
                GradientStop {
                    color: Color::from_rgb(255, 0, 0),
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::from_rgb(0, 0, 255),
                    offset: 1.0,
                }
            ]
        })
    );
}

#[test]
fn parse_gradient_angle() {
    assert_eq!(
        LinearGradient::parse("linear-gradient(45deg, red 0%, blue 100%)"),
        Ok(LinearGradient {
            angle: 45.0,
            stops: vec![
                GradientStop {
                    color: Color::from_rgb(255, 0, 0),
                    offset: 0.0,
                },
                GradientStop {
                    color: Color::from_rgb(0, 0, 255),
                    offset: 1.0,
                }
            ]
        })
    );
}

#[test]
fn invalid_linear_gradients() {
    let incorrect_name = LinearGradient::parse("lkdsjfalkasdasdjaslkfjsdklfs(red 0%, blue 100%)");
    let extra_lparen = LinearGradient::parse("linear-gradient((red 0%, blue 100%)");
    let extra_rparen = LinearGradient::parse("linear-gradient(red 0%, blue 100%))");
    let missing_rparen = LinearGradient::parse("linear-gradient(red 0%, blue 100%");
    let missing_commas = LinearGradient::parse("linear-gradient(red 0% blue 100%)");
    let extra_commas = LinearGradient::parse("linear-gradient(red 0%, blue 100%,)");
    let extra_stop_component =
        LinearGradient::parse("linear-gradient(red 0% something, blue 100%)");
    let bad_angle_unit = LinearGradient::parse("linear-gradient(45ft, red 0%, blue 100%)");
    let bad_offset_unit = LinearGradient::parse("linear-gradient(45deg, red 0atm, blue 100kpa)");
    let missing_color = LinearGradient::parse("linear-gradient(45deg, 0%, blue 100%)");
    let missing_offset = LinearGradient::parse("linear-gradient(45deg, red, blue 100%)");

    assert!(incorrect_name.is_err());
    assert!(extra_lparen.is_err());
    assert!(extra_rparen.is_err());
    assert!(missing_rparen.is_err());
    assert!(missing_commas.is_err());
    assert!(extra_commas.is_err());
    assert!(extra_stop_component.is_err());
    assert!(bad_angle_unit.is_err());
    assert!(bad_offset_unit.is_err());
    assert!(missing_color.is_err());
    assert!(missing_offset.is_err());
}

#[test]
fn invalid_radial_gradients() {
    let incorrect_name = RadialGradient::parse("lkdsjfalkasdasdjaslkfjsdklfs(red 0%, blue 100%)");
    let extra_lparen = RadialGradient::parse("radial-gradient((red 0%, blue 100%)");
    let extra_rparen = RadialGradient::parse("radial-gradient(red 0%, blue 100%))");
    let missing_rparen = RadialGradient::parse("radial-gradient(red 0%, blue 100%");
    let missing_commas = RadialGradient::parse("radial-gradient(red 0% blue 100%)");
    let extra_commas = RadialGradient::parse("radial-gradient(red 0%, blue 100%,)");
    let extra_stop_component =
        RadialGradient::parse("radial-gradient(red 0% something, blue 100%)");
    let bad_offset_unit = RadialGradient::parse("radial-gradient(red 0atm, blue 100kpa)");
    let missing_color = RadialGradient::parse("radial-gradient(0%, blue 100%)");
    let missing_offset = RadialGradient::parse("radial-gradient(red, blue 100%)");

    assert!(incorrect_name.is_err());
    assert!(extra_lparen.is_err());
    assert!(extra_rparen.is_err());
    assert!(missing_rparen.is_err());
    assert!(missing_commas.is_err());
    assert!(extra_commas.is_err());
    assert!(extra_stop_component.is_err());
    assert!(bad_offset_unit.is_err());
    assert!(missing_color.is_err());
    assert!(missing_offset.is_err());
}

#[test]
fn invalid_conic_gradients() {
    let incorrect_name = ConicGradient::parse("lkdsjfalkasdasdjaslkfjsdklfs(red 0%, blue 100%)");
    let extra_lparen = ConicGradient::parse("conic-gradient((red 0%, blue 100%)");
    let extra_rparen = ConicGradient::parse("conic-gradient(red 0%, blue 100%))");
    let missing_rparen = ConicGradient::parse("conic-gradient(red 0%, blue 100%");
    let missing_commas = ConicGradient::parse("conic-gradient(red 0% blue 100%)");
    let extra_commas = ConicGradient::parse("conic-gradient(red 0%, blue 100%,)");
    let extra_stop_component = ConicGradient::parse("conic-gradient(red 0% something, blue 100%)");
    let bad_angle_unit = ConicGradient::parse("conic-gradient(45ft, red 0%, blue 100%)");
    let bad_offset_unit = ConicGradient::parse("conic-gradient(red 0atm, blue 100kpa)");
    let bad_angles =
        ConicGradient::parse("conic-gradient(45deg, from 60rft to 90fft, red 0%, blue 100%)");
    let missing_color = ConicGradient::parse("conic-gradient(0%, blue 100%)");
    let missing_offset = ConicGradient::parse("conic-gradient(red, blue 100%)");

    assert!(incorrect_name.is_err());
    assert!(extra_lparen.is_err());
    assert!(extra_rparen.is_err());
    assert!(missing_rparen.is_err());
    assert!(missing_commas.is_err());
    assert!(extra_commas.is_err());
    assert!(extra_stop_component.is_err());
    assert!(bad_angle_unit.is_err());
    assert!(bad_offset_unit.is_err());
    assert!(bad_angles.is_err());
    assert!(missing_color.is_err());
    assert!(missing_offset.is_err());
}