1 {{header}} 2 {{object 1 0}} << 3 /Type /Catalog 4 /Pages 2 0 R 5 /OpenAction 10 0 R 6 >> 7 endobj 8 {{object 2 0}} << 9 /Type /Pages 10 /Count 4 11 /Kids [ 12 3 0 R 13 4 0 R 14 5 0 R 15 6 0 R 16 ] 17 >> 18 endobj 19 % Page number 0. 20 {{object 3 0}} << 21 /Type /Page 22 /Parent 2 0 R 23 /Resources << 24 /Font <</F1 15 0 R>> 25 >> 26 /MediaBox [0 0 612 792] 27 /Contents 8 0 R 28 >> 29 % Page number 1. 30 {{object 4 0}} << 31 /Type /Page 32 /Parent 2 0 R 33 /Resources << 34 /Font <</F1 15 0 R>> 35 >> 36 /MediaBox [0 0 612 792] 37 >> 38 % Page number 2. 39 {{object 5 0}} << 40 /Type /Page 41 /Parent 2 0 R 42 /Resources << 43 /Font <</F1 15 0 R>> 44 >> 45 /MediaBox [0 0 612 792] 46 >> 47 % Page number 3. 48 {{object 6 0}} << 49 /Type /Page 50 /Parent 2 0 R 51 /Resources << 52 /Font <</F1 15 0 R>> 53 >> 54 /MediaBox [0 0 612 792] 55 >> 56 % Contents of the page. 57 {{object 8 0}} << 58 >> 59 stream 60 BT 61 20 50 Td 62 /F1 12 Tf 63 (Hello, world!) Tj 64 0 50 Td 65 endstream 66 endobj 67 % Info 68 {{object 9 0}} << 69 /Author (Joe Random Author) 70 /Creator (Joe Random Creator) 71 >> 72 endobj 73 % OpenAction action 74 {{object 10 0}} << 75 /Type /Action 76 /S /JavaScript 77 /JS 11 0 R 78 >> 79 endobj 80 % JS program to exexute 81 {{object 11 0}} << 82 >> 83 stream 84 function expect(str, expected) { 85 try { 86 var result = eval(str); 87 if (result == expected) { 88 app.alert('PASS: ' + str + ' = ' + result); 89 } else { 90 app.alert('FAIL: ' + str + ' = ' + result + ', expected = ' + expected); 91 } 92 } catch (e) { 93 app.alert('ERROR: ' + e.toString()); 94 } 95 } 96 97 function expectError(str) { 98 try { 99 var result = eval(str); 100 app.alert('FAIL: ' + str + ' = ' + result + ', expected to throw error'); 101 } catch (e) { 102 app.alert('PASS: ' + str + ' threw error ' + e.toString()); 103 } 104 } 105 106 // "Unsupported" methods are present in the document object, but not 107 // implemented. They always return |undefined| regardless of arguments. 108 function testUnsupported(str) { 109 expect('typeof ' + str, 'function'); 110 expect(str + '()', undefined); 111 expect(str + '(1, 2, "clams", [1, 2, 3])', undefined); 112 } 113 114 function testAddIcon() { 115 // Method is present. 116 expect('typeof this.addIcon', 'function'); 117 118 // Method takes exactly two arguments. 119 expectError('this.addIcon()'); 120 expectError('this.addIcon(1)'); 121 expectError('this.addIcon(1, 2, 3)'); 122 123 // Second argument must actually be an icon. 124 expectError('this.addIcon("myicon", 3)'); 125 expectError('this.addIcon("myicon", undefined)'); 126 127 // TODO(tsepez): test success cases. 128 } 129 130 function testCalculateNow() { 131 // Method is present. 132 expect('typeof this.calculateNow', 'function'); 133 134 // TODO(tsepez): test with no permissions. 135 // TODO(tsepez): test success cases. 136 } 137 138 function testGetAnnot() { 139 // Method is present. 140 expect('typeof this.getAnnot', 'function'); 141 142 // Method needs two arguments. 143 expectError('this.getAnnot()'); 144 expectError('this.getAnnot(0)'); 145 expectError('this.getAnnot(0, "test", 0)'); 146 147 // TODO(tonikitoo): test success cases. 148 } 149 150 function testGetAnnots() { 151 // Method is present. 152 expect('typeof this.getAnnots', 'function'); 153 154 // TODO(tonikitoo): test success cases. 155 } 156 157 function testGetField() { 158 // Method is present. 159 expect('typeof this.getField', 'function'); 160 161 // Method needs at least one argument. 162 expectError('this.getField()'); 163 164 // TODO(tsepez): test success cases. 165 } 166 167 function testGetIcon() { 168 // Method is present. 169 expect('typeof this.getIcon', 'function'); 170 171 // Method needs exactly one argument. 172 expectError('this.getIcon()'); 173 expectError('this.getIcon(1, 2)'); 174 175 // TODO(tsepez): test success cases. 176 } 177 178 function testGetNthFieldName() { 179 // Method is present. 180 expect('typeof this.getNthFieldName', 'function'); 181 182 // Method needs at least one argument. 183 expectError('this.getNthFieldName()'); 184 185 // Argument can not be negative. 186 expectError('this.getNthFieldName(-1)'); 187 188 // TODO(tsepez): test success cases. 189 } 190 191 function testGetPageNthWord() { 192 // Method is present. 193 expect('typeof this.getPageNthWord', 'function'); 194 195 // Method accepts any number of parameters. 196 expect('this.getPageNthWord(0, 0, true, "clams", [1, 2])', 'Hello,'); 197 198 // Arguments can't be negative or out of range. 199 expectError('this.getPageNthWord(-1, 0, true)'); 200 expectError('this.getPageNthWord(6, 0, true)'); 201 202 // TODO(tsepez): test with no permissions. 203 // TODO(tsepez): test success cases. 204 } 205 206 function testGetPageNthWordQuads() { 207 // Method is present. 208 expect('typeof this.getPageNthWordQuads', 'function'); 209 210 // TODO(tsepez): test with no permissions. 211 // TODO(tsepez): test success cases. 212 } 213 214 function testGetPageNumWords() { 215 // Method is present. 216 expect('typeof this.getPageNumWords', 'function'); 217 218 // Method accepts any number of parameters. 219 expect('this.getPageNumWords(0, "clams", [1, 2])', 2); 220 221 // Arguments can't be negative or out of range. 222 expectError('this.getPageNumWords(-1)'); 223 expectError('this.getPageNumWords(6)'); 224 225 // TODO(tsepez): test with no permissions. 226 // TODO(tsepez): test success cases. 227 } 228 229 function testGetPrintParams() { 230 // Method is present. 231 expect('typeof this.getPrintParams', 'function'); 232 233 // TODO(tsepez): test success cases. 234 } 235 236 function testGotoNamedDest() { 237 // Method is present. 238 expect('typeof this.gotoNamedDest', 'function'); 239 240 // Method needs exactly one argument. 241 expectError('this.gotoNamedDest()'); 242 expectError('this.gotoNamedDest(1, 2)'); 243 244 // TODO(tonikitoo): test success cases. 245 } 246 247 function testMailDoc() { 248 // Method is present. 249 expect('typeof this.mailDoc', 'function'); 250 251 // TODO(tsepez): test with no permissions. 252 // TODO(tsepez): test success cases. 253 } 254 255 function testMailForm() { 256 // Method is present. 257 expect('typeof this.mailForm', 'function'); 258 259 // TODO(tsepez): test with no permissions. 260 // TODO(tsepez): test success cases. 261 } 262 263 function testPrint() { 264 // Method is present. 265 expect('typeof this.print', 'function'); 266 267 // TODO(tsepez): test success cases. 268 } 269 270 function testRemoveField() { 271 // Method is present. 272 expect('typeof this.removeField', 'function'); 273 274 // Method requires at least one argument. 275 expectError('this.removeField()'); 276 277 // TODO(tsepez): test with no permissions. 278 // TODO(tsepez): test success cases. 279 } 280 281 function testResetForm() { 282 // Method is present. 283 expect('typeof this.resetForm', 'function'); 284 285 // TODO(tsepez): test with no permissions. 286 // TODO(tsepez): test success cases. 287 } 288 289 function testSubmitForm() { 290 // Method is present. 291 expect('typeof this.submitForm', 'function'); 292 293 // Method requires at least one argument. 294 expectError('this.submitForm()'); 295 296 // TODO(tsepez): test success cases. 297 } 298 299 try { 300 app.alert('*** Testing Unsupported Methods ***'); 301 testUnsupported('this.addAnnot'); 302 testUnsupported('this.addField'); 303 testUnsupported('this.addLink'); 304 testUnsupported('this.closeDoc'); 305 testUnsupported('this.createDataObject'); 306 testUnsupported('this.deletePages'); 307 testUnsupported('this.exportAsFDF'); 308 testUnsupported('this.exportAsText'); 309 testUnsupported('this.exportAsXFDF'); 310 testUnsupported('this.extractPages'); 311 testUnsupported('this.getAnnot3D'); 312 testUnsupported('this.getLinks'); 313 testUnsupported('this.getOCGs'); 314 testUnsupported('this.getPageBox'); 315 testUnsupported('this.getURL'); 316 testUnsupported('this.importAnFDF'); 317 testUnsupported('this.importAnXFDF'); 318 testUnsupported('this.importTextData'); 319 testUnsupported('this.insertPages'); 320 testUnsupported('this.removeIcon'); 321 testUnsupported('this.replacePages'); 322 testUnsupported('this.saveAs'); 323 testUnsupported('this.syncAnnotScan'); 324 325 app.alert('*** Testing Supported Methods ***'); 326 testAddIcon(); 327 testCalculateNow(); 328 testGetAnnot(); 329 testGetAnnots(); 330 testGetField(); 331 testGetIcon(); 332 testGetNthFieldName(); 333 testGetPageNthWord(); 334 testGetPageNthWordQuads(); 335 testGetPageNumWords(); 336 testGetPrintParams(); 337 testGotoNamedDest(); 338 testMailDoc(); 339 testMailForm(); 340 testPrint(); 341 testRemoveField(); 342 testResetForm(); 343 testSubmitForm(); 344 } catch (e) { 345 app.alert('FATAL: ' + e.toString()); 346 } 347 endstream 348 endobj 349 {{xref}} 350 trailer << 351 /Root 1 0 R 352 /Info 9 0 R 353 >> 354 {{startxref}} 355 %%EOF 356