{{header}}
{{object 1 0}} <<
  /Type /Catalog
  /Pages 2 0 R
  /OpenAction 10 0 R
>>
endobj
{{object 2 0}} <<
  /Type /Pages
  /Count 4
  /Kids [
    3 0 R
    4 0 R
    5 0 R
    6 0 R
  ]
>>
endobj
% Page number 0.
{{object 3 0}} <<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /Font <</F1 15 0 R>>
  >>
  /MediaBox [0 0 612 792]
  /Contents 8 0 R
>>
% Page number 1.
{{object 4 0}} <<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /Font <</F1 15 0 R>>
  >>
  /MediaBox [0 0 612 792]
>>
% Page number 2.
{{object 5 0}} <<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /Font <</F1 15 0 R>>
  >>
  /MediaBox [0 0 612 792]
>>
% Page number 3.
{{object 6 0}} <<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /Font <</F1 15 0 R>>
  >>
  /MediaBox [0 0 612 792]
>>
% Contents of the page.
{{object 8 0}} <<
>>
stream
BT
20 50 Td
/F1 12 Tf
(Hello, world!) Tj
0 50 Td
endstream
endobj
% Info
{{object 9 0}} <<
  /Author (Joe Random Author)
  /Creator (Joe Random Creator)
>>
endobj
% OpenAction action
{{object 10 0}} <<
  /Type /Action
  /S /JavaScript
  /JS 11 0 R
>>
endobj
% JS program to exexute
{{object 11 0}} <<
>>
stream
function expect(str, expected) {
  try {
    var result = eval(str);
    if (result == expected) {
      app.alert('PASS: ' + str + ' = ' + result);
    } else {
      app.alert('FAIL: ' + str + ' = ' + result + ', expected = ' + expected);
    }
  } catch (e) {
    app.alert('ERROR: ' + e.toString());
  }
}

function expectError(str) {
  try {
    var result = eval(str);
    app.alert('FAIL: ' + str + ' = ' + result + ', expected to throw error');
  } catch (e) {
    app.alert('PASS: ' + str + ' threw error ' + e.toString());
  }
}

// "Unsupported" methods are present in the document object, but not
// implemented. They always return |undefined| regardless of arguments.
function testUnsupported(str) {
  expect('typeof ' + str, 'function');
  expect(str + '()', undefined);
  expect(str + '(1, 2, "clams", [1, 2, 3])', undefined);
}

function testAddIcon() {
   // Method is present.
   expect('typeof this.addIcon', 'function');

   // Method takes exactly two arguments.
   expectError('this.addIcon()');
   expectError('this.addIcon(1)');
   expectError('this.addIcon(1, 2, 3)');

   // Second argument must actually be an icon.
   expectError('this.addIcon("myicon", 3)');
   expectError('this.addIcon("myicon", undefined)');

   // TODO(tsepez): test success cases.
}

function testCalculateNow() {
   // Method is present.
   expect('typeof this.calculateNow', 'function');

   // TODO(tsepez): test with no permissions.
   // TODO(tsepez): test success cases.
}

function testDeletePages() {
   // Method is present.
   expect('typeof this.deletePages', 'function');

   // TODO(tsepez): test with no permissions.
   // TODO(tsepez): test success cases.
}

function testGetField() {
   // Method is present.
   expect('typeof this.getField', 'function');

   // Method needs at least one argument.
   expectError('this.getField()');

   // TODO(tsepez): test success cases.
}

function testGetIcon() {
   // Method is present.
   expect('typeof this.getIcon', 'function');

   // Method needs exactly one argument.
   expectError('this.getIcon()');
   expectError('this.getIcon(1, 2)');

  // TODO(tsepez): test success cases.
}

function testGetNthFieldName() {
  // Method is present.
  expect('typeof this.getNthFieldName', 'function');

  // Method needs at least one argument.
  expectError('this.getNthFieldName()');

  // Argument can not be negative.
  expectError('this.getNthFieldName(-1)');

  // TODO(tsepez): test success cases.
}

