import { empty as observableEmpty } from "rxjs"; import { skip } from "rxjs/operators"; import * as vd from "virtual-dom"; import { DOMRenderer } from "../../src/render/DOMRenderer"; import { RenderMode } from "../../src/render/RenderMode"; import { RenderService } from "../../src/render/RenderService"; describe("DOMRenderer.ctor", () => { it("should be contructed", () => { let element: HTMLDivElement = document.createElement("div"); let renderService: RenderService = new RenderService(element, observableEmpty(), RenderMode.Letterbox); let domRenderer: DOMRenderer = new DOMRenderer(element, renderService, observableEmpty()); expect(domRenderer).toBeDefined(); }); }); describe("DOMRenderer.render$", () => { it("should render one element", (done: Function) => { let element: HTMLDivElement = document.createElement("div"); let renderService: RenderService = new RenderService(element, observableEmpty(), RenderMode.Letterbox); let domRenderer: DOMRenderer = new DOMRenderer(element, renderService, observableEmpty()); domRenderer.element$ .subscribe( (e: Element): void => { let list: HTMLCollectionOf = >e.getElementsByClassName("testdiv"); expect(list.length).toBe(1); let testDiv: HTMLDivElement = list[0]; expect(testDiv).toBeDefined(); expect(testDiv instanceof HTMLDivElement).toBeTruthy(); done(); }); let vNode: vd.VNode = vd.h("div.testdiv", []); domRenderer.render$.next({ name: "test", vNode: vNode }); }); it("should render multiple elements with different hash names", (done: Function) => { let element: HTMLDivElement = document.createElement("div"); let renderService: RenderService = new RenderService(element, observableEmpty(), RenderMode.Letterbox); let domRenderer: DOMRenderer = new DOMRenderer(element, renderService, observableEmpty()); domRenderer.element$.pipe( skip(1)) .subscribe( (e: Element): void => { for (let i of [1, 2]) { let className: string = "testdiv" + i.toString(); let list: HTMLCollectionOf = >e.getElementsByClassName(className); expect(list.length).toBe(1); let testDiv: HTMLDivElement = list[0]; expect(testDiv).toBeDefined(); expect(testDiv instanceof HTMLDivElement).toBeTruthy(); } done(); }); let vNode1: vd.VNode = vd.h("div.testdiv1", []); let vNode2: vd.VNode = vd.h("div.testdiv2", []); domRenderer.render$.next({ name: "test1", vNode: vNode1 }); domRenderer.render$.next({ name: "test2", vNode: vNode2 }); }); it("should apply patch", (done: Function) => { let element: HTMLDivElement = document.createElement("div"); let renderService: RenderService = new RenderService(element, observableEmpty(), RenderMode.Letterbox); let domRenderer: DOMRenderer = new DOMRenderer(element, renderService, observableEmpty()); domRenderer.element$.pipe( skip(1)) .subscribe( (e: Element): void => { let list1: HTMLCollectionOf = >e.getElementsByClassName("testdiv1"); expect(list1.length).toBe(0); let list2: HTMLCollectionOf = >e.getElementsByClassName("testdiv2"); expect(list2.length).toBe(1); let testDiv: HTMLDivElement = list2[0]; expect(testDiv).toBeDefined(); expect(testDiv instanceof HTMLDivElement).toBeTruthy(); done(); }); let vNode1: vd.VNode = vd.h("div.testdiv1", []); let vNode2: vd.VNode = vd.h("div.testdiv2", []); domRenderer.render$.next({ name: "test", vNode: vNode1 }); domRenderer.render$.next({ name: "test", vNode: vNode2 }); }); });