Skip to content

Commit 8355022

Browse files
committed
Replace serde_json with serde_test
1 parent 909062b commit 8355022

File tree

3 files changed

+69
-64
lines changed

3 files changed

+69
-64
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ serde = { version = "1.0", optional = true, default-features = false }
2828

2929
[dev-dependencies]
3030
paste = "1"
31-
serde_json = "<1.0.101"
31+
serde_test = "<1.0.176"
3232
siphasher = { version = "0.3.10", default-features = false }
3333
# The following dev-dependencies are only required for benchmarking
3434
# (use the `benchmark-bigdecimal` script to uncomment these and run benchmarks)

src/impl_serde.rs

Lines changed: 65 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,20 @@ mod test {
7878
use super::*;
7979
use paste::paste;
8080

81-
mod serde_serialize {
81+
use serde_test::{
82+
Token, assert_tokens, assert_de_tokens, assert_de_tokens_error
83+
};
84+
85+
mod serde_serialize_deserialize_str {
8286
use super::*;
8387

8488
macro_rules! impl_case {
8589
($name:ident : $input:literal => $output:literal) => {
8690
#[test]
8791
fn $name() {
88-
let expected = format!("\"{}\"", $output);
92+
let expected = Token::Str($output);
8993
let decimal: BigDecimal = $input.parse().unwrap();
90-
let value = serde_json::to_string(&decimal).unwrap();
91-
assert_eq!(expected, value);
94+
assert_tokens(&decimal, &[expected]);
9295
}
9396
}
9497
}
@@ -104,89 +107,88 @@ mod test {
104107
impl_case!(case_40d0010: "40.0010" => "40.0010");
105108
}
106109

107-
mod serde_deserialize_str {
110+
#[cfg(not(feature = "string-only"))]
111+
mod serde_deserialize_int {
108112
use super::*;
109113

110114
macro_rules! impl_case {
111-
($name:ident : $input:literal => $output:literal) => {
115+
( $( $ttype:ident ),+ : -$input:literal ) => {
116+
$( paste! { impl_case!([< case_n $input _ $ttype:lower >] : $ttype : -$input); } )*
117+
};
118+
( $( $ttype:ident ),+ : $input:literal ) => {
119+
$( paste! { impl_case!([< case_ $input _ $ttype:lower >] : $ttype : $input); } )*
120+
};
121+
($name:ident : $type:ident : $input:literal) => {
112122
#[test]
113123
fn $name() {
114-
let expected: BigDecimal = $output.parse().unwrap();
115-
116-
let s = $input;
117-
let value: BigDecimal = serde_json::from_str(&format!("\"{}\"", s)).unwrap();
118-
assert_eq!(expected, value);
124+
let expected = BigDecimal::from($input);
125+
let token = Token::$type($input);
126+
assert_de_tokens(&expected, &[token]);
119127
}
120-
}
128+
};
121129
}
122130

123-
impl_case!(case_1d0: "1.0" => "1.0");
124-
impl_case!(case_0d5: "0.5" => "0.5");
125-
impl_case!(case_50: "50" => "50");
126-
impl_case!(case_50000: "50000" => "50000");
127-
impl_case!(case_1en3: "1e-3" => "0.001");
128-
impl_case!(case_1e12: "1e12" => "1000000000000");
129-
impl_case!(case_d25: ".25" => "0.25");
130-
impl_case!(case_12d34e1: "12.34e1" => "123.4");
131-
impl_case!(case_40d0010: "40.0010" => "40.0010");
131+
impl_case!(I8, I16, I32, I64, U8, U16, U32, U64 : 0);
132+
impl_case!(I8, I16, I32, I64, U8, U16, U32, U64 : 1);
133+
impl_case!(I8, I16, I32, I64 : -1);
134+
impl_case!(I64: -99999999999i64);
135+
impl_case!(I64: -9_223_372_036_854_775_808i64);
132136
}
133137

134-
135138
#[cfg(not(feature = "string-only"))]
136-
mod serde_deserialize_int {
139+
mod serde_deserialize_float {
137140
use super::*;
138141

139142
macro_rules! impl_case {
140-
(-$input:literal) => {
141-
paste! { impl_case!([< case_n $input >] : -$input); }
143+
( $name:ident : $input:literal => $ttype:ident : $expected:literal ) => {
144+
paste! {
145+
#[test]
146+
fn [< $name _ $ttype:lower >]() {
147+
let expected: BigDecimal = $expected.parse().unwrap();
148+
let token = Token::$ttype($input);
149+
assert_de_tokens(&expected, &[token]);
150+
}
151+
}
142152
};
143-
($input:literal) => {
144-
paste! { impl_case!([< case_ $input >] : $input); }
153+
( $name:ident : $input:literal => $( $ttype:ident : $expected:literal )+ ) => {
154+
$( impl_case!($name : $input => $ttype : $expected); )*
155+
};
156+
( $name:ident : $input:literal => $( $ttype:ident ),+ : $expected:literal ) => {
157+
$( impl_case!($name : $input => $ttype : $expected); )*
145158
};
146-
($name:ident : $input:literal) => {
147-
#[test]
148-
fn $name() {
149-
let n = $input;
150-
let expected = BigDecimal::from_i64(n).unwrap();
151-
let value: BigDecimal = serde_json::from_str(&serde_json::to_string(&n).unwrap()).unwrap();
152-
assert_eq!(expected, value);
153-
}
154-
}
155159
}
156160

157-
impl_case!(0);
158-
impl_case!(1);
159-
impl_case!(81516161);
160-
impl_case!(-370);
161-
impl_case!(-8);
162-
impl_case!(-99999999999);
163-
}
161+
impl_case!(case_1d0 : 1.0 => F32, F64 : "1");
162+
impl_case!(case_1d1 : 1.1 => F32 : "1.10000002384185791015625"
163+
F64 : "1.100000000000000088817841970012523233890533447265625");
164+
165+
impl_case!(case_0d001834988943300:
166+
0.001834988943300 => F32 : "0.001834988943301141262054443359375"
167+
F64 : "0.00183498894330000003084768511740776375518180429935455322265625");
164168

169+
impl_case!(case_n869651d9131236838:
170+
-869651.9131236838 => F32 : "-869651.9375"
171+
F64 : "-869651.91312368377111852169036865234375");
172+
173+
impl_case!(case_n1en20:
174+
-1e-20 => F32 : "-9.999999682655225388967887463487205224055287544615566730499267578125E-21"
175+
F64 : "-999999999999999945153271454209571651729503702787392447107715776066783064379706047475337982177734375e-119");
176+
}
165177

166178
#[cfg(not(feature = "string-only"))]
167-
mod serde_deserialize_f64 {
179+
mod serde_deserialize_nan {
168180
use super::*;
169-
use stdlib::f64::consts;
170181

171-
macro_rules! impl_case {
172-
($name:ident : $input:expr) => {
173-
#[test]
174-
fn $name() {
175-
let n = $input;
176-
let expected = BigDecimal::from_f64(n).unwrap();
177-
let value: BigDecimal = serde_json::from_str(&serde_json::to_string(&n).unwrap()).unwrap();
178-
assert_eq!(expected, value);
179-
}
180-
}
182+
#[test]
183+
fn case_f32() {
184+
let tokens = [ Token::F32(f32::NAN) ];
185+
assert_de_tokens_error::<BigDecimal>(&tokens, "NAN");
181186
}
182187

183-
impl_case!(case_1d0: 1.0);
184-
impl_case!(case_0d1: 0.1);
185-
impl_case!(case_0d5: 0.5);
186-
impl_case!(case_50d0: 50.0);
187-
impl_case!(case_pi: consts::PI);
188-
impl_case!(case_pi_times_100: consts::PI * 100.0);
189-
impl_case!(case_pi_times_30000: consts::PI * 30000.0);
188+
#[test]
189+
fn case_f64() {
190+
let tokens = [ Token::F64(f64::NAN) ];
191+
assert_de_tokens_error::<BigDecimal>(&tokens, "NAN");
192+
}
190193
}
191-
192194
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ extern crate paste;
5959
#[cfg(feature = "serde")]
6060
extern crate serde;
6161

62+
#[cfg(all(test, feature = "serde"))]
63+
extern crate serde_test;
64+
6265
#[cfg(feature = "std")]
6366
include!("./with_std.rs");
6467

0 commit comments

Comments
 (0)