@feltdb/core 0.4.12 → 0.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/dist/cli/commands.js +5 -2
  2. package/dist/cli/index.js +1 -1
  3. package/dist/create/cli.js +16 -1
  4. package/dist/create/create.js +30 -16
  5. package/dist/create/docker-compose-generator.js +48 -9
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/Cargo.lock +2238 -0
  8. package/dist/create/server-source/Cargo.toml +7 -0
  9. package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
  10. package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
  11. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
  12. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
  13. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
  14. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
  15. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
  16. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
  17. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
  18. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
  19. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
  20. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
  21. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
  22. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
  23. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
  24. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
  25. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
  26. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
  27. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
  28. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
  29. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
  30. package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
  31. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
  32. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
  33. package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
  34. package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
  35. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
  36. package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
  37. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
  38. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
  39. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
  40. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
  41. package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
  42. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
  43. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
  44. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
  45. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
  46. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
  47. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
  48. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
  49. package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
  50. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
  51. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
  52. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
  53. package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
  54. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
  55. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
  56. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
  57. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
  58. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
  59. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
  60. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
  61. package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
  62. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
  63. package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
  64. package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
  65. package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
  66. package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
  67. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
  68. package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
  69. package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
  70. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
  71. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
  72. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
  73. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
  74. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
  75. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
  76. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
  77. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
  78. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
  79. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
  80. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
  81. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
  82. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
  83. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
  84. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
  85. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
  86. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
  87. package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
  88. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
  89. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
  90. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
  91. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
  92. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
  93. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
  94. package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
  95. package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
  96. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
  97. package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
  98. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
  99. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
  100. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
  101. package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
  102. package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
  103. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
  104. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
  105. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
  106. package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
  107. package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
  108. package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
  109. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
  110. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
  111. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
  112. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
  113. package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
  114. package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
  115. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
  116. package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
  117. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
  118. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
  119. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
  120. package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
  121. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
  122. package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
  123. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
  124. package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
  125. package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
  126. package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
  127. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
  128. package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
  129. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
  130. package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
  131. package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
  132. package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
  133. package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
  134. package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
  135. package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
  136. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
  137. package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
  138. package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
  139. package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
  140. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
  141. package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
  142. package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
  143. package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
  144. package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
  145. package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
  146. package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
  147. package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
  148. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
  149. package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
  150. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
  151. package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
  152. package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
  153. package/dist/flowspec.d.ts +2 -0
  154. package/dist/flowspec.d.ts.map +1 -1
  155. package/dist/flowspec.js +28 -4
  156. package/dist/state-contract.d.ts +7 -1
  157. package/dist/state-contract.d.ts.map +1 -1
  158. package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
  159. package/dist/studio/components/index.js +1 -1
  160. package/dist/studio/{components-Q0Nx6gLE.js → components-bHTARBin.js} +156 -46
  161. package/dist/studio/index.js +31 -28
  162. package/dist/studio-app/assets/{index-BHOmLZF-.js → index-BqKquLuU.js} +8 -8
  163. package/dist/studio-app/index.html +1 -1
  164. package/package.json +1 -1
