use plotpy::{Plot, StrError, Surface};
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
const OUT_DIR: &str = "/tmp/plotpy/integ_tests";
#[test]
fn test_surface_geometry() -> Result<(), StrError> {
let mut plane = Surface::new();
plane.set_colormap_name("terrain").draw_plane_nzz(
&[-1.0, 1.0, 1.0],
&[1.0, -1.0, 1.0],
-1.0,
1.0,
-1.0,
1.0,
3,
3,
)?;
let mut cap = Surface::new();
let mut cup = Surface::new();
let (x, y, z, r) = (-1.0, -1.0, -1.0, 0.5);
cap.set_wire_line_color("red")
.set_with_surface(false)
.set_with_wireframe(true)
.draw_hemisphere(&[x, y, z], r, -180.0, 180.0, 10, 10, false)?;
cup.draw_hemisphere(&[x, y, z], r, -180.0, 180.0, 10, 10, true)?;
let mut plot = Plot::new();
plot.add(&plane).add(&cap).add(&cup);
let path = Path::new(OUT_DIR).join("integ_surface_geometry.svg");
plot.set_equal_axes(true).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() > 1690);
Ok(())
}
#[test]
fn test_surface_cylinder() -> Result<(), StrError> {
let mut surface = Surface::new();
surface.set_surf_color("red");
surface.draw_cylinder(&[0.0, 0.0, 0.0], &[5.0, 0.0, 0.0], 0.5, 1, 20)?;
surface.set_surf_color("green");
surface.draw_cylinder(&[0.0, 0.0, 0.0], &[0.0, 5.0, 0.0], 0.5, 1, 20)?;
surface.set_surf_color("blue");
surface.draw_cylinder(&[0.0, 0.0, 0.0], &[0.0, 0.0, 5.0], 0.5, 1, 20)?;
surface.set_surf_color("gold");
surface.draw_cylinder(&[0.0, 0.0, 0.0], &[5.0, 5.0, 5.0], 0.5, 1, 20)?;
surface.set_surf_color("magenta");
surface.draw_cylinder(&[5.0, 5.0, 0.0], &[5.0, 5.0, 5.0], 0.5, 1, 20)?;
let mut plot = Plot::new();
plot.add(&surface);
let path = Path::new(OUT_DIR).join("integ_surface_cylinder.svg");
plot.set_range_3d(-1.0, 6.0, -1.0, 6.0, -1.0, 6.0).set_equal_axes(true);
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() > 1340);
Ok(())
}
#[test]
fn test_surface_superquadric() -> Result<(), StrError> {
let r = &[1.0, 1.0, 1.0];
let c = &[-1.0, -1.0, -1.0];
let k = &[0.5, 0.5, 0.5];
let mut star = Surface::new();
star.set_colormap_name("jet")
.draw_superquadric(c, r, k, -180.0, 180.0, -90.0, 90.0, 40, 20)?;
let c = &[1.0, -1.0, -1.0];
let k = &[1.0, 1.0, 1.0];
let mut pyramids = Surface::new();
pyramids
.set_colormap_name("inferno")
.draw_superquadric(c, r, k, -180.0, 180.0, -90.0, 90.0, 40, 20)?;
let c = &[-1.0, 1.0, 1.0];
let k = &[4.0, 4.0, 4.0];
let mut cube = Surface::new();
cube.set_surf_color("#ee29f2")
.draw_superquadric(c, r, k, -180.0, 180.0, -90.0, 90.0, 40, 20)?;
let c = &[0.0, 0.0, 0.0];
let k = &[2.0, 2.0, 2.0];
let mut sphere = Surface::new();
sphere
.set_colormap_name("rainbow")
.draw_superquadric(c, r, k, -180.0, 180.0, -90.0, 90.0, 40, 20)?;
let mut sphere_direct = Surface::new();
sphere_direct.draw_sphere(&[1.0, 1.0, 1.0], 1.0, 40, 20)?;
let mut plot = Plot::new();
plot.add(&star)
.add(&pyramids)
.add(&cube)
.add(&sphere)
.add(&sphere_direct);
let path = Path::new(OUT_DIR).join("integ_surface_superquadric.svg");
plot.set_equal_axes(true)
.set_figure_size_points(600.0, 600.0)
.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() > 24780);
Ok(())
}