import { Clock } from "../../../Source/Cesium.js"; import { defaultValue } from "../../../Source/Cesium.js"; import { EllipsoidTerrainProvider } from "../../../Source/Cesium.js"; import { ScreenSpaceEventHandler } from "../../../Source/Cesium.js"; import { WebMercatorProjection } from "../../../Source/Cesium.js"; import { Camera } from "../../../Source/Cesium.js"; import { ImageryLayerCollection } from "../../../Source/Cesium.js"; import { Scene } from "../../../Source/Cesium.js"; import { SceneMode } from "../../../Source/Cesium.js"; import { SkyBox } from "../../../Source/Cesium.js"; import { TileCoordinatesImageryProvider } from "../../../Source/Cesium.js"; import DomEventSimulator from "../../DomEventSimulator.js"; import getWebGLStub from "../../getWebGLStub.js"; import pollToPromise from "../../pollToPromise.js"; import { CesiumWidget } from "../../../Source/Cesium.js"; describe( "Widgets/CesiumWidget/CesiumWidget", function () { var container; var widget; beforeEach(function () { container = document.createElement("div"); container.id = "container"; container.style.width = "1px"; container.style.height = "1px"; container.style.overflow = "hidden"; container.style.position = "relative"; document.body.appendChild(container); }); afterEach(function () { if (widget && !widget.isDestroyed()) { widget = widget.destroy(); } document.body.removeChild(container); }); function createCesiumWidget(container, options) { options = defaultValue(options, {}); options.contextOptions = defaultValue(options.contextOptions, {}); options.contextOptions.webgl = defaultValue( options.contextOptions.webgl, {} ); if (!!window.webglStub) { options.contextOptions.getWebGLStub = getWebGLStub; } return new CesiumWidget(container, options); } it("can create, render, and destroy", function () { widget = createCesiumWidget(container); expect(widget.isDestroyed()).toEqual(false); expect(widget.container).toBeInstanceOf(HTMLElement); expect(widget.canvas).toBeInstanceOf(HTMLElement); expect(widget.creditContainer).toBeInstanceOf(HTMLElement); expect(widget.creditViewport).toBeInstanceOf(HTMLElement); expect(widget.scene).toBeInstanceOf(Scene); expect(widget.imageryLayers).toBeInstanceOf(ImageryLayerCollection); expect(widget.terrainProvider).toBeInstanceOf(EllipsoidTerrainProvider); expect(widget.camera).toBeInstanceOf(Camera); expect(widget.clock).toBeInstanceOf(Clock); expect(widget.screenSpaceEventHandler).toBeInstanceOf( ScreenSpaceEventHandler ); expect(widget.useBrowserRecommendedResolution).toBe(true); widget.render(); widget.destroy(); expect(widget.isDestroyed()).toEqual(true); }); it("can pass id string for container", function () { widget = createCesiumWidget("container"); }); it("sets expected options clock", function () { var options = { clock: new Clock(), }; widget = createCesiumWidget(container, options); expect(widget.clock).toBe(options.clock); }); it("can set scene mode 2D", function () { widget = createCesiumWidget(container, { sceneMode: SceneMode.SCENE2D, }); widget.scene.completeMorph(); expect(widget.scene.mode).toBe(SceneMode.SCENE2D); }); it("can set map projection", function () { var mapProjection = new WebMercatorProjection(); widget = createCesiumWidget(container, { mapProjection: mapProjection, }); expect(widget.scene.mapProjection).toEqual(mapProjection); }); it("can set scene mode Columbus", function () { widget = createCesiumWidget(container, { sceneMode: SceneMode.COLUMBUS_VIEW, }); widget.scene.completeMorph(); expect(widget.scene.mode).toBe(SceneMode.COLUMBUS_VIEW); }); it("can disable render loop", function () { widget = createCesiumWidget(container, { useDefaultRenderLoop: false, }); expect(widget.useDefaultRenderLoop).toBe(false); }); it("can set target frame rate", function () { widget = createCesiumWidget(container, { targetFrameRate: 23, }); expect(widget.targetFrameRate).toBe(23); }); it("sets expected options imageryProvider", function () { var options = { imageryProvider: new TileCoordinatesImageryProvider(), }; widget = createCesiumWidget(container, options); var imageryLayers = widget.scene.imageryLayers; expect(imageryLayers.length).toEqual(1); expect(imageryLayers.get(0).imageryProvider).toBe( options.imageryProvider ); }); it("does not create an ImageryProvider if option is false", function () { widget = createCesiumWidget(container, { imageryProvider: false, }); var imageryLayers = widget.scene.imageryLayers; expect(imageryLayers.length).toEqual(0); }); it("sets expected options terrainProvider", function () { var options = { terrainProvider: new EllipsoidTerrainProvider(), }; widget = createCesiumWidget(container, options); expect(widget.terrainProvider).toBe(options.terrainProvider); var anotherProvider = new EllipsoidTerrainProvider(); widget.terrainProvider = anotherProvider; expect(widget.terrainProvider).toBe(anotherProvider); }); it("does not create a globe if option is false", function () { widget = createCesiumWidget(container, { globe: false, }); expect(widget.scene.globe).not.toBeDefined(); }); it("does not create a skyBox if option is false", function () { widget = createCesiumWidget(container, { skyBox: false, }); expect(widget.scene.skyBox).not.toBeDefined(); }); it("does not create a skyAtmosphere if option is false", function () { widget = createCesiumWidget(container, { skyAtmosphere: false, }); expect(widget.scene.skyAtmosphere).not.toBeDefined(); }); it("sets expected options skyBox", function () { var options = { skyBox: new SkyBox({ sources: { positiveX: "./Data/Images/Blue.png", negativeX: "./Data/Images/Green.png", positiveY: "./Data/Images/Blue.png", negativeY: "./Data/Images/Green.png", positiveZ: "./Data/Images/Blue.png", negativeZ: "./Data/Images/Green.png", }, }), }; widget = createCesiumWidget(container, options); expect(widget.scene.skyBox).toBe(options.skyBox); }); it("can set contextOptions", function () { var webglOptions = { alpha: true, depth: true, //TODO Change to false when https://bugzilla.mozilla.org/show_bug.cgi?id=745912 is fixed. stencil: true, antialias: false, premultipliedAlpha: true, // Workaround IE 11.0.8, which does not honor false. preserveDrawingBuffer: true, powerPreference: "low-power", }; var contextOptions = { allowTextureFilterAnisotropic: false, webgl: webglOptions, }; widget = createCesiumWidget(container, { contextOptions: contextOptions, }); var context = widget.scene.context; var contextAttributes = context._gl.getContextAttributes(); expect(context.options.allowTextureFilterAnisotropic).toEqual(false); expect(contextAttributes.alpha).toEqual(webglOptions.alpha); expect(contextAttributes.depth).toEqual(webglOptions.depth); expect(contextAttributes.stencil).toEqual(webglOptions.stencil); expect(contextAttributes.antialias).toEqual(webglOptions.antialias); expect(contextAttributes.premultipliedAlpha).toEqual( webglOptions.premultipliedAlpha ); expect(contextAttributes.powerPreference).toEqual( webglOptions.powerPreference ); expect(contextAttributes.preserveDrawingBuffer).toEqual( webglOptions.preserveDrawingBuffer ); }); it("can disable Order Independent Translucency", function () { widget = createCesiumWidget(container, { orderIndependentTranslucency: false, }); expect(widget.scene.orderIndependentTranslucency).toBe(false); }); it("can enable requestRenderMode", function () { widget = createCesiumWidget(container, { requestRenderMode: true, }); expect(widget.scene.requestRenderMode).toBe(true); }); it("can set maximumRenderTimeChange", function () { widget = createCesiumWidget(container, { maximumRenderTimeChange: Number.POSITIVE_INFINITY, }); expect(widget.scene.maximumRenderTimeChange).toBe( Number.POSITIVE_INFINITY ); }); it("throws if no container provided", function () { expect(function () { return createCesiumWidget(undefined); }).toThrowDeveloperError(); }); it("throws if targetFrameRate less than 0", function () { widget = createCesiumWidget(container); expect(function () { widget.targetFrameRate = -1; }).toThrowDeveloperError(); }); it("can set resolutionScale", function () { widget = createCesiumWidget(container); widget.resolutionScale = 0.5; expect(widget.resolutionScale).toBe(0.5); }); it("can enable useBrowserRecommendedResolution", function () { widget = createCesiumWidget(container, { useBrowserRecommendedResolution: true, }); expect(widget.useBrowserRecommendedResolution).toBe(true); }); it("useBrowserRecommendedResolution ignores devicePixelRatio", function () { var oldDevicePixelRatio = window.devicePixelRatio; window.devicePixelRatio = 2.0; widget = createCesiumWidget(container, { useDefaultRenderLoop: false, }); widget.resolutionScale = 0.5; widget.useBrowserRecommendedResolution = true; widget.resize(); expect(widget.scene.pixelRatio).toEqual(0.5); widget.useBrowserRecommendedResolution = false; widget.resize(); expect(widget.scene.pixelRatio).toEqual(1.0); window.devicePixelRatio = oldDevicePixelRatio; }); it("throws if resolutionScale is less than 0", function () { widget = createCesiumWidget(container); expect(function () { widget.resolutionScale = -1; }).toThrowDeveloperError(); }); it("resizing triggers a render in requestRender mode", function () { widget = createCesiumWidget(container, { requestRenderMode: true, maximumRenderTimeChange: Number.POSITIVE_INFINITY, }); var scene = widget._scene; spyOn(scene, "requestRender"); widget.resize(); expect(scene.requestRender).not.toHaveBeenCalled(); widget._forceResize = true; widget.resize(); expect(scene.requestRender).toHaveBeenCalled(); }); it("throws if no container id does not exist", function () { expect(function () { return createCesiumWidget("doesnotexist"); }).toThrowDeveloperError(); }); it("stops the render loop when render throws", function () { widget = createCesiumWidget(container); expect(widget.useDefaultRenderLoop).toEqual(true); var error = "foo"; widget.scene.primitives.update = function () { throw error; }; return pollToPromise(function () { return !widget.useDefaultRenderLoop; }, "render loop to be disabled."); }); it("shows the error panel when render throws", function () { widget = createCesiumWidget(container); var error = "foo"; widget.scene.primitives.update = function () { throw error; }; return pollToPromise(function () { return !widget.useDefaultRenderLoop; }).then(function () { expect( widget._element.querySelector(".cesium-widget-errorPanel") ).not.toBeNull(); var messages = widget._element.querySelectorAll( ".cesium-widget-errorPanel-message" ); var found = false; for (var i = 0; i < messages.length; ++i) { if (messages[i].textContent.indexOf(error) !== -1) { found = true; } } expect(found).toBe(true); // click the OK button to dismiss the panel DomEventSimulator.fireClick( widget._element.querySelector(".cesium-button") ); expect( widget._element.querySelector(".cesium-widget-errorPanel") ).toBeNull(); }); }); it("does not show the error panel if disabled", function () { widget = createCesiumWidget(container, { showRenderLoopErrors: false, }); var error = "foo"; widget.scene.primitives.update = function () { throw error; }; return pollToPromise(function () { return !widget.useDefaultRenderLoop; }).then(function () { expect( widget._element.querySelector(".cesium-widget-errorPanel") ).toBeNull(); }); }); }, "WebGL" );