import { clone, combine, ImplicitSubdivisionScheme, ImplicitTileset, MetadataSchema, Resource, } from "../../Source/Cesium.js"; describe("Scene/ImplicitTileset", function () { var contentUriPattern = "https://example.com/{level}/{x}/{y}.b3dm"; var subtreeUriPattern = "https://example.com/{level}/{x}/{y}.subtree"; var implicitTileJson = { geometricError: 500, refine: "ADD", boundingVolume: { region: [0, 0, Math.PI / 24, Math.PI / 24, 0, 1000.0], }, content: { uri: contentUriPattern, extras: { author: "Cesium", }, }, extensions: { "3DTILES_implicit_tiling": { subdivisionScheme: "QUADTREE", subtreeLevels: 3, maximumLevel: 4, subtrees: { uri: subtreeUriPattern, }, }, }, extras: { creationDate: "2021-02-22", }, }; var baseResource = new Resource("https://example.com/tileset.json"); var contentUriTemplate = new Resource(contentUriPattern); var subtreeUriTemplate = new Resource(subtreeUriPattern); it("gathers information from both tile JSON and extension", function () { var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, implicitTileJson, metadataSchema ); expect(implicitTileset.metadataSchema).toBeUndefined(); expect(implicitTileset.subtreeLevels).toEqual(3); expect(implicitTileset.maximumLevel).toEqual(4); expect(implicitTileset.subdivisionScheme).toEqual( ImplicitSubdivisionScheme.QUADTREE ); expect(implicitTileset.boundingVolume).toEqual( implicitTileJson.boundingVolume ); expect(implicitTileset.refine).toEqual(implicitTileJson.refine); expect(implicitTileset.geometricError).toEqual(500); expect(implicitTileset.contentUriTemplates).toEqual([contentUriTemplate]); expect(implicitTileset.subtreeUriTemplate).toEqual(subtreeUriTemplate); }); it("stores a template of the tile JSON structure", function () { var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, implicitTileJson, metadataSchema ); var deep = true; var expected = clone(implicitTileJson, deep); delete expected.content; delete expected.extensions; expect(implicitTileset.tileHeader).toEqual(expected); }); it("tileHeader stores additional extensions", function () { var deep = true; var withExtensions = clone(implicitTileJson, deep); withExtensions.extensions["3DTILES_extension"] = {}; var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, withExtensions, metadataSchema ); var expected = clone(withExtensions, deep); delete expected.content; delete expected.extensions["3DTILES_implicit_tiling"]; expect(implicitTileset.tileHeader).toEqual(expected); }); it("stores a template of the tile content structure", function () { var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, implicitTileJson, metadataSchema ); expect(implicitTileset.contentHeaders[0]).toEqual(implicitTileJson.content); }); it("allows undefined content URI", function () { var noContentJson = clone(implicitTileJson); delete noContentJson.content; var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, noContentJson, metadataSchema ); expect(implicitTileset.contentUriTemplates).toEqual([]); }); it("accepts tilesets with 3DTILES_bounding_volume_S2", function () { var tileJson = clone(implicitTileJson, true); tileJson.boundingVolume = { extensions: { "3DTILES_bounding_volume_S2": { token: "1", minimumHeight: 0, maximumHeight: 100, }, }, }; var tileJsonS2 = tileJson.boundingVolume.extensions["3DTILES_bounding_volume_S2"]; var metadataSchema; var implicitTileset = new ImplicitTileset( baseResource, tileJson, metadataSchema ); var implicitTilesetS2 = implicitTileset.boundingVolume.extensions["3DTILES_bounding_volume_S2"]; expect(implicitTilesetS2.token).toEqual(tileJsonS2.token); expect(implicitTilesetS2.minimumHeight).toEqual(tileJsonS2.minimumHeight); expect(implicitTilesetS2.maximumHeight).toEqual(tileJsonS2.maximumHeight); }); it("rejects bounding spheres", function () { var sphereJson = { boundingVolume: { sphere: [0, 0, 0, 100], }, }; var tileJson = combine(sphereJson, implicitTileJson); var metadataSchema; // intentionally left undefined expect(function () { return new ImplicitTileset(baseResource, tileJson, metadataSchema); }).toThrowRuntimeError(); }); describe("3DTILES_multiple_contents", function () { var b3dmPattern = "https://example.com/{level}/{x}/{y}.b3dm"; var pntsPattern = "https://example.com/{level}/{x}/{y}.pnts"; var gltfPattern = "https://example.com/{level}/{x}/{y}.gltf"; var multipleContentTile = { geometricError: 500, refine: "ADD", boundingVolume: { region: [0, 0, Math.PI / 24, Math.PI / 24, 0, 1000.0], }, extensions: { "3DTILES_implicit_tiling": { subdivisionScheme: "QUADTREE", subtreeLevels: 3, maximumLevel: 4, subtrees: { uri: subtreeUriPattern, }, }, "3DTILES_multiple_contents": { content: [ { uri: b3dmPattern, }, { uri: pntsPattern, }, { uri: gltfPattern, }, ], }, }, }; it("gathers content URIs from multiple contents extension", function () { var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, multipleContentTile, metadataSchema ); expect(implicitTileset.contentUriTemplates).toEqual([ new Resource({ url: b3dmPattern }), new Resource({ url: pntsPattern }), new Resource({ url: gltfPattern }), ]); }); it("stores content JSON for every tile", function () { var deep = true; var withProperties = clone(multipleContentTile, deep); var extension = { "3DTILES_extension": {} }; var boundingBox = { box: [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1] }; var contents = withProperties.extensions["3DTILES_multiple_contents"].content; var i; for (i = 0; i < contents.length; i++) { contents[i].boundingVolume = boundingBox; contents[i].extensions = extension; } var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, withProperties, metadataSchema ); for (i = 0; i < implicitTileset.contentHeaders.length; i++) { expect(implicitTileset.contentHeaders[i]).toEqual(contents[i]); } }); it("template tileHeader does not store multiple contents extension", function () { var metadataSchema; // intentionally left undefined var implicitTileset = new ImplicitTileset( baseResource, multipleContentTile, metadataSchema ); expect(implicitTileset.tileHeader.extensions).not.toBeDefined(); }); }); describe("3DTILES_metadata", function () { it("stores metadataSchema", function () { var schema = { classes: { tile: { properties: { buildingCount: { type: "UINT16", }, }, }, }, }; var metadataSchema = new MetadataSchema(schema); var implicitTileset = new ImplicitTileset( baseResource, implicitTileJson, metadataSchema ); expect(implicitTileset.metadataSchema).toBeDefined(); expect(implicitTileset.metadataSchema.classes.tile).toBeDefined(); }); }); });