From a73b5ac59723393a027e446f613d8eb572b46f08 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Tue, 1 Jul 2025 15:55:08 -0500 Subject: [PATCH] wip: test for id calculation being stable --- offline-web-model/src/test.rs | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/offline-web-model/src/test.rs b/offline-web-model/src/test.rs index 792251c..3c7e501 100644 --- a/offline-web-model/src/test.rs +++ b/offline-web-model/src/test.rs @@ -240,6 +240,76 @@ fn test_root_id_changes_for_any_reference_update() { } } +/// Tests that Reference IDs are stable regardless of dependency add order +#[test] +fn test_reference_ids_stable_regardless_of_dependency_order() { + // Create test dependencies + let dep_a = Reference::new( + Some(String::from("content_a")), + String::from("/dep_a"), + ).to_arc(); + + let dep_b = Reference::new( + Some(String::from("content_b")), + String::from("/dep_b"), + ).to_arc(); + + let dep_c = Reference::new( + Some(String::from("content_c")), + String::from("/dep_c"), + ).to_arc(); + + let dep_d = Reference::new( + Some(String::from("content_d")), + String::from("/dep_d"), + ).to_arc(); + + // Create base reference + let base_ref = Reference::new( + Some(String::from("base_content")), + String::from("/base"), + ); + + // Test multiple different orders of adding the same dependencies + let orders = vec![ + vec![dep_a.clone(), dep_b.clone(), dep_c.clone(), dep_d.clone()], // alphabetical + vec![dep_d.clone(), dep_c.clone(), dep_b.clone(), dep_a.clone()], // reverse alphabetical + vec![dep_b.clone(), dep_d.clone(), dep_a.clone(), dep_c.clone()], // random order 1 + vec![dep_c.clone(), dep_a.clone(), dep_d.clone(), dep_b.clone()], // random order 2 + vec![dep_d.clone(), dep_a.clone(), dep_b.clone(), dep_c.clone()], // random order 3 + ]; + + let mut all_ids = Vec::new(); + + for (i, order) in orders.iter().enumerate() { + let mut test_ref = base_ref.clone(); + + // Add dependencies in this specific order + for dep in order { + test_ref = test_ref.add_dep(dep.clone()); + } + + all_ids.push(test_ref.id.clone()); + + // Verify that dependencies are always sorted lexicographically regardless of add order + for j in 0..test_ref.dependents.len() - 1 { + let current = &test_ref.dependents[j]; + let next = &test_ref.dependents[j + 1]; + + assert!(current.name < next.name, + "Dependencies should be lexicographically ordered. Order {}: Found '{}' before '{}'", + i, current.name, next.name); + } + } + + // Verify all IDs are identical + let first_id = &all_ids[0]; + for (i, id) in all_ids.iter().enumerate() { + assert_eq!(id, first_id, + "Reference ID should be stable regardless of dependency add order. Order {} produced different ID", i); + } +} + /// Tests that dependencies of a Reference are always lexicographically ordered by name #[test] fn test_dependencies_lexicographically_ordered() {