From 386acf5bdd0788224fba604339be2e887e4aa225 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Fri, 17 Sep 2021 11:29:58 +0200 Subject: [PATCH] Integration test for PR #14023 --- test/integration/annotation_spec.js | 95 ++++++++++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue14023.pdf | Bin 0 -> 12962 bytes 3 files changed, 96 insertions(+) create mode 100644 test/pdfs/issue14023.pdf diff --git a/test/integration/annotation_spec.js b/test/integration/annotation_spec.js index a2444ea01..5fcd7901e 100644 --- a/test/integration/annotation_spec.js +++ b/test/integration/annotation_spec.js @@ -126,3 +126,98 @@ describe("Text widget", () => { }); }); }); + +describe("Annotation and storage", () => { + describe("issue14023.pdf", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("issue14023.pdf", "[data-annotation-id='64R']"); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must let checkboxes with the same name behave like radio buttons", async () => { + const text1 = "hello world!"; + const text2 = "!dlrow olleh"; + await Promise.all( + pages.map(async ([browserName, page]) => { + // Text field. + await page.type("#\\36 4R", text1); + // Checkbox. + await page.click("[data-annotation-id='65R']"); + // Radio. + await page.click("[data-annotation-id='67R']"); + + for (const [pageNumber, textId, checkId, radio1Id, radio2Id] of [ + [2, "#\\31 8R", "#\\31 9R", "#\\32 1R", "#\\32 0R"], + [5, "#\\32 3R", "#\\32 4R", "#\\32 2R", "#\\32 5R"], + ]) { + await page.evaluate(n => { + window.document + .querySelectorAll(`[data-page-number="${n}"][class="page"]`)[0] + .scrollIntoView(); + }, pageNumber); + + // Need to wait to have a displayed text input. + await page.waitForSelector(textId, { + timeout: 0, + }); + + const text = await page.$eval(textId, el => el.value); + expect(text).withContext(`In ${browserName}`).toEqual(text1); + + let checked = await page.$eval(checkId, el => el.checked); + expect(checked).toEqual(true); + + checked = await page.$eval(radio1Id, el => el.checked); + expect(checked).toEqual(false); + + checked = await page.$eval(radio2Id, el => el.checked); + expect(checked).toEqual(false); + } + + // Change data on page 5 and check that other pages changed. + // Text field. + await page.type("#\\32 3R", text2); + // Checkbox. + await page.click("[data-annotation-id='24R']"); + // Radio. + await page.click("[data-annotation-id='25R']"); + + for (const [pageNumber, textId, checkId, radio1Id, radio2Id] of [ + [1, "#\\36 4R", "#\\36 5R", "#\\36 7R", "#\\36 8R"], + [2, "#\\31 8R", "#\\31 9R", "#\\32 1R", "#\\32 0R"], + ]) { + await page.evaluate(n => { + window.document + .querySelectorAll(`[data-page-number="${n}"][class="page"]`)[0] + .scrollIntoView(); + }, pageNumber); + + // Need to wait to have a displayed text input. + await page.waitForSelector(textId, { + timeout: 0, + }); + + const text = await page.$eval(textId, el => el.value); + expect(text) + .withContext(`In ${browserName}`) + .toEqual(text2 + text1); + + let checked = await page.$eval(checkId, el => el.checked); + expect(checked).toEqual(false); + + checked = await page.$eval(radio1Id, el => el.checked); + expect(checked).toEqual(false); + + checked = await page.$eval(radio2Id, el => el.checked); + expect(checked).toEqual(false); + } + }) + ); + }); + }); +}); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 3790b3514..a53250667 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -112,6 +112,7 @@ !issue11651.pdf !issue11878.pdf !issue13916.pdf +!issue14023.pdf !bad-PageLabels.pdf !decodeACSuccessive.pdf !filled-background.pdf diff --git a/test/pdfs/issue14023.pdf b/test/pdfs/issue14023.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03d3ca8ec3814bc47e7f2b519d04f7f65788bd6d GIT binary patch literal 12962 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