Skip to content

Commit d30c103

Browse files
bors[bot]japaric
andcommitted
120: test edge cases r=japaric a=japaric the test generator is not good at generating test cases that contain values like inf, zero and nan. This commit adds test cases that contain those values. Co-authored-by: Jorge Aparicio <[email protected]>
2 parents 3932e2e + bebe357 commit d30c103

File tree

3 files changed

+70
-28
lines changed

3 files changed

+70
-28
lines changed

ci/script.sh

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ main() {
1515
# generate tests
1616
cargo run --package test-generator --target x86_64-unknown-linux-musl
1717

18-
if cargo fmt --version >/dev/null 2>&1; then
19-
# nicer syntax error messages (if any)
20-
cargo fmt
21-
fi
22-
2318
# run tests
2419
cross test --target $TARGET --release
2520

test-generator/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ publish = false
66

77
[dependencies]
88
rand = "0.5.3"
9+
itertools = "0.7.8"

test-generator/src/main.rs

Lines changed: 69 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
// NOTE usually the only thing you need to do to test a new math function is to add it to one of the
55
// macro invocations found in the bottom of this file.
66

7+
#[macro_use]
8+
extern crate itertools;
79
extern crate rand;
810

911
use std::error::Error;
1012
use std::fmt::Write as _0;
1113
use std::fs::{self, File};
1214
use std::io::Write as _1;
13-
use std::{i16, u16, u32, u64, u8};
15+
use std::{f32, f64, i16, u16, u32, u64, u8};
1416

1517
use rand::{Rng, SeedableRng, XorShiftRng};
1618

@@ -34,6 +36,30 @@ fn f64(rng: &mut XorShiftRng) -> f64 {
3436
f64::from_bits(sign + exponent + mantissa)
3537
}
3638

39+
const EDGE_CASES32: &[f32] = &[
40+
-0.,
41+
0.,
42+
f32::EPSILON,
43+
f32::INFINITY,
44+
f32::MAX,
45+
f32::MIN,
46+
f32::MIN_POSITIVE,
47+
f32::NAN,
48+
f32::NEG_INFINITY,
49+
];
50+
51+
const EDGE_CASES64: &[f64] = &[
52+
-0.,
53+
0.,
54+
f64::EPSILON,
55+
f64::INFINITY,
56+
f64::MAX,
57+
f64::MIN,
58+
f64::MIN_POSITIVE,
59+
f64::NAN,
60+
f64::NEG_INFINITY,
61+
];
62+
3763
// fn(f32) -> f32
3864
macro_rules! f32_f32 {
3965
($($intr:ident,)*) => {
@@ -45,8 +71,9 @@ macro_rules! f32_f32 {
4571

4672
$(
4773
let mut cases = String::new();
48-
for _ in 0..NTESTS {
49-
let inp = f32(rng);
74+
75+
// random inputs
76+
for inp in EDGE_CASES32.iter().cloned().chain((0..NTESTS).map(|_| f32(rng))) {
5077
let out = unsafe { $intr(inp) };
5178

5279
let inp = inp.to_bits();
@@ -112,11 +139,17 @@ macro_rules! f32f32_f32 {
112139
$(fn $intr(_: f32, _: f32) -> f32;)*
113140
}
114141

142+
let mut rng2 = rng.clone();
143+
let mut rng3 = rng.clone();
115144
$(
116145
let mut cases = String::new();
117-
for _ in 0..NTESTS {
118-
let i1 = f32(rng);
119-
let i2 = f32(rng);
146+
for (i1, i2) in iproduct!(
147+
EDGE_CASES32.iter().cloned(),
148+
EDGE_CASES32.iter().cloned()
149+
).chain(EDGE_CASES32.iter().map(|i1| (*i1, f32(rng))))
150+
.chain(EDGE_CASES32.iter().map(|i2| (f32(&mut rng2), *i2)))
151+
.chain((0..NTESTS).map(|_| (f32(&mut rng3), f32(&mut rng3))))
152+
{
120153
let out = unsafe { $intr(i1, i2) };
121154

122155
let i1 = i1.to_bits();
@@ -186,12 +219,16 @@ macro_rules! f32f32f32_f32 {
186219
$(fn $intr(_: f32, _: f32, _: f32) -> f32;)*
187220
}
188221

222+
let mut rng2 = rng.clone();
189223
$(
190224
let mut cases = String::new();
191-
for _ in 0..NTESTS {
192-
let i1 = f32(rng);
193-
let i2 = f32(rng);
194-
let i3 = f32(rng);
225+
for (i1, i2, i3) in iproduct!(
226+
EDGE_CASES32.iter().cloned(),
227+
EDGE_CASES32.iter().cloned(),
228+
EDGE_CASES32.iter().cloned()
229+
).chain(EDGE_CASES32.iter().map(|i1| (*i1, f32(rng), f32(rng))))
230+
.chain((0..NTESTS).map(|_| (f32(&mut rng2), f32(&mut rng2), f32(&mut rng2))))
231+
{
195232
let out = unsafe { $intr(i1, i2, i3) };
196233

197234
let i1 = i1.to_bits();
@@ -266,10 +303,10 @@ macro_rules! f32i32_f32 {
266303
$(fn $intr(_: f32, _: i32) -> f32;)*
267304
}
268305

306+
let mut rng2 = rng.clone();
269307
$(
270308
let mut cases = String::new();
271-
for _ in 0..NTESTS {
272-
let i1 = f32(rng);
309+
for i1 in EDGE_CASES32.iter().cloned().chain((0..NTESTS).map(|_| f32(&mut rng2))) {
273310
let i2 = rng.gen_range(i16::MIN, i16::MAX);
274311
let out = unsafe { $intr(i1, i2 as i32) };
275312

@@ -342,8 +379,7 @@ macro_rules! f64_f64 {
342379

343380
$(
344381
let mut cases = String::new();
345-
for _ in 0..NTESTS {
346-
let inp = f64(rng);
382+
for inp in EDGE_CASES64.iter().cloned().chain((0..NTESTS).map(|_| f64(rng))) {
347383
let out = unsafe { $intr(inp) };
348384

349385
let inp = inp.to_bits();
@@ -412,11 +448,17 @@ macro_rules! f64f64_f64 {
412448
$(fn $intr(_: f64, _: f64) -> f64;)*
413449
}
414450

451+
let mut rng2 = rng.clone();
452+
let mut rng3 = rng.clone();
415453
$(
416454
let mut cases = String::new();
417-
for _ in 0..NTESTS {
418-
let i1 = f64(rng);
419-
let i2 = f64(rng);
455+
for (i1, i2) in iproduct!(
456+
EDGE_CASES64.iter().cloned(),
457+
EDGE_CASES64.iter().cloned()
458+
).chain(EDGE_CASES64.iter().map(|i1| (*i1, f64(rng))))
459+
.chain(EDGE_CASES64.iter().map(|i2| (f64(&mut rng2), *i2)))
460+
.chain((0..NTESTS).map(|_| (f64(&mut rng3), f64(&mut rng3))))
461+
{
420462
let out = unsafe { $intr(i1, i2) };
421463

422464
let i1 = i1.to_bits();
@@ -485,12 +527,16 @@ macro_rules! f64f64f64_f64 {
485527
$(fn $intr(_: f64, _: f64, _: f64) -> f64;)*
486528
}
487529

530+
let mut rng2 = rng.clone();
488531
$(
489532
let mut cases = String::new();
490-
for _ in 0..NTESTS {
491-
let i1 = f64(rng);
492-
let i2 = f64(rng);
493-
let i3 = f64(rng);
533+
for (i1, i2, i3) in iproduct!(
534+
EDGE_CASES64.iter().cloned(),
535+
EDGE_CASES64.iter().cloned(),
536+
EDGE_CASES64.iter().cloned()
537+
).chain(EDGE_CASES64.iter().map(|i1| (*i1, f64(rng), f64(rng))))
538+
.chain((0..NTESTS).map(|_| (f64(&mut rng2), f64(&mut rng2), f64(&mut rng2))))
539+
{
494540
let out = unsafe { $intr(i1, i2, i3) };
495541

496542
let i1 = i1.to_bits();
@@ -565,10 +611,10 @@ macro_rules! f64i32_f64 {
565611
$(fn $intr(_: f64, _: i32) -> f64;)*
566612
}
567613

614+
let mut rng2 = rng.clone();
568615
$(
569616
let mut cases = String::new();
570-
for _ in 0..NTESTS {
571-
let i1 = f64(rng);
617+
for i1 in EDGE_CASES64.iter().cloned().chain((0..NTESTS).map(|_| f64(&mut rng2))) {
572618
let i2 = rng.gen_range(i16::MIN, i16::MAX);
573619
let out = unsafe { $intr(i1, i2 as i32) };
574620

0 commit comments

Comments
 (0)