pad.libre-service.eu-etherpad/tests/frontend/specs/pageupdown.js

215 lines
8.4 KiB
JavaScript
Raw Normal View History

2020-12-28 21:53:08 +01:00
'use strict';
describe('Page Up/Down', function () {
beforeEach(function (cb) {
helper.newPad({
cb: async () => {
await helper.clearPad();
// 200 lines
await helper.edit(
2020-12-30 00:44:43 +01:00
'\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' +
2020-12-28 21:53:08 +01:00
'\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');
2020-12-30 00:44:43 +01:00
cb();
},
2020-12-28 21:53:08 +01:00
});
});
// scrolls up 3 times
2020-12-30 00:44:43 +01:00
it('scrolls up on key stroke', async function () {
2020-12-28 21:53:08 +01:00
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());
2020-12-30 00:44:43 +01:00
});
2020-12-28 21:53:08 +01:00
// scrolls down 3 times
2020-12-30 00:44:43 +01:00
it('scrolls down on key stroke', async function () {
2020-12-28 21:53:08 +01:00
// 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());
2020-12-30 00:44:43 +01:00
});
});
2020-12-29 23:58:16 +01:00
describe('Page Up/Down Beginning and End position', function () {
beforeEach(function (cb) {
helper.newPad({
cb: async () => {
await helper.clearPad();
// 200 lines
await helper.edit(
'\n\n\n\nhello');
cb();
},
});
});
it('scrolls to very end content on page down when viewport is at bottom of document', async function () {
// this places the caret in the first line
await helper.edit('Line 1', 1);
const currentLineNumber = helper.caretLineNumber();
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
// make sure caret is after hello
const pos = helper.padInner$.document.getSelection();
await helper.waitForPromise(() => pos.anchorOffset > 0);
});
// scrolls down 3 times - caret should be AFTER "hello
it('scrolls to very beginning content on page up when viewport is at bottom of document', async function () {
// this places the caret in the first line
await helper.edit('Line 1', 1);
const currentLineNumber = helper.caretLineNumber();
helper.pageUp();
await helper.waitForPromise(() => currentLineNumber > helper.caretLineNumber());
2020-12-30 00:44:43 +01:00
// make sure caret is at 0 position
2020-12-29 23:58:16 +01:00
const pos = helper.padInner$.document.getSelection();
await helper.waitForPromise(() => pos.anchorOffset === 0);
});
2020-12-30 00:44:43 +01:00
});
describe('Line number integrity is kept between 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();
},
});
});
2020-12-29 23:58:16 +01:00
2020-12-30 00:44:43 +01:00
const lineHistory = [];
it('Page down three times to a given line, then page up and see if lines match', async function () {
2020-12-29 23:58:16 +01:00
// this places the caret in the first line
await helper.edit('Line 1', 1);
2020-12-30 00:44:43 +01:00
const currentLineNumber = helper.caretLineNumber();
lineHistory.push(helper.caretLineNumber());
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
lineHistory.push(helper.caretLineNumber());
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
lineHistory.push(helper.caretLineNumber());
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
let futureLineNumber = helper.caretLineNumber();
helper.pageUp();
await helper.waitForPromise(() => futureLineNumber > helper.caretLineNumber());
if (helper.caretLineNumber() !== lineHistory[lineHistory.length]) {
throw new Error('Line History not being properly maintained');
}
lineHistory.pop();
futureLineNumber = helper.caretLineNumber();
helper.pageUp();
await helper.waitForPromise(() => futureLineNumber > helper.caretLineNumber());
if (helper.caretLineNumber() !== lineHistory[lineHistory.length]) {
throw new Error('Line History not being properly maintained');
}
});
});
describe('X character offset integrity is kept between page up/down', function () {
beforeEach(function (cb) {
helper.newPad({
cb: async () => {
await helper.clearPad();
// 200 lines
await helper.edit(
'hel\n\nhello\nhello\nhello\nhello\nhello\nhello\nhello\nhello\nhello\nhello\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' +
'hel\nhello\nhello\nhello\nhello\nhello\nhello\nhello\nhello\nhello\nhello\n' +
'hello\n\n\nhello\n\n\nhel\n\n\nhel\n\nhel\n\nhel\n\nhel\n\nhel\n\nhel\n\nhel');
cb();
},
});
});
it('Page down with an offset of 3 and check we keep our x offset', async function () {
/*
Consider this document..
hello*
world
.
.
.
BOO!
Hitting page down at the star point should put your caret after BOO!
Now consider that the empty lines are very long and the caret lands in them.
We respect the original x character offset and try to pass it forward.
*/
// this places the caret in the first line
await helper.edit('xxx', 1); // caret is offset 6
2020-12-29 23:58:16 +01:00
let currentLineNumber = helper.caretLineNumber();
2020-12-30 00:44:43 +01:00
const nodeLength = helper.padInner$.document.getSelection().anchorNode.length;
const originalOffset = helper.padInner$.document.getSelection().anchorOffset;
2020-12-29 23:58:16 +01:00
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
2020-12-30 00:44:43 +01:00
await helper.waitForPromise(() => helper.padInner$.document.getSelection().anchorOffset === originalOffset ||
!helper.padInner$.document.getSelection().anchorNode.length);
// !helper.padInner$.document.getSelection().anchorNode.length) in the above line serves a useful purpose..
// We use it to ensure character offset is respected on empty lines but also to check that it's continued
// to be respected on next page downs.
2020-12-29 23:58:16 +01:00
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
2020-12-30 00:44:43 +01:00
console.log(helper.padInner$.document.getSelection().anchorNode.length, 'WAT');
await helper.waitForPromise(() => helper.padInner$.document.getSelection().anchorOffset === originalOffset ||
!helper.padInner$.document.getSelection().anchorNode.length);
2020-12-29 23:58:16 +01:00
helper.pageDown();
await helper.waitForPromise(() => currentLineNumber < helper.caretLineNumber());
2020-12-30 00:44:43 +01:00
await helper.waitForPromise(() => helper.padInner$.document.getSelection().anchorOffset === originalOffset ||
!helper.padInner$.document.getSelection().anchorNode.length);
// need to reset for page up
currentLineNumber = helper.caretLineNumber();
helper.pageUp();
await helper.waitForPromise(() => currentLineNumber > helper.caretLineNumber());
await helper.waitForPromise(() => helper.padInner$.document.getSelection().anchorOffset === originalOffset ||
!helper.padInner$.document.getSelection().anchorNode.length);
2020-12-29 23:58:16 +01:00
});
});