You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
6.9 KiB
JavaScript
247 lines
6.9 KiB
JavaScript
import { FeatureDetection } from "../../Source/Cesium.js";
|
|
import { TaskProcessor } from "../../Source/Cesium.js";
|
|
import absolutize from "../absolutize.js";
|
|
import { when } from "../../Source/Cesium.js";
|
|
|
|
describe("Core/TaskProcessor", function () {
|
|
var taskProcessor;
|
|
|
|
afterEach(function () {
|
|
if (taskProcessor && !taskProcessor.isDestroyed()) {
|
|
taskProcessor = taskProcessor.destroy();
|
|
}
|
|
});
|
|
|
|
it("works with a simple worker defined as relative to TaskProcessor._workerModulePrefix", function () {
|
|
TaskProcessor._workerModulePrefix = absolutize("../Specs/TestWorkers/");
|
|
taskProcessor = new TaskProcessor("returnParameters.js");
|
|
|
|
var parameters = {
|
|
prop: "blah",
|
|
obj: {
|
|
val: true,
|
|
},
|
|
};
|
|
|
|
return taskProcessor
|
|
.scheduleTask(parameters)
|
|
.then(function (result) {
|
|
expect(result).toEqual(parameters);
|
|
})
|
|
.always(function () {
|
|
TaskProcessor._workerModulePrefix =
|
|
TaskProcessor._defaultWorkerModulePrefix;
|
|
});
|
|
});
|
|
|
|
it("can be destroyed", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnParameters.js")
|
|
);
|
|
|
|
expect(taskProcessor.isDestroyed()).toEqual(false);
|
|
|
|
taskProcessor.destroy();
|
|
|
|
expect(taskProcessor.isDestroyed()).toEqual(true);
|
|
});
|
|
|
|
it("can transfer array buffer", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnByteLength.js")
|
|
);
|
|
|
|
var byteLength = 100;
|
|
var parameters = new ArrayBuffer(byteLength);
|
|
expect(parameters.byteLength).toEqual(byteLength);
|
|
|
|
return when(TaskProcessor._canTransferArrayBuffer, function (
|
|
canTransferArrayBuffer
|
|
) {
|
|
var promise = taskProcessor.scheduleTask(parameters, [parameters]);
|
|
|
|
if (canTransferArrayBuffer) {
|
|
// array buffer should be neutered when transferred
|
|
expect(parameters.byteLength).toEqual(0);
|
|
}
|
|
|
|
// the worker should see the array with proper byte length
|
|
return promise.then(function (result) {
|
|
expect(result).toEqual(byteLength);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("can transfer array buffer back from worker", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/transferArrayBuffer.js")
|
|
);
|
|
|
|
var byteLength = 100;
|
|
var parameters = {
|
|
byteLength: byteLength,
|
|
};
|
|
|
|
// the worker should see the array with proper byte length
|
|
return taskProcessor.scheduleTask(parameters).then(function (result) {
|
|
expect(result.byteLength).toEqual(100);
|
|
});
|
|
});
|
|
|
|
it("rejects promise if worker throws", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/throwError.js")
|
|
);
|
|
|
|
var message = "foo";
|
|
var parameters = {
|
|
message: message,
|
|
};
|
|
|
|
return taskProcessor
|
|
.scheduleTask(parameters)
|
|
.then(function () {
|
|
fail("should not be called");
|
|
})
|
|
.otherwise(function (error) {
|
|
expect(error.message).toEqual(message);
|
|
});
|
|
});
|
|
|
|
it("rejects promise if worker returns a non-clonable result", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnNonCloneable.js")
|
|
);
|
|
|
|
var message = "foo";
|
|
var parameters = {
|
|
message: message,
|
|
};
|
|
|
|
return taskProcessor
|
|
.scheduleTask(parameters)
|
|
.then(function () {
|
|
fail("should not be called");
|
|
})
|
|
.otherwise(function (error) {
|
|
expect(error).toContain("postMessage failed");
|
|
});
|
|
});
|
|
|
|
it("successful task raises the taskCompletedEvent", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnParameters.js")
|
|
);
|
|
|
|
var parameters = {
|
|
prop: "blah",
|
|
obj: {
|
|
val: true,
|
|
},
|
|
};
|
|
var eventRaised = false;
|
|
var removeListenerCallback = TaskProcessor.taskCompletedEvent.addEventListener(
|
|
function () {
|
|
eventRaised = true;
|
|
}
|
|
);
|
|
|
|
return taskProcessor
|
|
.scheduleTask(parameters)
|
|
.then(function (result) {
|
|
expect(eventRaised).toBe(true);
|
|
})
|
|
.always(function () {
|
|
removeListenerCallback();
|
|
});
|
|
});
|
|
|
|
it("unsuccessful task raises the taskCompletedEvent with error", function () {
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnNonCloneable.js")
|
|
);
|
|
|
|
var message = "foo";
|
|
var parameters = {
|
|
message: message,
|
|
};
|
|
|
|
var eventRaised = false;
|
|
var removeListenerCallback = TaskProcessor.taskCompletedEvent.addEventListener(
|
|
function (error) {
|
|
eventRaised = true;
|
|
expect(error).toBeDefined();
|
|
}
|
|
);
|
|
|
|
return taskProcessor
|
|
.scheduleTask(parameters)
|
|
.then(function () {
|
|
fail("should not be called");
|
|
})
|
|
.otherwise(function (error) {
|
|
expect(eventRaised).toBe(true);
|
|
})
|
|
.always(function () {
|
|
removeListenerCallback();
|
|
});
|
|
});
|
|
|
|
it("can load and compile web assembly module", function () {
|
|
var binaryUrl = absolutize("../Specs/TestWorkers/TestWasm/testWasm.wasm");
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnWasmConfig.js", 5)
|
|
);
|
|
var promise = taskProcessor.initWebAssemblyModule({
|
|
modulePath: "TestWasm/testWasmWrapper",
|
|
wasmBinaryFile: binaryUrl,
|
|
fallbackModulePath: "TestWasm/testWasmFallback",
|
|
});
|
|
|
|
return promise.then(function (result) {
|
|
expect(result).toBeDefined();
|
|
if (FeatureDetection.supportsWebAssembly()) {
|
|
expect(result.modulePath).toMatch(/TestWasm\/testWasmWrapper/);
|
|
expect(result.wasmBinary).toBeDefined();
|
|
}
|
|
});
|
|
});
|
|
|
|
it("uses a backup module if web assembly is not supported", function () {
|
|
var binaryUrl = absolutize("../Specs/TestWorkers/TestWasm/testWasm.wasm");
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnWasmConfig.js", 5)
|
|
);
|
|
|
|
spyOn(FeatureDetection, "supportsWebAssembly").and.returnValue(false);
|
|
|
|
var promise = taskProcessor.initWebAssemblyModule({
|
|
modulePath: "TestWasm/testWasmWrapper",
|
|
wasmBinaryFile: binaryUrl,
|
|
fallbackModulePath: "TestWasm/testWasmFallback",
|
|
});
|
|
|
|
return promise.then(function (result) {
|
|
expect(result).toBeDefined();
|
|
expect(result.modulePath).toMatch(/TestWasm\/testWasmFallback/);
|
|
expect(result.wasmBinary).not.toBeDefined();
|
|
});
|
|
});
|
|
|
|
it("throws runtime error if web assembly is not supported and no backup is provided", function () {
|
|
var binaryUrl = absolutize("../Specs/TestWorkers/TestWasm/testWasm.wasm");
|
|
taskProcessor = new TaskProcessor(
|
|
absolutize("../Specs/TestWorkers/returnWasmConfig.js", 5)
|
|
);
|
|
|
|
spyOn(FeatureDetection, "supportsWebAssembly").and.returnValue(false);
|
|
|
|
expect(function () {
|
|
taskProcessor.initWebAssemblyModule({
|
|
modulePath: "TestWasm/testWasmWrapper",
|
|
wasmBinaryFile: binaryUrl,
|
|
});
|
|
}).toThrowRuntimeError();
|
|
});
|
|
});
|