diff --git a/test/unit/clitests.json b/test/unit/clitests.json index a0348fb7e..9aa5a7b12 100644 --- a/test/unit/clitests.json +++ b/test/unit/clitests.json @@ -25,8 +25,9 @@ "network_utils_spec.js", "node_stream_spec.js", "parser_spec.js", - "pdf_find_utils.js", - "pdf_history.js", + "pdf_find_controller_spec.js", + "pdf_find_utils_spec.js", + "pdf_history_spec.js", "primitives_spec.js", "stream_spec.js", "type1_parser_spec.js", diff --git a/test/unit/jasmine-boot.js b/test/unit/jasmine-boot.js index ef87c76ee..98b736e49 100644 --- a/test/unit/jasmine-boot.js +++ b/test/unit/jasmine-boot.js @@ -67,6 +67,7 @@ function initializePDFJS(callback) { 'pdfjs-test/unit/network_spec', 'pdfjs-test/unit/network_utils_spec', 'pdfjs-test/unit/parser_spec', + 'pdfjs-test/unit/pdf_find_controller_spec', 'pdfjs-test/unit/pdf_find_utils_spec', 'pdfjs-test/unit/pdf_history_spec', 'pdfjs-test/unit/primitives_spec', diff --git a/test/unit/pdf_find_controller_spec.js b/test/unit/pdf_find_controller_spec.js new file mode 100644 index 000000000..269e6c65f --- /dev/null +++ b/test/unit/pdf_find_controller_spec.js @@ -0,0 +1,99 @@ +/* Copyright 2018 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { buildGetDocumentParams } from './test_utils'; +import { EventBus } from '../../web/ui_utils'; +import { getDocument } from '../../src/display/api'; +import { PDFFindController } from '../../web/pdf_find_controller'; +import { SimpleLinkService } from '../../web/pdf_link_service'; + +class MockLinkService extends SimpleLinkService { + constructor() { + super(); + + this._page = 1; + this._pdfDocument = null; + } + + setDocument(pdfDocument) { + this._pdfDocument = pdfDocument; + } + + get pagesCount() { + return this._pdfDocument.numPages; + } + + get page() { + return this._page; + } + + set page(value) { + this._page = value; + } +} + +describe('pdf_find_controller', function() { + let eventBus; + let pdfFindController; + + beforeEach(function(done) { + const loadingTask = getDocument(buildGetDocumentParams('tracemonkey.pdf')); + loadingTask.promise.then(function(pdfDocument) { + const linkService = new MockLinkService(); + linkService.setDocument(pdfDocument); + + eventBus = new EventBus(); + + pdfFindController = new PDFFindController({ + linkService, + eventBus, + }); + pdfFindController.setDocument(pdfDocument); + + eventBus.dispatch('pagesinit'); + done(); + }); + }); + + afterEach(function() { + eventBus = null; + pdfFindController = null; + }); + + it('performs a basic search', function(done) { + pdfFindController.executeCommand('find', { query: 'Dynamic', }); + + const matchesPerPage = [11, 5, 0, 3, 0, 0, 0, 1, 1, 1, 0, 3, 4, 4]; + const totalPages = matchesPerPage.length; + const totalMatches = matchesPerPage.reduce((a, b) => { + return a + b; + }); + + eventBus.on('updatefindmatchescount', + function onUpdateFindMatchesCount(evt) { + if (pdfFindController.pageMatches.length !== totalPages) { + return; + } + eventBus.off('updatefindmatchescount', onUpdateFindMatchesCount); + + expect(evt.matchesCount.total).toBe(totalMatches); + for (let i = 0; i < totalPages; i++) { + expect(pdfFindController.pageMatches[i].length) + .toEqual(matchesPerPage[i]); + } + done(); + }); + }); +}); diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index a74df0893..cbd50dbb4 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -526,8 +526,8 @@ class PDFFindController { if (found) { const previousPage = this._selected.pageIdx; - this.selected.pageIdx = this._offset.pageIdx; - this.selected.matchIdx = this._offset.matchIdx; + this._selected.pageIdx = this._offset.pageIdx; + this._selected.matchIdx = this._offset.matchIdx; state = (wrapped ? FindState.WRAPPED : FindState.FOUND); // Update the currently selected page to wipe out any selected matches.