From db26ea218ca5c5aa9b5f839310ff93c12f0f6010 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Mon, 28 Dec 2020 21:53:08 +0100 Subject: [PATCH] page up/down: add test coverage --- tests/frontend/helper/methods.js | 61 ++++++++++++++++++++++++++++++ tests/frontend/specs/pageupdown.js | 52 +++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 tests/frontend/specs/pageupdown.js diff --git a/tests/frontend/helper/methods.js b/tests/frontend/helper/methods.js index 4c7fe1204..05efcde92 100644 --- a/tests/frontend/helper/methods.js +++ b/tests/frontend/helper/methods.js @@ -236,3 +236,64 @@ helper.clearPad = async () => { await helper.waitForPromise(helper.padIsEmpty); await helper.waitForPromise(() => helper.commits.length > commitsBefore); }; + +/** + * Scrolls up in the editor + * TODO: is `getSelection` always defined? + */ +helper.pageUp = async () => { + // the caret is in this node + const caretNode = helper.padInner$.document.getSelection().anchorNode; + const event = new helper.padInner$.Event(helper.evtType); + event.which = 33; + helper.padInner$('#innerdocbody').trigger(event); + + // return as soon as the selection has changed + await helper.waitForPromise(() => helper.padInner$.document.getSelection().anchorNode !== caretNode); +}; + +/** + * Scrolls down in the editor + * TODO: is `getSelection` always defined? + */ +helper.pageDown = async () => { + // the caret is in this node + const caretNode = helper.padInner$.document.getSelection().anchorNode; + const event = new helper.padInner$.Event(helper.evtType); + event.which = 34; + helper.padInner$('#innerdocbody').trigger(event); + + // return as soon as the selection has changed + await helper.waitForPromise(() => helper.padInner$.document.getSelection().anchorNode !== caretNode); +}; + +/** + * Gets the line number where the caret is currently in + * + * @returns {number} line number + */ +helper.caretLineNumber = () => { + if (helper.padInner$.document.getSelection()) { + let caretNode = helper.padInner$.document.getSelection().anchorNode;; + let bodyElement = helper.padInner$('body')[0]; + + // a text node does not have a classList method + if (caretNode.nodeType === 3) { + caretNode = caretNode.parentNode; + } + + // find the ace-line that contains the caret + while (!caretNode.classList.contains('ace-line') && caretNode !== bodyElement ) { + caretNode = caretNode.parentNode; + + // a text node does not have a classList method + if (caretNode.nodeType === 3) { + caretNode = caretNode.parentNode; + } + } + + // find the index of that line in the array of all lines + const lines = helper.linesDiv().map((line) => line[0]); + return lines.indexOf(caretNode) + 1; + } +}; diff --git a/tests/frontend/specs/pageupdown.js b/tests/frontend/specs/pageupdown.js new file mode 100644 index 000000000..7a58c2201 --- /dev/null +++ b/tests/frontend/specs/pageupdown.js @@ -0,0 +1,52 @@ +'use strict'; + +describe('Page Up/Down', function () { + beforeEach(function (cb) { + helper.newPad({ + cb: async () => { + await helper.clearPad(); + // 200 lines + await helper.edit( + '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' + + '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' + + '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' + + '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' + + '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n'); + cb() + } + }); + }); + + // scrolls up 3 times + it('scrolls up on key stroke', async function(){ + let currentLineNumber = helper.caretLineNumber(); + helper.pageUp(); + await helper.waitForPromise(() => currentLineNumber > helper.caretLineNumber()); + + currentLineNumber = helper.caretLineNumber(); + helper.pageUp(); + await helper.waitForPromise(() => currentLineNumber > helper.caretLineNumber()); + + currentLineNumber = helper.caretLineNumber(); + helper.pageUp(); + await helper.waitForPromise(() => currentLineNumber > helper.caretLineNumber()); + }) + + // scrolls down 3 times + it('scrolls down on key stroke', async function(){ + // this places the caret in the first line + await helper.edit('Line 1', 1); + + let currentLineNumber = helper.caretLineNumber(); + helper.pageDown(); + await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber()); + + currentLineNumber = helper.caretLineNumber(); + helper.pageDown(); + await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber()); + + currentLineNumber = helper.caretLineNumber(); + helper.pageDown(); + await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber()); + }) +})