mapillary-js/test/graph/Image.test.ts
Oscar Lorentzon 40a2d5e539 feat: add camera factory
Make it possible to register camera constructors.
Register default cameras.
Use camera factory when creating cameras.
2022-07-26 09:34:30 -07:00

235 lines
6.6 KiB
TypeScript

import { ImageHelper } from "../helper/ImageHelper";
import { Image as MImage } from "../../src/graph/Image";
import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt";
import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt";
import { MeshContract } from "../../src/api/contracts/MeshContract";
import { ImageCache } from "../../src/graph/ImageCache";
import { PerspectiveCamera } from "../../src/geometry/camera/PerspectiveCamera";
import { ICamera } from "../../src/geometry/interfaces/ICamera";
describe("Image", () => {
let helper: ImageHelper;
beforeEach(() => {
helper = new ImageHelper();
});
it("should create a image", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
expect(image).toBeDefined();
});
});
describe("Image.complete", () => {
let helper: ImageHelper;
beforeEach(() => {
helper = new ImageHelper();
});
it("should make image complete", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
expect(image.complete).toBe(false);
let fillImage: SpatialImageEnt = helper.createSpatialImageEnt();
image.makeComplete(fillImage);
expect(image.complete).toBe(true);
});
it("should throw when fill is null", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
expect(() => { image.makeComplete(null); }).toThrowError(Error);
});
});
describe("Image.dispose", () => {
let helper: ImageHelper;
beforeEach(() => {
helper = new ImageHelper();
});
it("should clear core and fill properties", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let fillImage: SpatialImageEnt = helper.createSpatialImageEnt();
image.makeComplete(fillImage);
image.dispose();
expect(image.complete).toBe(false);
expect(() => { return image.id; }).toThrowError(Error);
});
it("should dipose cache", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let imageCache: ImageCache = new ImageCache(undefined);
let disposeSpy: jasmine.Spy = spyOn(imageCache, "dispose");
disposeSpy.and.stub();
image.initializeCache(imageCache);
image.dispose();
expect(disposeSpy.calls.count()).toBe(1);
});
});
describe("Image.uncache", () => {
let helper: ImageHelper;
beforeEach(() => {
helper = new ImageHelper();
});
it("should handle when cache is not initilized", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
image.uncache();
});
it("should dispose image cache", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let imageCache: ImageCache = new ImageCache(undefined);
let disposeSpy: jasmine.Spy = spyOn(imageCache, "dispose");
disposeSpy.and.stub();
image.initializeCache(imageCache);
image.uncache();
expect(disposeSpy.calls.count()).toBe(1);
});
it("should be able to initialize cache again after uncache", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let imageCache: ImageCache = new ImageCache(undefined);
let disposeSpy: jasmine.Spy = spyOn(imageCache, "dispose");
disposeSpy.and.stub();
image.initializeCache(imageCache);
image.uncache();
image.initializeCache(imageCache);
});
});
describe("Image.merged", () => {
let helper: ImageHelper;
beforeEach(() => {
helper = new ImageHelper();
});
it("should not be merged when not complete", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
expect(image.merged).toBe(false);
});
it("should not be merged because merge cc is null", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let fillImage: SpatialImageEnt = helper.createSpatialImageEnt();
fillImage.merge_id = null;
image.makeComplete(fillImage);
expect(image.merged).toBe(false);
});
it("should be merged because merge cc present", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let fillImage: SpatialImageEnt = helper.createSpatialImageEnt();
fillImage.merge_id = "7";
image.makeComplete(fillImage);
expect(image.merged).toBe(true);
});
});
describe("Image.assetsCached", () => {
let helper: ImageHelper;
beforeEach(() => {
helper = new ImageHelper();
});
it("should not be cached when core", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
expect(image.assetsCached).toBe(false);
});
class ImageCacheMock extends ImageCache {
protected _overridingImage: HTMLImageElement;
protected _overridingMesh: MeshContract;
protected _overridingCamera: ICamera;
constructor() { super(undefined); }
public get image(): HTMLImageElement {
return this._overridingImage;
}
public set image(value: HTMLImageElement) {
this._overridingImage = value;
}
public get mesh(): MeshContract {
return this._overridingMesh;
}
public set mesh(value: MeshContract) {
this._overridingMesh = value;
}
public get camera(): ICamera {
return this._overridingCamera;
}
public set camera(value: ICamera) {
this._overridingCamera = value;
}
}
it("should be cached when assets set", () => {
let coreImage: CoreImageEnt = helper.createCoreImageEnt();
let image = new MImage(coreImage);
let fillImage: SpatialImageEnt = helper.createSpatialImageEnt();
image.makeComplete(fillImage);
let imageCache: ImageCacheMock = new ImageCacheMock();
imageCache.image = new Image();
imageCache.mesh = { faces: [], vertices: [] };
imageCache.camera = new PerspectiveCamera([1, 0, 0]);
image.initializeCache(imageCache);
expect(image.assetsCached).toBe(true);
});
});