Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/includes/arbitrary_helpers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#[cfg(feature = "arb")]
trait UnstructuredFloatExt {
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32>;
}

#[cfg(feature = "arb")]
impl UnstructuredFloatExt for arbitrary::Unstructured<'_> {
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32> {
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)
}
}
8 changes: 6 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
Expand Down Expand Up @@ -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})?",
Expand Down
1 change: 1 addition & 0 deletions testing/can-messages/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
Expand Down
25 changes: 21 additions & 4 deletions testing/can-messages/src/messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Self, arbitrary::Error> {
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)
}
}
Expand Down Expand Up @@ -434,7 +434,7 @@ impl core::convert::TryFrom<&[u8]> for Bar {
impl<'a> Arbitrary<'a> for Bar {
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self, arbitrary::Error> {
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;
Expand Down Expand Up @@ -707,7 +707,7 @@ impl core::convert::TryFrom<&[u8]> for Amet {
impl<'a> Arbitrary<'a> for Amet {
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self, arbitrary::Error> {
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;
Expand Down Expand Up @@ -816,3 +816,20 @@ pub enum CanError {
},
InvalidPayloadSize,
}
#[cfg(feature = "arb")]
trait UnstructuredFloatExt {
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32>;
}

#[cfg(feature = "arb")]
impl UnstructuredFloatExt for arbitrary::Unstructured<'_> {
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32> {
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)
}
}