UNPKG

@cycle/dom

Version:

The standard DOM Driver for Cycle.js, based on Snabbdom

155 lines (139 loc) 3.82 kB
import * as simulant from 'simulant'; import * as assert from 'assert'; import isolate from '@cycle/isolate'; import xs, {Stream, MemoryStream} from 'xstream'; import delay from 'xstream/extra/delay'; import concat from 'xstream/extra/concat'; import {setup} from '@cycle/run'; import { svg, div, span, h2, h3, h4, p, makeDOMDriver, MainDOMSource, VNode, } from '../../src/index'; function createRenderTarget(id: string | null = null) { const element = document.createElement('div'); element.className = 'cycletest'; if (id) { element.id = id; } document.body.appendChild(element); return element; } describe('DOMSource.elements()', function() { it('should return a stream of documents when querying "document"', done => { function app(_sources: {DOM: MainDOMSource}) { return { DOM: xs.of(div('.top-most', [p('Foo'), span('Bar')])), }; } const {sinks, sources, run} = setup(app, { DOM: makeDOMDriver(createRenderTarget()), }); function isDocument(element: any): element is Document { return 'body' in element && 'head' in element; } let dispose: any; sources.DOM.select('document') .element() .take(1) .addListener({ next: root => { assert(root.body !== undefined); //Check type inference assert(isDocument(root)); setTimeout(() => { dispose(); done(); }); }, }); dispose = run(); }); it('should return a stream of bodies when querying "body"', done => { function app(_sources: {DOM: MainDOMSource}) { return { DOM: xs.of(div('.top-most', [p('Foo'), span('Bar')])), }; } const {sinks, sources, run} = setup(app, { DOM: makeDOMDriver(createRenderTarget()), }); function isBody(element: any): element is HTMLBodyElement { return 'aLink' in element && 'link' in element; } let dispose: any; sources.DOM.select('body') .element() .take(1) .addListener({ next: root => { assert(root.aLink !== undefined); //Check type inference assert(isBody(root)); setTimeout(() => { dispose(); done(); }); }, }); dispose = run(); }); it('should return a stream of arrays of elements of size 1 when querying ":root"', done => { function app(_sources: {DOM: MainDOMSource}) { return { DOM: xs.of(div('.top-most', [p('Foo'), span('Bar')])), }; } const {sinks, sources, run} = setup(app, { DOM: makeDOMDriver(createRenderTarget()), }); let dispose: any; sources.DOM.select(':root') .elements() .drop(1) .take(1) .addListener({ next: root => { assert(root.forEach !== undefined); //Check type inference assert(Array.isArray(root)); assert(root.length === 1); setTimeout(() => { dispose(); done(); }); }, }); dispose = run(); }); it('should return a stream of arrays of elements of size 2 when querying ".some"', done => { function app(_sources: {DOM: MainDOMSource}) { return { DOM: xs.of(div('.top-most', [div('.some'), div('.some')])), }; } const {sinks, sources, run} = setup(app, { DOM: makeDOMDriver(createRenderTarget()), }); let dispose: any; sources.DOM.select('.some') .elements() .drop(1) .take(1) .addListener({ next: (elems: Array<Element>) => { assert(Array.isArray(elems)); assert(elems.length === 2); setTimeout(() => { dispose(); done(); }); }, }); dispose = run(); }); });