#!/bin/sh test_description='test json-writer JSON generation' . ./test-lib.sh test_expect_success 'unit test of json-writer routines' ' test-tool json-writer -u ' test_expect_success 'trivial object' ' cat >expect <<-\EOF && {} EOF cat >input <<-\EOF && object end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'trivial array' ' cat >expect <<-\EOF && [] EOF cat >input <<-\EOF && array end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'simple object' ' cat >expect <<-\EOF && {"a":"abc","b":42,"c":3.14,"d":true,"e":false,"f":null} EOF cat >input <<-\EOF && object object-string a abc object-int b 42 object-double c 2 3.140 object-true d object-false e object-null f end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'simple array' ' cat >expect <<-\EOF && ["abc",42,3.14,true,false,null] EOF cat >input <<-\EOF && array array-string abc array-int 42 array-double 2 3.140 array-true array-false array-null end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'escape quoting string' ' cat >expect <<-\EOF && {"a":"abc\\def"} EOF cat >input <<-\EOF && object object-string a abc\def end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'escape quoting string 2' ' cat >expect <<-\EOF && {"a":"abc\"def"} EOF cat >input <<-\EOF && object object-string a abc"def end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'nested inline object' ' cat >expect <<-\EOF && {"a":"abc","b":42,"sub1":{"c":3.14,"d":true,"sub2":{"e":false,"f":null}}} EOF cat >input <<-\EOF && object object-string a abc object-int b 42 object-object sub1 object-double c 2 3.140 object-true d object-object sub2 object-false e object-null f end end end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'nested inline array' ' cat >expect <<-\EOF && ["abc",42,[3.14,true,[false,null]]] EOF cat >input <<-\EOF && array array-string abc array-int 42 array-array array-double 2 3.140 array-true array-array array-false array-null end end end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'nested inline object and array' ' cat >expect <<-\EOF && {"a":"abc","b":42,"sub1":{"c":3.14,"d":true,"sub2":[false,null]}} EOF cat >input <<-\EOF && object object-string a abc object-int b 42 object-object sub1 object-double c 2 3.140 object-true d object-array sub2 array-false array-null end end end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'nested inline object and array 2' ' cat >expect <<-\EOF && {"a":"abc","b":42,"sub1":{"c":3.14,"d":true,"sub2":[false,{"g":0,"h":1},null]}} EOF cat >input <<-\EOF && object object-string a abc object-int b 42 object-object sub1 object-double c 2 3.140 object-true d object-array sub2 array-false array-object object-int g 0 object-int h 1 end array-null end end end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'pretty nested inline object and array 2' ' sed -e "s/^|//" >expect <<-\EOF && |{ | "a": "abc", | "b": 42, | "sub1": { | "c": 3.14, | "d": true, | "sub2": [ | false, | { | "g": 0, | "h": 1 | }, | null | ] | } |} EOF cat >input <<-\EOF && object object-string a abc object-int b 42 object-object sub1 object-double c 2 3.140 object-true d object-array sub2 array-false array-object object-int g 0 object-int h 1 end array-null end end end EOF test-tool json-writer -p actual && test_cmp expect actual ' test_expect_success 'inline object with no members' ' cat >expect <<-\EOF && {"a":"abc","empty":{},"b":42} EOF cat >input <<-\EOF && object object-string a abc object-object empty end object-int b 42 end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'inline array with no members' ' cat >expect <<-\EOF && {"a":"abc","empty":[],"b":42} EOF cat >input <<-\EOF && object object-string a abc object-array empty end object-int b 42 end EOF test-tool json-writer actual && test_cmp expect actual ' test_expect_success 'larger empty example' ' cat >expect <<-\EOF && {"a":"abc","empty":[{},{},{},[],{}],"b":42} EOF cat >input <<-\EOF && object object-string a abc object-array empty array-object end array-object end array-object end array-array end array-object end end object-int b 42 end EOF test-tool json-writer actual && test_cmp expect actual ' test_lazy_prereq PERLJSON ' perl -MJSON -e "exit 0" ' # As a sanity check, ask Perl to parse our generated JSON and recursively # dump the resulting data in sorted order. Confirm that that matches our # expectations. test_expect_success PERLJSON 'parse JSON using Perl' ' cat >expect <<-\EOF && row[0].a abc row[0].b 42 row[0].sub1 hash row[0].sub1.c 3.14 row[0].sub1.d 1 row[0].sub1.sub2 array row[0].sub1.sub2[0] 0 row[0].sub1.sub2[1] hash row[0].sub1.sub2[1].g 0 row[0].sub1.sub2[1].h 1 row[0].sub1.sub2[2] null EOF cat >input <<-\EOF && object object-string a abc object-int b 42 object-object sub1 object-double c 2 3.140 object-true d object-array sub2 array-false array-object object-int g 0 object-int h 1 end array-null end end end EOF test-tool json-writer output.json && perl "$TEST_DIRECTORY"/t0019/parse_json.perl actual && test_cmp expect actual ' test_done