facett-flow/tests/compositions.rs
//! Every browser composition is also checked offline, including a negative control.
#[test]
fn all_compositions_validate() {
let root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src");
for row in include_str!("../src/wgsl-compositions.txt")
.lines()
.filter(|s| !s.trim().is_empty() && !s.starts_with('#'))
{
let (name, files) = row.split_once(':').unwrap();
let source = files
.split_whitespace()
.map(|p| std::fs::read_to_string(root.join(p)).unwrap())
.collect::<Vec<_>>()
.join("\n");
let module = naga::front::wgsl::parse_str(&source)
.unwrap_or_else(|e| panic!("{name}: {}", e.emit_to_string(&source)));
if name == "plain" {
assert_eq!(
module
.global_variables
.iter()
.filter(|(_, v)| v.binding.as_ref().is_some_and(|b| b.group == 0))
.count(),
3
);
let entries = module
.entry_points
.iter()
.map(|e| e.name.as_str())
.collect::<Vec<_>>();
assert_eq!(
entries,
[
"node_vs", "node_fs", "edge_vs", "edge_fs", "pulse_vs", "pulse_fs"
]
);
}
naga::valid::Validator::new(
naga::valid::ValidationFlags::all(),
naga::valid::Capabilities::all(),
)
.validate(&module)
.unwrap_or_else(|e| panic!("{name}: {e:?}"));
assert!(naga::front::wgsl::parse_str(&(source + "\n@vertex fn broken( {")).is_err());
}
}
#[test]
fn node_wire_keys_stay_unchanged() {
let value = serde_json::to_value(&facett_flow::Graph::demo(1).nodes[0]).unwrap();
let mut keys = value
.as_object()
.unwrap()
.keys()
.map(String::as_str)
.collect::<Vec<_>>();
keys.sort();
assert_eq!(keys, ["group", "id", "kind", "label", "position"]);
}
#[test]
fn plain_shader_matches_latest_main_witness() {
use sha2::{Digest, Sha256};
assert_eq!(
Sha256::digest(include_bytes!("../src/flow.wgsl"))
.iter()
.map(|byte| format!("{byte:02x}"))
.collect::<String>(),
"4621d557c133a6cd8e73569f1797cb3d7619dc1260416b5078afe7f651e8b548"
);
}