summaryrefslogtreecommitdiffstats
path: root/fluent-bit/lib/jansson-e23f558/test/suites/api/test_number.c
blob: 2a22a67d33dff22624118c2ebc9d745910e97f7b (plain)
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
 *
 * Jansson is free software; you can redistribute it and/or modify
 * it under the terms of the MIT license. See LICENSE for details.
 */

#include "util.h"
#include <jansson.h>
#include <math.h>

#ifdef INFINITY
// This test triggers "warning C4756: overflow in constant arithmetic"
// in Visual Studio. This warning is triggered here by design, so disable it.
// (This can only be done on function level so we keep these tests separate)
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4756)
#endif
static void test_inifity() {
    json_t *real = json_real(INFINITY);
    if (real != NULL)
        fail("could construct a real from Inf");

    real = json_real(1.0);
    if (json_real_set(real, INFINITY) != -1)
        fail("could set a real to Inf");

    if (json_real_value(real) != 1.0)
        fail("real value changed unexpectedly");

    json_decref(real);
#ifdef _MSC_VER
#pragma warning(pop)
#endif
}
#endif // INFINITY

static void test_bad_args(void) {
    json_t *txt = json_string("test");

    if (json_integer_value(NULL) != 0)
        fail("json_integer_value did not return 0 for non-integer");
    if (json_integer_value(txt) != 0)
        fail("json_integer_value did not return 0 for non-integer");

    if (!json_integer_set(NULL, 0))
        fail("json_integer_set did not return error for non-integer");
    if (!json_integer_set(txt, 0))
        fail("json_integer_set did not return error for non-integer");

    if (json_real_value(NULL) != 0.0)
        fail("json_real_value did not return 0.0 for non-real");
    if (json_real_value(txt) != 0.0)
        fail("json_real_value did not return 0.0 for non-real");

    if (!json_real_set(NULL, 0.0))
        fail("json_real_set did not return error for non-real");
    if (!json_real_set(txt, 0.0))
        fail("json_real_set did not return error for non-real");

    if (json_number_value(NULL) != 0.0)
        fail("json_number_value did not return 0.0 for non-numeric");
    if (json_number_value(txt) != 0.0)
        fail("json_number_value did not return 0.0 for non-numeric");

    if (txt->refcount != 1)
        fail("unexpected reference count for txt");

    json_decref(txt);
}

static void run_tests() {
    json_t *integer, *real;
    json_int_t i;
    double d;

    integer = json_integer(5);
    real = json_real(100.1);

    if (!integer)
        fail("unable to create integer");
    if (!real)
        fail("unable to create real");

    i = json_integer_value(integer);
    if (i != 5)
        fail("wrong integer value");

    d = json_real_value(real);
    if (d != 100.1)
        fail("wrong real value");

    d = json_number_value(integer);
    if (d != 5.0)
        fail("wrong number value");
    d = json_number_value(real);
    if (d != 100.1)
        fail("wrong number value");

    json_decref(integer);
    json_decref(real);

#ifdef NAN
    real = json_real(NAN);
    if (real != NULL)
        fail("could construct a real from NaN");

    real = json_real(1.0);
    if (json_real_set(real, NAN) != -1)
        fail("could set a real to NaN");

    if (json_real_value(real) != 1.0)
        fail("real value changed unexpectedly");

    json_decref(real);
#endif

#ifdef INFINITY
    test_inifity();
#endif
    test_bad_args();
}