Skip to content

Commit a38799e

Browse files
committed
0.8.0 fixing #46, #45 and #42
1 parent f67945f commit a38799e

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

src/codegen.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::io::Write;
2+
use std::num::FpCategory;
23
use JsonValue;
34

45
pub trait Generator {
@@ -57,8 +58,21 @@ pub trait Generator {
5758
}
5859

5960
fn write_number(&mut self, mut num: f64) {
60-
if num < 0.0 {
61-
num = -num;
61+
match num.classify() {
62+
FpCategory::Nan |
63+
FpCategory::Infinite => {
64+
self.write(b"null");
65+
return;
66+
},
67+
FpCategory::Zero => {
68+
self.write(if num.is_sign_negative() { b"-0" } else { b"0" });
69+
return;
70+
},
71+
_ => {},
72+
}
73+
74+
if num.is_sign_negative() {
75+
num = num.abs();
6276
self.write_char(b'-');
6377
}
6478

tests/lib.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#[macro_use]
22
extern crate json;
33

4+
use std::f64;
45
use std::collections::BTreeMap;
56
use std::collections::HashMap;
67
use json::{ stringify, stringify_pretty, parse, JsonValue, JsonError, Null };
@@ -130,6 +131,37 @@ fn stringify_number() {
130131
assert_eq!(stringify(3.141592653589793), "3.141592653589793");
131132
}
132133

134+
// #[test]
135+
// fn stringify_precise_positive_number() {
136+
// assert_eq!(JsonValue::Number(1.2345f64).dump(), "1.2345");
137+
// }
138+
139+
// #[test]
140+
// fn stringify_precise_negative_number() {
141+
// assert_eq!(JsonValue::Number(-1.2345f64).dump(), "-1.2345");
142+
// }
143+
144+
#[test]
145+
fn stringify_zero() {
146+
assert_eq!(JsonValue::Number(0.0).dump(), "0");
147+
}
148+
149+
#[test]
150+
fn stringify_nan() {
151+
assert_eq!(JsonValue::Number(f64::NAN).dump(), "null");
152+
}
153+
154+
#[test]
155+
fn stringify_infinity() {
156+
assert_eq!(JsonValue::Number(f64::INFINITY).dump(), "null");
157+
assert_eq!(JsonValue::Number(f64::NEG_INFINITY).dump(), "null");
158+
}
159+
160+
#[test]
161+
fn stringify_negative_zero() {
162+
assert_eq!(JsonValue::Number(-0f64).dump(), "-0");
163+
}
164+
133165
#[test]
134166
fn stringify_integer() {
135167
assert_eq!(stringify(42), "42");
@@ -299,6 +331,11 @@ fn parse_integer() {
299331
assert_eq!(parse("42").unwrap(), 42);
300332
}
301333

334+
#[test]
335+
fn parse_negative_zero() {
336+
assert_eq!(parse("-0").unwrap(), JsonValue::Number(-0f64));
337+
}
338+
302339
#[test]
303340
fn parse_negative_integer() {
304341
assert_eq!(parse("-42").unwrap(), -42);

0 commit comments

Comments
 (0)