LCOV - code coverage report
Current view: top level - test - test-json.c (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 246 246 100.0 %
Date: 2019-08-22 15:41:25 Functions: 9 9 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: LGPL-2.1+ */
       2             : 
       3             : #include <math.h>
       4             : 
       5             : #include "alloc-util.h"
       6             : #include "fd-util.h"
       7             : #include "fileio.h"
       8             : #include "json-internal.h"
       9             : #include "json.h"
      10             : #include "string-util.h"
      11             : #include "strv.h"
      12             : #include "tests.h"
      13             : #include "util.h"
      14             : 
      15          35 : static void test_tokenizer(const char *data, ...) {
      16          35 :         unsigned line = 0, column = 0;
      17          35 :         void *state = NULL;
      18             :         va_list ap;
      19             : 
      20          35 :         va_start(ap, data);
      21             : 
      22          51 :         for (;;) {
      23             :                 unsigned token_line, token_column;
      24          86 :                 _cleanup_free_ char *str = NULL;
      25          86 :                 JsonValue v = JSON_VALUE_NULL;
      26             :                 int t, tt;
      27             : 
      28          86 :                 t = json_tokenize(&data, &str, &v, &token_line, &token_column, &state, &line, &column);
      29          86 :                 tt = va_arg(ap, int);
      30             : 
      31          86 :                 assert_se(t == tt);
      32             : 
      33          86 :                 if (t == JSON_TOKEN_END || t < 0)
      34             :                         break;
      35             : 
      36          51 :                 else if (t == JSON_TOKEN_STRING) {
      37             :                         const char *nn;
      38             : 
      39           9 :                         nn = va_arg(ap, const char *);
      40           9 :                         assert_se(streq_ptr(nn, str));
      41             : 
      42          42 :                 } else if (t == JSON_TOKEN_REAL) {
      43             :                         long double d;
      44             : 
      45           6 :                         d = va_arg(ap, long double);
      46             : 
      47             :                         /* Valgrind doesn't support long double calculations and automatically downgrades to 80bit:
      48             :                          * http://www.valgrind.org/docs/manual/manual-core.html#manual-core.limits.
      49             :                          * Some architectures might not support long double either.
      50             :                          */
      51             : 
      52           6 :                         assert_se(fabsl(d - v.real) < 1e-10 ||
      53             :                                   fabsl((d - v.real) / v.real) < 1e-10);
      54             : 
      55          36 :                 } else if (t == JSON_TOKEN_INTEGER) {
      56             :                         intmax_t i;
      57             : 
      58           5 :                         i = va_arg(ap, intmax_t);
      59           5 :                         assert_se(i == v.integer);
      60             : 
      61          31 :                 } else if (t == JSON_TOKEN_UNSIGNED) {
      62             :                         uintmax_t u;
      63             : 
      64           5 :                         u = va_arg(ap, uintmax_t);
      65           5 :                         assert_se(u == v.unsig);
      66             : 
      67          26 :                 } else if (t == JSON_TOKEN_BOOLEAN) {
      68             :                         bool b;
      69             : 
      70           4 :                         b = va_arg(ap, int);
      71           4 :                         assert_se(b == v.boolean);
      72             :                 }
      73             :         }
      74             : 
      75          35 :         va_end(ap);
      76          35 : }
      77             : 
      78             : typedef void (*Test)(JsonVariant *);
      79             : 
      80           4 : static void test_variant(const char *data, Test test) {
      81           4 :         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *w = NULL;
      82           4 :         _cleanup_free_ char *s = NULL;
      83             :         int r;
      84             : 
      85           4 :         r = json_parse(data, &v, NULL, NULL);
      86           4 :         assert_se(r == 0);
      87           4 :         assert_se(v);
      88             : 
      89           4 :         r = json_variant_format(v, 0, &s);
      90           4 :         assert_se(r >= 0);
      91           4 :         assert_se(s);
      92           4 :         assert_se((size_t) r == strlen(s));
      93             : 
      94           4 :         log_info("formatted normally: %s\n", s);
      95             : 
      96           4 :         r = json_parse(data, &w, NULL, NULL);
      97           4 :         assert_se(r == 0);
      98           4 :         assert_se(w);
      99           4 :         assert_se(json_variant_has_type(v, json_variant_type(w)));
     100           4 :         assert_se(json_variant_has_type(w, json_variant_type(v)));
     101           4 :         assert_se(json_variant_equal(v, w));
     102             : 
     103           4 :         s = mfree(s);
     104           4 :         w = json_variant_unref(w);
     105             : 
     106           4 :         r = json_variant_format(v, JSON_FORMAT_PRETTY, &s);
     107           4 :         assert_se(r >= 0);
     108           4 :         assert_se(s);
     109           4 :         assert_se((size_t) r == strlen(s));
     110             : 
     111           4 :         log_info("formatted prettily:\n%s", s);
     112             : 
     113           4 :         r = json_parse(data, &w, NULL, NULL);
     114           4 :         assert_se(r == 0);
     115           4 :         assert_se(w);
     116             : 
     117           4 :         assert_se(json_variant_has_type(v, json_variant_type(w)));
     118           4 :         assert_se(json_variant_has_type(w, json_variant_type(v)));
     119           4 :         assert_se(json_variant_equal(v, w));
     120             : 
     121           4 :         s = mfree(s);
     122           4 :         r = json_variant_format(v, JSON_FORMAT_COLOR, &s);
     123           4 :         assert_se(r >= 0);
     124           4 :         assert_se(s);
     125           4 :         assert_se((size_t) r == strlen(s));
     126           4 :         printf("Normal with color: %s\n", s);
     127             : 
     128           4 :         s = mfree(s);
     129           4 :         r = json_variant_format(v, JSON_FORMAT_COLOR|JSON_FORMAT_PRETTY, &s);
     130           4 :         assert_se(r >= 0);
     131           4 :         assert_se(s);
     132           4 :         assert_se((size_t) r == strlen(s));
     133           4 :         printf("Pretty with color:\n%s\n", s);
     134             : 
     135           4 :         if (test)
     136           3 :                 test(v);
     137           4 : }
     138             : 
     139           1 : static void test_1(JsonVariant *v) {
     140             :         JsonVariant *p, *q;
     141             :         unsigned i;
     142             : 
     143             :         /* 3 keys + 3 values */
     144           1 :         assert_se(json_variant_elements(v) == 6);
     145             : 
     146             :         /* has k */
     147           1 :         p = json_variant_by_key(v, "k");
     148           1 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_STRING);
     149             : 
     150             :         /* k equals v */
     151           1 :         assert_se(streq(json_variant_string(p), "v"));
     152             : 
     153             :         /* has foo */
     154           1 :         p = json_variant_by_key(v, "foo");
     155           1 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_ARRAY && json_variant_elements(p) == 3);
     156             : 
     157             :         /* check  foo[0] = 1, foo[1] = 2, foo[2] = 3 */
     158           4 :         for (i = 0; i < 3; ++i) {
     159           3 :                 q = json_variant_by_index(p, i);
     160           3 :                 assert_se(q && json_variant_type(q) == JSON_VARIANT_UNSIGNED && json_variant_unsigned(q) == (i+1));
     161           3 :                 assert_se(q && json_variant_has_type(q, JSON_VARIANT_INTEGER) && json_variant_integer(q) == (i+1));
     162             :         }
     163             : 
     164             :         /* has bar */
     165           1 :         p = json_variant_by_key(v, "bar");
     166           1 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_OBJECT && json_variant_elements(p) == 2);
     167             : 
     168             :         /* zap is null */
     169           1 :         q = json_variant_by_key(p, "zap");
     170           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_NULL);
     171           1 : }
     172             : 
     173           1 : static void test_2(JsonVariant *v) {
     174             :         JsonVariant *p, *q;
     175             : 
     176             :         /* 2 keys + 2 values */
     177           1 :         assert_se(json_variant_elements(v) == 4);
     178             : 
     179             :         /* has mutant */
     180           1 :         p = json_variant_by_key(v, "mutant");
     181           1 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_ARRAY && json_variant_elements(p) == 4);
     182             : 
     183             :         /* mutant[0] == 1 */
     184           1 :         q = json_variant_by_index(p, 0);
     185           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_UNSIGNED && json_variant_unsigned(q) == 1);
     186           1 :         assert_se(q && json_variant_has_type(q, JSON_VARIANT_INTEGER) && json_variant_integer(q) == 1);
     187             : 
     188             :         /* mutant[1] == null */
     189           1 :         q = json_variant_by_index(p, 1);
     190           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_NULL);
     191             : 
     192             :         /* mutant[2] == "1" */
     193           1 :         q = json_variant_by_index(p, 2);
     194           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
     195             : 
     196             :         /* mutant[3] == JSON_VARIANT_OBJECT */
     197           1 :         q = json_variant_by_index(p, 3);
     198           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_OBJECT && json_variant_elements(q) == 2);
     199             : 
     200             :         /* has 1 */
     201           1 :         p = json_variant_by_key(q, "1");
     202           1 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_ARRAY && json_variant_elements(p) == 2);
     203             : 
     204             :         /* "1"[0] == 1 */
     205           1 :         q = json_variant_by_index(p, 0);
     206           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_UNSIGNED && json_variant_unsigned(q) == 1);
     207           1 :         assert_se(q && json_variant_has_type(q, JSON_VARIANT_INTEGER) && json_variant_integer(q) == 1);
     208             : 
     209             :         /* "1"[1] == "1" */
     210           1 :         q = json_variant_by_index(p, 1);
     211           1 :         assert_se(q && json_variant_type(q) == JSON_VARIANT_STRING && streq(json_variant_string(q), "1"));
     212             : 
     213             :         /* has thisisaverylongproperty */
     214           1 :         p = json_variant_by_key(v, "thisisaverylongproperty");
     215           1 :         assert_se(p && json_variant_type(p) == JSON_VARIANT_REAL && fabsl(json_variant_real(p) - 1.27) < 0.001);
     216           1 : }
     217             : 
     218           1 : static void test_zeroes(JsonVariant *v) {
     219             :         size_t i;
     220             : 
     221             :         /* Make sure zero is how we expect it. */
     222             : 
     223           1 :         assert_se(json_variant_elements(v) == 13);
     224             : 
     225          14 :         for (i = 0; i < json_variant_elements(v); i++) {
     226             :                 JsonVariant *w;
     227             :                 size_t j;
     228             : 
     229          13 :                 assert_se(w = json_variant_by_index(v, i));
     230             : 
     231          13 :                 assert_se(json_variant_integer(w) == 0);
     232          13 :                 assert_se(json_variant_unsigned(w) == 0U);
     233             : 
     234             : #pragma GCC diagnostic push
     235             : #pragma GCC diagnostic ignored "-Wfloat-equal"
     236          13 :                 assert_se(json_variant_real(w) == 0.0L);
     237             : #pragma GCC diagnostic pop
     238             : 
     239          13 :                 assert_se(json_variant_is_integer(w));
     240          13 :                 assert_se(json_variant_is_unsigned(w));
     241          13 :                 assert_se(json_variant_is_real(w));
     242          13 :                 assert_se(json_variant_is_number(w));
     243             : 
     244          13 :                 assert_se(!json_variant_is_negative(w));
     245             : 
     246          13 :                 assert_se(IN_SET(json_variant_type(w), JSON_VARIANT_INTEGER, JSON_VARIANT_UNSIGNED, JSON_VARIANT_REAL));
     247             : 
     248         182 :                 for (j = 0; j < json_variant_elements(v); j++) {
     249             :                         JsonVariant *q;
     250             : 
     251         169 :                         assert_se(q = json_variant_by_index(v, j));
     252             : 
     253         169 :                         assert_se(json_variant_equal(w, q));
     254             :                 }
     255             :         }
     256           1 : }
     257             : 
     258           1 : static void test_build(void) {
     259           1 :         _cleanup_(json_variant_unrefp) JsonVariant *a = NULL, *b = NULL;
     260           1 :         _cleanup_free_ char *s = NULL, *t = NULL;
     261             : 
     262           1 :         assert_se(json_build(&a, JSON_BUILD_STRING("hallo")) >= 0);
     263           1 :         assert_se(json_build(&b, JSON_BUILD_LITERAL(" \"hallo\"   ")) >= 0);
     264           1 :         assert_se(json_variant_equal(a, b));
     265             : 
     266           1 :         b = json_variant_unref(b);
     267             : 
     268           1 :         assert_se(json_build(&b, JSON_BUILD_VARIANT(a)) >= 0);
     269           1 :         assert_se(json_variant_equal(a, b));
     270             : 
     271           1 :         b = json_variant_unref(b);
     272           1 :         assert_se(json_build(&b, JSON_BUILD_STRING("pief")) >= 0);
     273           1 :         assert_se(!json_variant_equal(a, b));
     274             : 
     275           1 :         a = json_variant_unref(a);
     276           1 :         b = json_variant_unref(b);
     277             : 
     278           1 :         assert_se(json_build(&a, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("one", JSON_BUILD_INTEGER(7)),
     279             :                                                    JSON_BUILD_PAIR("two", JSON_BUILD_REAL(2.0)),
     280             :                                                    JSON_BUILD_PAIR("three", JSON_BUILD_INTEGER(0)))) >= 0);
     281             : 
     282           1 :         assert_se(json_build(&b, JSON_BUILD_OBJECT(JSON_BUILD_PAIR("two", JSON_BUILD_INTEGER(2)),
     283             :                                                    JSON_BUILD_PAIR("three", JSON_BUILD_REAL(0)),
     284             :                                                    JSON_BUILD_PAIR("one", JSON_BUILD_REAL(7)))) >= 0);
     285             : 
     286           1 :         assert_se(json_variant_equal(a, b));
     287             : 
     288           1 :         a = json_variant_unref(a);
     289           1 :         b = json_variant_unref(b);
     290             : 
     291           1 :         const char* arr_1234[] = {"one", "two", "three", "four", NULL};
     292           1 :         assert_se(json_build(&a, JSON_BUILD_ARRAY(JSON_BUILD_OBJECT(JSON_BUILD_PAIR("x", JSON_BUILD_BOOLEAN(true)),
     293             :                                                                     JSON_BUILD_PAIR("y", JSON_BUILD_OBJECT(JSON_BUILD_PAIR("this", JSON_BUILD_NULL)))),
     294             :                                                   JSON_BUILD_VARIANT(NULL),
     295             :                                                   JSON_BUILD_LITERAL(NULL),
     296             :                                                   JSON_BUILD_STRING(NULL),
     297             :                                                   JSON_BUILD_NULL,
     298             :                                                   JSON_BUILD_INTEGER(77),
     299             :                                                   JSON_BUILD_ARRAY(JSON_BUILD_VARIANT(JSON_VARIANT_STRING_CONST("foobar")),
     300             :                                                                    JSON_BUILD_VARIANT(JSON_VARIANT_STRING_CONST("zzz"))),
     301             :                                                   JSON_BUILD_STRV((char**) arr_1234))) >= 0);
     302             : 
     303           1 :         assert_se(json_variant_format(a, 0, &s) >= 0);
     304           1 :         log_info("GOT: %s\n", s);
     305           1 :         assert_se(json_parse(s, &b, NULL, NULL) >= 0);
     306           1 :         assert_se(json_variant_equal(a, b));
     307             : 
     308           1 :         a = json_variant_unref(a);
     309           1 :         b = json_variant_unref(b);
     310             : 
     311           1 :         assert_se(json_build(&a, JSON_BUILD_REAL(M_PIl)) >= 0);
     312             : 
     313           1 :         s = mfree(s);
     314           1 :         assert_se(json_variant_format(a, 0, &s) >= 0);
     315           1 :         log_info("GOT: %s\n", s);
     316           1 :         assert_se(json_parse(s, &b, NULL, NULL) >= 0);
     317           1 :         assert_se(json_variant_format(b, 0, &t) >= 0);
     318           1 :         log_info("GOT: %s\n", t);
     319             : 
     320           1 :         assert_se(streq(s, t));
     321             : 
     322           1 :         a = json_variant_unref(a);
     323           1 :         b = json_variant_unref(b);
     324             : 
     325           1 :         assert_se(json_build(&a, JSON_BUILD_OBJECT(
     326             :                                              JSON_BUILD_PAIR("x", JSON_BUILD_STRING("y")),
     327             :                                              JSON_BUILD_PAIR("z", JSON_BUILD_STRING("a")),
     328             :                                              JSON_BUILD_PAIR("b", JSON_BUILD_STRING("c"))
     329             :                              )) >= 0);
     330             : 
     331           1 :         assert_se(json_build(&b, JSON_BUILD_OBJECT(
     332             :                                              JSON_BUILD_PAIR("x", JSON_BUILD_STRING("y")),
     333             :                                              JSON_BUILD_PAIR_CONDITION(false, "p", JSON_BUILD_STRING("q")),
     334             :                                              JSON_BUILD_PAIR_CONDITION(true, "z", JSON_BUILD_STRING("a")),
     335             :                                              JSON_BUILD_PAIR_CONDITION(false, "j", JSON_BUILD_ARRAY(JSON_BUILD_STRING("k"), JSON_BUILD_STRING("u"), JSON_BUILD_STRING("i"))),
     336             :                                              JSON_BUILD_PAIR("b", JSON_BUILD_STRING("c"))
     337             :                              )) >= 0);
     338             : 
     339           1 :         assert_se(json_variant_equal(a, b));
     340           1 : }
     341             : 
     342           1 : static void test_source(void) {
     343             :         static const char data[] =
     344             :                 "\n"
     345             :                 "\n"
     346             :                 "{\n"
     347             :                 "\"foo\" : \"bar\", \n"
     348             :                 "\"qüüx\" : [ 1, 2, 3,\n"
     349             :                 "4,\n"
     350             :                 "5 ],\n"
     351             :                 "\"miep\" : { \"hallo\" : 1 },\n"
     352             :                 "\n"
     353             :                 "\"zzzzzz\" \n"
     354             :                 ":\n"
     355             :                 "[ true, \n"
     356             :                 "false, 7.5, {} ]\n"
     357             :                 "}\n";
     358             : 
     359           1 :         _cleanup_fclose_ FILE *f = NULL;
     360           1 :         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
     361             : 
     362           1 :         printf("--- original begin ---\n"
     363             :                "%s"
     364             :                "--- original end ---\n", data);
     365             : 
     366           1 :         assert_se(f = fmemopen_unlocked((void*) data, strlen(data), "r"));
     367             : 
     368           1 :         assert_se(json_parse_file(f, "waldo", &v, NULL, NULL) >= 0);
     369             : 
     370           1 :         printf("--- non-pretty begin ---\n");
     371           1 :         json_variant_dump(v, 0, stdout, NULL);
     372           1 :         printf("\n--- non-pretty end ---\n");
     373             : 
     374           1 :         printf("--- pretty begin ---\n");
     375           1 :         json_variant_dump(v, JSON_FORMAT_PRETTY|JSON_FORMAT_COLOR|JSON_FORMAT_SOURCE, stdout, NULL);
     376           1 :         printf("--- pretty end ---\n");
     377           1 : }
     378             : 
     379           1 : static void test_depth(void) {
     380           2 :         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
     381             :         unsigned i;
     382             :         int r;
     383             : 
     384           1 :         v = JSON_VARIANT_STRING_CONST("start");
     385             : 
     386             :         /* Let's verify that the maximum depth checks work */
     387             : 
     388        4097 :         for (i = 0;; i++) {
     389        4097 :                 _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
     390             : 
     391        4097 :                 assert_se(i <= UINT16_MAX);
     392        4097 :                 if (i & 1)
     393        2048 :                         r = json_variant_new_array(&w, &v, 1);
     394             :                 else
     395        2049 :                         r = json_variant_new_object(&w, (JsonVariant*[]) { JSON_VARIANT_STRING_CONST("key"), v }, 2);
     396        4097 :                 if (r == -ELNRNG) {
     397           1 :                         log_info("max depth at %u", i);
     398           1 :                         break;
     399             :                 }
     400             : #if HAS_FEATURE_MEMORY_SANITIZER
     401             :                 /* msan doesn't like the stack nesting to be too deep. Let's quit early. */
     402             :                 if (i >= 128) {
     403             :                         log_info("quitting early at depth %u", i);
     404             :                         break;
     405             :                 }
     406             : #endif
     407             : 
     408        4096 :                 assert_se(r >= 0);
     409             : 
     410        4096 :                 json_variant_unref(v);
     411        4096 :                 v = TAKE_PTR(w);
     412             :         }
     413             : 
     414           1 :         json_variant_dump(v, 0, stdout, NULL);
     415           1 :         fputs("\n", stdout);
     416           1 : }
     417             : 
     418           1 : int main(int argc, char *argv[]) {
     419           1 :         test_setup_logging(LOG_DEBUG);
     420             : 
     421           1 :         test_tokenizer("x", -EINVAL);
     422           1 :         test_tokenizer("", JSON_TOKEN_END);
     423           1 :         test_tokenizer(" ", JSON_TOKEN_END);
     424           1 :         test_tokenizer("0", JSON_TOKEN_UNSIGNED, (uintmax_t) 0, JSON_TOKEN_END);
     425           1 :         test_tokenizer("-0", JSON_TOKEN_INTEGER, (intmax_t) 0, JSON_TOKEN_END);
     426           1 :         test_tokenizer("1234", JSON_TOKEN_UNSIGNED, (uintmax_t) 1234, JSON_TOKEN_END);
     427           1 :         test_tokenizer("-1234", JSON_TOKEN_INTEGER, (intmax_t) -1234, JSON_TOKEN_END);
     428           1 :         test_tokenizer("18446744073709551615", JSON_TOKEN_UNSIGNED, (uintmax_t) UINT64_MAX, JSON_TOKEN_END);
     429           1 :         test_tokenizer("-9223372036854775808", JSON_TOKEN_INTEGER, (intmax_t) INT64_MIN, JSON_TOKEN_END);
     430           1 :         test_tokenizer("18446744073709551616", JSON_TOKEN_REAL, (long double) 18446744073709551616.0L, JSON_TOKEN_END);
     431           1 :         test_tokenizer("-9223372036854775809", JSON_TOKEN_REAL, (long double) -9223372036854775809.0L, JSON_TOKEN_END);
     432           1 :         test_tokenizer("-1234", JSON_TOKEN_INTEGER, (intmax_t) -1234, JSON_TOKEN_END);
     433           1 :         test_tokenizer("3.141", JSON_TOKEN_REAL, (long double) 3.141, JSON_TOKEN_END);
     434           1 :         test_tokenizer("0.0", JSON_TOKEN_REAL, (long double) 0.0, JSON_TOKEN_END);
     435           1 :         test_tokenizer("7e3", JSON_TOKEN_REAL, (long double) 7e3, JSON_TOKEN_END);
     436           1 :         test_tokenizer("-7e-3", JSON_TOKEN_REAL, (long double) -7e-3, JSON_TOKEN_END);
     437           1 :         test_tokenizer("true", JSON_TOKEN_BOOLEAN, true, JSON_TOKEN_END);
     438           1 :         test_tokenizer("false", JSON_TOKEN_BOOLEAN, false, JSON_TOKEN_END);
     439           1 :         test_tokenizer("null", JSON_TOKEN_NULL, JSON_TOKEN_END);
     440           1 :         test_tokenizer("{}", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     441           1 :         test_tokenizer("\t {\n} \n", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     442           1 :         test_tokenizer("[]", JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_END);
     443           1 :         test_tokenizer("\t [] \n\n", JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_END);
     444           1 :         test_tokenizer("\"\"", JSON_TOKEN_STRING, "", JSON_TOKEN_END);
     445           1 :         test_tokenizer("\"foo\"", JSON_TOKEN_STRING, "foo", JSON_TOKEN_END);
     446           1 :         test_tokenizer("\"foo\\nfoo\"", JSON_TOKEN_STRING, "foo\nfoo", JSON_TOKEN_END);
     447           1 :         test_tokenizer("{\"foo\" : \"bar\"}", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_STRING, "foo", JSON_TOKEN_COLON, JSON_TOKEN_STRING, "bar", JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     448           1 :         test_tokenizer("{\"foo\" : [true, false]}", JSON_TOKEN_OBJECT_OPEN, JSON_TOKEN_STRING, "foo", JSON_TOKEN_COLON, JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_BOOLEAN, true, JSON_TOKEN_COMMA, JSON_TOKEN_BOOLEAN, false, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_OBJECT_CLOSE, JSON_TOKEN_END);
     449           1 :         test_tokenizer("\"\xef\xbf\xbd\"", JSON_TOKEN_STRING, "\xef\xbf\xbd", JSON_TOKEN_END);
     450           1 :         test_tokenizer("\"\\ufffd\"", JSON_TOKEN_STRING, "\xef\xbf\xbd", JSON_TOKEN_END);
     451           1 :         test_tokenizer("\"\\uf\"", -EINVAL);
     452           1 :         test_tokenizer("\"\\ud800a\"", -EINVAL);
     453           1 :         test_tokenizer("\"\\udc00\\udc00\"", -EINVAL);
     454           1 :         test_tokenizer("\"\\ud801\\udc37\"", JSON_TOKEN_STRING, "\xf0\x90\x90\xb7", JSON_TOKEN_END);
     455             : 
     456           1 :         test_tokenizer("[1, 2, -3]", JSON_TOKEN_ARRAY_OPEN, JSON_TOKEN_UNSIGNED, (uintmax_t) 1, JSON_TOKEN_COMMA, JSON_TOKEN_UNSIGNED, (uintmax_t) 2, JSON_TOKEN_COMMA, JSON_TOKEN_INTEGER, (intmax_t) -3, JSON_TOKEN_ARRAY_CLOSE, JSON_TOKEN_END);
     457             : 
     458           1 :         test_variant("{\"k\": \"v\", \"foo\": [1, 2, 3], \"bar\": {\"zap\": null}}", test_1);
     459           1 :         test_variant("{\"mutant\": [1, null, \"1\", {\"1\": [1, \"1\"]}], \"thisisaverylongproperty\": 1.27}", test_2);
     460           1 :         test_variant("{\"foo\" : \"\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFFFFF\\\"\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFF\\uDBFF\\uDFFFF\\uDBFF\\uDFFF\\uDBFF\\uDFFF\\uDBFF\\uDFFF\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFFFF\\\"\\uDBFF\\uDFFF\\\"\\uD9FF\\uDFFF\\uDBFF\\uDFFF\"}", NULL);
     461             : 
     462           1 :         test_variant("[ 0, -0, 0.0, -0.0, 0.000, -0.000, 0e0, -0e0, 0e+0, -0e-0, 0e-0, -0e000, 0e+000 ]", test_zeroes);
     463             : 
     464           1 :         test_build();
     465             : 
     466           1 :         test_source();
     467             : 
     468           1 :         test_depth();
     469             : 
     470           1 :         return 0;
     471             : }

Generated by: LCOV version 1.14