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