import {
|
Resource,
|
ResourceCache,
|
ResourceLoaderState,
|
MetadataSchemaLoader,
|
when,
|
} from "../../Source/Cesium.js";
|
|
describe("Scene/MetadataSchemaLoader", function () {
|
var schemaJson = {
|
classes: {
|
tree: {
|
properties: {
|
height: {
|
componentType: "FLOAT32",
|
},
|
type: {
|
componentType: "ENUM",
|
enumType: "treeType",
|
},
|
},
|
},
|
},
|
enums: {
|
treeType: {
|
values: [
|
{
|
name: "Coniferous",
|
value: 0,
|
},
|
{
|
name: "Deciduous",
|
value: 1,
|
},
|
],
|
},
|
},
|
};
|
|
var resource = new Resource({ url: "https://example.com/schema.json" });
|
|
afterEach(function () {
|
ResourceCache.clearForSpecs();
|
});
|
|
it("throws if neither options.schema nor options.resource are defined", function () {
|
expect(function () {
|
return new MetadataSchemaLoader({
|
schema: undefined,
|
resource: undefined,
|
});
|
}).toThrowDeveloperError();
|
});
|
|
it("throws if both options.schema and options.resource are defined", function () {
|
expect(function () {
|
return new MetadataSchemaLoader({
|
resource: resource,
|
schema: schemaJson,
|
});
|
}).toThrowDeveloperError();
|
});
|
|
it("rejects promise if schema cannot be fetched", function () {
|
var error = new Error("404 Not Found");
|
spyOn(Resource.prototype, "fetchJson").and.returnValue(when.reject(error));
|
|
var schemaLoader = new MetadataSchemaLoader({
|
resource: resource,
|
});
|
|
schemaLoader.load();
|
|
return schemaLoader.promise
|
.then(function (schemaLoader) {
|
fail();
|
})
|
.otherwise(function (runtimeError) {
|
expect(runtimeError.message).toBe(
|
"Failed to load schema: https://example.com/schema.json\n404 Not Found"
|
);
|
});
|
});
|
|
it("loads schema from JSON", function () {
|
var schemaLoader = new MetadataSchemaLoader({
|
schema: schemaJson,
|
});
|
schemaLoader.load();
|
|
return schemaLoader.promise.then(function (schemaLoader) {
|
var schema = schemaLoader.schema;
|
expect(schema).toBeDefined();
|
|
var enums = schema.enums;
|
expect(enums.treeType).toBeDefined();
|
|
var classes = schema.classes;
|
expect(classes.tree).toBeDefined();
|
});
|
});
|
|
it("loads external schema", function () {
|
var fetchJson = spyOn(Resource.prototype, "fetchJson").and.returnValue(
|
when.resolve(schemaJson)
|
);
|
|
var schemaLoader = new MetadataSchemaLoader({
|
resource: resource,
|
});
|
|
schemaLoader.load();
|
|
return schemaLoader.promise.then(function (schemaLoader) {
|
expect(fetchJson).toHaveBeenCalled();
|
|
var schema = schemaLoader.schema;
|
expect(schema).toBeDefined();
|
|
var enums = schema.enums;
|
expect(enums.treeType).toBeDefined();
|
|
var classes = schema.classes;
|
expect(classes.tree).toBeDefined();
|
});
|
});
|
|
it("destroys schema", function () {
|
spyOn(Resource.prototype, "fetchJson").and.returnValue(
|
when.resolve(schemaJson)
|
);
|
|
var schemaLoader = new MetadataSchemaLoader({
|
resource: resource,
|
});
|
|
expect(schemaLoader.schema).not.toBeDefined();
|
|
schemaLoader.load();
|
|
return schemaLoader.promise.then(function (schemaLoader) {
|
expect(schemaLoader.schema).toBeDefined();
|
expect(schemaLoader.isDestroyed()).toBe(false);
|
|
schemaLoader.destroy();
|
expect(schemaLoader.schema).not.toBeDefined();
|
expect(schemaLoader.isDestroyed()).toBe(true);
|
});
|
});
|
|
function resolveJsonAfterDestroy(reject) {
|
var deferredPromise = when.defer();
|
spyOn(Resource.prototype, "fetchJson").and.returnValue(
|
deferredPromise.promise
|
);
|
|
var schemaLoader = new MetadataSchemaLoader({
|
resource: resource,
|
});
|
|
expect(schemaLoader.schema).not.toBeDefined();
|
|
schemaLoader.load();
|
expect(schemaLoader._state).toBe(ResourceLoaderState.LOADING);
|
schemaLoader.destroy();
|
|
if (reject) {
|
deferredPromise.reject(new Error());
|
} else {
|
deferredPromise.resolve(schemaJson);
|
}
|
|
expect(schemaLoader.schema).not.toBeDefined();
|
expect(schemaLoader.isDestroyed()).toBe(true);
|
}
|
|
it("handles resolving json after destroy", function () {
|
resolveJsonAfterDestroy(false);
|
});
|
|
it("handles rejecting json after destroy", function () {
|
resolveJsonAfterDestroy(true);
|
});
|
});
|