Commit a83b7b0611dfa0063e0c95a4b6722501feb99a17
1 parent
7f8c4b18
Tests with manually constructed qpdf json
Showing
6 changed files
with
481 additions
and
11 deletions
TODO
| ... | ... | @@ -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 | ||
| 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 | ... | ... |