1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#![allow(unstable)]
#[macro_export]
macro_rules! assert_abs_close(
($x:expr, $y:expr) => ({
use std::num::Float;
let delta = delta!();
for (&x, &y) in $x.iter().zip($y.iter()) {
if x.is_finite() && y.is_finite() {
assert!((x.abs() - y.abs()).abs() < delta, "|{}| !~ |{}|", x, y);
} else {
assert_eq!(x, y);
}
}
});
);
#[macro_export]
macro_rules! assert_close(
($x:expr, $y:expr) => ({
use std::num::Float;
let delta = delta!();
for (&x, &y) in $x.iter().zip($y.iter()) {
if x.is_finite() && y.is_finite() {
assert!((x - y).abs() < delta, "{} !~ {}", x, y);
} else {
assert_eq!(x, y);
}
}
});
);
#[macro_export]
macro_rules! assert_equal(
($x:expr, $y:expr) => ({
for (&x, &y) in $x.iter().zip($y.iter()) {
assert_eq!(x, y);
}
});
);
#[macro_export]
macro_rules! assert_err(
($result:expr) => {
match $result {
Ok(..) => assert!(false, "got Ok(..), expected Err(..)"),
Err(..) => {},
}
};
);
#[macro_export]
macro_rules! assert_ok(
($result:expr) => {
match $result {
Ok(..) => {},
Err(..) => assert!(false, "got Err(..), expected Ok(..)"),
}
};
);
#[macro_export]
macro_rules! delta(
() => (::std::f64::EPSILON.sqrt());
);
#[cfg(test)]
mod test {
struct Success;
struct Failure;
#[test]
fn assert_abs_close() {
assert_abs_close!([1f64, 2.0, 3.0], [-1f64, 2.0 + 1e-10, -3.0 - 1e-10]);
}
#[test]
fn assert_close() {
assert_close!([1f64, 2.0, 3.0], [1f64, 2.0 + 1e-10, 3.0 - 1e-10]);
}
#[test]
fn assert_equal() {
assert_equal!([1f64, 2.0, 3.0], [1f64, 2.0, 3.0]);
}
#[test]
fn assert_err() {
fn work() -> Result<Success, Failure> { Err(Failure) }
assert_err!(work());
}
#[test]
fn assert_ok() {
fn work() -> Result<Success, Failure> { Ok(Success) }
assert_ok!(work());
}
}