Skip to content

Commit

Permalink
Merge pull request #10425 from timvandermeij/find-controller-unit-tests
Browse files Browse the repository at this point in the history
Write more unit tests for the find controller
  • Loading branch information
timvandermeij authored Jan 12, 2019
2 parents b531fc4 + b1cef89 commit a37ea16
Showing 1 changed file with 136 additions and 19 deletions.
155 changes: 136 additions & 19 deletions test/unit/pdf_find_controller_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,28 +71,145 @@ describe('pdf_find_controller', function() {
pdfFindController = null;
});

it('performs a basic search', function(done) {
pdfFindController.executeCommand('find', { query: 'Dynamic', });
function testSearch({ parameters, matchesPerPage, selectedMatch, }) {
return new Promise(function(resolve) {
pdfFindController.executeCommand('find', parameters);

// The `updatefindmatchescount` event is only emitted if the page contains
// at least one match for the query, so the last non-zero item in the
// matches per page array corresponds to the page for which the final
// `updatefindmatchescount` event is emitted. If this happens, we know
// that any subsequent pages won't trigger the event anymore and we
// can start comparing the matches per page. This logic is necessary
// because we call the `pdfFindController.pageMatches` getter directly
// after receiving the event and the underlying `_pageMatches` array
// is only extended when a page is processed, so it will only contain
// entries for the pages processed until the time when the final event
// was emitted.
let totalPages = matchesPerPage.length;
for (let i = totalPages - 1; i >= 0; i--) {
if (matchesPerPage[i] > 0) {
totalPages = i + 1;
break;
}
}

const totalMatches = matchesPerPage.reduce((a, b) => {
return a + b;
});

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);
console.log(pdfFindController.pageMatches);

expect(evt.matchesCount.total).toBe(totalMatches);
for (let i = 0; i < totalPages; i++) {
expect(pdfFindController.pageMatches[i].length)
.toEqual(matchesPerPage[i]);
}
expect(pdfFindController.selected.pageIdx)
.toEqual(selectedMatch.pageIndex);
expect(pdfFindController.selected.matchIdx)
.toEqual(selectedMatch.matchIndex);

resolve();
});
});
}

eventBus.on('updatefindmatchescount',
function onUpdateFindMatchesCount(evt) {
if (pdfFindController.pageMatches.length !== totalPages) {
return;
}
eventBus.off('updatefindmatchescount', onUpdateFindMatchesCount);
it('performs a normal search', function(done) {
testSearch({
parameters: {
query: 'Dynamic',
caseSensitive: false,
entireWord: false,
phraseSearch: true,
findPrevious: false,
},
matchesPerPage: [11, 5, 0, 3, 0, 0, 0, 1, 1, 1, 0, 3, 4, 4],
selectedMatch: {
pageIndex: 0,
matchIndex: 0,
},
}).then(done);
});

expect(evt.matchesCount.total).toBe(totalMatches);
for (let i = 0; i < totalPages; i++) {
expect(pdfFindController.pageMatches[i].length)
.toEqual(matchesPerPage[i]);
}
done();
});
it('performs a normal search and finds the previous result', function(done) {
// Page 14 (with page index 13) contains five results. By default, the
// first result (match index 0) is selected, so the previous result
// should be the fifth result (match index 4).
testSearch({
parameters: {
query: 'conference',
caseSensitive: false,
entireWord: false,
phraseSearch: true,
findPrevious: true,
},
matchesPerPage: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
selectedMatch: {
pageIndex: 13,
matchIndex: 4,
},
}).then(done);
});

it('performs a case sensitive search', function(done) {
testSearch({
parameters: {
query: 'Dynamic',
caseSensitive: true,
entireWord: false,
phraseSearch: true,
findPrevious: false,
},
matchesPerPage: [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3],
selectedMatch: {
pageIndex: 0,
matchIndex: 0,
},
}).then(done);
});

it('performs an entire word search', function(done) {
// Page 13 contains both 'Government' and 'Governmental', so the latter
// should not be found with entire word search.
testSearch({
parameters: {
query: 'Government',
caseSensitive: false,
entireWord: true,
phraseSearch: true,
findPrevious: false,
},
matchesPerPage: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
selectedMatch: {
pageIndex: 12,
matchIndex: 0,
},
}).then(done);
});

it('performs a multiple term (no phrase) search', function(done) {
// Page 9 contains 'alternate' and pages 6 and 9 contain 'solution'.
// Both should be found for multiple term (no phrase) search.
testSearch({
parameters: {
query: 'alternate solution',
caseSensitive: false,
entireWord: false,
phraseSearch: false,
findPrevious: false,
},
matchesPerPage: [0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0],
selectedMatch: {
pageIndex: 5,
matchIndex: 0,
},
}).then(done);
});
});

0 comments on commit a37ea16

Please sign in to comment.