Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit 4045107

Browse files
committed
Add a cached test generator
Add a single generator that creates the needed function signatures after being populated with values. This provides the same input for all functions.
1 parent d68e6cd commit 4045107

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

crates/libm-test/src/gen.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
//! Different generators that can create random or systematic bit patterns.
2+
3+
use crate::GenerateInput;
4+
5+
/// Store inputs if the same values are used for multiple tests. The `CachedInput` then acts as a
6+
/// generator.
7+
#[derive(Clone, Debug, Default)]
8+
pub struct CachedInput {
9+
pub inputs_f32: Vec<(f32, f32, f32)>,
10+
pub inputs_f64: Vec<(f64, f64, f64)>,
11+
pub inputs_i32: Vec<(i32, i32, i32)>,
12+
}
13+
14+
impl GenerateInput<(f32,)> for CachedInput {
15+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f32,)> {
16+
self.inputs_f32.iter().map(|f| (f.0,))
17+
}
18+
}
19+
20+
impl GenerateInput<(f32, f32)> for CachedInput {
21+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f32, f32)> {
22+
self.inputs_f32.iter().map(|f| (f.0, f.1))
23+
}
24+
}
25+
26+
impl GenerateInput<(i32, f32)> for CachedInput {
27+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (i32, f32)> {
28+
self.inputs_i32
29+
.iter()
30+
.zip(self.inputs_f32.iter())
31+
.map(|(i, f)| (i.0, f.0))
32+
}
33+
}
34+
35+
impl GenerateInput<(f32, i32)> for CachedInput {
36+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f32, i32)> {
37+
GenerateInput::<(i32, f32)>::get_cases(self).map(|(i, f)| (f, i))
38+
}
39+
}
40+
41+
impl GenerateInput<(f32, f32, f32)> for CachedInput {
42+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f32, f32, f32)> {
43+
self.inputs_f32.iter().copied()
44+
}
45+
}
46+
47+
impl GenerateInput<(f64,)> for CachedInput {
48+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f64,)> {
49+
self.inputs_f64.iter().map(|f| (f.0,))
50+
}
51+
}
52+
53+
impl GenerateInput<(f64, f64)> for CachedInput {
54+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f64, f64)> {
55+
self.inputs_f64.iter().map(|f| (f.0, f.1))
56+
}
57+
}
58+
59+
impl GenerateInput<(i32, f64)> for CachedInput {
60+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (i32, f64)> {
61+
self.inputs_i32
62+
.iter()
63+
.zip(self.inputs_f64.iter())
64+
.map(|(i, f)| (i.0, f.0))
65+
}
66+
}
67+
68+
impl GenerateInput<(f64, i32)> for CachedInput {
69+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f64, i32)> {
70+
GenerateInput::<(i32, f64)>::get_cases(self).map(|(i, f)| (f, i))
71+
}
72+
}
73+
74+
impl GenerateInput<(f64, f64, f64)> for CachedInput {
75+
fn get_cases(&self) -> impl ExactSizeIterator<Item = (f64, f64, f64)> {
76+
self.inputs_f64.iter().copied()
77+
}
78+
}

crates/libm-test/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod gen;
12
mod num_traits;
23
mod test_traits;
34

0 commit comments

Comments
 (0)