use plotpy::{Curve, Plot, RayEndpoint, StrError};
use std::f64::consts::PI;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
const OUT_DIR: &str = "/tmp/plotpy/integ_tests";
#[test]
fn test_curve() -> Result<(), StrError> {
let mut curve1 = Curve::new();
curve1
.set_line_alpha(0.7)
.set_line_color("#cd0000")
.set_line_style("--")
.set_line_width(2.0)
.set_marker_color("#1862ab")
.set_marker_every(2)
.set_marker_void(false)
.set_marker_line_color("#cda500")
.set_marker_line_width(3.0)
.set_marker_size(15.0)
.set_marker_style("p");
let mut curve2 = Curve::new();
curve2
.set_line_style("None")
.set_marker_style("o")
.set_marker_size(20.0)
.set_marker_void(true);
let mut curve3 = Curve::new();
curve3.set_extra("drawstyle='steps'");
let x = &[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0];
let y = &[
1.0, 1.41421356, 1.73205081, 2.0, 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.0, 3.16227766,
];
let y2 = &[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 3.5, 3.5, 3.5, 3.5];
curve1.draw(x, y);
curve2.draw(x, y2);
curve3.draw(x, x);
let mut ray1 = Curve::new();
let mut ray2 = Curve::new();
let mut ray3 = Curve::new();
let mut ray4 = Curve::new();
ray1.set_line_color("orange");
ray2.set_line_color("gold");
ray3.set_line_color("yellow");
ray4.set_line_color("#9b7014");
ray1.draw_ray(2.0, 0.0, RayEndpoint::Coords(8.0, 0.5));
ray2.draw_ray(2.0, 0.0, RayEndpoint::Slope(0.2));
ray3.draw_ray(2.0, 0.0, RayEndpoint::Horizontal);
ray4.draw_ray(2.0, 0.0, RayEndpoint::Vertical);
let mut plot = Plot::new();
plot.add(&curve1)
.add(&curve2)
.add(&curve3)
.add(&ray1)
.add(&ray2)
.add(&ray3)
.add(&ray4);
let path = Path::new(OUT_DIR).join("integ_curve.svg");
plot.save(&path)?;
let file = File::open(path).map_err(|_| "cannot open file")?;
let buffered = BufReader::new(file);
let lines_iter = buffered.lines();
let n = lines_iter.count();
assert!(n > 450 && n < 500);
Ok(())
}
#[test]
fn test_curve_twinx() -> Result<(), StrError> {
let np = 201;
let mut x = vec![0.0; np];
let mut y1 = vec![0.0; np];
let mut y2 = vec![0.0; np];
let dx = 4.0 / (np as f64);
for i in 0..np {
x[i] = (i as f64) * dx;
y1[i] = f64::exp(x[i]);
y2[i] = f64::sin(2.0 * PI * x[i]);
}
let mut curve = Curve::new();
curve.set_line_color("red").draw(&x, &y1);
curve.set_line_color("blue").draw_with_twin_x(&y2);
let mut plot = Plot::new();
plot.add(&curve) .grid_and_labels("time (s)", "exp function")
.set_label_x_color("green")
.set_label_y_color("red")
.set_label_y_twinx("sin function")
.set_label_y_twinx_color("blue");
let path = Path::new(OUT_DIR).join("integ_curve_twinx.svg");
plot.save(&path)?;
let file = File::open(path).map_err(|_| "cannot open file")?;
let buffered = BufReader::new(file);
let lines_iter = buffered.lines();
let c = lines_iter.count();
assert!(c > 1250 && c < 1300);
Ok(())
}
#[test]
fn test_curve_points_methods_work() -> Result<(), StrError> {
let mut curve = Curve::new();
curve
.points_begin()
.points_add(0.0, 0.0)
.points_add(1.0, 1.0)
.points_add(2.0, 4.0)
.points_end();
let mut plot = Plot::new();
plot.add(&curve);
let path = Path::new(OUT_DIR).join("integ_curve_points_methods.svg");
plot.save(&path)?;
let file = File::open(path).map_err(|_| "cannot open file")?;
let buffered = BufReader::new(file);
let lines_iter = buffered.lines();
assert!(lines_iter.count() > 510);
Ok(())
}
#[test]
fn test_curve_points_3d_methods_work() -> Result<(), StrError> {
let mut curve = Curve::new();
curve
.points_3d_begin()
.points_3d_add(0.0, 0.0, 0.0)
.points_3d_add(1.0, 0.0, 0.0)
.points_3d_add(1.0, 1.0, 0.0)
.points_3d_add(1.0, 1.0, 1.0)
.points_3d_end();
let mut plot = Plot::new();
plot.add(&curve);
let path = Path::new(OUT_DIR).join("integ_curve_points_3d_methods.svg");
plot.save(&path)?;
let file = File::open(path).map_err(|_| "cannot open file")?;
let buffered = BufReader::new(file);
let lines_iter = buffered.lines();
assert!(lines_iter.count() > 660);
Ok(())
}
#[test]
fn test_curve_3d() -> Result<(), StrError> {
let mut curve = Curve::new();
curve
.set_line_alpha(0.7)
.set_line_color("#cd0000")
.set_line_style("--")
.set_line_width(2.0)
.set_marker_color("#1862ab")
.set_marker_every(2)
.set_marker_void(false)
.set_marker_line_color("#cda500")
.set_marker_line_width(3.0)
.set_marker_size(8.0)
.set_marker_style("p");
let x = &[1.0, 2.0, 3.0, 4.0, 5.0];
let y = &[1.0, 4.0, 9.0, 16.0, 25.0];
let z = &[0.0, 0.0, 0.0, 1.0, 1.0];
curve.draw_3d(x, y, z);
let mut plot = Plot::new();
plot.add(&curve);
plot.set_range_3d(-0.5, 6.0, -0.5, 30.0, -0.5, 1.5);
let path = Path::new(OUT_DIR).join("integ_curve_3d.svg");
plot.set_save_pad_inches(0.3).save(&path)?;
let file = File::open(path).map_err(|_| "cannot open file")?;
let buffered = BufReader::new(file);
let lines_iter = buffered.lines();
let n_lines = lines_iter.count();
assert!(n_lines > 800 && n_lines < 900);
Ok(())
}