import toArray from 'tui-code-snippet/collection/toArray'; import { isPositionInBox, isElemNode, findNodes, appendNodes, insertBeforeNode, removeNode, unwrapNode, toggleClass, createElementWith, closest, empty, appendNode, prependNode, } from '@/utils/dom'; describe('dom utils', () => { let container: HTMLElement; beforeEach(() => { container = document.createElement('div'); document.body.appendChild(container); }); afterEach(() => { container.parentNode!.removeChild(container); }); it('isPositionInBox() returns state whether position is contained within box size', () => { container.innerHTML = '
foo
'; const el = document.querySelector('.test') as HTMLElement; const { style } = el; style.left = '0'; style.top = '0'; style.width = '10px'; style.height = '10px'; style.paddingLeft = '0'; style.paddingRight = '0'; style.paddingTop = '0'; style.paddingBottom = '0'; expect(isPositionInBox(style, 5, 5)).toBe(true); expect(isPositionInBox(style, 15, 15)).toBe(false); }); describe('isElemNode', () => { it('returns true if passed node is ELEMENT_NODE', () => { container.innerHTML = '

hi

'; const target = container.querySelector('p') as HTMLElement; const result = isElemNode(target); expect(result).toBe(true); }); it('returns false if passed node is not ELEMENT_NODE', () => { container.innerHTML = 'text'; const result = isElemNode(container.firstChild!); expect(result).toBe(false); }); }); it('appendNodes() appends last child to parent using dom element', () => { container.innerHTML = '
foo
'; const el = document.createElement('p'); el.innerHTML = 'bar'; const target = container.querySelector('div') as HTMLElement; appendNodes(target, el); expect(container.innerHTML).toBe('
foo

bar

'); }); it('insertBeforeNode() inserts node in front of target node', () => { container.innerHTML = '
foo
'; const el = document.createElement('p'); el.innerHTML = 'bar'; const target = container.querySelector('div') as HTMLElement; insertBeforeNode(el, target); expect(container.innerHTML).toBe('

bar

foo
'); }); it('removeNode() removes target node', () => { container.innerHTML = '

foo

bar

'; const target = container.querySelector('p') as HTMLElement; removeNode(target); expect(container.innerHTML).toBe('

bar

'); }); it('unwrapNode() removes given element and insert children at the same position', () => { const childrenHTML = 'emph1 text emph2'; container.innerHTML = `

${childrenHTML}

`; const target = container.querySelector('b') as HTMLElement; unwrapNode(target); expect(container.innerHTML).toBe(`

${childrenHTML}

`); }); describe('findNodes() returns nodes matching by selector', () => { beforeEach(() => { container.innerHTML = '
foo
bar
'; }); it('to array when found', () => { const result = findNodes(container, 'div'); expect(result.length).toBe(2); expect(result[0].textContent).toBe('foo'); expect(result[1].textContent).toBe('bar'); }); it('to empty array when not found', () => { const result = findNodes(container, '.test'); expect(result.length).toBe(0); }); }); describe('toggleClass() adds or removes specific class name of element', () => { beforeEach(() => { container.innerHTML = '
foo
'; }); it('only toggle class', () => { const target = container.querySelector('div')!; toggleClass(target, 'active'); expect(target.className).toBe('test active'); toggleClass(target, 'active'); expect(target.className).toBe('test'); }); it('add or remove class by condition', () => { const target = container.querySelector('div')!; toggleClass(target, 'active', true); expect(target.className).toBe('test active'); toggleClass(target, 'active1', false); expect(target.className).toBe('test active'); toggleClass(target, 'active', false); expect(target.className).toBe('test'); }); }); describe('createElementWith() returns created new element using', () => { it('html string', () => { const result = createElementWith('

foo

')!; expect(result.textContent).toBe('foo'); }); it('dom element', () => { const element = document.createElement('p'); element.innerHTML = 'foo'; const result = createElementWith(element)!; expect(result.textContent).toBe('foo'); }); it('if there is target element, new element is appended to target', () => { container.innerHTML = '
'; const target = container.querySelector('div')!; const result = createElementWith('

foo

', target)!; expect(result.parentNode).toBe(target); }); }); describe('closest() finds node with', () => { beforeEach(() => { container.innerHTML = ''; }); it('type selector from text node', () => { const selector = 'li'; const [target] = toArray(container.querySelectorAll('li')); const foundNode = closest(target.firstChild!, selector); const result = container.querySelector(selector); expect(foundNode).toBe(result); }); it('attribute selector from text node', () => { const selector = '.test'; const [, target] = toArray(container.querySelectorAll('li')); const foundNode = closest(target.firstChild!, selector); const result = container.querySelector(selector); expect(foundNode).toBe(result); }); it('type selector from element node', () => { const selector = 'UL'; const target = container.querySelector('li')!; const foundNode = closest(target, selector); const result = container.querySelector(selector); expect(foundNode).toBe(result); }); it('wrong selector', () => { const selector = 'wrong selector'; const target = container.querySelector('li')!; const foundNode = closest(target, selector); expect(foundNode).toBeNull(); }); it('dom element', () => { const target = container.querySelector('li')!; const selector = container.querySelector('ul')!; const foundNode = closest(target, selector)!; expect(foundNode).toEqual(selector); }); }); it('empty() removes all children from target node', () => { container.innerHTML = '

foo

bar

'; const target = container.querySelector('div')!; empty(target); expect(container.innerHTML).toBe('
'); }); describe('appendNode() appends last child to parent using', () => { beforeEach(() => { container.innerHTML = '
foo
'; }); it('html string', () => { appendNode(container.querySelector('div')!, '

bar

'); expect(container.innerHTML).toBe('
foo

bar

'); }); it('dom element', () => { const child = document.createElement('p'); child.innerHTML = 'bar'; appendNode(container.querySelector('div')!, child); expect(container.innerHTML).toBe('
foo

bar

'); }); }); describe('prependNode() appends first child to parent using', () => { beforeEach(() => { container.innerHTML = '
foo
'; }); it('html string', () => { prependNode(container.querySelector('div')!, '

bar

'); expect(container.innerHTML).toBe('

bar

foo
'); }); it('dom element', () => { const child = document.createElement('p'); child.innerHTML = 'bar'; prependNode(container.querySelector('div')!, child); expect(container.innerHTML).toBe('

bar

foo
'); }); }); });