defineSuite([ 'Widgets/Cesium3DTilesInspector/Cesium3DTilesInspectorViewModel', 'Scene/Cesium3DTileset', 'Scene/Cesium3DTileStyle', 'Scene/Globe', 'Specs/createScene', 'ThirdParty/when' ], function( Cesium3DTilesInspectorViewModel, Cesium3DTileset, Cesium3DTileStyle, Globe, createScene, when) { 'use strict'; // Parent tile with content and four child tiles with content var tilesetUrl = './Data/Cesium3DTiles/Tilesets/Tileset/tileset.json'; var scene; var viewModel; var performanceContainer = document.createElement('div'); beforeAll(function() { scene = createScene(); }); afterAll(function() { scene.destroyForSpecs(); }); beforeEach(function() { scene.globe = new Globe(); scene.initializeFrame(); }); afterEach(function() { scene.primitives.removeAll(); }); it('can create and destroy', function() { var viewModel = new Cesium3DTilesInspectorViewModel(scene, performanceContainer); expect(viewModel._scene).toBe(scene); expect(viewModel.isDestroyed()).toEqual(false); viewModel.destroy(); expect(viewModel.isDestroyed()).toEqual(true); }); it('throws if scene is undefined', function() { expect(function() { return new Cesium3DTilesInspectorViewModel(); }).toThrowDeveloperError(); }); it('throws if performanceContainer is undefined', function() { expect(function() { return new Cesium3DTilesInspectorViewModel(scene); }).toThrowDeveloperError(); }); describe('tileset options', function() { it('show properties', function() { viewModel = new Cesium3DTilesInspectorViewModel(scene, performanceContainer); var tileset = new Cesium3DTileset({ url : tilesetUrl }); viewModel.tileset = tileset; var done = when.defer(); tileset.readyPromise.then(function() { expect(viewModel.properties.indexOf('id') !== -1).toBe(true); expect(viewModel.properties.indexOf('Longitude') !== -1).toBe(true); expect(viewModel.properties.indexOf('Latitude') !== -1).toBe(true); expect(viewModel.properties.indexOf('Height') !== -1).toBe(true); viewModel.destroy(); done.resolve(); }); return done; }); }); describe('display options', function() { beforeAll(function() { viewModel = new Cesium3DTilesInspectorViewModel(scene, performanceContainer); var tileset = new Cesium3DTileset({ url : tilesetUrl }); viewModel.tileset = tileset; return tileset.readyPromise; }); afterAll(function() { viewModel.destroy(); }); it('colorize', function() { viewModel.colorize = true; expect(viewModel.tileset.debugColorizeTiles).toBe(true); viewModel.colorize = false; expect(viewModel.tileset.debugColorizeTiles).toBe(false); }); it('wireframe', function() { viewModel.wireframe = true; expect(viewModel.tileset.debugWireframe).toBe(true); viewModel.wireframe = false; expect(viewModel.tileset.debugWireframe).toBe(false); }); it('showBoundingVolumes', function() { viewModel.showBoundingVolumes = true; expect(viewModel.tileset.debugShowBoundingVolume).toBe(true); viewModel.showBoundingVolumes = false; expect(viewModel.tileset.debugShowBoundingVolume).toBe(false); }); it('showContentVolumes', function() { viewModel.showContentBoundingVolumes = true; expect(viewModel.tileset.debugShowContentBoundingVolume).toBe(true); viewModel.showContentBoundingVolumes = false; expect(viewModel.tileset.debugShowContentBoundingVolume).toBe(false); }); it('showRequestVolumes', function() { viewModel.showRequestVolumes = true; expect(viewModel.tileset.debugShowViewerRequestVolume).toBe(true); viewModel.showRequestVolumes = false; expect(viewModel.tileset.debugShowViewerRequestVolume).toBe(false); }); it('showOnlyPickedTileDebugLabel', function() { viewModel.showOnlyPickedTileDebugLabel = true; expect(viewModel.tileset.debugPickedTileLabelOnly).toBe(true); viewModel.showOnlyPickedTileDebugLabel = false; expect(viewModel.tileset.debugPickedTileLabelOnly).toBe(false); }); it('showGeometricError', function() { viewModel.showGeometricError = true; expect(viewModel.tileset.debugShowGeometricError).toBe(true); viewModel.showGeometricError = false; expect(viewModel.tileset.debugShowGeometricError).toBe(false); }); it('showRenderingStatistics', function() { viewModel.showRenderingStatistics = true; expect(viewModel.tileset.debugShowRenderingStatistics).toBe(true); viewModel.showRenderingStatistics = false; expect(viewModel.tileset.debugShowRenderingStatistics).toBe(false); }); it('showMemoryUsage', function() { viewModel.showMemoryUsage = true; expect(viewModel.tileset.debugShowMemoryUsage).toBe(true); viewModel.showMemoryUsage = false; expect(viewModel.tileset.debugShowMemoryUsage).toBe(false); }); it('showUrl', function() { viewModel.showUrl = true; expect(viewModel.tileset.debugShowUrl).toBe(true); viewModel.showUrl = false; expect(viewModel.tileset.debugShowUrl).toBe(false); }); it('pointCloudShading', function() { viewModel.pointCloudShading = true; expect(viewModel.tileset.pointCloudShading.attenuation).toBe(true); viewModel.pointCloudShading = false; expect(viewModel.tileset.pointCloudShading.attenuation).toBe(false); }); it('geometricErrorScale', function() { viewModel.geometricErrorScale = 1.0; expect(viewModel.tileset.pointCloudShading.geometricErrorScale).toBe(1.0); viewModel.geometricErrorScale = 0.0; expect(viewModel.tileset.pointCloudShading.geometricErrorScale).toBe(0.0); }); it('maximumAttenuation', function() { viewModel.maximumAttenuation = 1.0; expect(viewModel.tileset.pointCloudShading.maximumAttenuation).toBe(1.0); viewModel.maximumAttenuation = 0.0; expect(viewModel.tileset.pointCloudShading.maximumAttenuation).not.toBeDefined(); }); it('baseResolution', function() { viewModel.baseResolution = 1.0; expect(viewModel.tileset.pointCloudShading.baseResolution).toBe(1.0); viewModel.baseResolution = 0.0; expect(viewModel.tileset.pointCloudShading.baseResolution).not.toBeDefined(); }); it('eyeDomeLighting', function() { viewModel.eyeDomeLighting = true; expect(viewModel.tileset.pointCloudShading.eyeDomeLighting).toBe(true); viewModel.eyeDomeLighting = false; expect(viewModel.tileset.pointCloudShading.eyeDomeLighting).toBe(false); }); it('eyeDomeLightingStrength', function() { viewModel.eyeDomeLightingStrength = 1.0; expect(viewModel.tileset.pointCloudShading.eyeDomeLightingStrength).toBe(1.0); viewModel.eyeDomeLightingStrength = 0.0; expect(viewModel.tileset.pointCloudShading.eyeDomeLightingStrength).toBe(0.0); }); it('eyeDomeLightingRadius', function() { viewModel.eyeDomeLightingRadius = 1.0; expect(viewModel.tileset.pointCloudShading.eyeDomeLightingRadius).toBe(1.0); viewModel.eyeDomeLightingRadius = 0.0; expect(viewModel.tileset.pointCloudShading.eyeDomeLightingRadius).toBe(0.0); }); }); describe('update options', function() { beforeAll(function() { viewModel = new Cesium3DTilesInspectorViewModel(scene, performanceContainer); viewModel.tileset = new Cesium3DTileset({ url : tilesetUrl }); return viewModel.tileset.readyPromise; }); afterAll(function() { viewModel.destroy(); }); it('freeze frame', function() { viewModel.freezeFrame = false; expect(viewModel.tileset.debugFreezeFrame).toBe(false); viewModel.freezeFrame = true; expect(viewModel.tileset.debugFreezeFrame).toBe(true); }); it('maximum screen space error', function() { viewModel.dynamicScreenSpaceError = false; viewModel.maximumScreenSpaceError = 10; expect(viewModel.tileset.dynamicScreenSpaceError).toBe(false); expect(viewModel.tileset.maximumScreenSpaceError).toBe(10); }); it('dynamic screen space error', function() { viewModel.dynamicScreenSpaceError = true; viewModel.dynamicScreenSpaceErrorFactor = 2; viewModel.dynamicScreenSpaceErrorDensity = 0.1; expect(viewModel.tileset.dynamicScreenSpaceError).toBe(true); expect(viewModel.tileset.dynamicScreenSpaceErrorFactor).toBe(2); expect(viewModel.tileset.dynamicScreenSpaceErrorDensity).toBe(0.1); }); }); describe('style options', function() { var style; beforeAll(function() { style = new Cesium3DTileStyle({ color : { conditions : [ ['${Height} >= 83', "color('purple', 0.5)"], ['${Height} >= 80', "color('red')"], ['${Height} >= 70', "color('orange')"], ['${Height} >= 12', "color('yellow')"], ['${Height} >= 7', "color('lime')"], ['${Height} >= 1', "color('cyan')"], ['true', "color('blue')"] ] }, meta : { description : "'Building id ${id} has height ${Height}.'" } }); viewModel = new Cesium3DTilesInspectorViewModel(scene, performanceContainer); viewModel.tileset = new Cesium3DTileset({ url : tilesetUrl }); return viewModel.tileset.readyPromise; }); afterAll(function() { viewModel.destroy(); }); it('loads tileset style', function() { viewModel.tileset.style = style; viewModel._update(); expect(JSON.stringify(style.style)).toBe(JSON.stringify(JSON.parse(viewModel.styleString))); }); it('does not throw on invalid syntax', function() { expect(function() { viewModel.styleString = 'invalid'; }).not.toThrowError(); }); it('recompiles style', function() { viewModel._style = undefined; viewModel.tileset.style = style; viewModel._update(); var s = JSON.parse(viewModel.styleString); s.color = "color('red')"; viewModel.styleString = JSON.stringify(s); viewModel.compileStyle(); viewModel._update(); expect(viewModel.tileset.style.style.color).toBe("color('red')"); expect(viewModel.tileset.style.style.meta.description).toBe("'Building id ${id} has height ${Height}.'"); }); it('does not throw on invalid value', function() { expect(function() { viewModel.styleString = '{ "color": "color(1)" }'; }).not.toThrowError(); }); }); }, 'WebGL');