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

320 lines
14 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 () {
2020-12-30 18:36:01 +01:00
// 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.
2020-12-30 00:44:43 +01:00
// 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
});
});
2020-12-30 18:36:01 +01:00
describe('Really long text line goes to character within text line if text line is last line in viewport', function () {
beforeEach(function (cb) {
helper.newPad({
cb: async () => {
await helper.clearPad();
// 200 lines
await helper.edit(
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world\n ' +
'hello world hello world hello world hello world hello world hello world hello world ' +
'hello world hello world hello world hello world hello world hello world hello world ');
cb();
},
});
});
it('Page down on really long line keeps character on the same line but with a large X offset', async function () {
await helper.edit('xxx', 1); // caret is offset 6
await helper.waitForPromise(() => {
if ((helper.padInner$.document.getSelection().anchorOffset === 0) && (helper.caretLineNumber() === 1)) {
return true;
} else {
helper.pageUp();
}
});
helper.pageDown();
await helper.waitForPromise(() => {
if ((helper.padInner$.document.getSelection().anchorOffset > 0) && (helper.caretLineNumber() === 1)) {
throw new Error('This test will pass but it should not.. We need logic to check we were at the last possible caret');
return true;
}
});
});
});
describe('Viewport based Page Up/Down', function () {
2020-12-30 18:36:01 +01:00
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 down on page down key stroke when top is at 0', async function () {
// by default page down when caret is at end of the document will leave it in the same place.
// viewport based pageup/down changes that
const currentLineNumber = helper.caretLineNumber();
helper.padOuter$('#outerdocbody').parent().scrollTop(100);
helper.pageUp();
await helper.waitForPromise(() => currentLineNumber < 5);
});
});
describe('Shift 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');
cb();
},
});
});
it('highlights multiple lines on shift page down', async function () {
await helper.edit('xxx', 1); // caret is offset 6
helper.pageUp();
helper.pageDown({
shift: true,
});
await helper.waitForPromise(() => helper.padInner$.document.getSelection().type === 'Range');
});
});