t / t0019-json-writer.shon commit general improvements (43abf13)
   1#!/bin/sh
   2
   3test_description='test json-writer JSON generation'
   4. ./test-lib.sh
   5
   6test_expect_success 'unit test of json-writer routines' '
   7        test-tool json-writer -u
   8'
   9
  10test_expect_success 'trivial object' '
  11        cat >expect <<-\EOF &&
  12        {}
  13        EOF
  14        cat >input <<-\EOF &&
  15        object
  16        end
  17        EOF
  18        test-tool json-writer <input >actual &&
  19        test_cmp expect actual
  20'
  21
  22test_expect_success 'trivial array' '
  23        cat >expect <<-\EOF &&
  24        []
  25        EOF
  26        cat >input <<-\EOF &&
  27        array
  28        end
  29        EOF
  30        test-tool json-writer <input >actual &&
  31        test_cmp expect actual
  32'
  33
  34test_expect_success 'simple object' '
  35        cat >expect <<-\EOF &&
  36        {"a":"abc","b":42,"c":3.14,"d":true,"e":false,"f":null}
  37        EOF
  38        cat >input <<-\EOF &&
  39        object
  40                object-string a abc
  41                object-int b 42
  42                object-double c 2 3.140
  43                object-true d
  44                object-false e
  45                object-null f
  46        end
  47        EOF
  48        test-tool json-writer <input >actual &&
  49        test_cmp expect actual
  50'
  51
  52test_expect_success 'simple array' '
  53        cat >expect <<-\EOF &&
  54        ["abc",42,3.14,true,false,null]
  55        EOF
  56        cat >input <<-\EOF &&
  57        array
  58                array-string abc
  59                array-int 42
  60                array-double 2 3.140
  61                array-true
  62                array-false
  63                array-null
  64        end
  65        EOF
  66        test-tool json-writer <input >actual &&
  67        test_cmp expect actual
  68'
  69
  70test_expect_success 'escape quoting string' '
  71        cat >expect <<-\EOF &&
  72        {"a":"abc\\def"}
  73        EOF
  74        cat >input <<-\EOF &&
  75        object
  76                object-string a abc\def
  77        end
  78        EOF
  79        test-tool json-writer <input >actual &&
  80        test_cmp expect actual
  81'
  82
  83test_expect_success 'escape quoting string 2' '
  84        cat >expect <<-\EOF &&
  85        {"a":"abc\"def"}
  86        EOF
  87        cat >input <<-\EOF &&
  88        object
  89                object-string a abc"def
  90        end
  91        EOF
  92        test-tool json-writer <input >actual &&
  93        test_cmp expect actual
  94'
  95
  96test_expect_success 'nested inline object' '
  97        cat >expect <<-\EOF &&
  98        {"a":"abc","b":42,"sub1":{"c":3.14,"d":true,"sub2":{"e":false,"f":null}}}
  99        EOF
 100        cat >input <<-\EOF &&
 101        object
 102                object-string a abc
 103                object-int b 42
 104                object-object sub1
 105                        object-double c 2 3.140
 106                        object-true d
 107                        object-object sub2
 108                                object-false e
 109                                object-null f
 110                        end
 111                end
 112        end
 113        EOF
 114        test-tool json-writer <input >actual &&
 115        test_cmp expect actual
 116'
 117
 118test_expect_success 'nested inline array' '
 119        cat >expect <<-\EOF &&
 120        ["abc",42,[3.14,true,[false,null]]]
 121        EOF
 122        cat >input <<-\EOF &&
 123        array
 124                array-string abc
 125                array-int 42
 126                array-array
 127                        array-double 2 3.140
 128                        array-true
 129                        array-array
 130                                array-false
 131                                array-null
 132                        end
 133                end
 134        end
 135        EOF
 136        test-tool json-writer <input >actual &&
 137        test_cmp expect actual
 138'
 139
 140test_expect_success 'nested inline object and array' '
 141        cat >expect <<-\EOF &&
 142        {"a":"abc","b":42,"sub1":{"c":3.14,"d":true,"sub2":[false,null]}}
 143        EOF
 144        cat >input <<-\EOF &&
 145        object
 146                object-string a abc
 147                object-int b 42
 148                object-object sub1
 149                        object-double c 2 3.140
 150                        object-true d
 151                        object-array sub2
 152                                array-false
 153                                array-null
 154                        end
 155                end
 156        end
 157        EOF
 158        test-tool json-writer <input >actual &&
 159        test_cmp expect actual
 160'
 161
 162test_expect_success 'nested inline object and array 2' '
 163        cat >expect <<-\EOF &&
 164        {"a":"abc","b":42,"sub1":{"c":3.14,"d":true,"sub2":[false,{"g":0,"h":1},null]}}
 165        EOF
 166        cat >input <<-\EOF &&
 167        object
 168                object-string a abc
 169                object-int b 42
 170                object-object sub1
 171                        object-double c 2 3.140
 172                        object-true d
 173                        object-array sub2
 174                                array-false
 175                                array-object
 176                                        object-int g 0
 177                                        object-int h 1
 178                                end
 179                                array-null
 180                        end
 181                end
 182        end
 183        EOF
 184        test-tool json-writer <input >actual &&
 185        test_cmp expect actual
 186'
 187
 188test_expect_success 'pretty nested inline object and array 2' '
 189        sed -e "s/^|//" >expect <<-\EOF &&
 190        |{
 191        |  "a": "abc",
 192        |  "b": 42,
 193        |  "sub1": {
 194        |    "c": 3.14,
 195        |    "d": true,
 196        |    "sub2": [
 197        |      false,
 198        |      {
 199        |        "g": 0,
 200        |        "h": 1
 201        |      },
 202        |      null
 203        |    ]
 204        |  }
 205        |}
 206        EOF
 207        cat >input <<-\EOF &&
 208        object
 209                object-string a abc
 210                object-int b 42
 211                object-object sub1
 212                        object-double c 2 3.140
 213                        object-true d
 214                        object-array sub2
 215                                array-false
 216                                array-object
 217                                        object-int g 0
 218                                        object-int h 1
 219                                end
 220                                array-null
 221                        end
 222                end
 223        end
 224        EOF
 225        test-tool json-writer -p <input >actual &&
 226        test_cmp expect actual
 227'
 228
 229test_expect_success 'inline object with no members' '
 230        cat >expect <<-\EOF &&
 231        {"a":"abc","empty":{},"b":42}
 232        EOF
 233        cat >input <<-\EOF &&
 234        object
 235                object-string a abc
 236                object-object empty
 237                end
 238                object-int b 42
 239        end
 240        EOF
 241        test-tool json-writer <input >actual &&
 242        test_cmp expect actual
 243'
 244
 245test_expect_success 'inline array with no members' '
 246        cat >expect <<-\EOF &&
 247        {"a":"abc","empty":[],"b":42}
 248        EOF
 249        cat >input <<-\EOF &&
 250        object
 251                object-string a abc
 252                object-array empty
 253                end
 254                object-int b 42
 255        end
 256        EOF
 257        test-tool json-writer <input >actual &&
 258        test_cmp expect actual
 259'
 260
 261test_expect_success 'larger empty example' '
 262        cat >expect <<-\EOF &&
 263        {"a":"abc","empty":[{},{},{},[],{}],"b":42}
 264        EOF
 265        cat >input <<-\EOF &&
 266        object
 267                object-string a abc
 268                object-array empty
 269                        array-object
 270                        end
 271                        array-object
 272                        end
 273                        array-object
 274                        end
 275                        array-array
 276                        end
 277                        array-object
 278                        end
 279                end
 280                object-int b 42
 281        end
 282        EOF
 283        test-tool json-writer <input >actual &&
 284        test_cmp expect actual
 285'
 286
 287test_lazy_prereq PERLJSON '
 288        perl -MJSON -e "exit 0"
 289'
 290
 291# As a sanity check, ask Perl to parse our generated JSON and recursively
 292# dump the resulting data in sorted order.  Confirm that that matches our
 293# expectations.
 294test_expect_success PERLJSON 'parse JSON using Perl' '
 295        cat >expect <<-\EOF &&
 296        row[0].a abc
 297        row[0].b 42
 298        row[0].sub1 hash
 299        row[0].sub1.c 3.14
 300        row[0].sub1.d 1
 301        row[0].sub1.sub2 array
 302        row[0].sub1.sub2[0] 0
 303        row[0].sub1.sub2[1] hash
 304        row[0].sub1.sub2[1].g 0
 305        row[0].sub1.sub2[1].h 1
 306        row[0].sub1.sub2[2] null
 307        EOF
 308        cat >input <<-\EOF &&
 309        object
 310                object-string a abc
 311                object-int b 42
 312                object-object sub1
 313                        object-double c 2 3.140
 314                        object-true d
 315                        object-array sub2
 316                                array-false
 317                                array-object
 318                                        object-int g 0
 319                                        object-int h 1
 320                                end
 321                                array-null
 322                        end
 323                end
 324        end
 325        EOF
 326        test-tool json-writer <input >output.json &&
 327        perl "$TEST_DIRECTORY"/t0019/parse_json.perl <output.json >actual &&
 328        test_cmp expect actual
 329'
 330
 331test_done