oxiphysics_gpu/shaders/
functions_2.rs1#[cfg(test)]
6mod shader_meta_tests {
7 use super::super::functions::*;
8 use crate::shaders::BytecodeShaderCache;
9 use crate::shaders::ShaderMetaRegistry;
10 use crate::shaders::ShaderMetadata;
11 use crate::shaders::ShaderTemplateV2;
12 use crate::shaders::ShaderVariant;
13 use std::collections::HashMap;
14 #[test]
15 fn test_registry_lookup_after_register() {
16 let mut reg = ShaderMetaRegistry::new();
17 let meta = ShaderMetadata::new(ShaderVariant::Physics, "main", [64, 1, 1], 1);
18 reg.register("physics_kernel", meta);
19 let found = reg.lookup("physics_kernel");
20 assert!(found.is_some());
21 assert_eq!(found.unwrap().variant, ShaderVariant::Physics);
22 assert_eq!(found.unwrap().entry_point, "main");
23 assert!(reg.lookup("nonexistent").is_none());
24 }
25 #[test]
26 fn test_registry_all_names() {
27 let mut reg = ShaderMetaRegistry::new();
28 reg.register(
29 "a",
30 ShaderMetadata::new(ShaderVariant::Sph, "main", [64, 1, 1], 2),
31 );
32 reg.register(
33 "b",
34 ShaderMetadata::new(ShaderVariant::Lbm, "cs_main", [32, 1, 1], 3),
35 );
36 let mut names = reg.all_names();
37 names.sort();
38 assert_eq!(names, vec!["a", "b"]);
39 }
40 #[test]
41 fn test_bytecode_cache_insert_and_get() {
42 let mut cache = BytecodeShaderCache::new(1024);
43 cache.insert("kernel_a", vec![0u8; 100]);
44 assert!(cache.get("kernel_a").is_some());
45 assert_eq!(cache.get("kernel_a").unwrap().len(), 100);
46 assert_eq!(cache.total_bytes(), 100);
47 }
48 #[test]
49 fn test_bytecode_cache_eviction() {
50 let mut cache = BytecodeShaderCache::new(150);
51 cache.insert("a", vec![0u8; 100]);
52 cache.insert("b", vec![0u8; 100]);
53 assert!(cache.get("a").is_none(), "oldest entry should be evicted");
54 assert!(cache.get("b").is_some(), "newest entry should remain");
55 assert!(cache.total_bytes() <= 150);
56 }
57 #[test]
58 fn test_template_instantiation() {
59 let mut defines = HashMap::new();
60 defines.insert("WORKGROUP_SIZE".to_string(), "128".to_string());
61 defines.insert("DTYPE".to_string(), "f32".to_string());
62 let tmpl = ShaderTemplateV2::new(
63 "@compute @workgroup_size(WORKGROUP_SIZE)\nvar x: DTYPE;",
64 defines,
65 );
66 let out = tmpl.instantiate();
67 assert!(out.contains("128"), "WORKGROUP_SIZE should be replaced");
68 assert!(out.contains("f32"), "DTYPE should be replaced");
69 assert!(
70 !out.contains("WORKGROUP_SIZE"),
71 "placeholder should be gone"
72 );
73 }
74 #[test]
75 fn test_metadata_validation_valid() {
76 let meta = ShaderMetadata::new(ShaderVariant::Collision, "main", [64, 1, 1], 2);
77 assert!(validate_shader_metadata(&meta).is_ok());
78 }
79 #[test]
80 fn test_metadata_validation_zero_workgroup() {
81 let meta = ShaderMetadata::new(ShaderVariant::RigidBody, "main", [0, 1, 1], 1);
82 assert!(validate_shader_metadata(&meta).is_err());
83 }
84 #[test]
85 fn test_metadata_validation_too_many_threads() {
86 let meta = ShaderMetadata::new(ShaderVariant::NeuralInference, "main", [32, 32, 2], 1);
87 assert!(validate_shader_metadata(&meta).is_err());
88 }
89 #[test]
90 fn test_metadata_validation_too_many_bind_groups() {
91 let meta = ShaderMetadata::new(ShaderVariant::Sph, "main", [64, 1, 1], 5);
92 assert!(validate_shader_metadata(&meta).is_err());
93 }
94 #[test]
95 fn test_metadata_validation_empty_entry_point() {
96 let meta = ShaderMetadata::new(ShaderVariant::Lbm, "", [64, 1, 1], 1);
97 assert!(validate_shader_metadata(&meta).is_err());
98 }
99}