function testGetPageNthWord() {
  // Method is present.
  expect('typeof this.getPageNthWord', 'function');

  // Method accepts any number of parameters.
  expect('this.getPageNthWord(0, 0, true, "clams", [1, 2])', 'Hello,');

  // Arguments can't be negative or out of range.
  expectError('this.getPageNthWord(-1, 0, true)');
  expectError('this.getPageNthWord(6, 0, true)');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testGetPageNthWordQuads() {
   // Method is present.
   expect('typeof this.getPageNthWordQuads', 'function');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testGetPageNumWords() {
   // Method is present.
   expect('typeof this.getPageNumWords', 'function');

  // Method accepts any number of parameters.
  expect('this.getPageNumWords(0, "clams", [1, 2])', 2);

  // Arguments can't be negative or out of range.
  expectError('this.getPageNumWords(-1)');
  expectError('this.getPageNumWords(6)');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testGetPrintParams() {
   // Method is present.
   expect('typeof this.getPrintParams', 'function');

  // TODO(tsepez): test success cases.
}

function testMailDoc() {
   // Method is present.
   expect('typeof this.mailDoc', 'function');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testMailForm() {
   // Method is present.
   expect('typeof this.mailForm', 'function');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testPrint() {
   // Method is present.
   expect('typeof this.print', 'function');

  // TODO(tsepez): test success cases.
}

function testRemoveField() {
  // Method is present.
  expect('typeof this.removeField', 'function');

  // Method requires at least one argument.
  expectError('this.removeField()');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testRemoveIcon() {
   // Method is present.
   expect('typeof this.removeIcon', 'function');

  // Method requires at least one argument.
  expectError('this.removeIcon()');

  // TODO(tsepez): test success cases.
}

function testResetForm() {
   // Method is present.
   expect('typeof this.resetForm', 'function');

  // TODO(tsepez): test with no permissions.
  // TODO(tsepez): test success cases.
}

function testSubmitForm() {
   // Method is present.
   expect('typeof this.submitForm', 'function');

  // Method requires at least one argument.
  expectError('this.submitForm()');

  // TODO(tsepez): test success cases.
}

try {
  app.alert('*** Testing Unsupported Methods ***');
  testUnsupported('this.addAnnot');
  testUnsupported('this.addField');
  testUnsupported('this.addLink');
  testUnsupported('this.closeDoc');
  testUnsupported('this.createDataObject');
  testUnsupported('this.exportAsFDF');
  testUnsupported('this.exportAsText');
  testUnsupported('this.exportAsXFDF');
  testUnsupported('this.extractPages');
  testUnsupported('this.getAnnot');
  testUnsupported('this.getAnnot3D');
  testUnsupported('this.getAnnots');
  testUnsupported('this.getLinks');
  testUnsupported('this.getOCGs');
  testUnsupported('this.getPageBox');
  testUnsupported('this.getURL');
  testUnsupported('this.importAnFDF');
  testUnsupported('this.importAnXFDF');
  testUnsupported('this.importTextData');
  testUnsupported('this.insertPages');
  testUnsupported('this.replacePages');
  testUnsupported('this.saveAs');

  app.alert('*** Testing Supported Methods ***');
  testAddIcon();
  testCalculateNow();
  testDeletePages();
  testGetField();
  testGetIcon();
  testGetNthFieldName();
  testGetPageNthWord();
  testGetPageNthWordQuads();
  testGetPageNumWords();
  testGetPrintParams();
  testMailDoc();
  testMailForm();
  testPrint();
  testRemoveField();
  testRemoveIcon();
  testResetForm();
  testSubmitForm();
} catch (e) {
  app.alert('FATAL: ' + e.toString());
}
endstream
endobj
{{xref}}
trailer <<
  /Root 1 0 R
  /Info 9 0 R
>>
{{startxref}}
%%EOF
