Commit a83b7b0611dfa0063e0c95a4b6722501feb99a17

Authored by Jay Berkenbilt
1 parent 7f8c4b18

Tests with manually constructed qpdf json

... ... @@ -97,10 +97,6 @@ General things to remember:
97 97  
98 98 * Add json to the large file tests.
99 99  
100   -* Object representation tests
101   - * "b:cf80", "b:CF80", "u:π", "u:\u03c0"
102   - * "b:d83edd54", "u:🥔", "u:\ud83e\udd54"
103   -
104 100 JSON to PDF:
105 101  
106 102 Have --json-input and --update-from-json. With --json-input, the json
... ...
qpdf/qtest/qpdf-json.test
... ... @@ -67,30 +67,30 @@ foreach my $i (@goodfiles)
67 67 if (ref($i) eq 'ARRAY') {
68 68 ($f, $xargs) = @$i;
69 69 }
70   - $td->runtest("good: $f -> json",
  70 + $td->runtest("good: $f -> JSON",
71 71 {$td->COMMAND => "qpdf $xargs --decode-level=none" .
72 72 " --json-output=latest $f a.json"},
73 73 {$td->STRING => "", $td->EXIT_STATUS => 0},
74 74 $td->NORMALIZE_NEWLINES);
75   - $td->runtest("good: $f json -> json",
  75 + $td->runtest("good: $f JSON -> JSON",
76 76 {$td->COMMAND =>
77 77 "qpdf --decode-level=none" .
78 78 " --json-input --json-output=latest a.json b.json"},
79 79 {$td->STRING => "", $td->EXIT_STATUS => 0},
80 80 $td->NORMALIZE_NEWLINES);
81   - $td->runtest("good: $f json -> qdf",
  81 + $td->runtest("good: $f JSON -> QDF",
82 82 {$td->COMMAND =>
83 83 "qpdf --qdf --json-input --stream-data=preserve" .
84 84 " --static-id a.json a.pdf"},
85 85 {$td->STRING => "", $td->EXIT_STATUS => 0},
86 86 $td->NORMALIZE_NEWLINES);
87   - $td->runtest("good: $f compare json",
  87 + $td->runtest("good: $f compare JSON",
88 88 {$td->FILE => "a.json"},
89 89 {$td->FILE => "b.json"});
90 90 my $exp = "json-changed-$f";
91 91 if (! -f $exp)
92 92 {
93   - $td->runtest("good: $f -> qdf",
  93 + $td->runtest("good: $f -> aqdf",
94 94 {$td->COMMAND =>
95 95 "qpdf $xargs --object-streams=disable --qdf" .
96 96 " --stream-data=preserve --static-id $f b.pdf"},
... ... @@ -115,7 +115,34 @@ foreach my $i (@goodfiles)
115 115 {$td->FILE => $exp}); # from original PDF
116 116 }
117 117  
  118 +$n_tests += 6;
  119 +$td->runtest("manual JSON to PDF",
  120 + {$td->COMMAND => "qpdf --json-input --static-id --qdf" .
  121 + " manual-qpdf-json.json a.pdf"},
  122 + {$td->STRING => "", $td->EXIT_STATUS => 0},
  123 + $td->NORMALIZE_NEWLINES);
  124 +$td->runtest("check manual JSON to PDF",
  125 + {$td->FILE => "a.pdf"},
  126 + {$td->FILE => "manual-qpdf-json.pdf"});
  127 +$td->runtest("check manual JSON to PDF to JSON",
  128 + {$td->COMMAND => "qpdf --json-output=2 a.pdf -"},
  129 + {$td->FILE => "manual-qpdf-json-pdf.json", $td->EXIT_STATUS => 0},
  130 + $td->NORMALIZE_NEWLINES);
  131 +$td->runtest("manual JSON to JSON",
  132 + {$td->COMMAND => "qpdf --json-input --json-output=2" .
  133 + " manual-qpdf-json.json a.json"},
  134 + {$td->STRING => "", $td->EXIT_STATUS => 0},
  135 + $td->NORMALIZE_NEWLINES);
  136 +$td->runtest("check manual JSON to JSON",
  137 + {$td->FILE => "a.json"},
  138 + {$td->FILE => "manual-qpdf-json-out.json"},
  139 + $td->NORMALIZE_NEWLINES);
  140 +$td->runtest("check manual JSON to JSON to JSON",
  141 + {$td->COMMAND => "qpdf --json-output=2 --json-input a.json -"},
  142 + {$td->FILE => "a.json", $td->EXIT_STATUS => 0},
  143 + $td->NORMALIZE_NEWLINES);
118 144  
  145 +# QXXXQ file
119 146  
120 147 cleanup();
121 148 $td->report($n_tests);
... ...
qpdf/qtest/qpdf/manual-qpdf-json-out.json 0 → 100644
  1 +{
  2 + "qpdf-v2": {
  3 + "pdfversion": "2.0",
  4 + "maxobjectid": 8,
  5 + "objects": {
  6 + "obj:1 0 R": {
  7 + "value": {
  8 + "/Pages": "2 0 R",
  9 + "/Type": "/Catalog"
  10 + }
  11 + },
  12 + "obj:2 0 R": {
  13 + "value": {
  14 + "/Count": 1,
  15 + "/Kids": [
  16 + "3 0 R"
  17 + ],
  18 + "/Type": "/Pages"
  19 + }
  20 + },
  21 + "obj:3 0 R": {
  22 + "value": {
  23 + "/Contents": "4 0 R",
  24 + "/MediaBox": [
  25 + 0,
  26 + 0,
  27 + 612,
  28 + 792
  29 + ],
  30 + "/Parent": "2 0 R",
  31 + "/Resources": {
  32 + "/Font": {
  33 + "/F1": "6 0 R"
  34 + },
  35 + "/ProcSet": "5 0 R"
  36 + },
  37 + "/Type": "/Page"
  38 + }
  39 + },
  40 + "obj:4 0 R": {
  41 + "stream": {
  42 + "data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=",
  43 + "dict": {}
  44 + }
  45 + },
  46 + "obj:5 0 R": {
  47 + "value": [
  48 + "/PDF",
  49 + "/Text"
  50 + ]
  51 + },
  52 + "obj:6 0 R": {
  53 + "value": {
  54 + "/BaseFont": "/Helvetica",
  55 + "/Encoding": "/WinAnsiEncoding",
  56 + "/Name": "/F1",
  57 + "/Subtype": "/Type1",
  58 + "/Type": "/Font"
  59 + }
  60 + },
  61 + "obj:7 0 R": {
  62 + "value": {
  63 + "/hex strings": [
  64 + "u:Potato",
  65 + "b:01020300040560",
  66 + "u:AB"
  67 + ],
  68 + "/indirect": "8 0 R",
  69 + "/names": [
  70 + "/nesting",
  71 + "/hex strings",
  72 + "/text/plain"
  73 + ],
  74 + "/nesting": {
  75 + "/a": [
  76 + 1,
  77 + 2,
  78 + {
  79 + "/x": "u:y"
  80 + },
  81 + [
  82 + "u:z"
  83 + ]
  84 + ],
  85 + "/b": {
  86 + "/": "u:legal",
  87 + "/a": [
  88 + 1,
  89 + 2
  90 + ]
  91 + }
  92 + },
  93 + "/strings": [
  94 + "u:one",
  95 + "b:24a2",
  96 + "u:",
  97 + "u:()",
  98 + "u:(",
  99 + "u:)",
  100 + "u:a\f\b\t\r\nb",
  101 + "u:\"",
  102 + "u:\"\"",
  103 + "u:\"(\")\"",
  104 + "b:410042",
  105 + "u:a\nb",
  106 + "u:a b",
  107 + [
  108 + "u:π",
  109 + "u:π",
  110 + "u:π",
  111 + "u:π"
  112 + ],
  113 + [
  114 + "u:🥔",
  115 + "u:🥔",
  116 + "u:🥔"
  117 + ]
  118 + ]
  119 + }
  120 + },
  121 + "obj:8 0 R": {
  122 + "value": "u:hello"
  123 + },
  124 + "trailer": {
  125 + "value": {
  126 + "/QTest": "7 0 R",
  127 + "/Root": "1 0 R",
  128 + "/Size": 9
  129 + }
  130 + }
  131 + }
  132 + }
  133 +}
... ...
qpdf/qtest/qpdf/manual-qpdf-json-pdf.json 0 → 100644
  1 +{
  2 + "qpdf-v2": {
  3 + "pdfversion": "2.0",
  4 + "maxobjectid": 9,
  5 + "objects": {
  6 + "obj:1 0 R": {
  7 + "value": {
  8 + "/Pages": "3 0 R",
  9 + "/Type": "/Catalog"
  10 + }
  11 + },
  12 + "obj:2 0 R": {
  13 + "value": {
  14 + "/hex strings": [
  15 + "u:Potato",
  16 + "b:01020300040560",
  17 + "u:AB"
  18 + ],
  19 + "/indirect": "4 0 R",
  20 + "/names": [
  21 + "/nesting",
  22 + "/hex strings",
  23 + "/text/plain"
  24 + ],
  25 + "/nesting": {
  26 + "/a": [
  27 + 1,
  28 + 2,
  29 + {
  30 + "/x": "u:y"
  31 + },
  32 + [
  33 + "u:z"
  34 + ]
  35 + ],
  36 + "/b": {
  37 + "/": "u:legal",
  38 + "/a": [
  39 + 1,
  40 + 2
  41 + ]
  42 + }
  43 + },
  44 + "/strings": [
  45 + "u:one",
  46 + "b:24a2",
  47 + "u:",
  48 + "u:()",
  49 + "u:(",
  50 + "u:)",
  51 + "u:a\f\b\t\r\nb",
  52 + "u:\"",
  53 + "u:\"\"",
  54 + "u:\"(\")\"",
  55 + "b:410042",
  56 + "u:a\nb",
  57 + "u:a b",
  58 + [
  59 + "u:π",
  60 + "u:π",
  61 + "u:π",
  62 + "u:π"
  63 + ],
  64 + [
  65 + "u:🥔",
  66 + "u:🥔",
  67 + "u:🥔"
  68 + ]
  69 + ]
  70 + }
  71 + },
  72 + "obj:3 0 R": {
  73 + "value": {
  74 + "/Count": 1,
  75 + "/Kids": [
  76 + "5 0 R"
  77 + ],
  78 + "/Type": "/Pages"
  79 + }
  80 + },
  81 + "obj:4 0 R": {
  82 + "value": "u:hello"
  83 + },
  84 + "obj:5 0 R": {
  85 + "value": {
  86 + "/Contents": "6 0 R",
  87 + "/MediaBox": [
  88 + 0,
  89 + 0,
  90 + 612,
  91 + 792
  92 + ],
  93 + "/Parent": "3 0 R",
  94 + "/Resources": {
  95 + "/Font": {
  96 + "/F1": "8 0 R"
  97 + },
  98 + "/ProcSet": "9 0 R"
  99 + },
  100 + "/Type": "/Page"
  101 + }
  102 + },
  103 + "obj:6 0 R": {
  104 + "stream": {
  105 + "data": "QlQKICAvRjEgMjQgVGYKICA3MiA3MjAgVGQKICAoUG90YXRvKSBUagpFVAo=",
  106 + "dict": {}
  107 + }
  108 + },
  109 + "obj:7 0 R": {
  110 + "value": 44
  111 + },
  112 + "obj:8 0 R": {
  113 + "value": {
  114 + "/BaseFont": "/Helvetica",
  115 + "/Encoding": "/WinAnsiEncoding",
  116 + "/Name": "/F1",
  117 + "/Subtype": "/Type1",
  118 + "/Type": "/Font"
  119 + }
  120 + },
  121 + "obj:9 0 R": {
  122 + "value": [
  123 + "/PDF",
  124 + "/Text"
  125 + ]
  126 + },
  127 + "trailer": {
  128 + "value": {
  129 + "/ID": [
  130 + "b:31415926535897932384626433832795",
  131 + "b:31415926535897932384626433832795"
  132 + ],
  133 + "/QTest": "2 0 R",
  134 + "/Root": "1 0 R",
  135 + "/Size": 10
  136 + }
  137 + }
  138 + }
  139 + }
  140 +}
... ...
qpdf/qtest/qpdf/manual-qpdf-json.json
... ... @@ -104,11 +104,14 @@
104 104 "u:(",
105 105 "u:)",
106 106 "u:a\f\b\t\r\nb",
  107 + "u:\"",
  108 + "u:\"\"",
  109 + "u:\"(\")\"",
107 110 "b:410042",
108 111 "u:a\nb",
109 112 "u:a b",
110   - "u:π",
111   - "u:🥔"
  113 + ["u:π", "u:\u03c0", "b:EFBBBFCF80", "b:feff03c0"],
  114 + ["u:🥔", "u:\ud83e\udd54", "b:feffd83eDD54"]
112 115 ]
113 116 }
114 117 },
... ...
qpdf/qtest/qpdf/manual-qpdf-json.pdf 0 → 100644
  1 +%PDF-2.0
  2 +%¿÷¢þ
  3 +%QDF-1.0
  4 +
  5 +%% Original object ID: 1 0
  6 +1 0 obj
  7 +<<
  8 + /Pages 3 0 R
  9 + /Type /Catalog
  10 +>>
  11 +endobj
  12 +
  13 +%% Original object ID: 7 0
  14 +2 0 obj
  15 +<<
  16 + /hex#20strings [
  17 + (Potato)
  18 + <01020300040560>
  19 + (AB)
  20 + ]
  21 + /indirect 4 0 R
  22 + /names [
  23 + /nesting
  24 + /hex#20strings
  25 + /text#2fplain
  26 + ]
  27 + /nesting <<
  28 + /a [
  29 + 1
  30 + 2
  31 + <<
  32 + /x (y)
  33 + >>
  34 + [
  35 + (z)
  36 + ]
  37 + ]
  38 + /b <<
  39 + / (legal)
  40 + /a [
  41 + 1
  42 + 2
  43 + ]
  44 + >>
  45 + >>
  46 + /strings [
  47 + (one)
  48 + <24a2>
  49 + ()
  50 + (\(\))
  51 + (\()
  52 + (\))
  53 + (a\f\b\t\r\nb)
  54 + (")
  55 + ("")
  56 + ("\("\)")
  57 + <410042>
  58 + (a\nb)
  59 + (a b)
  60 + [
  61 + <feff03c0>
  62 + <feff03c0>
  63 + <efbbbfcf80>
  64 + <feff03c0>
  65 + ]
  66 + [
  67 + <feffd83edd54>
  68 + <feffd83edd54>
  69 + <feffd83edd54>
  70 + ]
  71 + ]
  72 +>>
  73 +endobj
  74 +
  75 +%% Original object ID: 2 0
  76 +3 0 obj
  77 +<<
  78 + /Count 1
  79 + /Kids [
  80 + 5 0 R
  81 + ]
  82 + /Type /Pages
  83 +>>
  84 +endobj
  85 +
  86 +%% Original object ID: 8 0
  87 +4 0 obj
  88 +(hello)
  89 +endobj
  90 +
  91 +%% Page 1
  92 +%% Original object ID: 3 0
  93 +5 0 obj
  94 +<<
  95 + /Contents 6 0 R
  96 + /MediaBox [
  97 + 0
  98 + 0
  99 + 612
  100 + 792
  101 + ]
  102 + /Parent 3 0 R
  103 + /Resources <<
  104 + /Font <<
  105 + /F1 8 0 R
  106 + >>
  107 + /ProcSet 9 0 R
  108 + >>
  109 + /Type /Page
  110 +>>
  111 +endobj
  112 +
  113 +%% Contents for page 1
  114 +%% Original object ID: 4 0
  115 +6 0 obj
  116 +<<
  117 + /Length 7 0 R
  118 +>>
  119 +stream
  120 +BT
  121 + /F1 24 Tf
  122 + 72 720 Td
  123 + (Potato) Tj
  124 +ET
  125 +endstream
  126 +endobj
  127 +
  128 +7 0 obj
  129 +44
  130 +endobj
  131 +
  132 +%% Original object ID: 6 0
  133 +8 0 obj
  134 +<<
  135 + /BaseFont /Helvetica
  136 + /Encoding /WinAnsiEncoding
  137 + /Name /F1
  138 + /Subtype /Type1
  139 + /Type /Font
  140 +>>
  141 +endobj
  142 +
  143 +%% Original object ID: 5 0
  144 +9 0 obj
  145 +[
  146 + /PDF
  147 + /Text
  148 +]
  149 +endobj
  150 +
  151 +xref
  152 +0 10
  153 +0000000000 65535 f
  154 +0000000052 00000 n
  155 +0000000133 00000 n
  156 +0000000829 00000 n
  157 +0000000928 00000 n
  158 +0000000989 00000 n
  159 +0000001231 00000 n
  160 +0000001330 00000 n
  161 +0000001376 00000 n
  162 +0000001521 00000 n
  163 +trailer <<
  164 + /QTest 2 0 R
  165 + /Root 1 0 R
  166 + /Size 10
  167 + /ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
  168 +>>
  169 +startxref
  170 +1556
  171 +%%EOF
... ...