Skip to content

Commit f435025

Browse files
author
Pascal Hertleif
authored
Merge pull request #26 from technocreatives/feature/arbitrary-floats
Generate arbitray floats
2 parents 4dab514 + 4398e53 commit f435025

File tree

4 files changed

+45
-6
lines changed

4 files changed

+45
-6
lines changed

src/includes/arbitrary_helpers.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#[cfg(feature = "arb")]
2+
trait UnstructuredFloatExt {
3+
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32>;
4+
}
5+
6+
#[cfg(feature = "arb")]
7+
impl UnstructuredFloatExt for arbitrary::Unstructured<'_> {
8+
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32> {
9+
let min = range.start();
10+
let max = range.end();
11+
let steps = u32::MAX;
12+
let factor = (max - min) / (steps as f32);
13+
let random_int: u32 = self.int_in_range(0..=steps)?;
14+
let random = min + factor * (random_int as f32);
15+
Ok(random)
16+
}
17+
}

src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ pub fn codegen(dbc_name: &str, dbc_content: &[u8], out: impl Write, debug: bool)
5858
writeln!(&mut w, "fn main() {{}}")?;
5959
writeln!(&mut w)?;
6060
w.write_all(include_bytes!("./includes/errors.rs"))?;
61+
w.write_all(include_bytes!("./includes/arbitrary_helpers.rs"))?;
6162
writeln!(&mut w)?;
6263

6364
Ok(())
@@ -683,8 +684,11 @@ fn signal_to_arbitrary(signal: &Signal) -> String {
683684
if signal.signal_size == 1 {
684685
"u.int_in_range(0..=1)? == 1".to_string()
685686
} else if signal_is_float_in_rust(signal) {
686-
// TODO generate arbitrary value for float
687-
format!("{}_f32", signal.min())
687+
format!(
688+
"u.float_in_range({min}_f32..={max}_f32)?",
689+
min = signal.min(),
690+
max = signal.max()
691+
)
688692
} else {
689693
format!(
690694
"u.int_in_range({min}..={max})?",

testing/can-messages/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ fn main() -> Result<()> {
88
let dbc_file = fs::read("../dbc-examples/example.dbc")?;
99
let mut out = BufWriter::new(File::create("src/messages.rs")?);
1010
println!("cargo:rerun-if-changed=../dbc-examples/example.dbc");
11+
println!("cargo:rerun-if-changed=../../src");
1112

1213
dbc_codegen::codegen("example.dbc", &dbc_file, &mut out, true)?;
1314
Ok(())

testing/can-messages/src/messages.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ impl core::convert::TryFrom<&[u8]> for Foo {
175175
#[cfg(feature = "arb")]
176176
impl<'a> Arbitrary<'a> for Foo {
177177
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self, arbitrary::Error> {
178-
let voltage = 0_f32;
179-
let current = -2048_f32;
178+
let voltage = u.float_in_range(0_f32..=63.9990234375_f32)?;
179+
let current = u.float_in_range(-2048_f32..=2047.9375_f32)?;
180180
Foo::new(voltage, current).map_err(|_| arbitrary::Error::IncorrectFormat)
181181
}
182182
}
@@ -434,7 +434,7 @@ impl core::convert::TryFrom<&[u8]> for Bar {
434434
impl<'a> Arbitrary<'a> for Bar {
435435
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self, arbitrary::Error> {
436436
let one = u.int_in_range(0..=3)?;
437-
let two = 0_f32;
437+
let two = u.float_in_range(0_f32..=100_f32)?;
438438
let three = u.int_in_range(0..=7)?;
439439
let four = u.int_in_range(0..=3)?;
440440
let xtype = u.int_in_range(0..=1)? == 1;
@@ -707,7 +707,7 @@ impl core::convert::TryFrom<&[u8]> for Amet {
707707
impl<'a> Arbitrary<'a> for Amet {
708708
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self, arbitrary::Error> {
709709
let one = u.int_in_range(0..=3)?;
710-
let two = 0_f32;
710+
let two = u.float_in_range(0_f32..=100_f32)?;
711711
let three = u.int_in_range(0..=7)?;
712712
let four = u.int_in_range(0..=3)?;
713713
let five = u.int_in_range(0..=1)? == 1;
@@ -816,3 +816,20 @@ pub enum CanError {
816816
},
817817
InvalidPayloadSize,
818818
}
819+
#[cfg(feature = "arb")]
820+
trait UnstructuredFloatExt {
821+
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32>;
822+
}
823+
824+
#[cfg(feature = "arb")]
825+
impl UnstructuredFloatExt for arbitrary::Unstructured<'_> {
826+
fn float_in_range(&mut self, range: core::ops::RangeInclusive<f32>) -> arbitrary::Result<f32> {
827+
let min = range.start();
828+
let max = range.end();
829+
let steps = u32::MAX;
830+
let factor = (max - min) / (steps as f32);
831+
let random_int: u32 = self.int_in_range(0..=steps)?;
832+
let random = min + factor * (random_int as f32);
833+
Ok(random)
834+
}
835+
}

0 commit comments

Comments
 (0)