import { before, describe, it } from '@ephox/bedrock-client';
import CaretPosition from 'tinymce/core/caret/CaretPosition';
import { CaretWalker } from 'tinymce/core/caret/CaretWalker';
import * as CaretAsserts from '../../module/test/CaretAsserts';
import * as ViewBlock from '../../module/test/ViewBlock';
describe('browser.tinymce.core.CaretWalkerTest', () => {
const viewBlock = ViewBlock.bddSetup();
const getRoot = viewBlock.get;
const setupHtml = viewBlock.update;
const getChildNode = (childIndex: number) => getRoot().childNodes[childIndex];
const findElm = (selector: string) => {
return getRoot().querySelector(selector);
};
const findElmPos = (selector: string, offset: number) => {
return CaretPosition(getRoot().querySelector(selector) as Node, offset);
};
const findTextPos = (selector: string, offset: number) => {
return CaretPosition(getRoot().querySelector(selector)?.firstChild as Text, offset);
};
let logicalCaret: CaretWalker;
before(() => logicalCaret = CaretWalker(getRoot()));
it('inside empty root', () => {
setupHtml('');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot(), 0)), null);
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot(), 0)), null);
});
it('on null', () => {
setupHtml('');
CaretAsserts.assertCaretPosition(logicalCaret.next(null), null);
CaretAsserts.assertCaretPosition(logicalCaret.prev(null), null);
});
it('within text node in root', () => {
setupHtml('abc');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot().firstChild as Text, 0)), CaretPosition(getRoot().firstChild as Text, 1));
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot().firstChild as Text, 1)), CaretPosition(getRoot().firstChild as Text, 2));
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot().firstChild as Text, 2)), CaretPosition(getRoot().firstChild as Text, 3));
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot().firstChild as Text, 3)), null);
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot().firstChild as Text, 3)), CaretPosition(getRoot().firstChild as Text, 2));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot().firstChild as Text, 2)), CaretPosition(getRoot().firstChild as Text, 1));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot().firstChild as Text, 1)), CaretPosition(getRoot().firstChild as Text, 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot().firstChild as Text, 0)), null);
});
it('within text node in element', () => {
setupHtml('
abc
');
CaretAsserts.assertCaretPosition(logicalCaret.next(findTextPos('p', 0)), findTextPos('p', 1));
CaretAsserts.assertCaretPosition(logicalCaret.next(findTextPos('p', 1)), findTextPos('p', 2));
CaretAsserts.assertCaretPosition(logicalCaret.next(findTextPos('p', 2)), findTextPos('p', 3));
CaretAsserts.assertCaretPosition(logicalCaret.next(findTextPos('p', 3)), null);
CaretAsserts.assertCaretPosition(logicalCaret.prev(findTextPos('p', 3)), findTextPos('p', 2));
CaretAsserts.assertCaretPosition(logicalCaret.prev(findTextPos('p', 2)), findTextPos('p', 1));
CaretAsserts.assertCaretPosition(logicalCaret.prev(findTextPos('p', 1)), findTextPos('p', 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(findTextPos('p', 0)), null);
});
it('from index text node over comment', () => {
setupHtml('abcdefgh');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot(), 0)), CaretPosition(getRoot().firstChild as Text, 0));
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot(), 1)), CaretPosition(getRoot().lastChild as Text, 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot(), 2)), CaretPosition(getRoot().firstChild as Text, 4));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot(), 3)), CaretPosition(getRoot().lastChild as Text, 4));
});
it('from text to text across elements', () => {
setupHtml('
abc
def
');
CaretAsserts.assertCaretPosition(logicalCaret.next(findTextPos('p:first-of-type', 3)), findTextPos('p:last-of-type', 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(findTextPos('p:last-of-type', 0)), findTextPos('p:first-of-type', 3));
});
it('from text to text across elements with siblings', () => {
setupHtml('
abc
def
');
CaretAsserts.assertCaretPosition(logicalCaret.next(findTextPos('p:first-of-type', 3)), CaretPosition(findElm('p:last-of-type')?.lastChild as Text, 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(findElm('p:last-of-type')?.lastChild as Text, 0)), findTextPos('p:first-of-type', 3));
});
it('from input to text', () => {
setupHtml('123456');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(getRoot(), 2)), CaretPosition(getRoot().lastChild as Text, 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(getRoot(), 1)), CaretPosition(getRoot().firstChild as Text, 3));
});
it('from input to input across elements', () => {
setupHtml('');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(findElm('p:first-of-type') as HTMLParagraphElement, 1)), CaretPosition(findElm('p:last-of-type') as HTMLParagraphElement, 0));
CaretAsserts.assertCaretPosition(logicalCaret.prev(CaretPosition(findElm('p:last-of-type') as HTMLParagraphElement, 0)), CaretPosition(findElm('p:first-of-type') as HTMLParagraphElement, 1));
});
it('next br to br across elements', () => {
setupHtml('
');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(findElm('p:first-of-type') as HTMLParagraphElement, 0)), CaretPosition(findElm('p:last-of-type') as HTMLParagraphElement, 0));
});
it('from text node to before cef span over br', () => {
setupHtml('
a X
');
CaretAsserts.assertCaretPosition(logicalCaret.next(CaretPosition(findElm('p') as HTMLParagraphElement, 1)), CaretPosition(findElm('p') as HTMLParagraphElement, 2));
});
it('prev br to br across elements', () => {
setupHtml('