@@ -0,0 +1,261 @@
1
+ /// Permutation Scheduler for Convergence Testing
2
+ ///
3
+ /// Generates multiple orderings of the same operation set to test
4
+ /// whether independent nodes converge to identical state regardless
5
+ /// of message delivery order.
6
+
7
+ use crate::transactions::Operation;
8
+ use rand::seq::SliceRandom;
9
+ use rand::SeedableRng;
10
+
11
+ /// Different scheduling strategies for operation ordering
12
+ #[derive(Clone, Debug, PartialEq, Eq)]
13
+ pub enum ScheduleStrategy {
14
+ /// Original order (baseline)
15
+ Original,
16
+ /// Reverse order
17
+ Reversed,
18
+ /// Sorted by operation ID
19
+ SortedById,
20
+ /// Random shuffle with fixed seed for reproducibility
21
+ RandomSeed { seed: u64 },
22
+ }
23
+
24
+ /// A specific ordering of operations
25
+ #[derive(Clone, Debug)]
26
+ pub struct OperationSchedule {
27
+ pub strategy: ScheduleStrategy,
28
+ pub operations: Vec<Operation>,
29
+ }
30
+
31
+ impl OperationSchedule {
32
+ pub fn new(strategy: ScheduleStrategy, operations: Vec<Operation>) -> Self {
33
+ Self { strategy, operations }
34
+ }
35
+
36
+ pub fn id(&self) -> String {
37
+ format!("{:?}", self.strategy)
38
+ }
39
+ }
40
+
41
+ /// Generates diverse operation schedules for convergence testing
42
+ pub struct PermutationScheduler;
43
+
44
+ impl PermutationScheduler {
45
+ /// Generate all deterministic permutations (original, reversed, sorted)
46
+ /// Use this for small operation sets where all permutations are feasible
47
+ pub fn deterministic_schedules(operations: &[Operation]) -> Vec<OperationSchedule> {
48
+ vec![
49
+ OperationSchedule::new(ScheduleStrategy::Original, operations.to_vec()),
50
+ OperationSchedule::new(ScheduleStrategy::Reversed, {
51
+ let mut ops = operations.to_vec();
52
+ ops.reverse();
53
+ ops
54
+ }),
55
+ OperationSchedule::new(ScheduleStrategy::SortedById, {
56
+ let mut ops = operations.to_vec();
57
+ ops.sort_by(|a, b| a.operation_id.sequence.cmp(&b.operation_id.sequence));
58
+ ops
59
+ }),
60
+ ]
61
+ }
62
+
63
+ /// Generate N random permutations with different seeds
64
+ /// Use this for large operation sets where exhaustive permutation is infeasible
65
+ pub fn random_schedules(operations: &[Operation], count: usize) -> Vec<OperationSchedule> {
66
+ (0..count)
67
+ .map(|i| {
68
+ let seed = i as u64;
69
+ let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
70
+ let mut ops = operations.to_vec();
71
+ ops.shuffle(&mut rng);
72
+
73
+ OperationSchedule::new(ScheduleStrategy::RandomSeed { seed }, ops)
74
+ })
75
+ .collect()
76
+ }
77
+
78
+ /// Generate a comprehensive test set:
79
+ /// - All deterministic permutations
80
+ /// - N random permutations
81
+ pub fn comprehensive_schedules(operations: &[Operation], random_count: usize) -> Vec<OperationSchedule> {
82
+ let mut schedules = Self::deterministic_schedules(operations);
83
+ schedules.extend(Self::random_schedules(operations, random_count));
84
+ schedules
85
+ }
86
+
87
+ /// Generate minimal test set (fast iteration)
88
+ /// - Original
89
+ /// - Reversed
90
+ /// - 5 random permutations
91
+ pub fn minimal_schedules(operations: &[Operation]) -> Vec<OperationSchedule> {
92
+ Self::comprehensive_schedules(operations, 5)
93
+ }
94
+
95
+ /// Generate standard test set (good coverage)
96
+ /// - Original
97
+ /// - Reversed
98
+ /// - Sorted
99
+ /// - 50 random permutations
100
+ pub fn standard_schedules(operations: &[Operation]) -> Vec<OperationSchedule> {
101
+ Self::comprehensive_schedules(operations, 50)
102
+ }
103
+
104
+ /// Generate thorough test set (exhaustive)
105
+ /// - Original
106
+ /// - Reversed
107
+ /// - Sorted
108
+ /// - 1000 random permutations
109
+ pub fn thorough_schedules(operations: &[Operation]) -> Vec<OperationSchedule> {
110
+ Self::comprehensive_schedules(operations, 1000)
111
+ }
112
+ }
113
+
114
+ #[cfg(test)]
115
+ mod tests {
116
+ use super::*;
117
+ use crate::convergence::VectorClock;
118
+ use crate::transactions::{OperationId, OperationCommand, StateVersion};
119
+ use std::collections::HashMap;
120
+
121
+ fn create_test_operation(seq: u64, collection: &str, record_id: &str, value: i32) -> Operation {
122
+ let mut vc = VectorClock::new();
123
+ vc.increment("test_node");
124
+ let version = StateVersion::new(vc, "test_hash".to_string());
125
+
126
+ Operation::new(
127
+ OperationId::new("test_node".to_string(), seq),
128
+ version,
129
+ format!("Op{}", seq),
130
+ OperationCommand {
131
+ op_type: "UpdateField".to_string(),
132
+ collection: collection.to_string(),
133
+ record_id: record_id.to_string(),
134
+ fields: {
135
+ let mut m = HashMap::new();
136
+ m.insert("value".to_string(), serde_json::json!(value));
137
+ m
138
+ },
139
+ },
140
+ "test".to_string(),
141
+ )
142
+ }
143
+
144
+ #[test]
145
+ fn test_deterministic_schedules() {
146
+ let ops = vec![
147
+ create_test_operation(1, "records", "rec1", 10),
148
+ create_test_operation(2, "records", "rec2", 20),
149
+ create_test_operation(3, "records", "rec3", 30),
150
+ ];
151
+
152
+ let schedules = PermutationScheduler::deterministic_schedules(&ops);
153
+ assert_eq!(schedules.len(), 3); // original, reversed, sorted
154
+ }
155
+
156
+ #[test]
157
+ fn test_random_schedules() {
158
+ let ops = vec![
159
+ create_test_operation(1, "records", "rec1", 10),
160
+ create_test_operation(2, "records", "rec2", 20),
161
+ ];
162
+
163
+ let schedules = PermutationScheduler::random_schedules(&ops, 10);
164
+ assert_eq!(schedules.len(), 10);
165
+
166
+ // All should be RandomSeed variants
167
+ for schedule in &schedules {
168
+ assert!(matches!(schedule.strategy, ScheduleStrategy::RandomSeed { .. }));
169
+ }
170
+ }
171
+
172
+ #[test]
173
+ fn test_random_schedules_deterministic() {
174
+ let ops = vec![
175
+ create_test_operation(1, "records", "rec1", 10),
176
+ create_test_operation(2, "records", "rec2", 20),
177
+ ];
178
+
179
+ let schedules1 = PermutationScheduler::random_schedules(&ops, 3);
180
+ let schedules2 = PermutationScheduler::random_schedules(&ops, 3);
181
+
182
+ // Same seed should produce same order
183
+ for i in 0..3 {
184
+ let ops1: Vec<u64> = schedules1[i].operations.iter().map(|o| o.operation_id.sequence).collect();
185
+ let ops2: Vec<u64> = schedules2[i].operations.iter().map(|o| o.operation_id.sequence).collect();
186
+ assert_eq!(ops1, ops2);
187
+ }
188
+ }
189
+
190
+ #[test]
191
+ fn test_comprehensive_schedules() {
192
+ let ops = vec![
193
+ create_test_operation(1, "records", "rec1", 10),
194
+ create_test_operation(2, "records", "rec2", 20),
195
+ create_test_operation(3, "records", "rec3", 30),
196
+ ];
197
+
198
+ let schedules = PermutationScheduler::comprehensive_schedules(&ops, 5);
199
+ assert_eq!(schedules.len(), 3 + 5); // 3 deterministic + 5 random
200
+ }
201
+
202
+ #[test]
203
+ fn test_minimal_schedules() {
204
+ let ops = vec![
205
+ create_test_operation(1, "records", "rec1", 10),
206
+ create_test_operation(2, "records", "rec2", 20),
207
+ ];
208
+
209
+ let schedules = PermutationScheduler::minimal_schedules(&ops);
210
+ assert_eq!(schedules.len(), 3 + 5); // deterministic + 5 random
211
+ }
212
+
213
+ #[test]
214
+ fn test_schedule_preserves_all_operations() {
215
+ let ops = vec![
216
+ create_test_operation(1, "records", "rec1", 10),
217
+ create_test_operation(2, "records", "rec2", 20),
218
+ create_test_operation(3, "records", "rec3", 30),
219
+ ];
220
+
221
+ let schedules = PermutationScheduler::comprehensive_schedules(&ops, 10);
222
+
223
+ for schedule in &schedules {
224
+ assert_eq!(schedule.operations.len(), 3);
225
+ let seq: Vec<u64> = schedule.operations.iter().map(|o| o.operation_id.sequence).collect();
226
+ assert!(seq.contains(&1));
227
+ assert!(seq.contains(&2));
228
+ assert!(seq.contains(&3));
229
+ }
230
+ }
231
+
232
+ #[test]
233
+ fn test_original_schedule_preserves_order() {
234
+ let ops = vec![
235
+ create_test_operation(1, "records", "rec1", 10),
236
+ create_test_operation(2, "records", "rec2", 20),
237
+ create_test_operation(3, "records", "rec3", 30),
238
+ ];
239
+
240
+ let schedules = PermutationScheduler::deterministic_schedules(&ops);
241
+ let original = &schedules[0];
242
+
243
+ let seq: Vec<u64> = original.operations.iter().map(|o| o.operation_id.sequence).collect();
244
+ assert_eq!(seq, vec![1, 2, 3]);
245
+ }
246
+
247
+ #[test]
248
+ fn test_reversed_schedule() {
249
+ let ops = vec![
250
+ create_test_operation(1, "records", "rec1", 10),
251
+ create_test_operation(2, "records", "rec2", 20),
252
+ create_test_operation(3, "records", "rec3", 30),
253
+ ];
254
+
255
+ let schedules = PermutationScheduler::deterministic_schedules(&ops);
256
+ let reversed = &schedules[1];
257
+
258
+ let seq: Vec<u64> = reversed.operations.iter().map(|o| o.operation_id.sequence).collect();
259
+ assert_eq!(seq, vec![3, 2, 1]);
260
+ }
261
+ }