use geo::{Line, coord, line_string};
use h3o::{Resolution, geom::PlotterBuilder};

fn line_rads() -> Line {
    Line::new(
        coord! { x: -0.009526982062241713, y: 0.8285232894553574 },
        coord! { x: 0.04142734140306332, y: 0.8525145186317127 },
    )
}

fn line_degs() -> Line {
    Line::new(
        coord! { x: -0.5458558636632915, y: 47.47088771408784 },
        coord! { x: 2.373611818843102,   y: 48.84548389122412 },
    )
}

#[test]
fn add_rads() {
    let mut plotter = PlotterBuilder::new(Resolution::Two)
        .disable_radians_conversion()
        .build();
    let result = plotter.add(line_rads());

    assert!(result.is_ok());
}

#[test]
fn add_degs() {
    let mut plotter = PlotterBuilder::new(Resolution::Two).build();
    let result = plotter.add(line_degs());

    assert!(result.is_ok());
}

#[test]
fn add_batch() {
    let mut plotter = PlotterBuilder::new(Resolution::Two).build();
    let result = plotter.add_batch(
        line_string![
            (x: 2.363503198417334,  y: 48.8203086545891),
            (x: 2.3730684893043588, y: 48.85398407690437),
            (x: 2.334964762310932,  y: 48.870861968772914),
        ]
        .lines(),
    );

    assert!(result.is_ok());
}

#[test]
fn invalid() {
    let mut plotter = PlotterBuilder::new(Resolution::Two).build();
    let result = plotter.add(Line::new(
        coord! { x: 0., y: 0. },
        coord! { x: f64::NAN, y: 0. },
    ));

    assert!(result.is_err());
}

#[test]
fn plot() {
    let mut plotter = PlotterBuilder::new(Resolution::Ten).build();
    plotter.add(line_degs()).expect("failed to add line");

    let result = plotter
        .plot()
        .collect::<Result<Vec<_>, _>>()
        .expect("failed to plot")
        .len();

    assert_eq!(result, 2423);
}
