UNPKG

terriajs

Version:

Geospatial data visualization platform.

195 lines (177 loc) 7.12 kB
import { runInAction } from "mobx"; import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3"; import Color from "terriajs-cesium/Source/Core/Color"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import Matrix4 from "terriajs-cesium/Source/Core/Matrix4"; import Cesium3DTileFeature from "terriajs-cesium/Source/Scene/Cesium3DTileFeature"; import Cesium3DTileset from "terriajs-cesium/Source/Scene/Cesium3DTileset"; import ClippingPlane from "terriajs-cesium/Source/Scene/ClippingPlane"; import ClippingPlaneCollection from "terriajs-cesium/Source/Scene/ClippingPlaneCollection"; import Cesium3DTilesCatalogItem from "../../lib/Models/Catalog/CatalogItems/Cesium3DTilesCatalogItem"; import CommonStrata from "../../lib/Models/Definition/CommonStrata"; import Terria from "../../lib/Models/Terria"; describe("Cesium3dTilesMixin", function () { let terria: Terria; let cesium3dTiles: Cesium3DTilesCatalogItem; describe(" - loadClippingPlanes", function () { beforeEach(async function () { terria = new Terria({ baseUrl: "./" }); cesium3dTiles = new Cesium3DTilesCatalogItem("test", terria); runInAction(() => { cesium3dTiles.setTrait( "definition", "url", "test/Cesium3DTiles/tileset.json" ); cesium3dTiles.setTrait("definition", "clippingPlanes", { enabled: true, unionClippingRegions: false, planes: [ { normal: [-1, 0.0, 0.0], distance: 40 } ], modelMatrix: [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], edgeColor: "blue", edgeWidth: 12.0 }); }); await cesium3dTiles.loadMetadata(); }); it(" - Property ClippingPlaneCollection to be defined", function () { expect(cesium3dTiles.clippingPlaneCollection).toBeDefined(); }); it(" - Property ClippingPlaneCollection is a ClippingPlaneCollection type", function () { expect( cesium3dTiles.clippingPlaneCollection instanceof ClippingPlaneCollection ).toBe(true); }); it(" - ClippingPlaneCollection must contain a ClippingPlane", function () { const cpc = cesium3dTiles.clippingPlaneCollection; expect( cpc?.contains( new ClippingPlane(Cartesian3.fromArray([-1, 0.0, 0.0]), 40) ) ).toBe(true); }); it(" - ClippingPlaneCollection must be enabled", function () { const cpc = cesium3dTiles.clippingPlaneCollection; expect(cpc?.enabled).toBe(true); }); it(" - ClippingPlaneCollection unionClippingRegions must be false", function () { const cpc = cesium3dTiles.clippingPlaneCollection; expect(cpc?.unionClippingRegions).toBe(false); }); it(" - ClippingPlaneCollection edgeWidth must be 12.0", function () { const cpc = cesium3dTiles.clippingPlaneCollection; expect(cpc?.edgeWidth).toBe(12.0); }); it(" - ClippingPlaneCollection edgeColor must be Blue", function () { const cpc = cesium3dTiles.clippingPlaneCollection; expect(cpc?.edgeColor.equals(Color.BLUE)).toBe(true); }); it(" - ClippingPlaneCollection must content Identity Matrix as modelMatrix", function () { const cpc = cesium3dTiles.clippingPlaneCollection; expect(cpc?.modelMatrix.equals(Matrix4.IDENTITY)).toBe(true); }); }); describe("tileset style", function () { describe("show expression from filter", function () { it("casts the property to number", async function () { terria = new Terria({ baseUrl: "./" }); cesium3dTiles = new Cesium3DTilesCatalogItem("test", terria); cesium3dTiles.setTrait( CommonStrata.user, "url", "test/Cesium3DTiles/tileset.json" ); const filter = cesium3dTiles.addObject( CommonStrata.user, "filters", "level-filter" ); filter?.setTrait(CommonStrata.user, "name", "Level filter"); filter?.setTrait(CommonStrata.user, "property", "level"); filter?.setTrait(CommonStrata.user, "minimumValue", 0); filter?.setTrait(CommonStrata.user, "maximumValue", 42); filter?.setTrait(CommonStrata.user, "minimumShown", 10); filter?.setTrait(CommonStrata.user, "maximumShown", 20); await cesium3dTiles.loadMapItems(); const tileset = cesium3dTiles.mapItems[0] as Cesium3DTileset; const show = tileset.style?.show; const expr = (show as any)?.expression as string; expect(expr).toBeDefined(); if (expr) { const [cond1, cond2] = expr.split("&&"); expect(cond1.trim().startsWith("Number(${feature['level']})")).toBe( true ); expect(cond2.trim().startsWith("Number(${feature['level']})")).toBe( true ); } }); }); }); describe("lightColor", function () { it("sets the light color of the tileset", async function () { terria = new Terria({ baseUrl: "./" }); cesium3dTiles = new Cesium3DTilesCatalogItem("test", terria); cesium3dTiles.setTrait( CommonStrata.user, "url", "test/Cesium3DTiles/tileset.json" ); cesium3dTiles.setTrait(CommonStrata.user, "lightColor", [255, 0, 0]); await cesium3dTiles.loadMapItems(); const tileset = cesium3dTiles.mapItems[0] as Cesium3DTileset; expect(tileset.lightColor).toEqual(new Cartesian3(255, 0, 0)); }); }); describe("getSelectorForFeature", function () { it("returns a style expression for selecting the given feature if it can be constructed", function () { const item = new Cesium3DTilesCatalogItem("test", terria); item.setTrait(CommonStrata.user, "featureIdProperties", [ "locality", "building-no" ]); const fakeTileFeature = new Cesium3DTileFeature(); spyOn(fakeTileFeature, "getProperty").and.callFake((property: string) => property === "locality" ? "foo" : property === "building-no" ? 4242 : undefined ); const selector = item.getSelectorForFeature(fakeTileFeature); expect(selector).toBe('${building-no} === 4242 && ${locality} === "foo"'); }); }); describe("tileset modelMatrix", function () { it("when no transformation traits are set - should be same as the root transform", function () { expect( cesium3dTiles.modelMatrix.equalsEpsilon( Matrix4.fromArray([ -0.0010050878773394923, -0.010020359590716663, 0.00011650340166541126, 0, -0.006002102620114645, 0.0006957193601463293, 0.008057426370782056, 0, -0.008024708312922119, 0.000734676293133252, -0.006041166133112854, 0, -5088199.73081417, 465822.6898719493, -3804844.213142962, 1 ]), // Compare up to 6 digits precision CesiumMath.EPSILON6 ) ).toBe(true); }); }); });