diff --git a/src/includes/arbitrary_helpers.rs b/src/includes/arbitrary_helpers.rs new file mode 100644 index 0000000..ee2d4f2 --- /dev/null +++ b/src/includes/arbitrary_helpers.rs @@ -0,0 +1,17 @@ +#[cfg(feature = "arb")] +trait UnstructuredFloatExt { + fn float_in_range(&mut self, range: core::ops::RangeInclusive) -> arbitrary::Result; +} + +#[cfg(feature = "arb")] +impl UnstructuredFloatExt for arbitrary::Unstructured<'_> { + fn float_in_range(&mut self, range: core::ops::RangeInclusive) -> arbitrary::Result { + let min = range.start(); + let max = range.end(); + let steps = u32::MAX; + let factor = (max - min) / (steps as f32); + let random_int: u32 = self.int_in_range(0..=steps)?; + let random = min + factor * (random_int as f32); + Ok(random) + } +} diff --git a/src/lib.rs b/src/lib.rs index 40113a6..d0d0494 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,6 +58,7 @@ pub fn codegen(dbc_name: &str, dbc_content: &[u8], out: impl Write, debug: bool) writeln!(&mut w, "fn main() {{}}")?; writeln!(&mut w)?; w.write_all(include_bytes!("./includes/errors.rs"))?; + w.write_all(include_bytes!("./includes/arbitrary_helpers.rs"))?; writeln!(&mut w)?; Ok(()) @@ -683,8 +684,11 @@ fn signal_to_arbitrary(signal: &Signal) -> String { if signal.signal_size == 1 { "u.int_in_range(0..=1)? == 1".to_string() } else if signal_is_float_in_rust(signal) { - // TODO generate arbitrary value for float - format!("{}_f32", signal.min()) + format!( + "u.float_in_range({min}_f32..={max}_f32)?", + min = signal.min(), + max = signal.max() + ) } else { format!( "u.int_in_range({min}..={max})?", diff --git a/testing/can-messages/build.rs b/testing/can-messages/build.rs index 5c301b2..a47d0ed 100644 --- a/testing/can-messages/build.rs +++ b/testing/can-messages/build.rs @@ -8,6 +8,7 @@ fn main() -> Result<()> { let dbc_file = fs::read("../dbc-examples/example.dbc")?; let mut out = BufWriter::new(File::create("src/messages.rs")?); println!("cargo:rerun-if-changed=../dbc-examples/example.dbc"); + println!("cargo:rerun-if-changed=../../src"); dbc_codegen::codegen("example.dbc", &dbc_file, &mut out, true)?; Ok(()) diff --git a/testing/can-messages/src/messages.rs b/testing/can-messages/src/messages.rs index b76798e..9634774 100644 --- a/testing/can-messages/src/messages.rs +++ b/testing/can-messages/src/messages.rs @@ -175,8 +175,8 @@ impl core::convert::TryFrom<&[u8]> for Foo { #[cfg(feature = "arb")] impl<'a> Arbitrary<'a> for Foo { fn arbitrary(u: &mut Unstructured<'a>) -> Result { - let voltage = 0_f32; - let current = -2048_f32; + let voltage = u.float_in_range(0_f32..=63.9990234375_f32)?; + let current = u.float_in_range(-2048_f32..=2047.9375_f32)?; Foo::new(voltage, current).map_err(|_| arbitrary::Error::IncorrectFormat) } } @@ -434,7 +434,7 @@ impl core::convert::TryFrom<&[u8]> for Bar { impl<'a> Arbitrary<'a> for Bar { fn arbitrary(u: &mut Unstructured<'a>) -> Result { let one = u.int_in_range(0..=3)?; - let two = 0_f32; + let two = u.float_in_range(0_f32..=100_f32)?; let three = u.int_in_range(0..=7)?; let four = u.int_in_range(0..=3)?; let xtype = u.int_in_range(0..=1)? == 1; @@ -707,7 +707,7 @@ impl core::convert::TryFrom<&[u8]> for Amet { impl<'a> Arbitrary<'a> for Amet { fn arbitrary(u: &mut Unstructured<'a>) -> Result { let one = u.int_in_range(0..=3)?; - let two = 0_f32; + let two = u.float_in_range(0_f32..=100_f32)?; let three = u.int_in_range(0..=7)?; let four = u.int_in_range(0..=3)?; let five = u.int_in_range(0..=1)? == 1; @@ -816,3 +816,20 @@ pub enum CanError { }, InvalidPayloadSize, } +#[cfg(feature = "arb")] +trait UnstructuredFloatExt { + fn float_in_range(&mut self, range: core::ops::RangeInclusive) -> arbitrary::Result; +} + +#[cfg(feature = "arb")] +impl UnstructuredFloatExt for arbitrary::Unstructured<'_> { + fn float_in_range(&mut self, range: core::ops::RangeInclusive) -> arbitrary::Result { + let min = range.start(); + let max = range.end(); + let steps = u32::MAX; + let factor = (max - min) / (steps as f32); + let random_int: u32 = self.int_in_range(0..=steps)?; + let random = min + factor * (random_int as f32); + Ok(random) + } +}