//! Unit tests for exo-hypergraph substrate #[cfg(test)] mod hyperedge_creation_tests { use super::*; // use exo_hypergraph::*; #[test] fn test_create_basic_hyperedge() { // Test creating a hyperedge with 3 entities // let mut substrate = HypergraphSubstrate::new(); // // let e1 = EntityId::new(); // let e2 = EntityId::new(); // let e3 = EntityId::new(); // // let relation = Relation::new("connects"); // let hyperedge_id = substrate.create_hyperedge( // &[e1, e2, e3], // &relation // ).unwrap(); // // assert!(substrate.hyperedge_exists(hyperedge_id)); } #[test] fn test_create_hyperedge_2_entities() { // Test creating hyperedge with 2 entities (edge case) } #[test] fn test_create_hyperedge_many_entities() { // Test creating hyperedge with many entities (10+) // for n in [10, 50, 100] { // let entities: Vec<_> = (0..n).map(|_| EntityId::new()).collect(); // let result = substrate.create_hyperedge(&entities, &relation); // assert!(result.is_ok()); // } } #[test] fn test_create_hyperedge_invalid_entity() { // Test error when entity doesn't exist // let mut substrate = HypergraphSubstrate::new(); // let nonexistent = EntityId::new(); // // let result = substrate.create_hyperedge(&[nonexistent], &relation); // assert!(result.is_err()); } #[test] fn test_create_hyperedge_duplicate_entities() { // Test handling of duplicate entities in set // let e1 = EntityId::new(); // let result = substrate.create_hyperedge(&[e1, e1], &relation); // // Should either deduplicate or error } } #[cfg(test)] mod hyperedge_query_tests { use super::*; #[test] fn test_query_hyperedges_by_entity() { // Test finding all hyperedges containing an entity // let mut substrate = HypergraphSubstrate::new(); // let e1 = substrate.add_entity("entity_1"); // // let h1 = substrate.create_hyperedge(&[e1, e2], &r1).unwrap(); // let h2 = substrate.create_hyperedge(&[e1, e3], &r2).unwrap(); // // let containing_e1 = substrate.hyperedges_containing(e1); // assert_eq!(containing_e1.len(), 2); // assert!(containing_e1.contains(&h1)); // assert!(containing_e1.contains(&h2)); } #[test] fn test_query_hyperedges_by_relation() { // Test finding hyperedges by relation type } #[test] fn test_query_hyperedges_by_entity_set() { // Test finding hyperedges spanning specific entity set } } #[cfg(test)] mod persistent_homology_tests { use super::*; #[test] fn test_persistent_homology_0d() { // Test 0-dimensional homology (connected components) // let substrate = build_test_hypergraph(); // // let diagram = substrate.persistent_homology(0, (0.0, 1.0)); // // // Verify number of connected components // assert_eq!(diagram.num_features(), expected_components); } #[test] fn test_persistent_homology_1d() { // Test 1-dimensional homology (cycles/loops) // Create hypergraph with known cycle structure // let substrate = build_cycle_hypergraph(); // // let diagram = substrate.persistent_homology(1, (0.0, 1.0)); // // // Verify cycle detection // assert!(diagram.has_persistent_features()); } #[test] fn test_persistent_homology_2d() { // Test 2-dimensional homology (voids) } #[test] fn test_persistence_diagram_birth_death() { // Test birth-death times in persistence diagram // let diagram = substrate.persistent_homology(1, (0.0, 2.0)); // // for feature in diagram.features() { // assert!(feature.birth < feature.death); // assert!(feature.birth >= 0.0); // assert!(feature.death <= 2.0); // } } #[test] fn test_persistence_diagram_essential_features() { // Test detection of essential (infinite persistence) features } } #[cfg(test)] mod betti_numbers_tests { use super::*; #[test] fn test_betti_numbers_simple_complex() { // Test Betti numbers for simple simplicial complex // let substrate = build_simple_complex(); // let betti = substrate.betti_numbers(2); // // // For a sphere: b0=1, b1=0, b2=1 // assert_eq!(betti[0], 1); // One connected component // assert_eq!(betti[1], 0); // No holes // assert_eq!(betti[2], 1); // One void } #[test] fn test_betti_numbers_torus() { // Test Betti numbers for torus-like structure // Torus: b0=1, b1=2, b2=1 } #[test] fn test_betti_numbers_disconnected() { // Test with multiple connected components // let substrate = build_disconnected_complex(); // let betti = substrate.betti_numbers(0); // // assert_eq!(betti[0], num_components); } } #[cfg(test)] mod sheaf_consistency_tests { use super::*; #[test] #[cfg(feature = "sheaf-consistency")] fn test_sheaf_consistency_check_consistent() { // Test sheaf consistency on consistent structure // let substrate = build_consistent_sheaf(); // let sections = vec![section1, section2]; // // let result = substrate.check_sheaf_consistency(§ions); // // assert!(matches!(result, SheafConsistencyResult::Consistent)); } #[test] #[cfg(feature = "sheaf-consistency")] fn test_sheaf_consistency_check_inconsistent() { // Test detection of inconsistency // let substrate = build_inconsistent_sheaf(); // let sections = vec![section1, section2]; // // let result = substrate.check_sheaf_consistency(§ions); // // match result { // SheafConsistencyResult::Inconsistent(inconsistencies) => { // assert!(!inconsistencies.is_empty()); // } // _ => panic!("Expected inconsistency"), // } } #[test] #[cfg(feature = "sheaf-consistency")] fn test_sheaf_restriction_maps() { // Test restriction map operations } } #[cfg(test)] mod simplicial_complex_tests { use super::*; #[test] fn test_add_simplex_0d() { // Test adding 0-simplices (vertices) } #[test] fn test_add_simplex_1d() { // Test adding 1-simplices (edges) } #[test] fn test_add_simplex_2d() { // Test adding 2-simplices (triangles) } #[test] fn test_add_simplex_invalid() { // Test adding simplex with non-existent vertices } #[test] fn test_simplex_boundary() { // Test boundary operator } } #[cfg(test)] mod hyperedge_index_tests { use super::*; #[test] fn test_entity_index_update() { // Test entity->hyperedges inverted index // let mut substrate = HypergraphSubstrate::new(); // let e1 = substrate.add_entity("e1"); // // let h1 = substrate.create_hyperedge(&[e1], &r1).unwrap(); // // let containing = substrate.entity_index.get(&e1); // assert!(containing.contains(&h1)); } #[test] fn test_relation_index_update() { // Test relation->hyperedges index } #[test] fn test_concurrent_index_access() { // Test DashMap concurrent access } } #[cfg(test)] mod integration_with_ruvector_graph_tests { use super::*; #[test] fn test_ruvector_graph_integration() { // Test integration with ruvector-graph base // Verify hypergraph extends ruvector-graph properly } #[test] fn test_graph_database_queries() { // Test using base GraphDatabase for queries } } #[cfg(test)] mod edge_cases_tests { use super::*; #[test] fn test_empty_hypergraph() { // Test operations on empty hypergraph // let substrate = HypergraphSubstrate::new(); // let betti = substrate.betti_numbers(2); // assert_eq!(betti[0], 0); // No components } #[test] fn test_single_entity() { // Test hypergraph with single entity } #[test] fn test_large_hypergraph() { // Test scalability with large numbers of entities/edges // for size in [1000, 10000, 100000] { // let substrate = build_large_hypergraph(size); // // Verify operations complete in reasonable time // } } }