mapillary-js
Version:
WebGL JavaScript library for displaying street level imagery from mapillary.com
224 lines (160 loc) • 7.01 kB
text/typescript
import {skip} from "rxjs/operators";
import {ISpriteAtlas, SpriteService} from "../../src/Viewer";
class XMLHTTPRequestMock {
public response: string;
public responseType: string;
public onload: (e: Event) => any;
private _extension: string;
public open(...args: any[]): void {
this._extension = args[1].split(".").pop();
}
public send(...args: any[]): void { return; }
public fireLoad(extension: string): void {
if (extension === this._extension) {
this.onload(new Event("load"));
}
}
}
class ImageMock {
public src: string;
public onload: (e: Event) => any;
}
describe("SpriteService.ctor", () => {
it("should be initialized without retrieving sprite", () => {
let xmlHTTPRequestSpy: jasmine.Spy = spyOn(window, <keyof Window>"XMLHttpRequest");
let spriteService: SpriteService = new SpriteService();
expect(xmlHTTPRequestSpy.calls.count()).toBe(0);
return spriteService;
});
});
describe("SpriteService.spriteAtlas$", () => {
it("should emit a defined item when no sprite is provided", (done: Function) => {
let spriteService: SpriteService = new SpriteService();
spriteService.spriteAtlas$
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas).toBeDefined();
done();
});
});
it("should throw when trying to get a GL sprite for none loaded atlas", (done: Function) => {
let spriteService: SpriteService = new SpriteService();
spriteService.spriteAtlas$
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas.loaded).toBe(false);
expect(atlas.getGLSprite).toThrowError(Error);
done();
});
});
it("should throw when trying to get a GL sprite for none loaded atlas", (done: Function) => {
let spriteService: SpriteService = new SpriteService();
spriteService.spriteAtlas$
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas.loaded).toBe(false);
expect(atlas.getDOMSprite).toThrowError(Error);
done();
});
});
it("should emit an item that is not loaded when no sprite is provided", (done: Function) => {
let spriteService: SpriteService = new SpriteService();
spriteService.spriteAtlas$
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas.loaded).toBe(false);
done();
});
});
it("should retrieve an image if a sprite is provided", (done: Function) => {
let pngXmlHTTPRequestMock: XMLHTTPRequestMock = new XMLHTTPRequestMock();
let jsonXmlHTTPRequestMock: XMLHTTPRequestMock = new XMLHTTPRequestMock();
let imageMock: ImageMock = new ImageMock();
let json: boolean = false;
spyOn(window, <keyof Window>"XMLHttpRequest").and
.callFake((): XMLHTTPRequestMock => {
if (json) {
return jsonXmlHTTPRequestMock;
}
json = true;
return pngXmlHTTPRequestMock;
});
spyOn(window, "Blob").and.returnValue(<Blob>{});
spyOn(window.URL, "createObjectURL").and.returnValue("url");
let imageSpy: jasmine.Spy = spyOn(window, <keyof Window>"Image");
imageSpy.and.returnValue(imageMock);
let jsonSpy: jasmine.Spy = spyOn(JSON, "parse");
let spriteService: SpriteService = new SpriteService("sprite");
spriteService.spriteAtlas$.pipe(
skip(1))
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas.loaded).toBe(false);
expect(imageSpy.calls.count()).toBe(1);
expect(jsonSpy.calls.count()).toBe(0);
done();
});
pngXmlHTTPRequestMock.fireLoad("png");
imageMock.onload(new Event("load"));
});
it("should retrieve json definition if a sprite is provided", (done: Function) => {
let pngXmlHTTPRequestMock: XMLHTTPRequestMock = new XMLHTTPRequestMock();
let jsonXmlHTTPRequestMock: XMLHTTPRequestMock = new XMLHTTPRequestMock();
let json: boolean = false;
spyOn(window, <keyof Window>"XMLHttpRequest").and
.callFake((): XMLHTTPRequestMock => {
if (json) {
return jsonXmlHTTPRequestMock;
}
json = true;
return pngXmlHTTPRequestMock;
});
let imageSpy: jasmine.Spy = spyOn(window, <keyof Window>"Image");
let jsonSpy: jasmine.Spy = spyOn(JSON, "parse");
jsonSpy.and.returnValue({});
let spriteService: SpriteService = new SpriteService("sprite");
spriteService.spriteAtlas$.pipe(
skip(1))
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas.loaded).toBe(false);
expect(imageSpy.calls.count()).toBe(0);
expect(jsonSpy.calls.count()).toBe(1);
done();
});
jsonXmlHTTPRequestMock.fireLoad("json");
});
it("should be loaded when both image and json has been retrieved", (done: Function) => {
let pngXmlHTTPRequestMock: XMLHTTPRequestMock = new XMLHTTPRequestMock();
let jsonXmlHTTPRequestMock: XMLHTTPRequestMock = new XMLHTTPRequestMock();
let imageMock: ImageMock = new ImageMock();
let json: boolean = false;
spyOn(window, <keyof Window>"XMLHttpRequest").and
.callFake((): XMLHTTPRequestMock => {
if (json) {
return jsonXmlHTTPRequestMock;
}
json = true;
return pngXmlHTTPRequestMock;
});
spyOn(window, "Blob").and.returnValue(<Blob>{});
spyOn(window.URL, "createObjectURL").and.returnValue("url");
let imageSpy: jasmine.Spy = spyOn(window, <keyof Window>"Image");
imageSpy.and.returnValue(imageMock);
let jsonSpy: jasmine.Spy = spyOn(JSON, "parse");
jsonSpy.and.returnValue({});
let spriteService: SpriteService = new SpriteService("sprite");
spriteService.spriteAtlas$.pipe(
skip(2))
.subscribe(
(atlas: ISpriteAtlas): void => {
expect(atlas.loaded).toBe(true);
expect(imageSpy.calls.count()).toBe(1);
expect(jsonSpy.calls.count()).toBe(1);
done();
});
pngXmlHTTPRequestMock.fireLoad("png");
imageMock.onload(new Event("load"));
jsonXmlHTTPRequestMock.fireLoad("json");
});
});