@@ -78,17 +78,20 @@ mod test {
78
78
use super :: * ;
79
79
use paste:: paste;
80
80
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 {
82
86
use super :: * ;
83
87
84
88
macro_rules! impl_case {
85
89
( $name: ident : $input: literal => $output: literal) => {
86
90
#[ test]
87
91
fn $name( ) {
88
- let expected = format! ( " \" {} \" " , $output) ;
92
+ let expected = Token :: Str ( $output) ;
89
93
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] ) ;
92
95
}
93
96
}
94
97
}
@@ -104,89 +107,88 @@ mod test {
104
107
impl_case ! ( case_40d0010: "40.0010" => "40.0010" ) ;
105
108
}
106
109
107
- mod serde_deserialize_str {
110
+ #[ cfg( not( feature = "string-only" ) ) ]
111
+ mod serde_deserialize_int {
108
112
use super :: * ;
109
113
110
114
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) => {
112
122
#[ test]
113
123
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] ) ;
119
127
}
120
- }
128
+ } ;
121
129
}
122
130
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 ) ;
132
136
}
133
137
134
-
135
138
#[ cfg( not( feature = "string-only" ) ) ]
136
- mod serde_deserialize_int {
139
+ mod serde_deserialize_float {
137
140
use super :: * ;
138
141
139
142
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
+ }
142
152
} ;
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) ; ) *
145
158
} ;
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
- }
155
159
}
156
160
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" ) ;
164
168
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
+ }
165
177
166
178
#[ cfg( not( feature = "string-only" ) ) ]
167
- mod serde_deserialize_f64 {
179
+ mod serde_deserialize_nan {
168
180
use super :: * ;
169
- use stdlib:: f64:: consts;
170
181
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" ) ;
181
186
}
182
187
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
+ }
190
193
}
191
-
192
194
}
0 commit comments