1
#[test]
2
4
fn extreme_floats_use_exponent_notation() {
3
4
    assert_eq!(ron::to_string(&1e300_f64).unwrap(), "1e300");
4
4
    assert_eq!(ron::to_string(&5e-324_f64).unwrap(), "5e-324");
5
4
    assert_eq!(ron::to_string(&f64::MAX).unwrap(), "1.7976931348623157e308");
6
4
    assert_eq!(ron::to_string(&1e30_f32).unwrap(), "1e30");
7
4
    assert_eq!(ron::to_string(&f32::MAX).unwrap(), "3.4028235e38");
8
4
}
9

            
10
#[test]
11
4
fn ordinary_floats_keep_decimal_notation() {
12
4
    assert_eq!(ron::to_string(&1.0_f64).unwrap(), "1.0");
13
4
    assert_eq!(ron::to_string(&-0.0_f64).unwrap(), "-0.0");
14
4
    assert_eq!(ron::to_string(&0.1_f64).unwrap(), "0.1");
15
4
    assert_eq!(ron::to_string(&123.456_f64).unwrap(), "123.456");
16
4
    assert_eq!(ron::to_string(&3.0_f32).unwrap(), "3.0");
17
4
}
18

            
19
#[test]
20
4
fn exponent_floats_roundtrip() {
21
28
    for v in [
22
4
        1e300_f64,
23
4
        5e-324,
24
4
        f64::MAX,
25
4
        f64::MIN,
26
4
        f64::MIN_POSITIVE,
27
4
        1e16,
28
4
        1e-5,
29
4
    ] {
30
28
        let ron = ron::to_string(&v).unwrap();
31
28
        assert_eq!(ron::from_str::<f64>(&ron).unwrap().to_bits(), v.to_bits());
32

            
33
        // Untyped values must still be parsed as floats, not integers
34
28
        assert_eq!(
35
28
            ron::from_str::<ron::Value>(&ron).unwrap(),
36
28
            ron::Value::Number(ron::value::Number::F64(v.into()))
37
        );
38
    }
39

            
40
16
    for v in [1e30_f32, 1e-40, f32::MAX, f32::MIN_POSITIVE] {
41
16
        let ron = ron::to_string(&v).unwrap();
42
16
        assert_eq!(ron::from_str::<f32>(&ron).unwrap().to_bits(), v.to_bits());
43
    }
44
4
}
45

            
46
#[test]
47
4
fn exponent_floats_with_number_suffixes() {
48
4
    let config = ron::ser::PrettyConfig::default().number_suffixes(true);
49

            
50
4
    let ron = ron::ser::to_string_pretty(&1e300_f64, config.clone()).unwrap();
51
4
    assert_eq!(ron, "1e300f64");
52
4
    assert_eq!(ron::from_str::<f64>(&ron).unwrap(), 1e300);
53

            
54
4
    let ron = ron::ser::to_string_pretty(&1e30_f32, config).unwrap();
55
4
    assert_eq!(ron, "1e30f32");
56
4
    assert_eq!(ron::from_str::<f32>(&ron).unwrap(), 1e30);
57
4
}
58

            
59
#[test]
60
4
fn nan_sign_roundtrips() {
61
4
    let config = ron::ser::PrettyConfig::default().number_suffixes(true);
62

            
63
8
    for (v, expected) in [(f64::NAN, "NaN"), (-f64::NAN, "-NaN")] {
64
8
        let ron = ron::to_string(&v).unwrap();
65
8
        assert_eq!(ron, expected);
66

            
67
8
        let de = ron::from_str::<f64>(&ron).unwrap();
68
8
        assert!(de.is_nan());
69
8
        assert_eq!(de.is_sign_negative(), v.is_sign_negative());
70

            
71
8
        let ron = ron::ser::to_string_pretty(&v, config.clone()).unwrap();
72
8
        assert_eq!(ron, format!("{}f64", expected));
73

            
74
8
        let de = ron::from_str::<f64>(&ron).unwrap();
75
8
        assert!(de.is_nan());
76
8
        assert_eq!(de.is_sign_negative(), v.is_sign_negative());
77
    }
78

            
79
8
    for (v, expected) in [(f32::NAN, "NaN"), (-f32::NAN, "-NaN")] {
80
8
        let ron = ron::to_string(&v).unwrap();
81
8
        assert_eq!(ron, expected);
82

            
83
8
        let de = ron::from_str::<f32>(&ron).unwrap();
84
8
        assert!(de.is_nan());
85
8
        assert_eq!(de.is_sign_negative(), v.is_sign_negative());
86

            
87
        // Untyped values keep the sign as well
88
8
        match ron::from_str::<ron::Value>(&ron).unwrap() {
89
8
            ron::Value::Number(ron::value::Number::F32(de)) => {
90
8
                assert!(de.get().is_nan());
91
8
                assert_eq!(de.get().is_sign_negative(), v.is_sign_negative());
92
            }
93
            other => panic!("expected an f32 NaN, got {:?}", other),
94
        }
95

            
96
8
        let ron = ron::ser::to_string_pretty(&v, config.clone()).unwrap();
97
8
        assert_eq!(ron, format!("{}f32", expected));
98

            
99
8
        let de = ron::from_str::<f32>(&ron).unwrap();
100
8
        assert!(de.is_nan());
101
8
        assert_eq!(de.is_sign_negative(), v.is_sign_negative());
102
    }
103
4
}