diff --git a/quirky_binder/Cargo.toml b/quirky_binder/Cargo.toml index 141c8ae..f6e3eff 100644 --- a/quirky_binder/Cargo.toml +++ b/quirky_binder/Cargo.toml @@ -27,5 +27,8 @@ thiserror = "1" truc = { git = "https://github.com/arnodb/truc.git" } which = "4" +[features] +fuzz_data_order = [] + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage,coverage_nightly)'] } diff --git a/quirky_binder/src/graph/builder/update.rs b/quirky_binder/src/graph/builder/update.rs index 02cd018..449ff7a 100644 --- a/quirky_binder/src/graph/builder/update.rs +++ b/quirky_binder/src/graph/builder/update.rs @@ -344,7 +344,8 @@ impl<'g, R: TypeResolver + Copy, Extra> OutputBuilderForUpdate<'_, '_, 'g, R, Ex } pub fn build(self) -> &'g RefCell> { - let variant_id = self.record_definition.borrow_mut().close_record_variant(); + let variant_id = close_record_variant_internal(&mut self.record_definition.borrow_mut()); + self.streams.outputs.push(NodeStream::new( self.record_type, variant_id, @@ -353,6 +354,7 @@ impl<'g, R: TypeResolver + Copy, Extra> OutputBuilderForUpdate<'_, '_, 'g, R, Ex self.is_output_main_stream, self.facts, )); + self.record_definition } } @@ -475,7 +477,8 @@ impl SubStreamBuilderForUpdate<'_, R, Extra> { } pub fn close_record_variant(self, _facts: FactsFullyUpdated<()>) -> NodeSubStream { - let variant_id = self.record_definition.borrow_mut().close_record_variant(); + let variant_id = close_record_variant_internal(&mut self.record_definition.borrow_mut()); + NodeSubStream::new(self.record_type, variant_id, self.sub_streams, self.facts) } } @@ -485,3 +488,23 @@ impl SubStreamBuilderForUpdate<'_, R, DerivedExtra> { self.extra.input_variant_id } } + +fn close_record_variant_internal(builder: &mut RecordDefinitionBuilder) -> RecordVariantId +where + R: TypeResolver, +{ + #[cfg(not(feature = "fuzz_data_order"))] + let variant_id = builder.close_record_variant(); + + #[cfg(feature = "fuzz_data_order")] + let variant_id = match std::env::var("FUZZ_DATA_ORDER") { + Ok(_) => { + use truc::record::definition::builder::variant::append_data_reverse; + // With this one, it is almost assured that record data have an unexpected order + builder.close_record_variant_with(append_data_reverse) + } + Err(_) => builder.close_record_variant(), + }; + + variant_id +} diff --git a/tests/quirky_binder_tests/Cargo.toml b/tests/quirky_binder_tests/Cargo.toml index 09804cf..c979d67 100644 --- a/tests/quirky_binder_tests/Cargo.toml +++ b/tests/quirky_binder_tests/Cargo.toml @@ -18,3 +18,6 @@ truc_runtime = { git = "https://github.com/arnodb/truc.git" } [build-dependencies] quirky_binder_tests_source = { path = "../quirky_binder_tests_source" } + +[features] +fuzz_data_order = ["quirky_binder_tests_source/fuzz_data_order"] diff --git a/tests/quirky_binder_tests_source/Cargo.toml b/tests/quirky_binder_tests_source/Cargo.toml index 6db1ac0..c13df1a 100644 --- a/tests/quirky_binder_tests_source/Cargo.toml +++ b/tests/quirky_binder_tests_source/Cargo.toml @@ -12,3 +12,6 @@ quirky_binder_csv = { path = "../../contrib/quirky_binder_csv" } quirky_binder_lang = { path = "../../quirky_binder_lang" } serde = { version = "1", features = ["derive"] } truc = { git = "https://github.com/arnodb/truc.git" } + +[features] +fuzz_data_order = ["quirky_binder/fuzz_data_order"]