Skip to main content

clifford_codegen/spec/
bundled.rs

1//! Bundled algebra specifications.
2//!
3//! This module provides pre-defined specifications for common algebras.
4
5/// 2D Euclidean algebra specification (TOML).
6pub const EUCLIDEAN2: &str = include_str!("../../algebras/euclidean2.toml");
7
8/// 3D Euclidean algebra specification (TOML).
9pub const EUCLIDEAN3: &str = include_str!("../../algebras/euclidean3.toml");
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14    use crate::spec::parse_spec;
15
16    #[test]
17    fn parse_euclidean2_spec() {
18        let spec = parse_spec(EUCLIDEAN2).unwrap();
19
20        assert_eq!(spec.name, "euclidean2");
21        assert_eq!(spec.module_path, Some("euclidean::dim2".to_string()));
22        assert_eq!(spec.signature.p, 2);
23        assert_eq!(spec.signature.q, 0);
24        assert_eq!(spec.signature.r, 0);
25        assert_eq!(spec.signature.dim(), 2);
26        assert_eq!(spec.signature.num_blades(), 4);
27
28        // Check types
29        assert!(spec.types.iter().any(|t| t.name == "Scalar"));
30        assert!(spec.types.iter().any(|t| t.name == "Vector"));
31        assert!(spec.types.iter().any(|t| t.name == "Bivector"));
32        assert!(spec.types.iter().any(|t| t.name == "Rotor"));
33
34        // Check Rotor
35        let rotor = spec.types.iter().find(|t| t.name == "Rotor").unwrap();
36        assert_eq!(rotor.grades, vec![0, 2]);
37        assert_eq!(rotor.fields.len(), 2);
38    }
39
40    #[test]
41    fn parse_euclidean3_spec() {
42        let spec = parse_spec(EUCLIDEAN3).unwrap();
43
44        assert_eq!(spec.name, "euclidean3");
45        assert_eq!(spec.module_path, Some("euclidean::dim3".to_string()));
46        assert_eq!(spec.signature.p, 3);
47        assert_eq!(spec.signature.q, 0);
48        assert_eq!(spec.signature.r, 0);
49        assert_eq!(spec.signature.dim(), 3);
50        assert_eq!(spec.signature.num_blades(), 8);
51
52        // Check types
53        assert!(spec.types.iter().any(|t| t.name == "Scalar"));
54        assert!(spec.types.iter().any(|t| t.name == "Vector"));
55        assert!(spec.types.iter().any(|t| t.name == "Bivector"));
56        assert!(spec.types.iter().any(|t| t.name == "Trivector"));
57        assert!(spec.types.iter().any(|t| t.name == "Rotor"));
58
59        // Check Vector
60        let vector = spec.types.iter().find(|t| t.name == "Vector").unwrap();
61        assert_eq!(vector.grades, vec![1]);
62        assert_eq!(vector.fields.len(), 3);
63
64        // Check Bivector
65        let bivector = spec.types.iter().find(|t| t.name == "Bivector").unwrap();
66        assert_eq!(bivector.grades, vec![2]);
67        assert_eq!(bivector.fields.len(), 3);
68
69        // Check Rotor
70        let rotor = spec.types.iter().find(|t| t.name == "Rotor").unwrap();
71        assert_eq!(rotor.grades, vec![0, 2]);
72        assert_eq!(rotor.fields.len(), 4);
73    }
74}