]> mj.ucw.cz Git - libucw.git/commitdiff
JSON: More tests and bug fixes
authorMartin Mares <mj@ucw.cz>
Wed, 8 Jul 2015 17:55:35 +0000 (19:55 +0200)
committerMartin Mares <mj@ucw.cz>
Wed, 8 Jul 2015 17:55:35 +0000 (19:55 +0200)
ucw-json/format.c
ucw-json/json-test.t
ucw-json/parse.c

index 58526c84b2c470493bffda0d86818dd2742cc7a9..30f8757fd799199ad0c47ffd6c99c0de1018768d 100644 (file)
@@ -134,21 +134,24 @@ void json_write_value(struct json_context *js, struct json_node *n)
       {
        if (!GARY_SIZE(n->pairs))
          bputs(fb, "{}");
-       bputc(fb, '{');
-       js->out_indent++;
-       for (size_t i=0; i < GARY_SIZE(n->pairs); i++)
+       else
          {
-           if (i)
-             bputc(fb, ',');
+           bputc(fb, '{');
+           js->out_indent++;
+           for (size_t i=0; i < GARY_SIZE(n->pairs); i++)
+             {
+               if (i)
+                 bputc(fb, ',');
+               write_space(js);
+               struct json_pair *p = &n->pairs[i];
+               write_string(js, p->key);
+               bputs(fb, ": ");
+               json_write_value(js, p->value);
+             }
+           js->out_indent--;
            write_space(js);
-           struct json_pair *p = &n->pairs[i];
-           write_string(js, p->key);
-           bputs(fb, ": ");
-           json_write_value(js, p->value);
+           bputc(fb, '}');
          }
-       js->out_indent--;
-       write_space(js);
-       bputc(fb, '}');
        break;
       }
     default:
index 20aef1a90ec4de23c0667d57935bbd3ea4257617..cd6f5c7277453bca2b0dec2a68eff2bb9e27fe50 100644 (file)
@@ -1,14 +1,10 @@
 # Tests for the JSON library
 # (c) 2015 Martin Mares <mj@ucw.cz>
 
-Name:  Empty input
-Run:   ../obj/ucw-json/json-test -rw
-Exit:  1
-Err:   ERROR: Empty input at line 1:0
-
 ### Literals ###
 
 Name:  Null
+Run:   ../obj/ucw-json/json-test -rw
 In:    null
 Out:   null
 
@@ -275,3 +271,109 @@ In:       [
        ,false
        ]
 Out:   [ "a", null, false, false ]
+
+Name:  Unterminated array 1
+In:    [1,2
+Exit:  1
+Err:   ERROR: Comma or right bracket expected at line 2:0
+
+Name:  Unterminated array 2
+In:    [1,2,
+Exit:  1
+Err:   ERROR: Unterminated array at line 2:0
+
+Name:  Extra comma not allowed
+In:    [1,2,]
+Exit:  1
+Err:   ERROR: Misplaced end of array at line 1:6
+
+Name:  Solitary comma not allowed
+In:    ,
+Exit:  1
+Err:   ERROR: Misplaced comma at line 1:1
+
+Name:  Deeply nested array
+In:    [[[[[[[[[[]]]]]]]]]]
+Out:   [ [ [ [ [ [ [ [ [ [] ] ] ] ] ] ] ] ] ]
+
+Name:  Deeply unclosed array
+In:    [[[[[[[[[[]
+Exit:  1
+Err:   ERROR: Comma or right bracket expected at line 2:0
+
+Name:  Missing comma
+In:    [1 2]
+Exit:  1
+Err:   ERROR: Comma or right bracket expected at line 1:5
+
+### Objects ###
+
+Name:  Empty object
+In:    {}
+Out:   {}
+
+Name:  One-entry object
+In:    {"a":"b"}
+Out:   { "a": "b" }
+
+Name:  Two-entry object
+In:    {"a":1,"b":2}
+Out:   { "a": 1, "b": 2 }
+
+Name:  Nested objects
+In:    {
+               "a": [1,2],
+               "b": { "x": true, "y": false }
+       }
+Out:   { "a": [ 1, 2 ], "b": { "x": true, "y": false } }
+
+Name:  Unterminated object 1
+In:    {
+Exit:  1
+Err:   ERROR: Unterminated object at line 2:0
+
+Name:  Unterminated object 2
+In:    { "a"
+Exit:  1
+Err:   ERROR: Colon expected at line 2:0
+
+Name:  Unterminated object 3
+In:    { "a":
+Exit:  1
+Err:   ERROR: Unterminated object at line 2:0
+
+Name:  Unterminated object 4
+In:    { "a":1,
+Exit:  1
+Err:   ERROR: Unterminated object at line 2:0
+
+Name:  Extra comma not allowed in objects
+In:    { "a":1, }
+Exit:  1
+Err:   ERROR: Misplaced end of object at line 1:10
+
+Name:  Non-string key
+In:    {1:2}
+Exit:  1
+Err:   ERROR: Object key must be a string at line 1:3
+
+Name:  Repeated key
+In:    {"a":1, "a":2}
+Exit:  1
+Err:   ERROR: Key already set at line 1:14
+
+Name:  Missing object comma
+In:    {"a":1 "b":2}
+Exit:  1
+Err:   ERROR: Comma expected at line 1:10
+
+### Top-level problems ###
+
+Name:  Empty input
+Exit:  1
+Err:   ERROR: Empty input at line 1:0
+
+Name:  Multiple values
+In:    1 2
+Exit:  1
+Err:   ERROR: Only one top-level value allowed at line 1:4
index 765352b0acbb2ffae41551dc6d9c66431f955ca2..96c916f3c205fdac71738637ad89642013d5d943 100644 (file)
@@ -386,7 +386,7 @@ struct json_node *json_next_value(struct json_context *js)
            if (t->type == JSON_END_ARRAY)
              break;
            if (t->type != JSON_VALUE_SEP)
-             json_parse_error(js, "Comma expected");
+             json_parse_error(js, "Comma or right bracket expected");
          }
        return a;
       }