use draco_core::decoder_buffer::DecoderBuffer;
use draco_core::mesh::Mesh;
use draco_core::mesh_decoder::MeshDecoder;
use std::path::PathBuf;
fn get_testdata_path() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.parent()
.unwrap()
.join("testdata")
}
#[test]
fn test_decode_speed_0_cube() {
let path = get_testdata_path()
.join("reference_cpp")
.join("cpp_encoded_cube_speed_0.drc");
if !path.exists() {
println!("Skipping test - file not found: {:?}", path);
return;
}
let data = std::fs::read(&path).expect("Failed to read file");
let mut buffer = DecoderBuffer::new(&data);
let mut mesh = Mesh::new();
match MeshDecoder::new().decode(&mut buffer, &mut mesh) {
Ok(_) => {
println!(
"SUCCESS: faces={} points={}",
mesh.num_faces(),
mesh.num_points()
);
assert!(mesh.num_faces() > 0, "Expected faces > 0");
assert!(mesh.num_points() > 0, "Expected points > 0");
}
Err(e) => panic!("Failed to decode speed 0 file: {:?}", e),
}
}
#[test]
fn test_decode_bunny_cpp_standard() {
let path = get_testdata_path().join("bunny_cpp_standard.drc");
if !path.exists() {
println!("Skipping test - file not found: {:?}", path);
return;
}
let data = std::fs::read(&path).expect("Failed to read file");
let mut buffer = DecoderBuffer::new(&data);
let mut mesh = Mesh::new();
match MeshDecoder::new().decode(&mut buffer, &mut mesh) {
Ok(_) => {
println!(
"SUCCESS: faces={} points={}",
mesh.num_faces(),
mesh.num_points()
);
assert!(mesh.num_faces() > 0, "Expected faces > 0");
assert!(mesh.num_points() > 0, "Expected points > 0");
}
Err(e) => panic!("Failed to decode bunny_cpp_standard.drc: {:?}", e),
}
}
#[test]
fn test_decode_all_speed_0_files() {
let testdata = get_testdata_path();
for entry in std::fs::read_dir(&testdata).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
if path.extension().map(|e| e == "drc").unwrap_or(false) {
let name = path.file_name().unwrap().to_string_lossy();
let data = std::fs::read(&path).expect("Failed to read file");
let mut buffer = DecoderBuffer::new(&data);
let mut mesh = Mesh::new();
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
MeshDecoder::new().decode(&mut buffer, &mut mesh)
}));
match result {
Ok(Ok(_)) => {
println!(
"OK: {} -> faces={} points={}",
name,
mesh.num_faces(),
mesh.num_points()
);
}
Ok(Err(e)) => {
let err_str = format!("{:?}", e);
if err_str.contains("valence") || err_str.contains("Valence") {
panic!("Valence error for {}: {:?}", name, e);
}
println!("SKIP: {} -> {:?}", name, e);
}
Err(_) => {
println!("PANIC: {} -> caught panic", name);
}
}
}
}
}