diff --git a/README.md b/README.md index ff6573cfc..1ef308f95 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ You can use MapillaryJS as a ` @@ -48,9 +48,9 @@ Refer to the [Examples](https://github.com/mapillary/mapillary-js#examples) and - [Dynamic size](https://bl.ocks.org/oscarlorentzon/5af00c5c07448233bcb62f5e2124ab39) - [Load immediately](https://bl.ocks.org/oscarlorentzon/530cf3b89b8f5d1ecfdf4b79946caade) - [No cover](https://bl.ocks.org/oscarlorentzon/4f6f7ae5e86db7446f78ccea1eb6c2a7) -- [Initialize with or without a key](https://bl.ocks.org/oscarlorentzon/3eb61ce99b3c1cedba88942cb02f317d) +- [Initialize with or without an id](https://bl.ocks.org/oscarlorentzon/3eb61ce99b3c1cedba88942cb02f317d) - [Determine if viewer is navigable](https://bl.ocks.org/oscarlorentzon/898c55ef06917b07f165b7707d9f3a9e) -- [Move to key](https://bl.ocks.org/oscarlorentzon/317da436accbcf2ff04c642f86cefaf8) +- [Move to image](https://bl.ocks.org/oscarlorentzon/317da436accbcf2ff04c642f86cefaf8) - [Move in direction](https://bl.ocks.org/oscarlorentzon/63ac2aa3f0998f0c2d2b01a42c8babe4) - [Viewer options](https://bl.ocks.org/oscarlorentzon/08613728a283d1306b2848533852d22a) - [Subscribe to node changed](https://bl.ocks.org/oscarlorentzon/c5380e11fb3e84b8096f16737eb44820) @@ -83,10 +83,10 @@ Refer to the [Examples](https://github.com/mapillary/mapillary-js#examples) and - [Add one million interactive markers](https://bl.ocks.org/oscarlorentzon/999db12bc87c92d5c547b1e582989fc1) #### Mouse -- [Enable and disable mouse and touch handlers](https://bl.ocks.org/oscarlorentzon/37d28603212de2b8326bb65e49418368) +- [Activate and deactivate mouse and touch handlers](https://bl.ocks.org/oscarlorentzon/37d28603212de2b8326bb65e49418368) #### Keyboard -- [Enable and disable keyboard handlers](https://bl.ocks.org/oscarlorentzon/c92bbefbd4c74d4a490a8b37c85a1a7b) +- [Activate and deactivate keyboard handlers](https://bl.ocks.org/oscarlorentzon/c92bbefbd4c74d4a490a8b37c85a1a7b) #### Popup - [Display a popup](https://bl.ocks.org/oscarlorentzon/54182e3f3624cdeb7ca960d96ebfa5fb) diff --git a/debug/index.html b/debug/index.html index 04f3a72c6..2ec71205f 100644 --- a/debug/index.html +++ b/debug/index.html @@ -51,7 +51,7 @@ apiClient: "QjI1NnU0aG5FZFZISE56U3R5aWN4ZzpkYzg0NzE3MDA0YTRhZjlh", component: { cover: false }, container: "mly", - imageKey: "zarcRdNFZwg3FkXNcsFeGw", + imageId: "zarcRdNFZwg3FkXNcsFeGw", renderMode: Mapillary.RenderMode.Letterbox, }); @@ -70,9 +70,9 @@ let filterIndex = 0; const filters = [ [], - ["==", "cameraType", "equirectangular"], - ["==", "sequenceKey", "s5I5m7BvYykB677MpFnOIw"], - ["in", "sequenceKey", "s5I5m7BvYykB677MpFnOIw", "-aC4wx-8oOkCp6SFGXoyAg"], + ["==", "cameraType", "spherical"], + ["==", "sequenceId", "s5I5m7BvYykB677MpFnOIw"], + ["in", "sequenceId", "s5I5m7BvYykB677MpFnOIw", "-aC4wx-8oOkCp6SFGXoyAg"], [ "all", [">=", "capturedAt", 1370509079741 - 24 * 60 * 60 * 1000], diff --git a/debug/leaflet.html b/debug/leaflet.html index 51106c520..c0eb764c9 100644 --- a/debug/leaflet.html +++ b/debug/leaflet.html @@ -59,7 +59,7 @@ container: "mly", }); - mly.moveToKey("6Zhtztzt67fWmdd4OYH44w").then( + mly.moveTo("6Zhtztzt67fWmdd4OYH44w").then( () => { /* noop */ }, (e) => { console.error(e); }); diff --git a/debug/markers.html b/debug/markers.html index af889ee88..bd09b4025 100644 --- a/debug/markers.html +++ b/debug/markers.html @@ -101,7 +101,7 @@ }; // Start creating and adding markers when node has been set - mly.moveToKey("6Zhtztzt67fWmdd4OYH44w") + mly.moveTo("6Zhtztzt67fWmdd4OYH44w") .then( function (n) { let intervalId = window.setInterval(function () { diff --git a/debug/module.html b/debug/module.html index a0ebbd34f..4baf5c9e4 100644 --- a/debug/module.html +++ b/debug/module.html @@ -40,7 +40,7 @@ apiClient: "QjI1NnU0aG5FZFZISE56U3R5aWN4ZzpkYzg0NzE3MDA0YTRhZjlh", component: { cover: false }, container: container, - imageKey: "zarcRdNFZwg3FkXNcsFeGw", + imageId: "zarcRdNFZwg3FkXNcsFeGw", }); window.addEventListener("resize", function () { viewer.resize(); }); diff --git a/debug/popup.html b/debug/popup.html new file mode 100644 index 000000000..2949eb7c4 --- /dev/null +++ b/debug/popup.html @@ -0,0 +1,128 @@ + + + + + MapillaryJS Popup + + + + + + + + + + + + + + diff --git a/debug/provider.html b/debug/provider.html index f06b43b8e..116d51e9c 100644 --- a/debug/provider.html +++ b/debug/provider.html @@ -43,7 +43,7 @@ apiClient: new MyDataProvder({ clientToken: clientId }), component: { cover: false }, container: "mly", - imageKey: "zarcRdNFZwg3FkXNcsFeGw", + imageId: "zarcRdNFZwg3FkXNcsFeGw", }); window.addEventListener("resize", function () { viewer.resize(); }); diff --git a/debug/spatial.html b/debug/spatial.html index e093b23cc..9f340f844 100644 --- a/debug/spatial.html +++ b/debug/spatial.html @@ -33,7 +33,7 @@ apiClient: "QjI1NnU0aG5FZFZISE56U3R5aWN4ZzpkYzg0NzE3MDA0YTRhZjlh", component: { cover: false, stats: false, spatialData: true }, container: "mly", - imageKey: "zarcRdNFZwg3FkXNcsFeGw", + imageId: "zarcRdNFZwg3FkXNcsFeGw", }); window.addEventListener("resize", function () { viewer.resize(); }); @@ -103,9 +103,9 @@ var filterIndex = 0; var filters = [ [], - ["==", "cameraType", "equirectangular"], - ["==", "sequenceKey", "s5I5m7BvYykB677MpFnOIw"], - ["in", "sequenceKey", "s5I5m7BvYykB677MpFnOIw", "-aC4wx-8oOkCp6SFGXoyAg"], + ["==", "cameraType", "spherical"], + ["==", "sequenceId", "s5I5m7BvYykB677MpFnOIw"], + ["in", "sequenceId", "s5I5m7BvYykB677MpFnOIw", "-aC4wx-8oOkCp6SFGXoyAg"], ]; function setFilter() { filterIndex = (filterIndex + 1) % filters.length; diff --git a/debug/tags.html b/debug/tags.html index 31bb43c5e..640261960 100644 --- a/debug/tags.html +++ b/debug/tags.html @@ -44,7 +44,7 @@ apiClient: "QjI1NnU0aG5FZFZISE56U3R5aWN4ZzpkYzg0NzE3MDA0YTRhZjlh", component: { cover: false, tag: true }, container: "mly", - imageKey: "zarcRdNFZwg3FkXNcsFeGw", + imageId: "zarcRdNFZwg3FkXNcsFeGw", renderMode: Mapillary.RenderMode.Letterbox, }); diff --git a/docs/landing.md b/docs/landing.md index 07064fe80..cb21f8115 100644 --- a/docs/landing.md +++ b/docs/landing.md @@ -23,7 +23,7 @@ You can use MapillaryJS as a ` @@ -44,9 +44,9 @@ Refer to the [Examples](#examples) section below and the [Index](./modules.html) - [Dynamic size](https://bl.ocks.org/oscarlorentzon/5af00c5c07448233bcb62f5e2124ab39) - [Load immediately](https://bl.ocks.org/oscarlorentzon/530cf3b89b8f5d1ecfdf4b79946caade) - [No cover](https://bl.ocks.org/oscarlorentzon/4f6f7ae5e86db7446f78ccea1eb6c2a7) -- [Initialize with or without a key](https://bl.ocks.org/oscarlorentzon/3eb61ce99b3c1cedba88942cb02f317d) +- [Initialize with or without an image id](https://bl.ocks.org/oscarlorentzon/3eb61ce99b3c1cedba88942cb02f317d) - [Determine if viewer is navigable](https://bl.ocks.org/oscarlorentzon/898c55ef06917b07f165b7707d9f3a9e) -- [Move to key](https://bl.ocks.org/oscarlorentzon/317da436accbcf2ff04c642f86cefaf8) +- [Move to image id](https://bl.ocks.org/oscarlorentzon/317da436accbcf2ff04c642f86cefaf8) - [Move in direction](https://bl.ocks.org/oscarlorentzon/63ac2aa3f0998f0c2d2b01a42c8babe4) - [Viewer options](https://bl.ocks.org/oscarlorentzon/08613728a283d1306b2848533852d22a) - [Subscribe to node changed](https://bl.ocks.org/oscarlorentzon/c5380e11fb3e84b8096f16737eb44820) diff --git a/jest.config.js b/jest.config.js index 44d30e731..3322604f6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,8 +4,13 @@ export default { "/src/**/*", ], coveragePathIgnorePatterns: [ - "/src/Mapillary.js", + "/src/api/contracts/", + "/src/api/ents/", "/src/export/", + "/src/component/shaders/", + "/src/Mapillary.js", + "/src/viewer/events/", + "/src/viewer/options/", "interfaces" ], coverageProvider: "v8", diff --git a/package.json b/package.json index 62ffd8e99..fae030868 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A WebGL interactive street imagery library", "main": "dist/mapillary.js", "module": "dist/mapillary.module.js", - "style": "dist/mapillary.min.css", + "style": "dist/mapillary.css", "types": "dist/mapillary.d.ts", "type": "module", "license": "MIT", @@ -14,6 +14,7 @@ "imagery", "mapillary", "spatial-visualization", + "renderer", "street-imagery", "typescript", "viewer", @@ -99,7 +100,7 @@ "serve": "node server.js", "serve-docs": "python3 -m http.server", "start": "yarn start-init && concurrently --kill-others-on-fail -n 'compile,bundle,serve' 'yarn compile-watch' 'yarn bundle-watch' 'yarn serve'", - "start-init": "yarn clean-dist && yarn build-styles && yarn compile-incremental", + "start-init": "yarn clean-build && yarn clean-dist && yarn build-styles && yarn compile-incremental", "test": "yarn clean-build && yarn compile-test && jest" } } diff --git a/spec/Bootstrap.ts b/spec/Bootstrap.ts index c87ebe300..b4dc7cc8e 100644 --- a/spec/Bootstrap.ts +++ b/spec/Bootstrap.ts @@ -2,7 +2,7 @@ import { ComponentService } from "../src/component/ComponentService"; import { MarkerSet } from "../src/component/marker/MarkerSet"; import { Graph } from "../src/graph/Graph"; import { TraversingState } from "../src/state/states/TraversingState"; -import { IInterpolator } from "../src/utils/interfaces/IInterpolator"; +import { Interpolator } from "../src/state/interfaces/IInterpolator"; type Item = { lat: number; @@ -39,7 +39,7 @@ class SpatialIndexMock { class CoverMock { public activate(): void { /* noop */ } } -class InterpolatorMock implements IInterpolator { +class InterpolatorMock implements Interpolator { public solve(x: number): number { return x; } } diff --git a/spec/api/APIWrapper.spec.ts b/spec/api/APIWrapper.spec.ts index faebacf0d..d98938f8a 100644 --- a/spec/api/APIWrapper.spec.ts +++ b/spec/api/APIWrapper.spec.ts @@ -2,10 +2,10 @@ import { empty as observableEmpty, Observable } from "rxjs"; import { catchError } from "rxjs/operators"; import { APIWrapper } from "../../src/api/APIWrapper"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; -import { ISequence } from "../../src/api/interfaces/ISequence"; import { DataProvider } from "../helper/ProviderHelper"; +import { ImagesContract } from "../../src/api/contracts/ImagesContract"; +import { SpatialImagesContract } from "../../src/api/contracts/SpatialImagesContract"; +import { CoreImagesContract } from "../../src/api/contracts/CoreImagesContract"; describe("APIWrapperctor", () => { test("should create an APIWrapper instance", () => { @@ -23,16 +23,16 @@ describe("APIWrapperimageByKeyFill$", () => { }; const provider = new DataProvider(); - const providerSpy: jasmine.Spy = spyOn(provider, "getFillImages"); + const providerSpy: jasmine.Spy = spyOn(provider, "getSpatialImages"); providerSpy.and.returnValue(promise); const api: APIWrapper = new APIWrapper(provider); const key: string = "key"; - api.imageByKeyFill$([key]) + api.getSpatialImages$([key]) .subscribe( - (result: { [key: string]: IFillNode }): void => { + (result: SpatialImagesContract): void => { expect(result).toBeDefined(); expect(providerSpy.calls.count()).toBe(1); @@ -51,14 +51,14 @@ describe("APIWrapperimageByKeyFill$", () => { }; const provider = new DataProvider(); - const providerSpy: jasmine.Spy = spyOn(provider, "getFillImages"); + const providerSpy: jasmine.Spy = spyOn(provider, "getSpatialImages"); providerSpy.and.returnValue(promise); const api: APIWrapper = new APIWrapper(provider); const key: string = "key"; - api.imageByKeyFill$([key]).pipe( + api.getSpatialImages$([key]).pipe( catchError( (err: Error): Observable<{}> => { expect(err).toBeDefined(); @@ -82,16 +82,16 @@ describe("APIWrapperimageByKeyFull$", () => { }; const provider = new DataProvider(); - const providerSpy: jasmine.Spy = spyOn(provider, "getFullImages"); + const providerSpy: jasmine.Spy = spyOn(provider, "getImages"); providerSpy.and.returnValue(promise); const api: APIWrapper = new APIWrapper(provider); const key: string = "key"; - api.imageByKeyFull$([key]) + api.getImages$([key]) .subscribe( - (result: { [key: string]: IFillNode }): void => { + (result: ImagesContract): void => { expect(result).toBeDefined(); expect(providerSpy.calls.count()).toBe(1); @@ -110,14 +110,14 @@ describe("APIWrapperimageByKeyFull$", () => { }; const provider = new DataProvider(); - const providerSpy: jasmine.Spy = spyOn(provider, "getFullImages"); + const providerSpy: jasmine.Spy = spyOn(provider, "getImages"); providerSpy.and.returnValue(promise); const api: APIWrapper = new APIWrapper(provider); const key: string = "key"; - api.imageByKeyFull$([key]).pipe( + api.getImages$([key]).pipe( catchError( (err: Error): Observable<{}> => { expect(err).toBeDefined(); @@ -148,9 +148,9 @@ describe("APIWrapperimagesByH$", () => { const h: string = "h"; - api.imagesByH$(h) + api.getCoreImages$(h) .subscribe( - (result: { [key: string]: { [index: string]: ICoreNode } }): void => { + (result: CoreImagesContract): void => { expect(result).toBeDefined(); expect(providerSpy.calls.count()).toBe(1); @@ -163,7 +163,7 @@ describe("APIWrapperimagesByH$", () => { test("should pass on error", (done: Function) => { const promise: any = { - then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { + then: (_: (result: any) => void, reject: (error: Error) => void): void => { reject(new Error()); }, }; @@ -176,7 +176,7 @@ describe("APIWrapperimagesByH$", () => { const h: string = "h"; - api.imagesByH$(h).pipe( + api.getCoreImages$(h).pipe( catchError( (err: Error): Observable<{}> => { expect(err).toBeDefined(); @@ -207,9 +207,9 @@ describe("APIWrappersequenceByKey$", () => { const skey: string = "skey"; - api.sequenceByKey$([skey]) + api.getSequences$([skey]) .subscribe( - (result: { [key: string]: ISequence }): void => { + (result): void => { expect(result).toBeDefined(); expect(providerSpy.calls.count()).toBe(1); @@ -235,7 +235,7 @@ describe("APIWrappersequenceByKey$", () => { const skey: string = "skey"; - api.sequenceByKey$([skey]).pipe( + api.getSequences$([skey]).pipe( catchError( (err: Error): Observable<{}> => { expect(err).toBeDefined(); diff --git a/spec/api/DataProviderBase.spec.ts b/spec/api/DataProviderBase.spec.ts index b29b77ed8..d405a4672 100644 --- a/spec/api/DataProviderBase.spec.ts +++ b/spec/api/DataProviderBase.spec.ts @@ -1,4 +1,4 @@ -import { BufferFetcher } from "../../src/api/BufferFetcher"; +import { fetchArrayBuffer } from "../../src/api/Common"; import { DataProviderBase } from "../../src/api/DataProviderBase"; import { MapillaryError } from "../../src/error/MapillaryError"; import { GeometryProvider } from "../helper/ProviderHelper"; @@ -22,7 +22,7 @@ class XMLHTTPRequestMock { export class DataProvider extends DataProviderBase { constructor() { super(new GeometryProvider()); } public getArrayBuffer(abort?: Promise): Promise { - return BufferFetcher.getArrayBuffer("", abort); + return fetchArrayBuffer("", abort); } } diff --git a/spec/api/S2GeometryProvider.spec.ts b/spec/api/S2GeometryProvider.spec.ts index 634973b0d..c5110e642 100644 --- a/spec/api/S2GeometryProvider.spec.ts +++ b/spec/api/S2GeometryProvider.spec.ts @@ -1,6 +1,6 @@ import { S2 } from "s2-geometry"; -import { ICellCorners } from "../../src/api/interfaces/ICellCorners"; -import { ILatLon } from "../../src/api/interfaces/ILatLon"; +import { CellCorners } from "../../src/api/interfaces/CellCorners"; +import { LatLon } from "../../src/api/interfaces/LatLon"; import { S2GeometryProvider } from "../../src/api/S2GeometryProvider"; import { MapillaryError } from "../../src/error/MapillaryError"; import { GeoCoords } from "../../src/geo/GeoCoords"; @@ -217,7 +217,7 @@ describe("S2GeometryProvider.getCorners", () => { it("should be correctly placed relative to each other", () => { const geometry: S2GeometryProvider = new S2GeometryProvider(); - const latLons: ILatLon[] = [ + const latLons: LatLon[] = [ { lat: 0, lon: 0 }, { lat: 45, lon: 0 }, { lat: 0, lon: 45 }, @@ -232,7 +232,7 @@ describe("S2GeometryProvider.getCorners", () => { for (let latLon of latLons) { const cellId: string = geometry.latLonToCellId(latLon); - const corners: ICellCorners = geometry.getCorners(cellId); + const corners: CellCorners = geometry.getCorners(cellId); expect(corners.se.lat).toBeLessThan(corners.ne.lat); expect(corners.se.lat).toBeLessThan(corners.nw.lat); diff --git a/spec/api/FalcorDataProvider.spec.ts b/spec/api/falcor/FalcorDataProvider.spec.ts similarity index 80% rename from spec/api/FalcorDataProvider.spec.ts rename to spec/api/falcor/FalcorDataProvider.spec.ts index ff818fe04..d56ba2761 100644 --- a/spec/api/FalcorDataProvider.spec.ts +++ b/spec/api/falcor/FalcorDataProvider.spec.ts @@ -1,12 +1,13 @@ import * as pako from "pako"; import * as falcor from "falcor"; -import { FalcorDataProvider } from "../../src/api/FalcorDataProvider"; -import { IClusterReconstruction } from "../../src/api/interfaces/IClusterReconstruction"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; -import { ISequence } from "../../src/api/interfaces/ISequence"; -import { ModelCreator } from "../../src/api/ModelCreator"; -import { MapillaryError } from "../../src/error/MapillaryError"; +import { FalcorDataProvider } from "../../../src/api/falcor/FalcorDataProvider"; +import { ClusterReconstructionContract } from "../../../src/api/contracts/ClusterReconstructionContract"; +import { FalcorModelCreator } from "../../../src/api/falcor/FalcorModelCreator"; +import { MapillaryError } from "../../../src/error/MapillaryError"; +import { SpatialImagesContract } from "../../../src/api/contracts/SpatialImagesContract"; +import { ImagesContract } from "../../../src/api/contracts/ImagesContract"; +import { CoreImagesContract } from "../../../src/api/contracts/CoreImagesContract"; + describe("FalcorDataProvider.ctor", () => { it("should create a data provider", () => { @@ -24,11 +25,11 @@ describe("FalcorDataProvider.getFillImages", () => { }, }; - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const modelSpy: jasmine.Spy = spyOn(model, "get"); modelSpy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -37,11 +38,11 @@ describe("FalcorDataProvider.getFillImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; - provider.getFillImages([key]) + provider.getSpatialImages([key]) .then( - (result: { [key: string]: IFillNode }): void => { + (result: SpatialImagesContract): void => { expect(result).toBeDefined(); expect(modelSpy.calls.count()).toBe(1); @@ -61,11 +62,11 @@ describe("FalcorDataProvider.getFillImages", () => { }, }; - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const modelSpy: jasmine.Spy = spyOn(model, "get"); modelSpy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -74,9 +75,9 @@ describe("FalcorDataProvider.getFillImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; - provider.getFillImages([key]) + provider.getSpatialImages([key]) .catch( (err: Error): void => { expect(err).toBeDefined(); @@ -87,7 +88,7 @@ describe("FalcorDataProvider.getFillImages", () => { }); it("should invalidate model correctly when error is thrown", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -100,7 +101,7 @@ describe("FalcorDataProvider.getFillImages", () => { spyOn(model, "get").and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -109,9 +110,9 @@ describe("FalcorDataProvider.getFillImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; - provider.getFillImages([key]) + provider.getSpatialImages([key]) .then( (): void => { return; }, (): void => { @@ -127,7 +128,7 @@ describe("FalcorDataProvider.getFillImages", () => { }); it("should invalidate model for every error on retry", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -140,7 +141,7 @@ describe("FalcorDataProvider.getFillImages", () => { spyOn(model, "get").and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -149,13 +150,13 @@ describe("FalcorDataProvider.getFillImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; Promise .all([ - provider.getFillImages([key]), - provider.getFillImages([key]), - provider.getFillImages([key])]) + provider.getSpatialImages([key]), + provider.getSpatialImages([key]), + provider.getSpatialImages([key])]) .then( (): void => { return; }, (): void => { @@ -172,7 +173,7 @@ describe("FalcorDataProvider.getFillImages", () => { describe("FalcorDataProvider.getFullImages", () => { it("should call model correctly", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -183,7 +184,7 @@ describe("FalcorDataProvider.getFullImages", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -192,11 +193,11 @@ describe("FalcorDataProvider.getFullImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; - provider.getFullImages([key]) + provider.getImages([key]) .then( - (result: { [key: string]: IFillNode }): void => { + (result: ImagesContract): void => { expect(result).toBeDefined(); expect(spy.calls.count()).toBe(1); @@ -211,16 +212,16 @@ describe("FalcorDataProvider.getFullImages", () => { it("should throw when result is undefined", (done: Function) => { const promise: any = { - then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { + then: (resolve: (result: any) => void): void => { resolve(undefined); }, }; - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const modelSpy: jasmine.Spy = spyOn(model, "get"); modelSpy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -229,9 +230,9 @@ describe("FalcorDataProvider.getFullImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; - provider.getFullImages([key]) + provider.getImages([key]) .catch( (err: Error): void => { expect(err).toBeDefined(); @@ -242,7 +243,7 @@ describe("FalcorDataProvider.getFullImages", () => { }); it("should invalidate model correctly when error is thrown", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -255,7 +256,7 @@ describe("FalcorDataProvider.getFullImages", () => { spyOn(model, "get").and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -264,12 +265,12 @@ describe("FalcorDataProvider.getFullImages", () => { creator: creator, }); - const key: string = "key"; + const key = "key"; - provider.getFullImages([key]) + provider.getImages([key]) .then( - (result: { [key: string]: IFillNode }): void => { return; }, - (error: Error): void => { + (): void => { return; }, + (): void => { expect(invalidateSpy.calls.count()).toBe(1); expect(invalidateSpy.calls.first().args.length).toBe(1); expect(invalidateSpy.calls.first().args[0][0]).toBe("imageByKey"); @@ -284,7 +285,7 @@ describe("FalcorDataProvider.getFullImages", () => { describe("FalcorDataProvider.getCoreImages", () => { it("should call model correctly", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -295,7 +296,7 @@ describe("FalcorDataProvider.getCoreImages", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -304,25 +305,25 @@ describe("FalcorDataProvider.getCoreImages", () => { creator: creator, }); - const h: string = "h"; + const cellId = "h"; - provider.getCoreImages(h) + provider.getCoreImages(cellId) .then( - (result: { [key: string]: { [index: string]: ICoreNode } }): void => { + (result: CoreImagesContract): void => { expect(result).toBeDefined(); expect(spy.calls.count()).toBe(1); expect(spy.calls.first().args.length).toBe(1); expect(spy.calls.first().args[0][0]).toBe("imagesByH"); expect(spy.calls.first().args[0][1].length).toBe(1); - expect(spy.calls.first().args[0][1][0]).toBe(h); + expect(spy.calls.first().args[0][1][0]).toBe(cellId); done(); }); }); it("should invalidate model correctly when error is thrown", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -335,7 +336,7 @@ describe("FalcorDataProvider.getCoreImages", () => { spyOn(model, "get").and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -344,17 +345,17 @@ describe("FalcorDataProvider.getCoreImages", () => { creator: creator, }); - const h: string = "h"; + const cellId = "h"; - provider.getCoreImages(h) + provider.getCoreImages(cellId) .then( - (result: { [key: string]: { [index: string]: ICoreNode } }): void => { return; }, - (error: Error): void => { + (): void => { return; }, + (): void => { expect(invalidateSpy.calls.count()).toBe(1); expect(invalidateSpy.calls.first().args.length).toBe(1); expect(invalidateSpy.calls.first().args[0][0]).toBe("imagesByH"); expect(invalidateSpy.calls.first().args[0][1].length).toBe(1); - expect(invalidateSpy.calls.first().args[0][1][0]).toBe(h); + expect(invalidateSpy.calls.first().args[0][1][0]).toBe(cellId); done(); }, @@ -362,7 +363,7 @@ describe("FalcorDataProvider.getCoreImages", () => { }); it("should handle undefined response", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -373,7 +374,7 @@ describe("FalcorDataProvider.getCoreImages", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -382,13 +383,13 @@ describe("FalcorDataProvider.getCoreImages", () => { creator: creator, }); - const h: string = "h"; + const cellId = "h"; - provider.getCoreImages(h) + provider.getCoreImages(cellId) .then( - (result: { [key: string]: { [index: string]: ICoreNode } }): void => { + (result: CoreImagesContract): void => { expect(result).toBeDefined(); - expect(result[h]).toBeDefined(); + expect(result.images).toBeDefined(); done(); }); @@ -399,7 +400,7 @@ describe("FalcorDataProvider.getSequences", () => { it("should call model correctly", (done: Function) => { spyOn(console, "warn").and.stub(); - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -410,7 +411,7 @@ describe("FalcorDataProvider.getSequences", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -419,11 +420,11 @@ describe("FalcorDataProvider.getSequences", () => { creator: creator, }); - const skey: string = "skey"; + const skey = "skey"; provider.getSequences([skey]) .then( - (result: { [key: string]: ISequence }): void => { + (result): void => { expect(result).toBeDefined(); expect(spy.calls.count()).toBe(1); @@ -437,7 +438,7 @@ describe("FalcorDataProvider.getSequences", () => { }); it("should invalidate model correctly when error is thrown", (done: Function) => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -450,7 +451,7 @@ describe("FalcorDataProvider.getSequences", () => { spyOn(model, "get").and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -459,12 +460,12 @@ describe("FalcorDataProvider.getSequences", () => { creator: creator, }); - const skey: string = "skey"; + const skey = "skey"; provider.getSequences([skey]) .then( - (result: { [key: string]: ISequence }): void => { return; }, - (error: Error): void => { + (): void => { return; }, + (): void => { expect(invalidateSpy.calls.count()).toBe(1); expect(invalidateSpy.calls.first().args.length).toBe(1); expect(invalidateSpy.calls.first().args[0][0]).toBe("sequenceByKey"); @@ -479,10 +480,10 @@ describe("FalcorDataProvider.getSequences", () => { it("should call model correctly", (done: Function) => { spyOn(console, "warn").and.stub(); - const skey: string = "skey"; - const nkey: string = "nkey"; + const skey = "skey"; + const nkey = "nkey"; - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -493,7 +494,7 @@ describe("FalcorDataProvider.getSequences", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -504,12 +505,12 @@ describe("FalcorDataProvider.getSequences", () => { provider.getSequences([skey]) .then( - (result: { [key: string]: ISequence }): void => { + (result): void => { expect(result).toBeDefined(); - expect(result[skey]).toBeDefined(); - expect(result[skey].key).toBe(skey); - expect(result[skey].keys.length).toBe(1); - expect(result[skey].keys[0]).toBe(nkey); + expect(result[0]).toBeDefined(); + expect(result[0].node_id).toBe(skey); + expect(result[0].node.image_ids.length).toBe(1); + expect(result[0].node.image_ids[0]).toBe(nkey); done(); }); @@ -518,7 +519,7 @@ describe("FalcorDataProvider.getSequences", () => { it("should create empty sequence if return value is not defined", (done: Function) => { spyOn(console, "warn").and.stub(); - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -529,7 +530,7 @@ describe("FalcorDataProvider.getSequences", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -538,15 +539,16 @@ describe("FalcorDataProvider.getSequences", () => { creator: creator, }); - const skey: string = "skey"; + const skey = "skey"; provider.getSequences([skey]) .then( - (result: { [key: string]: ISequence }): void => { + (result): void => { expect(result).toBeDefined(); - expect(result[skey]).toBeDefined(); - expect(result[skey].key).toBe(skey); - expect(result[skey].keys.length).toBe(0); + expect(result[0]).toBeDefined(); + expect(result[0].node_id).toBe(skey); + expect(result[0].node.id).toBe(skey); + expect(result[0].node.image_ids.length).toBe(0); done(); }); @@ -555,7 +557,7 @@ describe("FalcorDataProvider.getSequences", () => { it("should populate empty sequence if missing", (done: Function) => { spyOn(console, "warn").and.stub(); - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const promise: any = { then: (resolve: (result: any) => void, reject: (error: Error) => void): void => { @@ -566,7 +568,7 @@ describe("FalcorDataProvider.getSequences", () => { const spy: jasmine.Spy = spyOn(model, "get"); spy.and.returnValue(promise); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -575,15 +577,16 @@ describe("FalcorDataProvider.getSequences", () => { creator: creator, }); - const skey: string = "skey"; + const skey = "skey"; provider.getSequences([skey]) .then( - (result: { [key: string]: ISequence }): void => { + (result): void => { expect(result).toBeDefined(); - expect(result[skey]).toBeDefined(); - expect(result[skey].key).toBe(skey); - expect(result[skey].keys.length).toBe(0); + expect(result[0]).toBeDefined(); + expect(result[0].node_id).toBe(skey); + expect(result[0].node.id).toBe(skey); + expect(result[0].node.image_ids.length).toBe(0); done(); }); @@ -592,11 +595,11 @@ describe("FalcorDataProvider.getSequences", () => { describe("FalcorDataProvider.setToken", () => { it("should invalidate old model and create a new with token", () => { - const model: falcor.Model = new falcor.Model(); + const model = new falcor.Model(); const modelSpy: jasmine.Spy = spyOn(model, "invalidate"); - const creator: ModelCreator = new ModelCreator(); + const creator: FalcorModelCreator = new FalcorModelCreator(); const creatorSpy: jasmine.Spy = spyOn(creator, "createModel"); creatorSpy.and.returnValue(model); @@ -645,7 +648,7 @@ describe("FalcorDataProvider.getImage", () => { const response: ArrayBuffer = new ArrayBuffer(1024); - provider.getImage("url", abort) + provider.getImageBuffer("url", abort) .then( (buffer: ArrayBuffer): void => { expect(buffer instanceof ArrayBuffer).toBe(true); @@ -670,7 +673,7 @@ describe("FalcorDataProvider.getImage", () => { const provider: FalcorDataProvider = new FalcorDataProvider({ clientToken: "cid" }); - provider.getImage("url", abort) + provider.getImageBuffer("url", abort) .then( undefined, (reason: Error): void => { @@ -692,7 +695,7 @@ describe("FalcorDataProvider.getImage", () => { const response: ArrayBuffer = new ArrayBuffer(1024); - provider.getImage("url", abort) + provider.getImageBuffer("url", abort) .then( undefined, (reason: Error): void => { @@ -716,7 +719,7 @@ describe("FalcorDataProvider.getImage", () => { const response: ArrayBuffer = new ArrayBuffer(1024); - provider.getImage("url", abort) + provider.getImageBuffer("url", abort) .then( undefined, (reason: Error): void => { @@ -740,7 +743,7 @@ describe("FalcorDataProvider.getImage", () => { const response: ArrayBuffer = new ArrayBuffer(1024); - provider.getImage("url", abort) + provider.getImageBuffer("url", abort) .then( undefined, (reason: Error): void => { @@ -763,11 +766,11 @@ describe("FalcorDataProvider.getClusterReconstruction", () => { provider.getClusterReconstruction("url") .then( - (r: IClusterReconstruction): void => { + (r: ClusterReconstructionContract): void => { expect(r.points).toEqual({}); - expect(r.reference_lla.altitude).toBe(1); - expect(r.reference_lla.latitude).toBe(2); - expect(r.reference_lla.longitude).toBe(3); + expect(r.reference.alt).toBe(1); + expect(r.reference.lat).toBe(2); + expect(r.reference.lon).toBe(3); done(); }); diff --git a/spec/api/FalcorDataProviderUrls.spec.ts b/spec/api/falcor/FalcorDataProviderUrls.spec.ts similarity index 68% rename from spec/api/FalcorDataProviderUrls.spec.ts rename to spec/api/falcor/FalcorDataProviderUrls.spec.ts index ab1e2207a..76d6245d6 100644 --- a/spec/api/FalcorDataProviderUrls.spec.ts +++ b/spec/api/falcor/FalcorDataProviderUrls.spec.ts @@ -1,19 +1,19 @@ -import { FalcorDataProviderUrls } from "../../src/api/FalcorDataProvider"; -import { IFalcorDataProviderOptions } from "../../src/api/interfaces/IFalcorDataProviderOptions"; +import { FalcorDataProviderOptions } from "../../../src/api/falcor/FalcorDataProviderOptions"; +import { FalcorDataProviderUrls } from "../../../src/api/falcor/FalcorDataProviderUrls"; describe("DataProviderUrls.ctor", () => { it("should set all option properties", () => { - const options: IFalcorDataProviderOptions = { + const options: FalcorDataProviderOptions = { apiHost: "test-api", clientToken: "ct", - clusterReconstructionHost: "test-cluster", + reconstructionHost: "test-cluster", imageHost: "test-image", imageTileHost: "test-image-tile", meshHost: "test-mesh", scheme: "test-scheme", }; - const urls: FalcorDataProviderUrls = new FalcorDataProviderUrls(options); + const urls = new FalcorDataProviderUrls(options); expect(urls.falcorModel).toContain(options.apiHost); expect(urls.falcorModel).toContain(options.scheme); diff --git a/spec/component/Component.spec.ts b/spec/component/Component.spec.ts index 35fee1588..a127d51e0 100644 --- a/spec/component/Component.spec.ts +++ b/spec/component/Component.spec.ts @@ -1,16 +1,16 @@ import { skip } from "rxjs/operators"; import { Component } from "../../src/component/Component"; -import { IComponentConfiguration } from "../../src/component/interfaces/IComponentConfiguration"; +import { ComponentConfiguration } from "../../src/component/interfaces/ComponentConfiguration"; -interface ITestConfiguration extends IComponentConfiguration { +interface TestConfiguration extends ComponentConfiguration { test?: string; } -class TestComponent extends Component { +class TestComponent extends Component { protected _activate(): void { /*noop*/ } protected _deactivate(): void { /*noop*/ } - protected _getDefaultConfiguration(): ITestConfiguration { + protected _getDefaultConfiguration(): TestConfiguration { return {}; } } @@ -29,7 +29,7 @@ describe("Component.configuration$", () => { component.configuration$ .subscribe( - (configuration: IComponentConfiguration): void => { + (configuration: ComponentConfiguration): void => { expect(Object.keys(configuration).length).toBe(0); }); }); @@ -40,7 +40,7 @@ describe("Component.configuration$", () => { component.configuration$.pipe( skip(1)) .subscribe( - (configuration: ITestConfiguration): void => { + (configuration: TestConfiguration): void => { expect(Object.keys(configuration).length).toBe(1); expect(configuration.test).toBe("test"); done(); @@ -55,7 +55,7 @@ describe("Component.configuration$", () => { component.configuration$.pipe( skip(2)) .subscribe( - (configuration: ITestConfiguration): void => { + (configuration: TestConfiguration): void => { expect(Object.keys(configuration).length).toBe(1); expect(configuration.test).toBe("testchanged"); done(); diff --git a/spec/component/direction/DirectionComponent.spec.ts b/spec/component/direction/DirectionComponent.spec.ts index b461da583..0e378e58b 100644 --- a/spec/component/direction/DirectionComponent.spec.ts +++ b/spec/component/direction/DirectionComponent.spec.ts @@ -77,7 +77,7 @@ describe("DirectionComponent.activate", () => { directionComponent.configure({ distinguishSequence: true }); directionComponent.activate(); - const sequence: Sequence = new Sequence({ key: "skey", keys: [] }); + const sequence: Sequence = new Sequence({ id: "skey", image_ids: [] }); (navigatorMock.graphService.cacheSequence$).and.returnValue(observableOf(sequence)); const node: Node = new NodeHelper().createNode(); @@ -105,7 +105,7 @@ describe("DirectionComponent.activate", () => { directionComponent.configure({ distinguishSequence: true }); directionComponent.activate(); - const sequence: Sequence = new Sequence({ key: "skey", keys: [] }); + const sequence: Sequence = new Sequence({ id: "skey", image_ids: [] }); const cacheSequence$: Subject = new Subject(); (navigatorMock.graphService.cacheSequence$).and.returnValue(cacheSequence$); diff --git a/spec/component/direction/DirectionDOMRenderer.spec.ts b/spec/component/direction/DirectionDOMRenderer.spec.ts index 403f310a7..05de5088a 100644 --- a/spec/component/direction/DirectionDOMRenderer.spec.ts +++ b/spec/component/direction/DirectionDOMRenderer.spec.ts @@ -6,15 +6,15 @@ import { NodeHelper } from "../../helper/NodeHelper"; import { Navigator } from "../../../src/viewer/Navigator"; import { Node } from "../../../src/graph/Node"; import { DirectionDOMRenderer } from "../../../src/component/direction/DirectionDOMRenderer"; -import { IDirectionConfiguration } from "../../../src/component/interfaces/IDirectionConfiguration"; +import { DirectionConfiguration } from "../../../src/component/interfaces/DirectionConfiguration"; import { RenderCamera } from "../../../src/render/RenderCamera"; -import { IFrame } from "../../../src/state/interfaces/IFrame"; +import { AnimationFrame } from "../../../src/state/interfaces/AnimationFrame"; import { FrameHelper } from "../../helper/FrameHelper"; import { RenderMode } from "../../../src/render/RenderMode"; describe("DirectionDOMRenderer.ctor", () => { it("should be defined", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -34,7 +34,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should not need render when constructed", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -46,7 +46,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should need render when node is set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -63,7 +63,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should not need render after rendering", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -88,7 +88,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should not need render when setting render camera without node set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -105,7 +105,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should not need render when setting configuration without node set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -120,7 +120,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should not need render when resizing without node set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -134,7 +134,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should need render when setting changed render camera if node is set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -158,7 +158,7 @@ describe("DirectionDOMRenderer.needsRender", () => { expect(renderer.needsRender).toBe(false); let renderCamera: RenderCamera = new RenderCamera(1, 1, RenderMode.Fill); - const frame: IFrame = new FrameHelper().createFrame(); + const frame: AnimationFrame = new FrameHelper().createFrame(); frame.state.camera.up.fromArray([0, 0, 1]); frame.state.camera.lookat.fromArray([1, 1, 0]); renderCamera.setFrame(frame); @@ -168,7 +168,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should need render when setting changed configuration if node is set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, @@ -198,7 +198,7 @@ describe("DirectionDOMRenderer.needsRender", () => { }); it("should need render when resizing if node is set", () => { - let configuration: IDirectionConfiguration = { + let configuration: DirectionConfiguration = { distinguishSequence: false, maxWidth: 200, minWidth: 100, diff --git a/spec/component/keyboard/KeyPlayHandler.spec.ts b/spec/component/keyboard/KeyPlayHandler.spec.ts index 4472a286c..103c3355b 100644 --- a/spec/component/keyboard/KeyPlayHandler.spec.ts +++ b/spec/component/keyboard/KeyPlayHandler.spec.ts @@ -9,24 +9,24 @@ import { NodeHelper } from "../../helper/NodeHelper"; import { Navigator } from "../../../src/viewer/Navigator"; import { Node } from "../../../src/graph/Node"; import { Component } from "../../../src/component/Component"; -import { IComponentConfiguration } from "../../../src/component/interfaces/IComponentConfiguration"; +import { ComponentConfiguration } from "../../../src/component/interfaces/ComponentConfiguration"; import { KeyPlayHandler } from "../../../src/component/keyboard/KeyPlayHandler"; -import { IEdgeStatus } from "../../../src/graph/interfaces/IEdgeStatus"; +import { NavigationEdgeStatus } from "../../../src/graph/interfaces/NavigationEdgeStatus"; import { State } from "../../../src/state/State"; import { Container } from "../../../src/viewer/Container"; -import { EdgeDirection } from "../../../src/graph/edge/EdgeDirection"; +import { NavigationDirection } from "../../../src/graph/edge/NavigationDirection"; -interface ITestConfiguration extends IComponentConfiguration { +interface TestConfiguration extends ComponentConfiguration { test: boolean; } -class TestComponent extends Component { +class TestComponent extends Component { constructor(name: string, container: Container, navigator: Navigator) { super(name, container, navigator); } protected _activate(): void { /* noop */ } protected _deactivate(): void { /* noop */ } - protected _getDefaultConfiguration(): ITestConfiguration { return { test: false }; } + protected _getDefaultConfiguration(): TestConfiguration { return { test: false }; } } describe("KeyPlayHandler.ctor", () => { @@ -92,12 +92,12 @@ describe("KeyPlayHandler.enable", () => { it("should not prevent default if modifier key is pressed", () => { (>navigatorMock.playService.playing$).next(true); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); (>navigatorMock.playService.speed$).next(0.5); (>navigatorMock.stateService.state$).next(State.Traversing); const node: Node = nodeHelper.createNode(); - const sequenceEdgesSubject: Subject = new Subject(); + const sequenceEdgesSubject: Subject = new Subject(); new MockCreator().mockProperty(node, "sequenceEdges$", sequenceEdgesSubject); (>navigatorMock.stateService.currentNode$).next(node); sequenceEdgesSubject.next({ cached: false, edges: [] }); @@ -130,12 +130,12 @@ describe("KeyPlayHandler.enable", () => { it("should change speed if `>` or `<` is pressed", () => { (>navigatorMock.playService.playing$).next(true); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); (>navigatorMock.playService.speed$).next(0.5); (>navigatorMock.stateService.state$).next(State.Traversing); const node: Node = nodeHelper.createNode(); - const sequenceEdgesSubject: Subject = new Subject(); + const sequenceEdgesSubject: Subject = new Subject(); new MockCreator().mockProperty(node, "sequenceEdges$", sequenceEdgesSubject); (>navigatorMock.stateService.currentNode$).next(node); sequenceEdgesSubject.next({ cached: false, edges: [] }); @@ -162,12 +162,12 @@ describe("KeyPlayHandler.enable", () => { it("should change direction when not playing", () => { (>navigatorMock.playService.playing$).next(true); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); (>navigatorMock.playService.speed$).next(0.5); (>navigatorMock.stateService.state$).next(State.Traversing); const node: Node = nodeHelper.createNode(); - const sequenceEdgesSubject: Subject = new Subject(); + const sequenceEdgesSubject: Subject = new Subject(); new MockCreator().mockProperty(node, "sequenceEdges$", sequenceEdgesSubject); (>navigatorMock.stateService.currentNode$).next(node); sequenceEdgesSubject.next({ cached: false, edges: [] }); @@ -181,18 +181,18 @@ describe("KeyPlayHandler.enable", () => { expect(setDirectionSpy.calls.count()).toBe(0); (>navigatorMock.playService.playing$).next(false); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); (>containerMock.keyboardService.keyDown$).next(shiftKeyboardEvent); expect(shiftPreventDefaultSpy.calls.count()).toBe(2); expect(setDirectionSpy.calls.count()).toBe(1); - expect(setDirectionSpy.calls.argsFor(0)[0]).toBe(EdgeDirection.Prev); + expect(setDirectionSpy.calls.argsFor(0)[0]).toBe(NavigationDirection.Prev); (>navigatorMock.playService.playing$).next(false); - (>navigatorMock.playService.direction$).next(EdgeDirection.Prev); + (>navigatorMock.playService.direction$).next(NavigationDirection.Prev); (>containerMock.keyboardService.keyDown$).next(shiftKeyboardEvent); expect(shiftPreventDefaultSpy.calls.count()).toBe(3); expect(setDirectionSpy.calls.count()).toBe(2); - expect(setDirectionSpy.calls.argsFor(1)[0]).toBe(EdgeDirection.Next); + expect(setDirectionSpy.calls.argsFor(1)[0]).toBe(NavigationDirection.Next); }); it("should play when stopped edge direction exist and stop when playing", () => { @@ -201,13 +201,13 @@ describe("KeyPlayHandler.enable", () => { (>navigatorMock.stateService.state$).next(State.Traversing); const node: Node = nodeHelper.createNode(); - const sequenceEdgesSubject: Subject = new Subject(); + const sequenceEdgesSubject: Subject = new Subject(); new MockCreator().mockProperty(node, "sequenceEdges$", sequenceEdgesSubject); (>navigatorMock.stateService.currentNode$).next(node); sequenceEdgesSubject.next({ cached: false, edges: [] }); (>navigatorMock.playService.playing$).next(false); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); (>navigatorMock.playService.speed$).next(0.5); const spacebarKeyboardEvent: KeyboardEvent = EventHelper.createKeyboardEvent("keyDown", { key: " " }); @@ -217,13 +217,13 @@ describe("KeyPlayHandler.enable", () => { expect(playSpy.calls.count()).toBe(0); expect(stopSpy.calls.count()).toBe(0); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); sequenceEdgesSubject.next({ cached: true, edges: [{ - data: { direction: EdgeDirection.Next, worldMotionAzimuth: 0 }, - from: node.key, - to: "toKey", + data: { direction: NavigationDirection.Next, worldMotionAzimuth: 0 }, + source: node.id, + target: "toKey", }], }); (>containerMock.keyboardService.keyDown$).next(spacebarKeyboardEvent); @@ -245,13 +245,13 @@ describe("KeyPlayHandler.enable", () => { (>navigatorMock.stateService.state$).next(State.Earth); const node: Node = nodeHelper.createNode(); - const sequenceEdgesSubject: Subject = new Subject(); + const sequenceEdgesSubject: Subject = new Subject(); new MockCreator().mockProperty(node, "sequenceEdges$", sequenceEdgesSubject); (>navigatorMock.stateService.currentNode$).next(node); sequenceEdgesSubject.next({ cached: false, edges: [] }); (>navigatorMock.playService.playing$).next(false); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); (>navigatorMock.playService.speed$).next(0.5); const spacebarKeyboardEvent: KeyboardEvent = EventHelper.createKeyboardEvent("keyDown", { key: " " }); @@ -261,13 +261,13 @@ describe("KeyPlayHandler.enable", () => { expect(playSpy.calls.count()).toBe(0); expect(stopSpy.calls.count()).toBe(0); - (>navigatorMock.playService.direction$).next(EdgeDirection.Next); + (>navigatorMock.playService.direction$).next(NavigationDirection.Next); sequenceEdgesSubject.next({ cached: true, edges: [{ - data: { direction: EdgeDirection.Next, worldMotionAzimuth: 0 }, - from: node.key, - to: "toKey", + data: { direction: NavigationDirection.Next, worldMotionAzimuth: 0 }, + source: node.id, + target: "toKey", }], }); (>containerMock.keyboardService.keyDown$).next(spacebarKeyboardEvent); diff --git a/spec/component/keyboard/KeyZoomHandler.spec.ts b/spec/component/keyboard/KeyZoomHandler.spec.ts index d2568f4ce..b67991ceb 100644 --- a/spec/component/keyboard/KeyZoomHandler.spec.ts +++ b/spec/component/keyboard/KeyZoomHandler.spec.ts @@ -11,24 +11,24 @@ import { TransformHelper } from "../../helper/TransformHelper"; import { Navigator } from "../../../src/viewer/Navigator"; import { Transform } from "../../../src/geo/Transform"; import { Component } from "../../../src/component/Component"; -import { IComponentConfiguration } from "../../../src/component/interfaces/IComponentConfiguration"; +import { ComponentConfiguration } from "../../../src/component/interfaces/ComponentConfiguration"; import { KeyZoomHandler } from "../../../src/component/keyboard/KeyZoomHandler"; import { ViewportCoords } from "../../../src/geo/ViewportCoords"; import { RenderCamera } from "../../../src/render/RenderCamera"; import { Container } from "../../../src/viewer/Container"; import { RenderMode } from "../../../src/render/RenderMode"; -interface ITestConfiguration extends IComponentConfiguration { +interface TestConfiguration extends ComponentConfiguration { test: boolean; } -class TestComponent extends Component { +class TestComponent extends Component { constructor(name: string, container: Container, navigator: Navigator) { super(name, container, navigator); } protected _activate(): void { /* noop */ } protected _deactivate(): void { /* noop */ } - protected _getDefaultConfiguration(): ITestConfiguration { return { test: false }; } + protected _getDefaultConfiguration(): TestConfiguration { return { test: false }; } } describe("KeyZoomHandler.ctor", () => { diff --git a/spec/component/marker/Marker.spec.ts b/spec/component/marker/Marker.spec.ts index 15b4de94b..dfbe457be 100644 --- a/spec/component/marker/Marker.spec.ts +++ b/spec/component/marker/Marker.spec.ts @@ -1,9 +1,9 @@ import * as THREE from "three"; -import { ILatLon } from "../../../src/api/interfaces/ILatLon"; +import { LatLon } from "../../../src/api/interfaces/LatLon"; import { Marker } from "../../../src/component/marker/marker/Marker"; class TestMarker extends Marker { - constructor(id: string, latLon: ILatLon) { super(id, latLon); } + constructor(id: string, latLon: LatLon) { super(id, latLon); } protected _createGeometry(position: number[]): void { this._geometry = new THREE.Object3D(); this._geometry.position.fromArray(position); diff --git a/spec/component/marker/MarkerScene.spec.ts b/spec/component/marker/MarkerScene.spec.ts index 4f8c08116..3341615ba 100644 --- a/spec/component/marker/MarkerScene.spec.ts +++ b/spec/component/marker/MarkerScene.spec.ts @@ -1,10 +1,10 @@ import * as THREE from "three"; -import { ILatLon } from "../../../src/api/interfaces/ILatLon"; +import { LatLon } from "../../../src/api/interfaces/LatLon"; import { Marker } from "../../../src/component/marker/marker/Marker"; import { MarkerScene } from "../../../src/component/marker/MarkerScene"; class TestMarker extends Marker { - constructor(id: string, latLon: ILatLon) { super(id, latLon); } + constructor(id: string, latLon: LatLon) { super(id, latLon); } protected _createGeometry(position: number[]): void { /* noop */ } protected _disposeGeometry(): void { /* noop */ } protected _getInteractiveObjects(): THREE.Object3D[] { return []; } diff --git a/spec/component/marker/MarkerSet.spec.ts b/spec/component/marker/MarkerSet.spec.ts index 21d0f0057..934d3d1f9 100644 --- a/spec/component/marker/MarkerSet.spec.ts +++ b/spec/component/marker/MarkerSet.spec.ts @@ -3,12 +3,12 @@ bootstrap(); import { first } from "rxjs/operators"; import { Subscription } from "rxjs"; -import { ILatLon } from "../../../src/api/interfaces/ILatLon"; +import { LatLon } from "../../../src/api/interfaces/LatLon"; import { Marker } from "../../../src/component/marker/marker/Marker"; import { MarkerSet } from "../../../src/component/marker/MarkerSet"; class TestMarker extends Marker { - constructor(id: string, latLon: ILatLon) { super(id, latLon); } + constructor(id: string, latLon: LatLon) { super(id, latLon); } protected _createGeometry(position: number[]): void { /* noop */ } protected _disposeGeometry(): void { /* noop */ } protected _getInteractiveObjects(): THREE.Object3D[] { return []; } diff --git a/spec/component/mouse/DragPanHandler.spec.ts b/spec/component/mouse/DragPanHandler.spec.ts index 8052d1188..94381d5d5 100644 --- a/spec/component/mouse/DragPanHandler.spec.ts +++ b/spec/component/mouse/DragPanHandler.spec.ts @@ -17,7 +17,7 @@ import { DragPanHandler } from "../../../src/component/mouse/DragPanHandler"; import { Spatial } from "../../../src/geo/Spatial"; import { ViewportCoords } from "../../../src/geo/ViewportCoords"; import { RenderCamera } from "../../../src/render/RenderCamera"; -import { IFrame } from "../../../src/state/interfaces/IFrame"; +import { AnimationFrame } from "../../../src/state/interfaces/AnimationFrame"; import { Container } from "../../../src/viewer/Container"; import { RenderMode } from "../../../src/render/RenderMode"; @@ -219,8 +219,8 @@ describe("DragPanHandler.enable", () => { testComponent.activate(); handler.enable(); - const frame: IFrame = new FrameHelper().createFrame(); - (>navigatorMock.stateService.currentState$).next(frame); + const frame: AnimationFrame = new FrameHelper().createFrame(); + (>navigatorMock.stateService.currentState$).next(frame); (>navigatorMock.panService.panNodes$).next([]); @@ -257,8 +257,8 @@ describe("DragPanHandler.enable", () => { testComponent.activate(); handler.enable(); - const frame: IFrame = new FrameHelper().createFrame(); - (>navigatorMock.stateService.currentState$).next(frame); + const frame: AnimationFrame = new FrameHelper().createFrame(); + (>navigatorMock.stateService.currentState$).next(frame); (>navigatorMock.panService.panNodes$).next([]); @@ -296,8 +296,8 @@ describe("DragPanHandler.enable", () => { testComponent.activate(); handler.enable(); - const frame: IFrame = new FrameHelper().createFrame(); - (>navigatorMock.stateService.currentState$).next(frame); + const frame: AnimationFrame = new FrameHelper().createFrame(); + (>navigatorMock.stateService.currentState$).next(frame); (>navigatorMock.panService.panNodes$).next([]); @@ -336,8 +336,8 @@ describe("DragPanHandler.enable", () => { testComponent.activate(); handler.enable(); - const frame: IFrame = new FrameHelper().createFrame(); - (>navigatorMock.stateService.currentState$).next(frame); + const frame: AnimationFrame = new FrameHelper().createFrame(); + (>navigatorMock.stateService.currentState$).next(frame); (>navigatorMock.panService.panNodes$).next([]); diff --git a/spec/component/popup/Popup.spec.ts b/spec/component/popup/Popup.spec.ts index da81b33c2..516d361a2 100644 --- a/spec/component/popup/Popup.spec.ts +++ b/spec/component/popup/Popup.spec.ts @@ -1,10 +1,10 @@ import { take } from "rxjs/operators"; -import { IPopupOffset } from "../../../src/component/popup/interfaces/IPopupOffset"; +import { PopupOffset } from "../../../src/component/popup/interfaces/PopupOffset"; import { Popup } from "../../../src/component/popup/popup/Popup"; import { ViewportCoords } from "../../../src/geo/ViewportCoords"; import { RenderCamera } from "../../../src/render/RenderCamera"; import { DOM } from "../../../src/utils/DOM"; -import { Alignment } from "../../../src/viewer/Alignment"; +import { Alignment } from "../../../src/viewer/enums/Alignment"; describe("Popup.ctor", () => { it("should be defined", () => { @@ -519,7 +519,7 @@ describe("Popup.offset", () => { const viewportCoords: ViewportCoords = new ViewportCoords(); spyOn(viewportCoords, "basicToCanvasSafe").and.returnValue([40, 60]); - const offset: IPopupOffset = { + const offset: PopupOffset = { bottom: [0, 1], bottomLeft: [2, 3], bottomRight: [4, 5], @@ -548,7 +548,7 @@ describe("Popup.offset", () => { const viewportCoords: ViewportCoords = new ViewportCoords(); spyOn(viewportCoords, "basicToCanvasSafe").and.returnValue([40, 60]); - const offset: IPopupOffset = { + const offset: PopupOffset = { bottom: [-0, -1], bottomLeft: [-2, -3], bottomRight: [-4, -5], diff --git a/spec/component/popup/PopupComponent.spec.ts b/spec/component/popup/PopupComponent.spec.ts index 4092328c4..620a9e4c0 100644 --- a/spec/component/popup/PopupComponent.spec.ts +++ b/spec/component/popup/PopupComponent.spec.ts @@ -7,7 +7,7 @@ import { ContainerMockCreator } from "../../helper/ContainerMockCreator"; import { NavigatorMockCreator } from "../../helper/NavigatorMockCreator"; import { Popup } from "../../../src/component/popup/popup/Popup"; import { PopupComponent } from "../../../src/component/popup/PopupComponent"; -import { ISize } from "../../../src/render/interfaces/ISize"; +import { ViewportSize } from "../../../src/render/interfaces/ViewportSize"; import { RenderCamera } from "../../../src/render/RenderCamera"; import { Container } from "../../../src/viewer/Container"; @@ -287,7 +287,7 @@ describe("PopupComponent.updateAdded", () => { popupComponent.activate(); (>containerMock.renderService.renderCamera$).next(null); - (>containerMock.renderService.size$).next(null); + (>containerMock.renderService.size$).next(null); (>navigatorMock.stateService.currentTransform$).next(null); popupComponent.add([popup]); @@ -313,7 +313,7 @@ describe("PopupComponent.updateAdded", () => { popupComponent.activate(); (>containerMock.renderService.renderCamera$).next(null); - (>containerMock.renderService.size$).next(null); + (>containerMock.renderService.size$).next(null); (>navigatorMock.stateService.currentTransform$).next(null); popupComponent.add([popup]); @@ -345,7 +345,7 @@ describe("PopupComponent.updateAll", () => { popupComponent.activate(); (>containerMock.renderService.renderCamera$).next(null); - (>containerMock.renderService.size$).next(null); + (>containerMock.renderService.size$).next(null); (>navigatorMock.stateService.currentTransform$).next(null); expect(updateSpy.calls.count()).toBe(1); @@ -373,7 +373,7 @@ describe("PopupComponent.updateAll", () => { popupComponent.deactivate(); (>containerMock.renderService.renderCamera$).next(null); - (>containerMock.renderService.size$).next(null); + (>containerMock.renderService.size$).next(null); (>navigatorMock.stateService.currentTransform$).next(null); expect(updateSpy.calls.count()).toBe(0); diff --git a/spec/component/sequence/SequenceComponent.spec.ts b/spec/component/sequence/SequenceComponent.spec.ts index 3073c13e5..843600244 100644 --- a/spec/component/sequence/SequenceComponent.spec.ts +++ b/spec/component/sequence/SequenceComponent.spec.ts @@ -11,9 +11,9 @@ import { Node } from "../../../src/graph/Node"; import { SequenceComponent } from "../../../src/component/sequence/SequenceComponent"; import { SequenceDOMRenderer } from "../../../src/component/sequence/SequenceDOMRenderer"; import { GraphMode } from "../../../src/graph/GraphMode"; -import { IEdgeStatus } from "../../../src/graph/interfaces/IEdgeStatus"; +import { NavigationEdgeStatus } from "../../../src/graph/interfaces/NavigationEdgeStatus"; import { Sequence } from "../../../src/graph/Sequence"; -import { ISize } from "../../../src/render/interfaces/ISize"; +import { ViewportSize } from "../../../src/render/interfaces/ViewportSize"; import { State } from "../../../src/state/State"; import { Container } from "../../../src/viewer/Container"; @@ -132,26 +132,26 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node1, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node1, "key", "nodeKey1"); + mockCreator.mockProperty(node1, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node1, "id", "nodeKey1"); (>navigatorMock.stateService.currentNode$).next(node1); expect(cacheNodeSpy.calls.count()).toBe(1); - expect(cacheNodeSpy.calls.argsFor(0)[0]).toBe(node1.key); + expect(cacheNodeSpy.calls.argsFor(0)[0]).toBe(node1.id); const node2: Node = nodeHelper.createNode(); mockCreator.mockProperty(node2, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node2, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node2, "key", "nodeKey2"); + mockCreator.mockProperty(node2, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node2, "id", "nodeKey2"); (>navigatorMock.stateService.currentNode$).next(node2); expect(cacheNodeSpy.calls.count()).toBe(2); - expect(cacheNodeSpy.calls.argsFor(1)[0]).toBe(node2.key); + expect(cacheNodeSpy.calls.argsFor(1)[0]).toBe(node2.id); const node3: Node = nodeHelper.createNode(); mockCreator.mockProperty(node3, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node3, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node3, "key", "nodeKey2"); + mockCreator.mockProperty(node3, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node3, "id", "nodeKey2"); (>navigatorMock.stateService.currentNode$).next(node3); expect(cacheNodeSpy.calls.count()).toBe(2); @@ -171,9 +171,9 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node1, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node1, "key", "nodeKey1"); - mockCreator.mockProperty(node1, "sequenceKey", "sequenceKey1"); + mockCreator.mockProperty(node1, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node1, "id", "nodeKey1"); + mockCreator.mockProperty(node1, "sequenceId", "sequenceKey1"); (>navigatorMock.stateService.currentNode$).next(node1); expect(cacheSequenceSpy.calls.count()).toBe(1); @@ -181,18 +181,18 @@ describe("SequenceComponent.activate", () => { const node2: Node = nodeHelper.createNode(); mockCreator.mockProperty(node2, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node2, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node2, "key", "nodeKey2"); - mockCreator.mockProperty(node2, "sequenceKey", "sequenceKey1"); + mockCreator.mockProperty(node2, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node2, "id", "nodeKey2"); + mockCreator.mockProperty(node2, "sequenceId", "sequenceKey1"); (>navigatorMock.stateService.currentNode$).next(node2); expect(cacheSequenceSpy.calls.count()).toBe(1); const node3: Node = nodeHelper.createNode(); mockCreator.mockProperty(node3, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node3, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node3, "key", "nodeKey3"); - mockCreator.mockProperty(node3, "sequenceKey", "sequenceKey2"); + mockCreator.mockProperty(node3, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node3, "id", "nodeKey3"); + mockCreator.mockProperty(node3, "sequenceId", "sequenceKey2"); (>navigatorMock.stateService.currentNode$).next(node3); expect(cacheSequenceSpy.calls.count()).toBe(2); @@ -215,9 +215,9 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); - mockCreator.mockProperty(node1, "sequenceEdges$", new Subject()); - mockCreator.mockProperty(node1, "key", "nodeKey1"); - mockCreator.mockProperty(node1, "sequenceKey", "sequenceKey1"); + mockCreator.mockProperty(node1, "sequenceEdges$", new Subject()); + mockCreator.mockProperty(node1, "id", "nodeKey1"); + mockCreator.mockProperty(node1, "sequenceId", "sequenceKey1"); (>navigatorMock.stateService.currentNode$).next(node1); const graphModeSubject$: Subject = >navigatorMock.graphService.graphMode$; @@ -270,13 +270,13 @@ describe("SequenceComponent.activate", () => { (>navigatorMock.stateService.state$).next(State.Traversing); (>navigatorMock.playService.speed$).next(1); - (>containerMock.renderService.size$).next({ height: 1, width: 1 }); + (>containerMock.renderService.size$).next({ height: 1, width: 1 }); const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", "nodeKey1"); - mockCreator.mockProperty(node1, "sequenceKey", "sequenceKey1"); + mockCreator.mockProperty(node1, "id", "nodeKey1"); + mockCreator.mockProperty(node1, "sequenceId", "sequenceKey1"); (>navigatorMock.stateService.currentNode$).next(node1); expect(renderSpy.calls.count()).toBe(1); @@ -303,7 +303,7 @@ describe("SequenceComponent.activate", () => { (>navigatorMock.stateService.state$).next(State.Traversing); (>navigatorMock.playService.speed$).next(1); - (>containerMock.renderService.size$).next({ height: 1, width: 1 }); + (>containerMock.renderService.size$).next({ height: 1, width: 1 }); const sequenceKey1: string = "sequenceKey1"; const nodeKey1: string = "nodeKey1"; @@ -311,13 +311,13 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey1); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey1); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); expect(renderSpy.calls.count()).toBe(1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1] })); expect(renderSpy.calls.count()).toBe(2); expect(renderSpy.calls.argsFor(1)[4]).toBe(0); @@ -343,7 +343,7 @@ describe("SequenceComponent.activate", () => { (>navigatorMock.stateService.state$).next(State.Traversing); (>navigatorMock.playService.speed$).next(1); - (>containerMock.renderService.size$).next({ height: 1, width: 1 }); + (>containerMock.renderService.size$).next({ height: 1, width: 1 }); const sequenceKey1: string = "sequenceKey1"; const nodeKey1: string = "nodeKey1"; @@ -352,13 +352,13 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey1); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey1); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); expect(renderSpy.calls.count()).toBe(1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2] })); expect(renderSpy.calls.count()).toBe(2); expect(renderSpy.calls.argsFor(1)[4]).toBe(0); @@ -367,8 +367,8 @@ describe("SequenceComponent.activate", () => { const node2: Node = nodeHelper.createNode(); mockCreator.mockProperty(node2, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node2, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node2, "key", nodeKey2); - mockCreator.mockProperty(node2, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node2, "id", nodeKey2); + mockCreator.mockProperty(node2, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node2); expect(renderSpy.calls.count()).toBe(4); @@ -397,7 +397,7 @@ describe("SequenceComponent.activate", () => { (>navigatorMock.stateService.state$).next(State.Traversing); (>navigatorMock.playService.speed$).next(1); - (>containerMock.renderService.size$).next({ height: 1, width: 1 }); + (>containerMock.renderService.size$).next({ height: 1, width: 1 }); const sequenceKey1: string = "sequenceKey1"; const sequenceKey2: string = "sequenceKey2"; @@ -407,13 +407,13 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey1); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey1); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); expect(renderSpy.calls.count()).toBe(1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1] })); expect(renderSpy.calls.count()).toBe(2); expect(renderSpy.calls.mostRecent().args[4]).toBe(0); @@ -424,13 +424,13 @@ describe("SequenceComponent.activate", () => { const node2: Node = nodeHelper.createNode(); mockCreator.mockProperty(node2, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node2, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node2, "key", nodeKey2); - mockCreator.mockProperty(node2, "sequenceKey", sequenceKey2); + mockCreator.mockProperty(node2, "id", nodeKey2); + mockCreator.mockProperty(node2, "sequenceId", sequenceKey2); (>navigatorMock.stateService.currentNode$).next(node2); changingPositionChangedSubject$.next(false); - sequenceSubject$.next(new Sequence({ key: sequenceKey2, keys: [nodeKey2] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey2, image_ids: [nodeKey2] })); expect(renderSpy.calls.count()).toBeGreaterThan(2); expect(renderSpy.calls.mostRecent().args[4]).toBe(0); @@ -444,7 +444,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - (navigatorMock.moveToKey$).and.returnValue(new Subject()); + (navigatorMock.moveTo$).and.returnValue(new Subject()); const changedSubject$: Subject = new Subject(); mockCreator.mockProperty(renderer, "changed$", changedSubject$); @@ -463,7 +463,7 @@ describe("SequenceComponent.activate", () => { (>navigatorMock.stateService.state$).next(State.Traversing); (>navigatorMock.playService.speed$).next(1); - (>containerMock.renderService.size$).next({ height: 1, width: 1 }); + (>containerMock.renderService.size$).next({ height: 1, width: 1 }); const sequenceKey1: string = "sequenceKey1"; const nodeKey1: string = "nodeKey1"; @@ -473,13 +473,13 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey2); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey2); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); expect(renderSpy.calls.count()).toBe(1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); changingPositionChangedSubject$.next(true); indexSubject$.next(0); @@ -494,7 +494,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - (navigatorMock.moveToKey$).and.returnValue(new Subject()); + (navigatorMock.moveTo$).and.returnValue(new Subject()); const changedSubject$: Subject = new Subject(); mockCreator.mockProperty(renderer, "changed$", changedSubject$); @@ -513,7 +513,7 @@ describe("SequenceComponent.activate", () => { (>navigatorMock.stateService.state$).next(State.Traversing); (>navigatorMock.playService.speed$).next(1); - (>containerMock.renderService.size$).next({ height: 1, width: 1 }); + (>containerMock.renderService.size$).next({ height: 1, width: 1 }); const sequenceKey1: string = "sequenceKey1"; const nodeKey1: string = "nodeKey1"; @@ -523,15 +523,15 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey1); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey1); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); expect(renderSpy.calls.count()).toBe(1); expect(renderSpy.calls.mostRecent().args[4]).toBe(null); expect(renderSpy.calls.mostRecent().args[5]).toBe(null); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); expect(renderSpy.calls.count()).toBe(2); expect(renderSpy.calls.mostRecent().args[4]).toBe(0); @@ -563,8 +563,8 @@ describe("SequenceComponent.activate", () => { const node3: Node = nodeHelper.createNode(); mockCreator.mockProperty(node3, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node3, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node3, "key", nodeKey3); - mockCreator.mockProperty(node3, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node3, "id", nodeKey3); + mockCreator.mockProperty(node3, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node3); expect(renderSpy.calls.mostRecent().args[4]).toBe(2); @@ -577,7 +577,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - const moveToKeySpy: jasmine.Spy = navigatorMock.moveToKey$; + const moveToKeySpy: jasmine.Spy = navigatorMock.moveTo$; moveToKeySpy.and.returnValue(new Subject()); const indexSubject$: Subject = new Subject(); @@ -601,11 +601,11 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey2); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey2); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); indexSubject$.next(1); expect(moveToKeySpy.calls.count()).toBe(0); @@ -622,7 +622,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - const moveToKeySpy: jasmine.Spy = navigatorMock.moveToKey$; + const moveToKeySpy: jasmine.Spy = navigatorMock.moveTo$; moveToKeySpy.and.returnValue(new Subject()); const indexSubject$: Subject = new Subject(); @@ -646,11 +646,11 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey2); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey2); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); indexSubject$.next(1); expect(moveToKeySpy.calls.count()).toBe(0); @@ -668,7 +668,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - const moveToKeySpy: jasmine.Spy = navigatorMock.moveToKey$; + const moveToKeySpy: jasmine.Spy = navigatorMock.moveTo$; moveToKeySpy.and.returnValue(new Subject()); const indexSubject$: Subject = new Subject(); @@ -692,11 +692,11 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey2); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey2); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); indexSubject$.next(1); expect(moveToKeySpy.calls.count()).toBe(0); @@ -713,7 +713,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - const moveToKeySpy: jasmine.Spy = navigatorMock.moveToKey$; + const moveToKeySpy: jasmine.Spy = navigatorMock.moveTo$; moveToKeySpy.and.returnValue(new Subject()); const indexSubject$: Subject = new Subject(); @@ -737,11 +737,11 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey2); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey2); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); indexSubject$.next(1); expect(moveToKeySpy.calls.count()).toBe(0); @@ -767,7 +767,7 @@ describe("SequenceComponent.activate", () => { (navigatorMock.graphService.cacheSequenceNodes$).and.returnValue(new Subject()); (navigatorMock.graphService.cacheNode$).and.returnValue(new Subject()); - const moveToKeySpy: jasmine.Spy = navigatorMock.moveToKey$; + const moveToKeySpy: jasmine.Spy = navigatorMock.moveTo$; moveToKeySpy.and.returnValue(new Subject()); const indexSubject$: Subject = new Subject(); @@ -791,11 +791,11 @@ describe("SequenceComponent.activate", () => { const node1: Node = nodeHelper.createNode(); mockCreator.mockProperty(node1, "spatialEdges", { cached: false, edges: [] }); mockCreator.mockProperty(node1, "sequenceEdges$", observableOf({ cached: false, edges: [] })); - mockCreator.mockProperty(node1, "key", nodeKey2); - mockCreator.mockProperty(node1, "sequenceKey", sequenceKey1); + mockCreator.mockProperty(node1, "id", nodeKey2); + mockCreator.mockProperty(node1, "sequenceId", sequenceKey1); (>navigatorMock.stateService.currentNode$).next(node1); - sequenceSubject$.next(new Sequence({ key: sequenceKey1, keys: [nodeKey1, nodeKey2, nodeKey3] })); + sequenceSubject$.next(new Sequence({ id: sequenceKey1, image_ids: [nodeKey1, nodeKey2, nodeKey3] })); indexSubject$.next(1); expect(moveToKeySpy.calls.count()).toBe(0); diff --git a/spec/component/spatialData/SpatialDataCache.spec.ts b/spec/component/spatialData/SpatialDataCache.spec.ts index 2c7bc837f..122b01c26 100644 --- a/spec/component/spatialData/SpatialDataCache.spec.ts +++ b/spec/component/spatialData/SpatialDataCache.spec.ts @@ -1,9 +1,9 @@ import { Subject } from "rxjs"; import { Node } from "../../../src/graph/Node"; -import { FalcorDataProvider } from "../../../src/api/FalcorDataProvider"; +import { FalcorDataProvider } from "../../../src/api/falcor/FalcorDataProvider"; import { GeohashGeometryProvider } from "../../../src/api/GeohashGeometryProvider"; -import { IClusterReconstruction } from "../../../src/api/interfaces/IClusterReconstruction"; +import { ClusterReconstructionContract } from "../../../src/api/contracts/ClusterReconstructionContract"; import { SpatialDataCache } from "../../../src/component/spatialdata/SpatialDataCache"; import { GraphService } from "../../../src/graph/GraphService"; import { GraphServiceMockCreator } from "../../helper/GraphServiceMockCreator"; @@ -107,7 +107,7 @@ describe("SpatialDataCache.cacheTile$", () => { expect(cache.isCachingTile(hash)).toBe(false); expect(cache.hasTile(hash)).toBe(true); expect(cache.getTile(hash).length).toBe(1); - expect(cache.getTile(hash)[0].key).toBe(node.key); + expect(cache.getTile(hash)[0].id).toBe(node.id); }); it("should catch error", (done: Function) => { @@ -172,8 +172,8 @@ describe("SpatialDataCache.cacheReconstructions$", () => { let emitCount: number = 0; cache.cacheClusterReconstructions$(hash) .subscribe( - (r: IClusterReconstruction): void => { - expect(r.key).toBe(node.clusterKey); + (r: ClusterReconstructionContract): void => { + expect(r.id).toBe(node.clusterId); emitCount++; }, undefined, @@ -183,7 +183,7 @@ describe("SpatialDataCache.cacheReconstructions$", () => { done(); }); - resolver({ key: node.clusterKey }); + resolver({ key: node.clusterId }); }); it("should not have an errored reconstruction", (done: Function) => { @@ -263,7 +263,7 @@ describe("SpatialDataCache.cacheReconstructions$", () => { let resolver: Function; const promise: any = { - then: (resolve: (value: IClusterReconstruction) => void): void => { + then: (resolve: (value: ClusterReconstructionContract) => void): void => { resolver = resolve; }, }; @@ -298,7 +298,7 @@ describe("SpatialDataCache.cacheReconstructions$", () => { expect(emitCount2).toBe(0); resolver({ - key: node.clusterKey, + key: node.clusterId, points: [], refererence_lla: { altitude: 0, latitude: 0, longitude: 0 }, }); @@ -311,7 +311,7 @@ describe("SpatialDataCache.cacheReconstructions$", () => { expect(cache.isCachingClusterReconstructions(hash)).toBe(false); expect(cache.hasClusterReconstructions(hash)).toBe(true); expect(cache.getClusterReconstructions(hash).length).toBe(1); - expect(cache.getClusterReconstructions(hash)[0].key).toBe(node.clusterKey); + expect(cache.getClusterReconstructions(hash)[0].id).toBe(node.clusterId); }); }); @@ -365,7 +365,7 @@ describe("SpatialDataCache.updateCell$", () => { expect(cache.hasTile(cellId)).toBe(true); expect(cacheCellSpy.calls.count()).toBe(2); expect(cache.getTile(cellId).length).toBe(1); - expect(cache.getTile(cellId)[0].key).toBe(node.key); + expect(cache.getTile(cellId)[0].id).toBe(node.id); }); it("should add new nodes to cell", () => { @@ -397,17 +397,17 @@ describe("SpatialDataCache.updateCell$", () => { cacheCell2$.next([node]); expect(cache.getTile(cellId).length).toBe(1); - expect(cache.getTile(cellId)[0].key).toBe(node.key); + expect(cache.getTile(cellId)[0].id).toBe(node.id); }); }); describe("SpatialDataCache.updateReconstructions$", () => { - const createCluster = (key: string): IClusterReconstruction => { + const createCluster = (key: string): ClusterReconstructionContract => { return { cameras: {}, - key, + id: key, points: {}, - reference_lla: { latitude: 0, longitude: 0, altitude: 0 }, + reference: { lat: 0, lon: 0, alt: 0 }, shots: {}, } } @@ -418,7 +418,7 @@ describe("SpatialDataCache.updateReconstructions$", () => { { clientToken: "cid" }, geometryProvider); spyOn(dataProvider, "getClusterReconstruction").and .returnValue( - new Promise(() => { /* noop */ })); + new Promise(() => { /* noop */ })); const graphService = new GraphServiceMockCreator().create(); const cache = new SpatialDataCache(graphService, dataProvider); @@ -432,7 +432,7 @@ describe("SpatialDataCache.updateReconstructions$", () => { let resolver: Function; const promise: any = { - then: (resolve: (value: IClusterReconstruction) => void): void => { + then: (resolve: (value: ClusterReconstructionContract) => void): void => { resolver = resolve; }, }; @@ -450,7 +450,7 @@ describe("SpatialDataCache.updateReconstructions$", () => { cache.cacheClusterReconstructions$(cellId).subscribe(); - const cluster = createCluster(node.clusterKey); + const cluster = createCluster(node.clusterId); resolver(cluster); expect(cache.hasClusterReconstructions(cellId)).toBe(true); @@ -472,7 +472,7 @@ describe("SpatialDataCache.updateReconstructions$", () => { let resolver: Function; const promise: any = { - then: (resolve: (value: IClusterReconstruction) => void): void => { + then: (resolve: (value: ClusterReconstructionContract) => void): void => { resolver = resolve; }, }; @@ -516,12 +516,12 @@ describe("SpatialDataCache.updateReconstructions$", () => { expect(cache.hasClusterReconstructions(cellId)).toBe(true); const cs = cache.getClusterReconstructions(cellId); expect(cs.length).toBe(1); - expect(cs[0].key).toBe(node.clusterKey); + expect(cs[0].id).toBe(node.clusterId); expect(clusterSpy.calls.count()).toBe(1); done(); }); - const cluster = createCluster(node.clusterKey); + const cluster = createCluster(node.clusterId); resolver(cluster); }); }); diff --git a/spec/component/tag/CreateHandlerBase.spec.ts b/spec/component/tag/CreateHandlerBase.spec.ts index db2f97991..3cb321e2f 100644 --- a/spec/component/tag/CreateHandlerBase.spec.ts +++ b/spec/component/tag/CreateHandlerBase.spec.ts @@ -3,7 +3,7 @@ import { Navigator } from "../../../src/viewer/Navigator"; import { ContainerMockCreator } from "../../helper/ContainerMockCreator"; import { NavigatorMockCreator } from "../../helper/NavigatorMockCreator"; import { Component } from "../../../src/component/Component"; -import { ITagConfiguration } from "../../../src/component/interfaces/ITagConfiguration"; +import { TagConfiguration } from "../../../src/component/interfaces/TagConfiguration"; import { CreateHandlerBase } from "../../../src/component/tag/handlers/CreateHandlerBase"; import { TagCreator } from "../../../src/component/tag/TagCreator"; import { ViewportCoords } from "../../../src/geo/ViewportCoords"; @@ -19,10 +19,10 @@ class CreateTestHandler extends CreateHandlerBase { protected _getNameExtension(): string { return "create-test"; } } -class TestComponent extends Component { +class TestComponent extends Component { protected _activate(): void { /*noop*/ } protected _deactivate(): void { /*noop*/ } - protected _getDefaultConfiguration(): ITagConfiguration { return {}; } + protected _getDefaultConfiguration(): TagConfiguration { return {}; } } describe("CreateHandlerBase.ctor", () => { diff --git a/spec/component/tag/CreatePointHandler.spec.ts b/spec/component/tag/CreatePointHandler.spec.ts index 233078922..46c014b54 100644 --- a/spec/component/tag/CreatePointHandler.spec.ts +++ b/spec/component/tag/CreatePointHandler.spec.ts @@ -5,7 +5,7 @@ import { NavigatorMockCreator } from "../../helper/NavigatorMockCreator"; import { Navigator } from "../../../src/viewer/Navigator"; import { Component } from "../../../src/component/Component"; -import { ITagConfiguration } from "../../../src/component/interfaces/ITagConfiguration"; +import { TagConfiguration } from "../../../src/component/interfaces/TagConfiguration"; import { PointGeometry } from "../../../src/component/tag/geometry/PointGeometry"; import { CreatePointHandler } from "../../../src/component/tag/handlers/CreatePointHandler"; import { TagCreator } from "../../../src/component/tag/TagCreator"; @@ -13,10 +13,10 @@ import { ViewportCoords } from "../../../src/geo/ViewportCoords"; import { Container } from "../../../src/viewer/Container"; import { Geometry } from "../../../src/component/tag/geometry/Geometry"; -class TestComponent extends Component { +class TestComponent extends Component { protected _activate(): void { /*noop*/ } protected _deactivate(): void { /*noop*/ } - protected _getDefaultConfiguration(): ITagConfiguration { return {}; } + protected _getDefaultConfiguration(): TagConfiguration { return {}; } } describe("CreatePointHandler.ctor", () => { diff --git a/spec/component/tag/ExtremePointRenderTag.spec.ts b/spec/component/tag/ExtremePointRenderTag.spec.ts index 944af9c71..7fd426591 100644 --- a/spec/component/tag/ExtremePointRenderTag.spec.ts +++ b/spec/component/tag/ExtremePointRenderTag.spec.ts @@ -45,7 +45,7 @@ describe("ExtremePointRenderTag.getRetrievableObjects", () => { const extremePointRenderTag = new ExtremePointRenderTag( extremePointTag, - transformHelper.createTransform("equirectangular")); + transformHelper.createTransform("spherical")); const retrievableObjects: THREE.Object3D[] = extremePointRenderTag.getRetrievableObjects(); diff --git a/spec/component/tag/OutlineRenderTag.spec.ts b/spec/component/tag/OutlineRenderTag.spec.ts index 09bedb15b..32227171a 100644 --- a/spec/component/tag/OutlineRenderTag.spec.ts +++ b/spec/component/tag/OutlineRenderTag.spec.ts @@ -47,7 +47,7 @@ describe("OutlineRenderTag.getRetrievableObjects", () => { new OutlineRenderTag( outlineTag, transformHelper.createTransform( - "equirectangular")); + "spherical")); const retrievableObjects = outlineRenderTag.getRetrievableObjects(); @@ -67,7 +67,7 @@ describe("OutlineRenderTag.getRetrievableObjects", () => { new OutlineRenderTag( outlineTag, transformHelper.createTransform( - "equirectangular")); + "spherical")); const retrievableObjects = outlineRenderTag.getRetrievableObjects(); diff --git a/spec/component/tag/PointGeometry.spec.ts b/spec/component/tag/PointGeometry.spec.ts index ef79785ff..f2fa864a9 100644 --- a/spec/component/tag/PointGeometry.spec.ts +++ b/spec/component/tag/PointGeometry.spec.ts @@ -34,7 +34,7 @@ describe("PointGeometry.setVertex2d", () => { let pointGeometry = new PointGeometry(original); let point = [0.5, 0.5]; - let transform = transformHelper.createTransform("equirectangular"); + let transform = transformHelper.createTransform("spherical"); pointGeometry.setCentroid2d(point, transform); @@ -47,7 +47,7 @@ describe("PointGeometry.setVertex2d", () => { let pointGeometry = new PointGeometry(original); let point = [-1, -1]; - let transform = transformHelper.createTransform("equirectangular"); + let transform = transformHelper.createTransform("spherical"); pointGeometry.setCentroid2d(point, transform); @@ -60,7 +60,7 @@ describe("PointGeometry.setVertex2d", () => { let pointGeometry = new PointGeometry(original); let point = [2, 2]; - let transform = transformHelper.createTransform("equirectangular"); + let transform = transformHelper.createTransform("spherical"); pointGeometry.setCentroid2d(point, transform); diff --git a/spec/component/tag/PointsGeometry.spec.ts b/spec/component/tag/PointsGeometry.spec.ts index e5d40bf9b..5435cc10f 100644 --- a/spec/component/tag/PointsGeometry.spec.ts +++ b/spec/component/tag/PointsGeometry.spec.ts @@ -136,7 +136,7 @@ describe("PointsGeometry.getRect2d", () => { const pointsGeometry = new PointsGeometry(points); const helper = new TransformHelper(); - const transform = helper.createTransform("equirectangular"); + const transform = helper.createTransform("spherical"); const result = pointsGeometry.getRect2d(transform); expect(result.length).toBe(4); @@ -153,7 +153,7 @@ describe("PointsGeometry.getRect2d", () => { const pointsGeometry = new PointsGeometry(points); const helper = new TransformHelper(); - const transform = helper.createTransform("equirectangular"); + const transform = helper.createTransform("spherical"); const result = pointsGeometry.getRect2d(transform); expect(result.length).toBe(4); diff --git a/spec/component/tag/PolygonGeometry.spec.ts b/spec/component/tag/PolygonGeometry.spec.ts index 38a864b08..0858a9779 100644 --- a/spec/component/tag/PolygonGeometry.spec.ts +++ b/spec/component/tag/PolygonGeometry.spec.ts @@ -496,7 +496,9 @@ describe("PolygonGeometry.get3dDomainTriangles", () => { const polygon = [[0, 0], [0.5, 0], [0.5, 0.5], [0, 0]]; const geometry = new PolygonGeometry(polygon); - const transform = new Transform(1, 1, 1, 0.5, 1, [0, 0, 0], [0, 0, 0], undefined); + const transform = new Transform( + 1, 1, 1, 0.5, [0, 0, 0], [0, 0, 0], + undefined, undefined, [1, 0, 0]); const triangles = geometry.get3dDomainTriangles3d(transform); @@ -509,7 +511,9 @@ describe("PolygonGeometry.getTriangles", () => { const polygon = [[0, 0], [1e-4, 0], [1e-4, 1e-4], [0, 0]]; const geometry = new PolygonGeometry(polygon); - const transform = new Transform(1, 1, 1, 0.5, 1, [0, 0, 0], [0, 0, 0], undefined); + const transform = new Transform( + 1, 1, 1, 0.5, [0, 0, 0], [0, 0, 0], + undefined, undefined, [1, 0, 0]); const triangles = geometry.getTriangles3d(transform); @@ -520,7 +524,9 @@ describe("PolygonGeometry.getTriangles", () => { const polygon = [[0, 0], [0.5, 0], [0.5, 0.5], [0, 0]]; const geometry = new PolygonGeometry(polygon); - const transform = new Transform(1, 1, 1, 0.5, 1, [0, 0, 0], [0, 0, 0], undefined); + const transform = new Transform( + 1, 1, 1, 0.5, [0, 0, 0], [0, 0, 0], + undefined, undefined, [1, 0, 0]); const triangles = geometry.getTriangles3d(transform); @@ -530,7 +536,9 @@ describe("PolygonGeometry.getTriangles", () => { it("should return two triangles for four close points for a spherical", () => { const polygon = [[0, 0], [1e-4, 0], [1e-4, 1e-4], [0, 1e-4], [0, 0]]; const geometry = new PolygonGeometry(polygon); - const transform = new Transform(1, 1, 1, 0.5, 1, [0, 0, 0], [0, 0, 0], undefined); + const transform = new Transform( + 1, 1, 1, 0.5, [0, 0, 0], [0, 0, 0], + undefined, undefined, [1, 0, 0]); const triangles = geometry.getTriangles3d(transform); diff --git a/spec/component/tag/RectGeometry.spec.ts b/spec/component/tag/RectGeometry.spec.ts index 66621cff4..d7abe4b15 100644 --- a/spec/component/tag/RectGeometry.spec.ts +++ b/spec/component/tag/RectGeometry.spec.ts @@ -114,7 +114,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.5, 0.5]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(0, vertex, transform); @@ -129,7 +129,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.5, 0.5]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -144,7 +144,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.5, 0.5]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(2, vertex, transform); @@ -159,7 +159,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.5, 0.5]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -174,7 +174,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [-1, -1]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -189,7 +189,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [2, 2]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -204,7 +204,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.3, original[3]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -219,7 +219,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.6, original[1]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -234,7 +234,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [original[2], 0.4]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -249,7 +249,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [original[0], 0.6]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -264,7 +264,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.9, original[1]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -279,7 +279,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.1, original[3]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -294,7 +294,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.8, original[1]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -309,7 +309,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.9, original[3]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -324,7 +324,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.1, original[1]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -339,7 +339,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.99, original[3]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(3, vertex, transform); @@ -354,7 +354,7 @@ describe("RectGeometry.setVertex2d", () => { let rectGeometry = new RectGeometry(original); let vertex = [0.01, original[1]]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setVertex2d(1, vertex, transform); @@ -403,7 +403,7 @@ describe("RectGeometry.setCentroid2d", () => { let rectGeometry = new RectGeometry(original); let centroid = [0, 0.2]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setCentroid2d(centroid, transform); @@ -433,7 +433,7 @@ describe("RectGeometry.setCentroid2d", () => { let rectGeometry = new RectGeometry(original); let centroid = [0.2, 0]; - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.setCentroid2d(centroid, transform); @@ -681,7 +681,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should invert for spherical when right side passes boundary rightward", () => { const rect = [0.9, 0.5, 0.99, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); @@ -695,7 +695,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should invert for spherical when left side passes right side and boundary rightward", () => { const rect = [0.9, 0.5, 0.99, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -709,7 +709,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should uninvert for spherical when left side passes boundary rightward", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -723,7 +723,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should uninvert for spherical when left side passes right side and boundary rightward", () => { const rect = [0.99, 0.5, 0.01, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -737,7 +737,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should invert for spherical when left side passes boundary leftward", () => { const rect = [0.01, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -751,7 +751,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should invert for spherical when right side passes left side and boundary leftward", () => { const rect = [0.01, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); @@ -765,7 +765,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should uninvert for spherical when right side passes boundary leftward", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); @@ -779,7 +779,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should uninvert for spherical when right side passes left side and boundary leftward", () => { const rect = [0.99, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); @@ -793,7 +793,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should keep inversion for anchor index 0", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); @@ -807,7 +807,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should keep inversion for anchor index 1", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); @@ -821,7 +821,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should keep inversion for anchor index 2", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(2); @@ -835,7 +835,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should keep inversion for anchor index 2", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -849,7 +849,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should keep inversion when passing vertically to the right", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); @@ -869,7 +869,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should keep inversion when passing vertically to the left", () => { const rect = [0.9, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(2); @@ -889,7 +889,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should reset loop when right passes left", () => { const rect = [0.15, 0.5, 0.1, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); @@ -903,7 +903,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should reset loop when left passes right", () => { const rect = [0.2, 0.5, 0.15, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -919,7 +919,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should rotate anchor index clockwise for spherical", () => { const rect = [0.5, 0.5, 0.6, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); expect(rectGeometry.anchorIndex).toBe(1); @@ -944,7 +944,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should rotate anchor index counterclockwise for spherical", () => { const rect = [0.5, 0.5, 0.6, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); expect(rectGeometry.anchorIndex).toBe(1); @@ -969,7 +969,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should rotate anchor index diagonally se-nw for spherical", () => { const rect = [0.5, 0.5, 0.6, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); expect(rectGeometry.anchorIndex).toBe(1); @@ -986,7 +986,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should rotate anchor index diagonally ne-sw for spherical", () => { const rect = [0.5, 0.4, 0.6, 0.5]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(0); expect(rectGeometry.anchorIndex).toBe(0); @@ -1003,7 +1003,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should not change anchor index when opposite decreases to equal anchor for spherical", () => { const rect = [0.5, 0.5, 0.6, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); @@ -1019,7 +1019,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should not change anchor index when opposite increases to equal anchor for spherical", () => { const rect = [0.4, 0.4, 0.5, 0.5]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(3); @@ -1035,7 +1035,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should always have a larger right x than left x except when equal for spherical", () => { const rect = [0.5, 0.5, 0.6, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); @@ -1052,7 +1052,7 @@ describe("RectGeometry.setOppositeVertex", () => { it("should always have a larger bottom y than top y except when equal for spherical", () => { const rect = [0.5, 0.5, 0.6, 0.6]; const rectGeometry = new RectGeometry(rect); - const transform = transformHelper.createTransform("equirectangular"); + const transform = transformHelper.createTransform("spherical"); rectGeometry.initializeAnchorIndexing(1); diff --git a/spec/component/tag/TagScene.spec.ts b/spec/component/tag/TagScene.spec.ts index 132a50b82..32f956eb8 100644 --- a/spec/component/tag/TagScene.spec.ts +++ b/spec/component/tag/TagScene.spec.ts @@ -4,7 +4,7 @@ import { RectGeometry } from "../../../src/component/tag/geometry/RectGeometry"; import { RenderTag } from "../../../src/component/tag/tag/RenderTag"; import { Tag } from "../../../src/component/tag/tag/Tag"; import { TagScene } from "../../../src/component/tag/TagScene"; -import { ISize } from "../../../src/render/interfaces/ISize"; +import { ViewportSize } from "../../../src/render/interfaces/ViewportSize"; import { ISpriteAtlas } from "../../../src/viewer/interfaces/ISpriteAtlas"; describe("TagScene.ctor", () => { @@ -36,7 +36,7 @@ class TestTag extends Tag { class TestRenderTag extends RenderTag { public dispose(): void { /*noop*/ } - public getDOMObjects(atlas: ISpriteAtlas, camera: THREE.Camera, size: ISize): vd.VNode[] { return []; } + public getDOMObjects(atlas: ISpriteAtlas, camera: THREE.Camera, size: ViewportSize): vd.VNode[] { return []; } public getGLObjects(): THREE.Object3D[] { return []; } public getRetrievableObjects(): THREE.Object3D[] { return []; } } diff --git a/spec/component/utils/HandlerBase.spec.ts b/spec/component/utils/HandlerBase.spec.ts index e75af2999..1a5ffda7c 100644 --- a/spec/component/utils/HandlerBase.spec.ts +++ b/spec/component/utils/HandlerBase.spec.ts @@ -4,27 +4,27 @@ import { NavigatorMockCreator } from "../../helper/NavigatorMockCreator"; import { Navigator } from "../../../src/viewer/Navigator"; import { Component } from "../../../src/component/Component"; -import { IComponentConfiguration } from "../../../src/component/interfaces/IComponentConfiguration"; +import { ComponentConfiguration } from "../../../src/component/interfaces/ComponentConfiguration"; import { HandlerBase } from "../../../src/component/utils/HandlerBase"; import { Container } from "../../../src/viewer/Container"; -interface ITestConfiguration extends IComponentConfiguration { +interface TestConfiguration extends ComponentConfiguration { test: boolean; } -class TestComponent extends Component { +class TestComponent extends Component { constructor(name: string, container: Container, navigator: Navigator) { super(name, container, navigator); } protected _activate(): void { /* noop */ } protected _deactivate(): void { /* noop */ } - protected _getDefaultConfiguration(): ITestConfiguration { return { test: false }; } + protected _getDefaultConfiguration(): TestConfiguration { return { test: false }; } } -class TestHandler extends HandlerBase { +class TestHandler extends HandlerBase { protected _disable(): void { /* noop */ } protected _enable(): void { /* noop */ } - protected _getConfiguration(enable: boolean): ITestConfiguration { return { test: enable }; } + protected _getConfiguration(enable: boolean): TestConfiguration { return { test: enable }; } } describe("HandlerBase.ctor", () => { diff --git a/spec/geo/GeoCoords.spec.ts b/spec/geo/GeoCoords.spec.ts index 6dda35900..771eade1d 100644 --- a/spec/geo/GeoCoords.spec.ts +++ b/spec/geo/GeoCoords.spec.ts @@ -1,5 +1,5 @@ import { GeoCoords } from "../../src/geo/GeoCoords"; -import { ILatLonAlt } from "../../src/geo/interfaces/ILatLonAlt"; +import { LatLonAlt } from "../../src/api/interfaces/LatLonAlt"; let precision: number = 8; @@ -14,7 +14,7 @@ describe("GeoCoords.geodeticToEcef", () => { }); it("should convert Equator - Greenwich to X axis value", () => { - let position: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let position: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let ecef: number[] = geoCoords.geodeticToEcef(position.lat, position.lon, position.alt); @@ -24,7 +24,7 @@ describe("GeoCoords.geodeticToEcef", () => { }); it("should convert positions on Equator to WGS84 a distance", () => { - let position1: ILatLonAlt = { alt: 0, lat: 0, lon: 90 }; + let position1: LatLonAlt = { alt: 0, lat: 0, lon: 90 }; let ecef1: number[] = geoCoords.geodeticToEcef(position1.lat, position1.lon, position1.alt); @@ -32,7 +32,7 @@ describe("GeoCoords.geodeticToEcef", () => { expect(ecef1[1]).toBeCloseTo(wgs84a, precision); expect(ecef1[2]).toBeCloseTo(0, precision); - let position2: ILatLonAlt = { alt: 0, lat: 0, lon: 180 }; + let position2: LatLonAlt = { alt: 0, lat: 0, lon: 180 }; let ecef2: number[] = geoCoords.geodeticToEcef(position2.lat, position2.lon, position2.alt); @@ -40,7 +40,7 @@ describe("GeoCoords.geodeticToEcef", () => { expect(ecef2[1]).toBeCloseTo(0, precision); expect(ecef2[2]).toBeCloseTo(0, precision); - let position3: ILatLonAlt = { alt: 0, lat: 0, lon: -90 }; + let position3: LatLonAlt = { alt: 0, lat: 0, lon: -90 }; let ecef3: number[] = geoCoords.geodeticToEcef(position3.lat, position3.lon, position3.alt); @@ -50,7 +50,7 @@ describe("GeoCoords.geodeticToEcef", () => { }); it("should convert random Equator postion correctly", () => { - let position: ILatLonAlt = { alt: 0, lat: 0, lon: 35.6589 }; + let position: LatLonAlt = { alt: 0, lat: 0, lon: 35.6589 }; let ecef: number[] = geoCoords.geodeticToEcef(position.lat, position.lon, position.alt); @@ -60,7 +60,7 @@ describe("GeoCoords.geodeticToEcef", () => { }); it("should convert value with altitude correctly", () => { - let position: ILatLonAlt = { alt: 452.43537987, lat: 0, lon: 0 }; + let position: LatLonAlt = { alt: 452.43537987, lat: 0, lon: 0 }; let ecef: number[] = geoCoords.geodeticToEcef(position.lat, position.lon, position.alt); @@ -70,7 +70,7 @@ describe("GeoCoords.geodeticToEcef", () => { }); it("should convert North Pole value correctly", () => { - let position: ILatLonAlt = { alt: 0, lat: 90, lon: 0 }; + let position: LatLonAlt = { alt: 0, lat: 90, lon: 0 }; let ecef: number[] = geoCoords.geodeticToEcef(position.lat, position.lon, position.alt); @@ -80,7 +80,7 @@ describe("GeoCoords.geodeticToEcef", () => { }); it("should convert back and forth between WGS84 and ECEF and correspond", () => { - let position: ILatLonAlt = { alt: 25.34543543, lat: 12.469889789, lon: -33.34589734 }; + let position: LatLonAlt = { alt: 25.34543543, lat: 12.469889789, lon: -33.34589734 }; let ecef: number[] = geoCoords.geodeticToEcef(position.lat, position.lon, position.alt); let rePosition: number[] = geoCoords.ecefToGeodetic(ecef[0], ecef[1], ecef[2]); @@ -166,7 +166,7 @@ describe("GeoCoords.ecefToEnu", () => { }); it("should convert to ECEF position corresponding to geodetic to ENU at origin", () => { - let ref: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let ref: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let ecef: number[] = [wgs84a, 0, 0]; let enu: number[] = geoCoords.ecefToEnu(ecef[0], ecef[1], ecef[2], ref.lat, ref.lon, ref.alt); @@ -177,7 +177,7 @@ describe("GeoCoords.ecefToEnu", () => { }); it("should convert positions on Equator to ENU positions at origin", () => { - let ref1: ILatLonAlt = { alt: 0, lat: 0, lon: 90 }; + let ref1: LatLonAlt = { alt: 0, lat: 0, lon: 90 }; let ecef1: number[] = [0, wgs84a, 0]; let enu1: number[] = geoCoords.ecefToEnu(ecef1[0], ecef1[1], ecef1[2], ref1.lat, ref1.lon, ref1.alt); @@ -186,7 +186,7 @@ describe("GeoCoords.ecefToEnu", () => { expect(enu1[1]).toBeCloseTo(0, precision); expect(enu1[2]).toBeCloseTo(0, precision); - let ref2: ILatLonAlt = { alt: 0, lat: 0, lon: 180 }; + let ref2: LatLonAlt = { alt: 0, lat: 0, lon: 180 }; let ecef2: number[] = [-wgs84a, 0, 0]; let enu2: number[] = geoCoords.ecefToEnu(ecef2[0], ecef2[1], ecef2[2], ref2.lat, ref2.lon, ref2.alt); @@ -195,7 +195,7 @@ describe("GeoCoords.ecefToEnu", () => { expect(enu2[1]).toBeCloseTo(0, precision); expect(enu2[2]).toBeCloseTo(0, precision); - let ref3: ILatLonAlt = { alt: 0, lat: 0, lon: -90 }; + let ref3: LatLonAlt = { alt: 0, lat: 0, lon: -90 }; let ecef3: number[] = [0, -wgs84a, 0]; let enu3: number[] = geoCoords.ecefToEnu(ecef3[0], ecef3[1], ecef3[2], ref3.lat, ref3.lon, ref3.alt); @@ -206,7 +206,7 @@ describe("GeoCoords.ecefToEnu", () => { }); it("should convert ECEF position with altitude to ENU with correct z-value", () => { - let ref: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let ref: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let altitude: number = 5.38973284; let ecef: number[] = [wgs84a + altitude, 0, 0]; @@ -219,7 +219,7 @@ describe("GeoCoords.ecefToEnu", () => { }); it("should convert ECEF position with translation to correct ENU position", () => { - let ref: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let ref: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let translation: number = 1.38973284; let ecef: number[] = [wgs84a, translation, translation]; @@ -240,7 +240,7 @@ describe("GeoCoords.enuToEcef", () => { }); it("should convert to ENU position at origin to ECEF X-value", () => { - let ref: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let ref: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let enu: number[] = [0, 0, 0]; let ecef: number[] = geoCoords.enuToEcef(enu[0], enu[1], enu[2], ref.lat, ref.lon, ref.alt); @@ -251,7 +251,7 @@ describe("GeoCoords.enuToEcef", () => { }); it("should convert to ENU position with up value to ECEF X-value", () => { - let ref: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let ref: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let enu: number[] = [0, 0, 7.3823847239847]; let ecef: number[] = geoCoords.enuToEcef(enu[0], enu[1], enu[2], ref.lat, ref.lon, ref.alt); @@ -262,7 +262,7 @@ describe("GeoCoords.enuToEcef", () => { }); it("should convert ECEF position with translation to correct ENU position", () => { - let ref: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let ref: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let translation: number = -2.34875843758493; let enu: number[] = [translation, translation, 0]; @@ -283,8 +283,8 @@ describe("GeoCoords.geodeticToEnu", () => { }); it("should convert to ENU position at origin when lla is at reference", () => { - let ref: ILatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; - let lla: ILatLonAlt = { alt: ref.alt, lat: ref.lat, lon: ref.lon }; + let ref: LatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; + let lla: LatLonAlt = { alt: ref.alt, lat: ref.lat, lon: ref.lon }; let enu: number[] = geoCoords.geodeticToEnu(lla.lat, lla.lon, lla.alt, ref.lat, ref.lon, ref.alt); @@ -294,10 +294,10 @@ describe("GeoCoords.geodeticToEnu", () => { }); it("should convert to ENU z value corresponding to diff with reference lla", () => { - let ref: ILatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; + let ref: LatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; let altTranslation: number = 4.4556433242; - let lla: ILatLonAlt = { alt: ref.alt + altTranslation, lat: ref.lat, lon: ref.lon }; + let lla: LatLonAlt = { alt: ref.alt + altTranslation, lat: ref.lat, lon: ref.lon }; let enu: number[] = geoCoords.geodeticToEnu(lla.lat, lla.lon, lla.alt, ref.lat, ref.lon, ref.alt); @@ -307,8 +307,8 @@ describe("GeoCoords.geodeticToEnu", () => { }); it("should convert back and forth between WGS84 and ENU and correspond", () => { - let ref: ILatLonAlt = { alt: -3.645563324, lat: 13.469889789, lon: 92.376689734 }; - let lla: ILatLonAlt = { alt: ref.alt + 20, lat: ref.lat - 0.01, lon: ref.lon + 0.01 }; + let ref: LatLonAlt = { alt: -3.645563324, lat: 13.469889789, lon: 92.376689734 }; + let lla: LatLonAlt = { alt: ref.alt + 20, lat: ref.lat - 0.01, lon: ref.lon + 0.01 }; let enu: number[] = geoCoords.geodeticToEnu(lla.lat, lla.lon, lla.alt, ref.lat, ref.lon, ref.alt); let reLla: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], ref.lat, ref.lon, ref.alt); @@ -327,7 +327,7 @@ describe("GeoCoords.enuToGeodetic", () => { }); it("should convert to reference WGS84 when ENU position is origin", () => { - let ref: ILatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; + let ref: LatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; let enu: number[] = [0, 0, 0]; let lla: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], ref.lat, ref.lon, ref.alt); @@ -338,7 +338,7 @@ describe("GeoCoords.enuToGeodetic", () => { }); it("should convert to reference WGS84 at correct altitude when ENU position has non zero z value", () => { - let ref: ILatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; + let ref: LatLonAlt = { alt: 12.523892390, lat: 12.9450823, lon: 133.34589734 }; let enu: number[] = [0, 0, 5.234872384927]; let lla: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], ref.lat, ref.lon, ref.alt); @@ -349,7 +349,7 @@ describe("GeoCoords.enuToGeodetic", () => { }); it("should convert back and forth between ENU and WGS84 and correspond", () => { - let ref: ILatLonAlt = { alt: 7.34543543, lat: -52.469889789, lon: -113.34589734 }; + let ref: LatLonAlt = { alt: 7.34543543, lat: -52.469889789, lon: -113.34589734 }; let enu: number[] = [12.435534543, -55.34242121, 5.98023489]; let lla: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], ref.lat, ref.lon, ref.alt); diff --git a/spec/geo/Transform.spec.ts b/spec/geo/Transform.spec.ts index 3b7ef25bb..24aa785f3 100644 --- a/spec/geo/Transform.spec.ts +++ b/spec/geo/Transform.spec.ts @@ -5,7 +5,8 @@ import { GeoHelper } from "../helper/GeoHelper"; import { Node } from "../../src/graph/Node"; import { Transform } from "../../src/geo/Transform"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; +import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt"; +import { CameraType } from "../../src/geo/interfaces/CameraType"; describe("Transform.rt", () => { @@ -22,19 +23,21 @@ describe("Transform.rt", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = r; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let rt: THREE.Matrix4 = transform.rt; @@ -64,19 +67,21 @@ describe("Transform.rt", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = r; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let rt: THREE.Matrix4 = transform.rt; @@ -106,19 +111,21 @@ describe("Transform.rt", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = r; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let rt: THREE.Matrix4 = transform.rt; @@ -148,19 +155,21 @@ describe("Transform.rt", () => { let t: number[] = [10, 20, 30]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = r; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let rt: THREE.Matrix4 = transform.rt; @@ -200,20 +209,22 @@ describe("Transform.srt", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.atomic_scale = 1; - fillNode.c_rotation = r; + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let sRt: THREE.Matrix4 = transform.srt; @@ -243,20 +254,22 @@ describe("Transform.srt", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.atomic_scale = 3; - fillNode.c_rotation = r; + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let sRt: THREE.Matrix4 = transform.srt; @@ -286,20 +299,22 @@ describe("Transform.srt", () => { let t: number[] = [-10, 20, -30]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.atomic_scale = 0.5; - fillNode.c_rotation = r; + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let sRt: THREE.Matrix4 = transform.srt; @@ -338,20 +353,22 @@ describe("Transform.basicWidth", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.width = width; - fillNode.orientation = 1; + fillNode.exif_orientation = 1; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.basicWidth).toBe(width); }); @@ -362,20 +379,22 @@ describe("Transform.basicWidth", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.height = height; - fillNode.orientation = 5; + fillNode.exif_orientation = 5; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.basicWidth).toBe(height); }); @@ -394,20 +413,22 @@ describe("Transform.basicHeight", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.height = height; - fillNode.orientation = 1; + fillNode.exif_orientation = 1; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.basicHeight).toBe(height); }); @@ -418,20 +439,22 @@ describe("Transform.basicHeight", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.width = width; - fillNode.orientation = 5; + fillNode.exif_orientation = 5; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.basicHeight).toBe(width); }); @@ -449,19 +472,21 @@ describe("Transform.width", () => { let node: Node = new Node(helper.createCoreNode()); - const fillNode: IFillNode = helper.createFillNode(); + const fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.width = 0; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.width).toBe(4); }); @@ -472,19 +497,21 @@ describe("Transform.width", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.width = width; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.width).toBe(width); }); @@ -501,20 +528,22 @@ describe("Transform.height", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.height = -1; - fillNode.orientation = 1; + fillNode.exif_orientation = 1; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.height).toBe(3); }); @@ -525,20 +554,22 @@ describe("Transform.height", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.height = height; - fillNode.orientation = 1; + fillNode.exif_orientation = 1; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.height).toBe(height); }); @@ -555,18 +586,20 @@ describe("Transform.focal", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.focal).toBe(1); }); @@ -577,19 +610,21 @@ describe("Transform.focal", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.cfocal = focal; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.camera_parameters = [focal, 0, 0]; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.focal).toBe(focal); }); @@ -606,18 +641,20 @@ describe("Transform.orientation", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.orientation).toBe(1); }); @@ -628,19 +665,21 @@ describe("Transform.orientation", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.orientation = 3; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.exif_orientation = 3; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.orientation).toBe(orientation); }); @@ -660,14 +699,16 @@ describe("Transform.scale", () => { node.makeFull(helper.createFillNode()); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.scale).toBe(0); }); @@ -678,19 +719,21 @@ describe("Transform.scale", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.atomic_scale = 0.4; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); expect(transform.scale).toBe(scale); }); @@ -714,14 +757,16 @@ describe("Transform.unprojectSfM", () => { node.makeFull(helper.createFillNode()); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let sfm: number[] = transform.unprojectSfM([0, 0], 0); @@ -737,14 +782,16 @@ describe("Transform.unprojectSfM", () => { node.makeFull(helper.createFillNode()); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let sfm: number[] = transform.unprojectSfM([0, 0], 0); @@ -759,19 +806,21 @@ describe("Transform.unprojectSfM", () => { let t: number[] = geoHelper.getTranslation(r, C); let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = r; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let sfm: number[] = transform.unprojectSfM([0, 0], 0); @@ -787,14 +836,16 @@ describe("Transform.unprojectSfM", () => { node.makeFull(helper.createFillNode()); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let depth: number = 10; let sfm: number[] = transform.unprojectSfM([0, 0], depth); @@ -809,19 +860,21 @@ describe("Transform.unprojectSfM", () => { let t: number[] = [0, 0, 0]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = r; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = r; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let depth: number = 5; let sfm: number[] = transform.unprojectSfM([0.5, 0], depth); @@ -848,14 +901,16 @@ describe("Transform.projectBasic", () => { node.makeFull(helper.createFillNode()); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let pixel: number[] = transform.projectBasic([0, 0, 10]); @@ -870,14 +925,16 @@ describe("Transform.projectBasic", () => { node.makeFull(helper.createFillNode()); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let pixel: number[] = transform.projectBasic([1, 1, 10]); @@ -899,20 +956,22 @@ describe("Transform.unprojectBasic", () => { let t: number[] = [10, 20, 30]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = [0.1, 0.2, 0.3]; - fillNode.orientation = 1; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = [0.1, 0.2, 0.3]; + fillNode.exif_orientation = 1; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let pixel: number[] = [-0.1, 0.2]; @@ -928,20 +987,22 @@ describe("Transform.unprojectBasic", () => { let t: number[] = [10, 20, 30]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = [0.1, 0.2, 0.3]; - fillNode.orientation = 3; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = [0.1, 0.2, 0.3]; + fillNode.exif_orientation = 3; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let pixel: number[] = [-0.1, 0.2]; @@ -957,20 +1018,22 @@ describe("Transform.unprojectBasic", () => { let t: number[] = [10, 20, 30]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = [0.1, 0.2, 0.3]; - fillNode.orientation = 6; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = [0.1, 0.2, 0.3]; + fillNode.exif_orientation = 6; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let pixel: number[] = [-0.1, 0.2]; @@ -986,20 +1049,22 @@ describe("Transform.unprojectBasic", () => { let t: number[] = [10, 20, 30]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = [0.1, 0.2, 0.3]; - fillNode.orientation = 8; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = [0.1, 0.2, 0.3]; + fillNode.exif_orientation = 8; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let pixel: number[] = [-0.1, 0.2]; @@ -1015,21 +1080,23 @@ describe("Transform.unprojectBasic", () => { let t: number[] = [5, 15, 2]; let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); - fillNode.c_rotation = [0.5, -0.2, 0.3]; - fillNode.camera_projection_type = "equirectangular"; + let fillNode: SpatialImageEnt = helper.createFillNode(); + fillNode.computed_rotation = [0.5, -0.2, 0.3]; + fillNode.camera_type = "spherical"; node.makeFull(fillNode); let transform: Transform = new Transform( - node.orientation, + node.exifOrientation, node.width, node.height, - node.focal, node.scale, node.rotation, t, - null); + null, + null, + node.cameraParameters, + node.cameraType); let basicPixel: number[] = [0.4534546, 0.72344564]; diff --git a/spec/graph/FilterCreator.spec.ts b/spec/graph/FilterCreator.spec.ts index d9d796da5..3758f065f 100644 --- a/spec/graph/FilterCreator.spec.ts +++ b/spec/graph/FilterCreator.spec.ts @@ -1,7 +1,7 @@ import { NodeHelper } from "../helper/NodeHelper"; import { Node } from "../../src/graph/Node"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; +import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt"; +import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt"; import { FilterCreator, FilterFunction } from "../../src/graph/FilterCreator"; /** @@ -26,17 +26,17 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "skey"; - let filter: FilterFunction = creator.createFilter(["==", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter(["==", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = sequenceKey; - coreNode2.sequence_key = sequenceKey + "w"; - coreNode3.sequence_key = null; - coreNode4.sequence_key = undefined; + coreNode1.sequence.id = sequenceKey; + coreNode2.sequence.id = sequenceKey + "w"; + coreNode3.sequence.id = null; + coreNode4.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -60,10 +60,10 @@ describe("FilterCreator.createFilter", () => { let node3: Node = new Node(helper.createCoreNode()); let node4: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt; fillNode2.captured_at = capturedAt + 1; @@ -84,22 +84,22 @@ describe("FilterCreator.createFilter", () => { it("should compare ==, null", () => { let creator: FilterCreator = new FilterCreator(); - let filter: FilterFunction = creator.createFilter(["==", "userKey", null]); + let filter = creator.createFilter(["==", "creatorId", null]); let node1: Node = new Node(helper.createCoreNode()); let node2: Node = new Node(helper.createCoreNode()); let node3: Node = new Node(helper.createCoreNode()); let node4: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); - fillNode1.user.key = null; - fillNode2.user.key = "ukey"; - fillNode3.user.key = "null"; - fillNode4.user.key = undefined; + fillNode1.creator.id = null; + fillNode2.creator.id = "ukey"; + fillNode3.creator.id = "null"; + fillNode4.creator.id = undefined; node1.makeFull(fillNode1); node2.makeFull(fillNode2); @@ -124,17 +124,17 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "skey"; - let filter: FilterFunction = creator.createFilter(["!=", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter(["!=", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = sequenceKey; - coreNode2.sequence_key = sequenceKey + "w"; - coreNode3.sequence_key = null; - coreNode4.sequence_key = undefined; + coreNode1.sequence.id = sequenceKey; + coreNode2.sequence.id = sequenceKey + "w"; + coreNode3.sequence.id = null; + coreNode4.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -158,10 +158,10 @@ describe("FilterCreator.createFilter", () => { let node3: Node = new Node(helper.createCoreNode()); let node4: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt; fillNode2.captured_at = capturedAt + 1; @@ -182,22 +182,22 @@ describe("FilterCreator.createFilter", () => { it("should compare !=, null", () => { let creator: FilterCreator = new FilterCreator(); - let filter: FilterFunction = creator.createFilter(["!=", "userKey", null]); + let filter = creator.createFilter(["!=", "creatorId", null]); let node1: Node = new Node(helper.createCoreNode()); let node2: Node = new Node(helper.createCoreNode()); let node3: Node = new Node(helper.createCoreNode()); let node4: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); - fillNode1.user.key = null; - fillNode2.user.key = "ukey"; - fillNode3.user.key = "null"; - fillNode4.user.key = undefined; + fillNode1.creator.id = null; + fillNode2.creator.id = "ukey"; + fillNode3.creator.id = "null"; + fillNode4.creator.id = undefined; node1.makeFull(fillNode1); node2.makeFull(fillNode2); @@ -230,11 +230,11 @@ describe("FilterCreator.createFilter", () => { let node4: Node = new Node(helper.createCoreNode()); let node5: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); - let fillNode5: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); + let fillNode5: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt - 1; fillNode2.captured_at = capturedAt; @@ -259,19 +259,19 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "0"; - let filter: FilterFunction = creator.createFilter([">", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter([">", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); - let coreNode5: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); + let coreNode5: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "-1"; - coreNode2.sequence_key = sequenceKey; - coreNode3.sequence_key = "1"; - coreNode4.sequence_key = null; - coreNode5.sequence_key = undefined; + coreNode1.sequence.id = "-1"; + coreNode2.sequence.id = sequenceKey; + coreNode3.sequence.id = "1"; + coreNode4.sequence.id = null; + coreNode5.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -306,11 +306,11 @@ describe("FilterCreator.createFilter", () => { let node4: Node = new Node(helper.createCoreNode()); let node5: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); - let fillNode5: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); + let fillNode5: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt - 1; fillNode2.captured_at = capturedAt; @@ -335,19 +335,19 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "0"; - let filter: FilterFunction = creator.createFilter([">=", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter([">=", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); - let coreNode5: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); + let coreNode5: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "-1"; - coreNode2.sequence_key = sequenceKey; - coreNode3.sequence_key = "1"; - coreNode4.sequence_key = null; - coreNode5.sequence_key = undefined; + coreNode1.sequence.id = "-1"; + coreNode2.sequence.id = sequenceKey; + coreNode3.sequence.id = "1"; + coreNode4.sequence.id = null; + coreNode5.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -382,11 +382,11 @@ describe("FilterCreator.createFilter", () => { let node4: Node = new Node(helper.createCoreNode()); let node5: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); - let fillNode5: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); + let fillNode5: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt - 1; fillNode2.captured_at = capturedAt; @@ -411,19 +411,19 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "0"; - let filter: FilterFunction = creator.createFilter(["<", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter(["<", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); - let coreNode5: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); + let coreNode5: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "-1"; - coreNode2.sequence_key = sequenceKey; - coreNode3.sequence_key = "1"; - coreNode4.sequence_key = null; - coreNode5.sequence_key = undefined; + coreNode1.sequence.id = "-1"; + coreNode2.sequence.id = sequenceKey; + coreNode3.sequence.id = "1"; + coreNode4.sequence.id = null; + coreNode5.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -458,11 +458,11 @@ describe("FilterCreator.createFilter", () => { let node4: Node = new Node(helper.createCoreNode()); let node5: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); - let fillNode5: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); + let fillNode5: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt - 1; fillNode2.captured_at = capturedAt; @@ -487,19 +487,19 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "0"; - let filter: FilterFunction = creator.createFilter(["<=", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter(["<=", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); - let coreNode5: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); + let coreNode5: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "-1"; - coreNode2.sequence_key = sequenceKey; - coreNode3.sequence_key = "1"; - coreNode4.sequence_key = null; - coreNode5.sequence_key = undefined; + coreNode1.sequence.id = "-1"; + coreNode2.sequence.id = sequenceKey; + coreNode3.sequence.id = "1"; + coreNode4.sequence.id = null; + coreNode5.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -534,11 +534,11 @@ describe("FilterCreator.createFilter", () => { let node4: Node = new Node(helper.createCoreNode()); let node5: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); - let fillNode5: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); + let fillNode5: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt - 1; fillNode2.captured_at = capturedAt; @@ -563,19 +563,19 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "0"; - let filter: FilterFunction = creator.createFilter(["in", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter(["in", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); - let coreNode5: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); + let coreNode5: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "-1"; - coreNode2.sequence_key = sequenceKey; - coreNode3.sequence_key = "1"; - coreNode4.sequence_key = null; - coreNode5.sequence_key = undefined; + coreNode1.sequence.id = "-1"; + coreNode2.sequence.id = sequenceKey; + coreNode3.sequence.id = "1"; + coreNode4.sequence.id = null; + coreNode5.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -593,15 +593,15 @@ describe("FilterCreator.createFilter", () => { it("should test in, null", () => { let creator: FilterCreator = new FilterCreator(); - let filter: FilterFunction = creator.createFilter(["in", "sequenceKey", null]); + let filter: FilterFunction = creator.createFilter(["in", "sequenceId", null]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "1"; - coreNode2.sequence_key = null; - coreNode3.sequence_key = undefined; + coreNode1.sequence.id = "1"; + coreNode2.sequence.id = null; + coreNode3.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -621,9 +621,9 @@ describe("FilterCreator.createFilter", () => { let node2: Node = new Node(helper.createCoreNode()); let node3: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = 0; fillNode2.captured_at = 1; @@ -651,10 +651,10 @@ describe("FilterCreator.createFilter", () => { let node3: Node = new Node(helper.createCoreNode()); let node4: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = 0; fillNode2.captured_at = 1; @@ -692,11 +692,11 @@ describe("FilterCreator.createFilter", () => { let node4: Node = new Node(helper.createCoreNode()); let node5: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); - let fillNode5: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); + let fillNode5: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = capturedAt - 1; fillNode2.captured_at = capturedAt; @@ -721,19 +721,19 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let sequenceKey: string = "0"; - let filter: FilterFunction = creator.createFilter(["!in", "sequenceKey", sequenceKey]); + let filter: FilterFunction = creator.createFilter(["!in", "sequenceId", sequenceKey]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); - let coreNode4: ICoreNode = helper.createCoreNode(); - let coreNode5: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); + let coreNode4: CoreImageEnt = helper.createCoreNode(); + let coreNode5: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "-1"; - coreNode2.sequence_key = sequenceKey; - coreNode3.sequence_key = "1"; - coreNode4.sequence_key = null; - coreNode5.sequence_key = undefined; + coreNode1.sequence.id = "-1"; + coreNode2.sequence.id = sequenceKey; + coreNode3.sequence.id = "1"; + coreNode4.sequence.id = null; + coreNode5.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -751,15 +751,15 @@ describe("FilterCreator.createFilter", () => { it("should test !in, null", () => { let creator: FilterCreator = new FilterCreator(); - let filter: FilterFunction = creator.createFilter(["!in", "sequenceKey", null]); + let filter: FilterFunction = creator.createFilter(["!in", "sequenceId", null]); - let coreNode1: ICoreNode = helper.createCoreNode(); - let coreNode2: ICoreNode = helper.createCoreNode(); - let coreNode3: ICoreNode = helper.createCoreNode(); + let coreNode1: CoreImageEnt = helper.createCoreNode(); + let coreNode2: CoreImageEnt = helper.createCoreNode(); + let coreNode3: CoreImageEnt = helper.createCoreNode(); - coreNode1.sequence_key = "1"; - coreNode2.sequence_key = null; - coreNode3.sequence_key = undefined; + coreNode1.sequence.id = "1"; + coreNode2.sequence.id = null; + coreNode3.sequence.id = undefined; let node1: Node = new Node(coreNode1); let node2: Node = new Node(coreNode2); @@ -779,9 +779,9 @@ describe("FilterCreator.createFilter", () => { let node2: Node = new Node(helper.createCoreNode()); let node3: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = 0; fillNode2.captured_at = 1; @@ -809,10 +809,10 @@ describe("FilterCreator.createFilter", () => { let node3: Node = new Node(helper.createCoreNode()); let node4: Node = new Node(helper.createCoreNode()); - let fillNode1: IFillNode = helper.createFillNode(); - let fillNode2: IFillNode = helper.createFillNode(); - let fillNode3: IFillNode = helper.createFillNode(); - let fillNode4: IFillNode = helper.createFillNode(); + let fillNode1: SpatialImageEnt = helper.createFillNode(); + let fillNode2: SpatialImageEnt = helper.createFillNode(); + let fillNode3: SpatialImageEnt = helper.createFillNode(); + let fillNode4: SpatialImageEnt = helper.createFillNode(); fillNode1.captured_at = 0; fillNode2.captured_at = 1; @@ -842,7 +842,7 @@ describe("FilterCreator.createFilter", () => { let creator: FilterCreator = new FilterCreator(); let node: Node = new Node(helper.createCoreNode()); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.captured_at = 1; node.makeFull(fillNode); diff --git a/spec/graph/Graph.spec.ts b/spec/graph/Graph.spec.ts index c9a0f0890..4c0e0cc00 100644 --- a/spec/graph/Graph.spec.ts +++ b/spec/graph/Graph.spec.ts @@ -15,12 +15,11 @@ import { import { NodeHelper } from "../helper/NodeHelper"; import { Node } from "../../src/graph/Node"; import { APIWrapper } from "../../src/api/APIWrapper"; -import { FalcorDataProvider } from "../../src/api/FalcorDataProvider"; +import { FalcorDataProvider } from "../../src/api/falcor/FalcorDataProvider"; import { GeohashGeometryProvider } from "../../src/api/GeohashGeometryProvider"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; -import { IFullNode } from "../../src/api/interfaces/IFullNode"; -import { ISequence } from "../../src/api/interfaces/ISequence"; +import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt"; +import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt"; +import { ImageEnt } from "../../src/api/ents/ImageEnt"; import { GraphMapillaryError } from "../../src/error/GraphMapillaryError"; import { EdgeCalculator } from "../../src/graph/edge/EdgeCalculator"; import { @@ -28,24 +27,29 @@ import { NodeIndexItem, } from "../../src/graph/Graph"; import { GraphCalculator } from "../../src/graph/GraphCalculator"; -import { IGraphConfiguration } from "../../src/graph/interfaces/IGraphConfiguration"; +import { GraphConfiguration } from "../../src/graph/interfaces/GraphConfiguration"; import { Sequence } from "../../src/graph/Sequence"; import { DataProvider, GeometryProvider } from "../helper/ProviderHelper"; +import { SequenceEnt } from "../../src/api/ents/SequenceEnt"; +import { SpatialImagesContract } from "../../src/api/contracts/SpatialImagesContract"; +import { SequencesContract } from "../../src/api/contracts/SequencesContract"; +import { ImagesContract } from "../../src/api/contracts/ImagesContract"; +import { CoreImagesContract } from "../../src/api/contracts/CoreImagesContract"; describe("Graph.ctor", () => { it("should create a graph", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graph: Graph = new Graph(api); + const graph = new Graph(api); expect(graph).toBeDefined(); }); it("should create a graph with all ctor params", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); expect(graph).toBeDefined(); }); @@ -63,49 +67,52 @@ describe("Graph.cacheBoundingBox$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "bboxToCellIds").and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const key: string = "key"; - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const id = "id"; + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = key; - fullNode.cl.lat = 0.5; - fullNode.cl.lon = 0.5; + const fullNode = helper.createFullNode(); + fullNode.id = id; + fullNode.computed_geometry.lat = 0.5; + fullNode.computed_geometry.lon = 0.5; - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); graph.cacheBoundingBox$({ lat: 0, lon: 0 }, { lat: 1, lon: 1 }) .subscribe( (nodes: Node[]): void => { expect(nodes.length).toBe(1); - expect(nodes[0].key).toBe(fullNode.key); + expect(nodes[0].id).toBe(fullNode.id); expect(nodes[0].full).toBe(true); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); done(); }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[h] = {}; - tileResult[h]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); - - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[key] = fullNode; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const tileResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); + + const spatialImages: SpatialImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); }); it("should not cache tile of fill node if already cached", (done: Function) => { @@ -113,72 +120,75 @@ describe("Graph.cacheBoundingBox$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "bboxToCellIds").and.returnValue([h]); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy: jasmine.Spy = spyOn(api, "imagesByH$"); - imagesByHSpy.and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = spyOn(api, "getCoreImages$"); + coreImagesSpy.and.returnValue(coreImages); - const key: string = "key"; - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - const imageByKeyFillSpy: jasmine.Spy = spyOn(api, "imageByKeyFill$"); - imageByKeyFillSpy.and.returnValue(imageByKeyFill); + const id = "id"; + const getSpatialImages = new Subject(); + const getSpatialImagesSpy = spyOn(api, "getSpatialImages$"); + getSpatialImagesSpy.and.returnValue(getSpatialImages); - const imageByKeyFull: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - const imageByKeyFullSpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); - imageByKeyFullSpy.and.returnValue(imageByKeyFull); + const getImages = new Subject(); + const getImagesSpy = spyOn(api, "getImages$"); + getImagesSpy.and.returnValue(getImages); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = key; - fullNode.cl.lat = 0.5; - fullNode.cl.lon = 0.5; + const fullNode = helper.createFullNode(); + fullNode.id = id; + fullNode.computed_geometry.lat = 0.5; + fullNode.computed_geometry.lon = 0.5; - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fullResult: { [key: string]: IFullNode } = {}; - fullResult[fullNode.key] = fullNode; - imageByKeyFull.next(fullResult); - imageByKeyFull.complete(); + const fullResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fullResult); + getImages.complete(); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[h] = {}; - tileResult[h]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); + const tileResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFillSpy.calls.count()).toBe(0); - expect(imageByKeyFullSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(0); + expect(getImagesSpy.calls.count()).toBe(1); graph.cacheBoundingBox$({ lat: 0, lon: 0 }, { lat: 1, lon: 1 }) .subscribe( (nodes: Node[]): void => { expect(nodes.length).toBe(1); - expect(nodes[0].key).toBe(fullNode.key); + expect(nodes[0].id).toBe(fullNode.id); expect(nodes[0].full).toBe(true); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFillSpy.calls.count()).toBe(0); - expect(imageByKeyFullSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(0); + expect(getImagesSpy.calls.count()).toBe(1); done(); }); @@ -186,29 +196,29 @@ describe("Graph.cacheBoundingBox$", () => { test("should only cache tile once for two similar calls", (done: Function) => { const dataProvider = new DataProvider(); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(dataProvider.geometry, "bboxToCellIds").and.returnValue([h]); spyOn(dataProvider.geometry, "latLonToCellIds").and.returnValue([h]); spyOn(dataProvider.geometry, "latLonToCellId").and.returnValue(h); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy: jasmine.Spy = spyOn(api, "imagesByH$"); - imagesByHSpy.and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = spyOn(api, "getCoreImages$"); + coreImagesSpy.and.returnValue(coreImages); - const key: string = "key"; - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const id = "id"; + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = key; - fullNode.cl.lat = 0.5; - fullNode.cl.lon = 0.5; + const fullNode = helper.createFullNode(); + fullNode.id = id; + fullNode.computed_geometry.lat = 0.5; + fullNode.computed_geometry.lon = 0.5; - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); let count: number = 0; observableMerge( @@ -217,31 +227,34 @@ describe("Graph.cacheBoundingBox$", () => { .subscribe( (nodes: Node[]): void => { expect(nodes.length).toBe(1); - expect(nodes[0].key).toBe(fullNode.key); + expect(nodes[0].id).toBe(fullNode.id); expect(nodes[0].full).toBe(true); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); count++; }, undefined, (): void => { expect(count).toBe(2); - expect(imagesByHSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); done(); }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[h] = {}; - tileResult[h]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); - - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[key] = fullNode; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const tileResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); + + const spatialImages: SpatialImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); }); }); @@ -253,117 +266,123 @@ describe("Graph.cacheFull$", () => { }); it("should be fetching", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const fullNode: IFullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); + const fullNode = helper.createFullNode(); + const getImages = new Subject(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode.key); + const graph = new Graph(api, undefined, calculator); + graph.cacheFull$(fullNode.id); - expect(graph.isCachingFull(fullNode.key)).toBe(true); - expect(graph.hasNode(fullNode.key)).toBe(false); - expect(graph.getNode(fullNode.key)).toBeUndefined(); + expect(graph.isCachingFull(fullNode.id)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(false); + expect(graph.getNode(fullNode.id)).toBeUndefined(); }); it("should fetch", (done: Function) => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key) + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id) .subscribe( (g: Graph): void => { - expect(g.isCachingFull(fullNode.key)).toBe(false); - expect(g.hasNode(fullNode.key)).toBe(true); - expect(g.getNode(fullNode.key)).toBeDefined(); - expect(g.getNode(fullNode.key).key).toBe(fullNode.key); + expect(g.isCachingFull(fullNode.id)).toBe(false); + expect(g.hasNode(fullNode.id)).toBe(true); + expect(g.getNode(fullNode.id)).toBeDefined(); + expect(g.getNode(fullNode.id).id).toBe(fullNode.id); done(); }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.isCachingFull(fullNode.key)).toBe(false); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.getNode(fullNode.key)).toBeDefined(); - expect(graph.getNode(fullNode.key).key).toBe(fullNode.key); + expect(graph.isCachingFull(fullNode.id)).toBe(false); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.getNode(fullNode.id)).toBeDefined(); + expect(graph.getNode(fullNode.id).id).toBe(fullNode.id); }); it("should not make additional calls when fetching same node twice", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const fullNode: IFullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); + const fullNode = helper.createFullNode(); + const getImages = new Subject(); - const imageByKeyFullSpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); - imageByKeyFullSpy.and.returnValue(imageByKeyFull); + const getImagesSpy = spyOn(api, "getImages$"); + getImagesSpy.and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - expect(imageByKeyFullSpy.calls.count()).toBe(1); + expect(getImagesSpy.calls.count()).toBe(1); }); it("should throw when fetching node already in graph", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - imageByKeyFull.next(result); - imageByKeyFull.complete(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(result); + getImages.complete(); - expect(graph.isCachingFull(fullNode.key)).toBe(false); - expect(() => { graph.cacheFull$(fullNode.key); }).toThrowError(Error); + expect(graph.isCachingFull(fullNode.id)).toBe(false); + expect(() => { graph.cacheFull$(fullNode.id); }).toThrowError(Error); }); it("should throw if sequence key is missing", (done: Function) => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = undefined; + const fullNode = helper.createFullNode(); + fullNode.sequence.id = undefined; - graph.cacheFull$(fullNode.key) + graph.cacheFull$(fullNode.id) .subscribe( (): void => { return; }, (): void => { done(); }); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - imageByKeyFull.next(result); - imageByKeyFull.complete(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(result); + getImages.complete(); }); it("should make full when fetched node has been retrieved in tile in parallell", () => { @@ -371,71 +390,75 @@ describe("Graph.cacheFull$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); - - const key: string = "key"; - const otherKey: string = "otherKey"; - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeyFullOther: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.callFake( - (keys: string[]): Observable<{ [key: string]: IFullNode }> => { - if (keys[0] === key) { - return imageByKeyFull; - } else if (keys[0] === otherKey) { - return imageByKeyFullOther; + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); + + const id = "id"; + const otherKey = "otherKey"; + const getImages = new Subject(); + const getImagesOther = new Subject(); + spyOn(api, "getImages$").and.callFake( + (imageIds: string[]): Observable => { + if (imageIds[0] === id) { + return getImages; + } else if (imageIds[0] === otherKey) { + return getImagesOther; } throw new GraphMapillaryError("Wrong key."); }); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const otherNode: IFullNode = helper.createFullNode(); - otherNode.key = otherKey; - graph.cacheFull$(otherNode.key).subscribe(() => { /*noop*/ }); + const otherNode = helper.createFullNode(); + otherNode.id = otherKey; + graph.cacheFull$(otherNode.id).subscribe(() => { /*noop*/ }); - const otherFullResult: { [key: string]: IFullNode } = {}; - otherFullResult[otherNode.key] = otherNode; - imageByKeyFullOther.next(otherFullResult); - imageByKeyFullOther.complete(); + const otherFullResult: ImagesContract = [{ + node: otherNode, + node_id: otherNode.id, + }]; + getImagesOther.next(otherFullResult); + getImagesOther.complete(); - graph.hasTiles(otherNode.key); - observableFrom(graph.cacheTiles$(otherNode.key)).pipe( + graph.hasTiles(otherNode.id); + observableFrom(graph.cacheTiles$(otherNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = key; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + fullNode.id = id; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - expect(graph.hasNode(fullNode.key)).toBe(false); - expect(graph.isCachingFull(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(false); + expect(graph.isCachingFull(fullNode.id)).toBe(true); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[h] = {}; - tileResult[h]["0"] = otherNode; - tileResult[h]["1"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); + const tileResult: CoreImagesContract = { + cell_id: h, + images: [otherNode, fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.getNode(fullNode.key).full).toBe(false); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.getNode(fullNode.id).full).toBe(false); - const fullResult: { [key: string]: IFullNode } = {}; - fullResult[fullNode.key] = fullNode; - imageByKeyFull.next(fullResult); - imageByKeyFull.complete(); + const fullResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fullResult); + getImages.complete(); - expect(graph.getNode(fullNode.key).full).toBe(true); + expect(graph.getNode(fullNode.id).full).toBe(true); }); }); @@ -451,51 +474,54 @@ describe("Graph.cacheFill$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const tileNode: ICoreNode = helper.createCoreNode(); - tileNode.key = "tileNodeKey"; - const result: { [key: string]: { [index: string]: ICoreNode } } = {}; - result[h] = {}; - result[h]["0"] = tileNode; - imagesByH.next(result); + const tileNode: CoreImageEnt = helper.createCoreNode(); + tileNode.id = "tileNodeKey"; + const result: CoreImagesContract = { + cell_id: h, + images: [tileNode], + }; + coreImages.next(result); - expect(graph.getNode(tileNode.key).full).toBe(false); - expect(graph.isCachingFill(tileNode.key)).toBe(false); + expect(graph.getNode(tileNode.id).full).toBe(false); + expect(graph.isCachingFill(tileNode.id)).toBe(false); - graph.cacheFill$(tileNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFill$(tileNode.id).subscribe(() => { /*noop*/ }); - expect(graph.getNode(tileNode.key).full).toBe(false); - expect(graph.isCachingFill(tileNode.key)).toBe(true); + expect(graph.getNode(tileNode.id).full).toBe(false); + expect(graph.isCachingFill(tileNode.id)).toBe(true); }); it("should fill", () => { @@ -503,56 +529,62 @@ describe("Graph.cacheFill$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const tileNode: ICoreNode = helper.createCoreNode(); - tileNode.key = "tileNodeKey"; - const result: { [key: string]: { [index: string]: ICoreNode } } = {}; - result[h] = {}; - result[h]["0"] = tileNode; - imagesByH.next(result); + const tileNode: CoreImageEnt = helper.createCoreNode(); + tileNode.id = "tileNodeKey"; + const result: CoreImagesContract = { + cell_id: h, + images: [tileNode], + }; + coreImages.next(result); - expect(graph.getNode(tileNode.key).full).toBe(false); - expect(graph.isCachingFill(tileNode.key)).toBe(false); + expect(graph.getNode(tileNode.id).full).toBe(false); + expect(graph.isCachingFill(tileNode.id)).toBe(false); - graph.cacheFill$(tileNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFill$(tileNode.id).subscribe(() => { /*noop*/ }); - const fillTileNode: IFillNode = helper.createFullNode(); - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[tileNode.key] = fillTileNode; - imageByKeyFill.next(fillResult); + const fillTileNode = helper.createFullNode(); + fillTileNode.id = tileNode.id; + const spatialImages: SpatialImagesContract = [{ + node: fillTileNode, + node_id: fillTileNode.id, + }]; + getSpatialImages.next(spatialImages); - expect(graph.getNode(tileNode.key).full).toBe(true); - expect(graph.isCachingFill(tileNode.key)).toBe(false); + expect(graph.getNode(tileNode.id).full).toBe(true); + expect(graph.isCachingFill(tileNode.id)).toBe(false); }); it("should not make additional calls when filling same node twice", () => { @@ -560,52 +592,55 @@ describe("Graph.cacheFill$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - const imageByKeyFillSpy: jasmine.Spy = spyOn(api, "imageByKeyFill$"); - imageByKeyFillSpy.and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + const getSpatialImagesSpy = spyOn(api, "getSpatialImages$"); + getSpatialImagesSpy.and.returnValue(getSpatialImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const tileNode: ICoreNode = helper.createCoreNode(); - tileNode.key = "tileNodeKey"; - const result: { [key: string]: { [index: string]: ICoreNode } } = {}; - result[h] = {}; - result[h]["0"] = tileNode; - imagesByH.next(result); + const tileNode: CoreImageEnt = helper.createCoreNode(); + tileNode.id = "tileNodeKey"; + const result: CoreImagesContract = { + cell_id: h, + images: [tileNode], + }; + coreImages.next(result); - expect(graph.getNode(tileNode.key).full).toBe(false); - expect(graph.isCachingFill(tileNode.key)).toBe(false); + expect(graph.getNode(tileNode.id).full).toBe(false); + expect(graph.isCachingFill(tileNode.id)).toBe(false); - graph.cacheFill$(tileNode.key).subscribe(() => { /*noop*/ }); - graph.cacheFill$(tileNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFill$(tileNode.id).subscribe(() => { /*noop*/ }); + graph.cacheFill$(tileNode.id).subscribe(() => { /*noop*/ }); - expect(imageByKeyFillSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(1); }); it("should throw if already fetching", () => { @@ -613,62 +648,64 @@ describe("Graph.cacheFill$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key); + const fullNode = helper.createFullNode(); + graph.cacheFull$(fullNode.id); - expect(graph.isCachingFull(fullNode.key)).toBe(true); + expect(graph.isCachingFull(fullNode.id)).toBe(true); - expect(() => { graph.cacheFill$(fullNode.key); }).toThrowError(Error); + expect(() => { graph.cacheFill$(fullNode.id); }).toThrowError(Error); }); it("should throw if node does not exist", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); expect(() => { graph.cacheFill$("key"); }).toThrowError(Error); }); it("should throw if already full", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const imageByKeyFill: Subject<{ [key: string]: IFillNode }> = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key); + const fullNode = helper.createFullNode(); + graph.cacheFull$(fullNode.id); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - expect(() => { graph.cacheFill$(fullNode.key); }).toThrowError(Error); + expect(() => { graph.cacheFill$(fullNode.id); }).toThrowError(Error); }); }); @@ -684,29 +721,29 @@ describe("Graph.cacheTiles$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const node: Node = helper.createNode(); + const node = helper.createNode(); spyOn(geometryProvider, "latLonToCellIds").and.returnValue(["h"]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); spyOn(graph, "hasNode").and.returnValue(true); spyOn(graph, "getNode").and.returnValue(node); - expect(graph.hasTiles(node.key)).toBe(false); - expect(graph.isCachingTiles(node.key)).toBe(false); + expect(graph.hasTiles(node.id)).toBe(false); + expect(graph.isCachingTiles(node.id)).toBe(false); - graph.cacheTiles$(node.key); + graph.cacheTiles$(node.id); - expect(graph.hasTiles(node.key)).toBe(false); - expect(graph.isCachingTiles(node.key)).toBe(true); + expect(graph.hasTiles(node.id)).toBe(false); + expect(graph.isCachingTiles(node.id)).toBe(true); }); it("should cache tiles", () => { @@ -714,41 +751,44 @@ describe("Graph.cacheTiles$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyResult: { [key: string]: IFullNode } = {}; - imageByKeyResult[fullNode.key] = fullNode; - const imageByKeyFull: Observable<{ [key: string]: IFullNode }> = observableOf<{ [key: string]: IFullNode }>(imageByKeyResult); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const imageByKeyResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + const getImages: Observable = observableOf(imageByKeyResult); + spyOn(api, "getImages$").and.returnValue(getImages); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, calculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - expect(graph.hasTiles(fullNode.key)).toBe(false); - expect(graph.isCachingTiles(fullNode.key)).toBe(false); + expect(graph.hasTiles(fullNode.id)).toBe(false); + expect(graph.isCachingTiles(fullNode.id)).toBe(false); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const result: { [key: string]: { [index: string]: ICoreNode } } = {}; - result[h] = {}; - result[h]["0"] = fullNode; - imagesByH.next(result); + const result: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(result); - expect(graph.hasTiles(fullNode.key)).toBe(true); - expect(graph.isCachingTiles(fullNode.key)).toBe(false); + expect(graph.hasTiles(fullNode.id)).toBe(true); + expect(graph.isCachingTiles(fullNode.id)).toBe(false); }); it("should encode hs only once when checking tiles cache", () => { @@ -756,26 +796,26 @@ describe("Graph.cacheTiles$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const node: Node = helper.createNode(); + const node = helper.createNode(); - const h: string = "h"; - const encodeHsSpy: jasmine.Spy = spyOn(geometryProvider, "latLonToCellIds"); + const h = "h"; + const encodeHsSpy = spyOn(geometryProvider, "latLonToCellIds"); encodeHsSpy.and.returnValue([h]); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); spyOn(graph, "hasNode").and.returnValue(true); spyOn(graph, "getNode").and.returnValue(node); - expect(graph.hasTiles(node.key)).toBe(false); - expect(graph.hasTiles(node.key)).toBe(false); + expect(graph.hasTiles(node.id)).toBe(false); + expect(graph.hasTiles(node.id)).toBe(false); expect(encodeHsSpy.calls.count()).toBe(1); }); @@ -785,40 +825,43 @@ describe("Graph.cacheTiles$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const encodeHsSpy: jasmine.Spy = spyOn(geometryProvider, "latLonToCellIds"); + const encodeHsSpy = spyOn(geometryProvider, "latLonToCellIds"); encodeHsSpy.and.returnValue([h]); - const imageByKeyResult: { [key: string]: IFullNode } = {}; - imageByKeyResult[fullNode.key] = fullNode; - const imageByKeyFull: Observable<{ [key: string]: IFullNode }> = observableOf<{ [key: string]: IFullNode }>(imageByKeyResult); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const imageByKeyResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + const getImages: Observable = observableOf(imageByKeyResult); + spyOn(api, "getImages$").and.returnValue(getImages); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, calculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - expect(graph.hasTiles(fullNode.key)).toBe(false); + expect(graph.hasTiles(fullNode.id)).toBe(false); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const result: { [key: string]: { [index: string]: ICoreNode } } = {}; - result[h] = {}; - result[h]["0"] = fullNode; - imagesByH.next(result); + const result: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(result); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); expect(encodeHsSpy.calls.count()).toBe(1); }); @@ -832,104 +875,113 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should throw when sequence does not exist", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - expect(() => { graph.cacheSequenceNodes$("sequenceKey"); }).toThrowError(Error); + expect(() => { graph.cacheSequenceNodes$("sequenceId"); }).toThrowError(Error); }); it("should not be cached", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; - const key: string = "key"; + const sequenceId = "sequenceId"; + const id = "id"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [key] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [id] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(false); + expect(graph.hasSequenceNodes(sequenceId)).toBe(false); }); it("should start caching", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; - const key: string = "key"; + const sequenceId = "sequenceId"; + const id = "id"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [key] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [id] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); }); it("should be cached and not caching", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - imageResult[nodeKey] = helper.createFullNode(); - imageResult[nodeKey].key = nodeKey; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(false); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(false); expect(graph.hasNode(nodeKey)).toBe(true); - expect(graph.getNode(nodeKey).key).toBe(nodeKey); + expect(graph.getNode(nodeKey).id).toBe(nodeKey); }); it("should not be cached after uncaching sequence node", () => { @@ -937,51 +989,55 @@ describe("Graph.cacheSequenceNodes$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); spyOn(geometryProvider, "latLonToCellId").and.returnValue("h"); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - const configuration: IGraphConfiguration = { + const edgeCalculator = new EdgeCalculator(); + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = nodeKey; - fullNode.sequence_key = sequenceKey; - imageResult[fullNode.key] = fullNode; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + fullNode.sequence.id = sequenceId; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); graph.uncache([]); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(false); + expect(graph.hasSequenceNodes(sequenceId)).toBe(false); }); it("should not be cached after uncaching sequence", () => { @@ -989,53 +1045,57 @@ describe("Graph.cacheSequenceNodes$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); spyOn(geometryProvider, "latLonToCellId").and.returnValue("h"); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - const configuration: IGraphConfiguration = { + const edgeCalculator = new EdgeCalculator(); + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = nodeKey; - fullNode.sequence_key = sequenceKey; - imageResult[fullNode.key] = fullNode; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + fullNode.sequence.id = sequenceId; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); graph.uncache([]); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(false); + expect(graph.hasSequenceNodes(sequenceId)).toBe(false); }); it("should be cached after uncaching if sequence is kept", () => { @@ -1043,51 +1103,55 @@ describe("Graph.cacheSequenceNodes$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); spyOn(geometryProvider, "latLonToCellId").and.returnValue("h"); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - const configuration: IGraphConfiguration = { + const edgeCalculator = new EdgeCalculator(); + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = nodeKey; - fullNode.sequence_key = sequenceKey; - imageResult[fullNode.key] = fullNode; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + fullNode.sequence.id = sequenceId; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); - graph.uncache([], sequenceKey); + graph.uncache([], sequenceId); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); }); it("should be cached after uncaching if all nodes are kept", () => { @@ -1095,51 +1159,55 @@ describe("Graph.cacheSequenceNodes$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); spyOn(geometryProvider, "latLonToCellId").and.returnValue("h"); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - const configuration: IGraphConfiguration = { + const edgeCalculator = new EdgeCalculator(); + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = nodeKey; - fullNode.sequence_key = sequenceKey; - imageResult[fullNode.key] = fullNode; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + fullNode.sequence.id = sequenceId; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); - graph.uncache([fullNode.key]); + graph.uncache([fullNode.id]); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); }); it("should not be cached after uncaching tile", () => { @@ -1147,78 +1215,83 @@ describe("Graph.cacheSequenceNodes$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const h: string = "h"; + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - const configuration: IGraphConfiguration = { + const edgeCalculator = new EdgeCalculator(); + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = nodeKey; - fullNode.sequence_key = sequenceKey; - imageResult[fullNode.key] = fullNode; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + fullNode.sequence.id = sequenceId; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(1); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(false); + expect(graph.hasSequenceNodes(sequenceId)).toBe(false); }); it("should be cached after uncaching tile if sequence is kept", () => { @@ -1226,144 +1299,159 @@ describe("Graph.cacheSequenceNodes$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const h: string = "h"; + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - const configuration: IGraphConfiguration = { + const edgeCalculator = new EdgeCalculator(); + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator, undefined, configuration); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - const fullNode: IFullNode = helper.createFullNode(); - fullNode.key = nodeKey; - fullNode.sequence_key = sequenceKey; - imageResult[fullNode.key] = fullNode; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + fullNode.sequence.id = sequenceId; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); - graph.uncache([], sequenceKey); + graph.uncache([], sequenceId); expect(nodeUncacheSpy.calls.count()).toBe(1); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(true); + expect(graph.hasSequenceNodes(sequenceId)).toBe(true); }); it("should throw if caching already cached sequence nodes", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - imageResult[nodeKey] = helper.createFullNode(); - imageResult[nodeKey].key = nodeKey; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); - expect(() => { graph.cacheSequenceNodes$(sequenceKey); }).toThrowError(Error); + expect(() => { graph.cacheSequenceNodes$(sequenceId); }).toThrowError(Error); }); it("should only call API once if caching multiple times before response", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - const imageResult: { [key: string]: IFullNode } = {}; - imageResult[nodeKey] = helper.createFullNode(); - imageResult[nodeKey].key = nodeKey; + const fullNode = helper.createFullNode(); + fullNode.id = nodeKey; + const imageResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; imageByKey.next(imageResult); imageByKey.complete(); @@ -1371,66 +1459,75 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should not be cached and not caching on error", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKey); + const imageByKey = new Subject(); + spyOn(api, "getImages$").and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; - const nodeKey: string = "nodeKey"; + const sequenceId = "sequenceId"; + const nodeKey = "nodeKey"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [nodeKey] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [nodeKey] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey) + graph.cacheSequenceNodes$(sequenceId) .subscribe( (): void => { /*noop*/ }, (): void => { /*noop*/ }); imageByKey.error(new Error("404")); - expect(graph.hasSequenceNodes(sequenceKey)).toBe(false); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(false); + expect(graph.hasSequenceNodes(sequenceId)).toBe(false); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(false); expect(graph.hasNode(nodeKey)).toBe(false); }); it("should start caching in with single batch when lass than or equal to 200 nodes", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array(200).fill(undefined).map((value, i) => { return i.toString(); }) }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array(200) + .fill(undefined) + .map((_, i) => i.toString()) + }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); expect(imageByKeySpy.calls.count()).toBe(1); expect(imageByKeySpy.calls.argsFor(0)[0].length).toBe(200); @@ -1442,31 +1539,38 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should start caching in batches when more than 200 nodes", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array(201).fill(undefined).map((value, i) => { return i.toString(); }) }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array(201) + .fill(undefined) + .map((_, i) => i.toString()), + }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); expect(imageByKeySpy.calls.count()).toBe(2); expect(imageByKeySpy.calls.argsFor(0)[0].length).toBe(200); @@ -1479,34 +1583,42 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should start caching prioritized batch when reference node key is specified at start", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const referenceNodeKey: string = "referenceNodeKey"; + const referenceNodeKey = "referenceNodeKey"; - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array.from(new Array(400), (x, i): string => i.toString()) }; - result[sequenceKey].keys.splice(0, 1, referenceNodeKey); - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array + .from( + new Array(400), + (_, i): string => i.toString()) + }, + node_id: sequenceId, + }]; + result[0].node.image_ids.splice(0, 1, referenceNodeKey); + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId, referenceNodeKey).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); expect(imageByKeySpy.calls.count()).toBe(3); expect(imageByKeySpy.calls.argsFor(0)[0].length).toBe(50); @@ -1521,34 +1633,42 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should start caching prioritized batch when reference node key is specified at end", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const referenceNodeKey: string = "referenceNodeKey"; + const referenceNodeKey = "referenceNodeKey"; - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array.from(new Array(400), (x, i): string => i.toString()) }; - result[sequenceKey].keys.splice(399, 1, referenceNodeKey); - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array + .from( + new Array(400), + (_, i) => i.toString()), + }, + node_id: sequenceId, + }]; + result[0].node.image_ids.splice(399, 1, referenceNodeKey); + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId, referenceNodeKey).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); expect(imageByKeySpy.calls.count()).toBe(3); expect(imageByKeySpy.calls.argsFor(0)[0].length).toBe(50); @@ -1564,34 +1684,42 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should start caching in prioritized batches when reference node key is specified in middle", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const referenceNodeKey: string = "referenceNodeKey"; + const referenceNodeKey = "referenceNodeKey"; - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array.from(new Array(400), (x, i): string => i.toString()) }; - result[sequenceKey].keys.splice(200, 1, referenceNodeKey); - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array + .from( + new Array(400), + (_, i) => i.toString()), + }, + node_id: sequenceId, + }]; + result[0].node.image_ids.splice(200, 1, referenceNodeKey); + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId, referenceNodeKey).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); expect(imageByKeySpy.calls.count()).toBe(3); expect(imageByKeySpy.calls.argsFor(0)[0].length).toBe(50); @@ -1608,67 +1736,84 @@ describe("Graph.cacheSequenceNodes$", () => { }); it("should not corrupt sequence when caching in batches", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const referenceNodeKey: string = "referenceNodeKey"; + const referenceNodeKey = "referenceNodeKey"; - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array.from(new Array(400), (x, i): string => i.toString()) }; - result[sequenceKey].keys.splice(200, 1, referenceNodeKey); - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array + .from( + new Array(400), + (_, i) => i.toString()), + }, + node_id: sequenceId, + }]; + result[0].node.image_ids.splice(200, 1, referenceNodeKey); + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId, referenceNodeKey).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); - expect(graph.getSequence(sequenceKey).keys.length).toBe(400); - expect(graph.getSequence(sequenceKey).keys).toEqual(result[sequenceKey].keys); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); + expect(graph.getSequence(sequenceId).imageIds.length).toBe(400); + expect(graph.getSequence(sequenceId).imageIds) + .toEqual(result[0].node.image_ids); }); it("should create single batch when fewer than or equal to 50 nodes", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const imageByKey: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeySpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const imageByKey = new Subject(); + const imageByKeySpy = spyOn(api, "getImages$"); imageByKeySpy.and.returnValue(imageByKey); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(); + graph.cacheSequence$(sequenceId).subscribe(); - const referenceNodeKey: string = "referenceNodeKey"; + const referenceNodeKey = "referenceNodeKey"; - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: Array.from(new Array(50), (x, i): string => i.toString()) }; - result[sequenceKey].keys.splice(20, 1, referenceNodeKey); - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: sequenceId, + image_ids: Array + .from( + new Array(50), + (_, i) => i.toString()), + }, + node_id: sequenceId, + }]; + result[0].node.image_ids.splice(20, 1, referenceNodeKey); + getSequences.next(result); + getSequences.complete(); - graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey).subscribe(); + graph.cacheSequenceNodes$(sequenceId, referenceNodeKey).subscribe(); - expect(graph.isCachingSequenceNodes(sequenceKey)).toBe(true); + expect(graph.isCachingSequenceNodes(sequenceId)).toBe(true); expect(imageByKeySpy.calls.count()).toBe(1); expect(imageByKeySpy.calls.argsFor(0)[0].length).toBe(50); @@ -1696,79 +1841,83 @@ describe("Graph.cacheSpatialArea$", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); spyOn(graphCalculator, "boundingBoxCorners").and.returnValue([{ lat: 0, lon: 0 }, { lat: 0, lon: 0 }]); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); }); test("should not be cached", () => { const dataProvider = new DataProvider() - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const h: string = "h"; + const h = "h"; spyOn(dataProvider.geometry, "latLonToCellId").and.returnValue(h); spyOn(dataProvider.geometry, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); expect(node).toBeDefined(); spyOn(graphCalculator, "boundingBoxCorners") .and.returnValue([{ lat: -0.5, lon: -0.5 }, { lat: 0.5, lon: 0.5 }]); - const coreNode: ICoreNode = helper.createCoreNode(); - coreNode.key = "otherKey"; + const coreNode: CoreImageEnt = helper.createCoreNode(); + coreNode.id = "otherKey"; - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const result: { [key: string]: { [index: string]: ICoreNode } } = {}; - result[h] = {}; - result[h]["0"] = fullNode; - result[h]["1"] = coreNode; - imagesByH.next(result); + const result: CoreImagesContract = { + cell_id: h, + images: [fullNode, coreNode], + }; + coreImages.next(result); - const otherNode: Node = graph.getNode(coreNode.key); + const otherNode = graph.getNode(coreNode.id); expect(otherNode).toBeDefined(); - expect(graph.hasSpatialArea(fullNode.key)).toBe(false); + expect(graph.hasSpatialArea(fullNode.id)).toBe(false); }); }); @@ -1780,40 +1929,47 @@ describe("Graph.cacheSpatialEdges", () => { }); it("should use fallback keys", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); - imageByKeyFull.complete(); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); + getImages.complete(); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: ["prev", fullNode.key, "next"] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: ["prev", fullNode.id, "next"], + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); spyOn(graphCalculator, "boundingBoxCorners").and.returnValue([{ lat: 0, lon: 0 }, { lat: 0, lon: 0 }]); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); - const getPotentialSpy: jasmine.Spy = spyOn(edgeCalculator, "getPotentialEdges"); + const getPotentialSpy = spyOn(edgeCalculator, "getPotentialEdges"); getPotentialSpy.and.returnValue([]); spyOn(edgeCalculator, "computeStepEdges").and.returnValue([]); @@ -1822,14 +1978,14 @@ describe("Graph.cacheSpatialEdges", () => { spyOn(edgeCalculator, "computePerspectiveToSphericalEdges").and.returnValue([]); spyOn(edgeCalculator, "computeSimilarEdges").and.returnValue([]); - graph.initializeCache(fullNode.key); - graph.cacheSpatialEdges(fullNode.key); + graph.initializeCache(fullNode.id); + graph.cacheSpatialEdges(fullNode.id); expect(getPotentialSpy.calls.first().args.length).toBe(3); expect(getPotentialSpy.calls.first().args[2].length).toBe(2); expect(getPotentialSpy.calls.first().args[2].indexOf("prev")).not.toBe(-1); expect(getPotentialSpy.calls.first().args[2].indexOf("next")).not.toBe(-1); - expect(getPotentialSpy.calls.first().args[2].indexOf(fullNode.key)).toBe(-1); + expect(getPotentialSpy.calls.first().args[2].indexOf(fullNode.id)).toBe(-1); }); test("should apply filter", () => { @@ -1840,73 +1996,87 @@ describe("Graph.cacheSpatialEdges", () => { spyOn(dataProvider.geometry, "latLonToCellIds") .and.returnValue([cellId]); const api = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); - - const fullNode: IFullNode = helper.createFullNode(); - const otherFullNode: IFullNode = helper.createFullNode(); - otherFullNode.key = "other-key"; - otherFullNode.sequence_key = "otherSequenceKey"; - - const imageByKeyFill = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); - - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); - - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); - - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); - - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); - - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); - imageByKeyFull.complete(); - - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); - - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: ["prev", fullNode.key, "next"] }; - sequenceByKey.next(result); - sequenceByKey.complete(); - - const node = graph.getNode(fullNode.key); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); + + const fullNode = helper.createFullNode(); + const otherFullNode = helper.createFullNode(); + otherFullNode.id = "other-key"; + otherFullNode.sequence.id = "otherSequenceKey"; + + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); + + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); + + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); + + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); + + const graph = new Graph( + api, + undefined, + graphCalculator, + edgeCalculator); + + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); + + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); + getImages.complete(); + + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); + + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: ["prev", fullNode.id, "next"], + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); + + const node = graph.getNode(fullNode.id); expect(node).toBeDefined(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - expect(graph.hasTiles(fullNode.key)).toBe(false); - expect(graph.isCachingTiles(fullNode.key)).toBe(false); + expect(graph.hasTiles(fullNode.id)).toBe(false); + expect(graph.isCachingTiles(fullNode.id)).toBe(false); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const coreResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - coreResult[cellId] = {}; - coreResult[cellId]["0"] = fullNode; - coreResult[cellId]["1"] = otherFullNode; - imagesByH.next(coreResult); + const coreResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode, otherFullNode], + }; + coreImages.next(coreResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); spyOn(graphCalculator, "boundingBoxCorners").and.returnValue([{ lat: -0.5, lon: -0.5 }, { lat: 0.5, lon: 0.5 }]); - graph.cacheFill$(otherFullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFill$(otherFullNode.id).subscribe(() => { /*noop*/ }); - const otherFetchResult: { [key: string]: IFullNode } = {}; - otherFetchResult[otherFullNode.key] = otherFullNode; - imageByKeyFill.next(otherFetchResult); - imageByKeyFill.complete(); + const otherSpatialImages: SpatialImagesContract = [{ + node: otherFullNode, + node_id: otherFullNode.id, + }]; + getSpatialImages.next(otherSpatialImages); + getSpatialImages.complete(); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); - const getPotentialSpy: jasmine.Spy = spyOn(edgeCalculator, "getPotentialEdges"); + const getPotentialSpy = spyOn(edgeCalculator, "getPotentialEdges"); getPotentialSpy.and.returnValue([]); spyOn(edgeCalculator, "computeStepEdges").and.returnValue([]); @@ -1915,56 +2085,63 @@ describe("Graph.cacheSpatialEdges", () => { spyOn(edgeCalculator, "computePerspectiveToSphericalEdges").and.returnValue([]); spyOn(edgeCalculator, "computeSimilarEdges").and.returnValue([]); - graph.setFilter(["==", "sequenceKey", "otherSequenceKey"]); + graph.setFilter(["==", "sequenceId", "otherSequenceKey"]); - graph.initializeCache(fullNode.key); - graph.cacheSpatialEdges(fullNode.key); + graph.initializeCache(fullNode.id); + graph.cacheSpatialEdges(fullNode.id); expect(getPotentialSpy.calls.first().args.length).toBe(3); expect(getPotentialSpy.calls.first().args[1].length).toBe(1); - expect(getPotentialSpy.calls.first().args[1][0].sequenceKey).toBe("otherSequenceKey"); + expect(getPotentialSpy.calls.first().args[1][0].sequenceId).toBe("otherSequenceKey"); }); it("should apply remove by filtering", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); - imageByKeyFull.complete(); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); + getImages.complete(); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: ["prev", fullNode.key, "next"] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: ["prev", fullNode.id, "next"], + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); spyOn(graphCalculator, "boundingBoxCorners").and.returnValue([{ lat: 0, lon: 0 }, { lat: 0, lon: 0 }]); - const otherFullNode: IFullNode = helper.createFullNode(); - otherFullNode.sequence_key = "otherSequenceKey"; - const otherNode: Node = new Node(otherFullNode); + const otherFullNode = helper.createFullNode(); + otherFullNode.sequence.id = "otherSequenceKey"; + const otherNode = new Node(otherFullNode); otherNode.makeFull(otherFullNode); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); - const getPotentialSpy: jasmine.Spy = spyOn(edgeCalculator, "getPotentialEdges"); + const getPotentialSpy = spyOn(edgeCalculator, "getPotentialEdges"); getPotentialSpy.and.returnValue([]); spyOn(edgeCalculator, "computeStepEdges").and.returnValue([]); @@ -1973,10 +2150,10 @@ describe("Graph.cacheSpatialEdges", () => { spyOn(edgeCalculator, "computePerspectiveToSphericalEdges").and.returnValue([]); spyOn(edgeCalculator, "computeSimilarEdges").and.returnValue([]); - graph.setFilter(["==", "sequenceKey", "none"]); + graph.setFilter(["==", "sequenceId", "none"]); - graph.initializeCache(fullNode.key); - graph.cacheSpatialEdges(fullNode.key); + graph.initializeCache(fullNode.id); + graph.cacheSpatialEdges(fullNode.id); expect(getPotentialSpy.calls.first().args.length).toBe(3); expect(getPotentialSpy.calls.first().args[1].length).toBe(0); @@ -1991,293 +2168,322 @@ describe("Graph.cacheNodeSequence$", () => { }); it("should not be cached", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - expect(graph.hasNodeSequence(fullNode.key)).toBe(false); + expect(graph.hasNodeSequence(fullNode.id)).toBe(false); }); it("should be caching", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); - imageByKeyFull.complete(); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); + getImages.complete(); - graph.cacheNodeSequence$(fullNode.key); + graph.cacheNodeSequence$(fullNode.id); - expect(graph.hasNodeSequence(fullNode.key)).toBe(false); - expect(graph.isCachingNodeSequence(fullNode.key)).toBe(true); + expect(graph.hasNodeSequence(fullNode.id)).toBe(false); + expect(graph.isCachingNodeSequence(fullNode.id)).toBe(true); }); it("should be cached", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequenceKey"; + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequenceId"; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.cacheNodeSequence$(fullNode.key) + graph.cacheNodeSequence$(fullNode.id) .subscribe( (g: Graph): void => { - expect(g.hasNodeSequence(fullNode.key)).toBe(true); - expect(g.isCachingNodeSequence(fullNode.key)).toBe(false); + expect(g.hasNodeSequence(fullNode.id)).toBe(true); + expect(g.isCachingNodeSequence(fullNode.id)).toBe(false); }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: [fullNode.key] }; - sequenceByKey.next(result); - sequenceByKey.complete(); - - expect(graph.hasNodeSequence(fullNode.key)).toBe(true); - expect(graph.isCachingNodeSequence(fullNode.key)).toBe(false); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: [fullNode.id], + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); + + expect(graph.hasNodeSequence(fullNode.id)).toBe(true); + expect(graph.isCachingNodeSequence(fullNode.id)).toBe(false); }); it("should throw if node not in graph", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequenceKey"; + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequenceId"; - expect(() => { graph.cacheNodeSequence$(fullNode.key); }).toThrowError(Error); + expect(() => { graph.cacheNodeSequence$(fullNode.id); }).toThrowError(Error); }); it("should throw if already cached", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequenceKey"; + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequenceId"; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: [fullNode.key] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: [fullNode.id], + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); - expect(graph.hasNodeSequence(fullNode.key)).toBe(true); + expect(graph.hasNodeSequence(fullNode.id)).toBe(true); - expect(() => { graph.cacheNodeSequence$(fullNode.key); }).toThrowError(Error); + expect(() => { graph.cacheNodeSequence$(fullNode.id); }).toThrowError(Error); }); it("should call api only once when caching the same sequence twice in succession", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - const sequenceByKeySpy: jasmine.Spy = spyOn(api, "sequenceByKey$"); - sequenceByKeySpy.and.returnValue(sequenceByKey); + const getSequences = new Subject(); + const sequenceByKeySpy = spyOn(api, "getSequences$"); + sequenceByKeySpy.and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequenceKey"; + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequenceId"; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); expect(sequenceByKeySpy.calls.count()).toBe(1); }); it("should emit to changed stream", (done: Function) => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequenceKey"; + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequenceId"; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); graph.changed$.pipe( first()) .subscribe( (g: Graph): void => { - expect(g.hasNodeSequence(fullNode.key)).toBe(true); - expect(g.isCachingNodeSequence(fullNode.key)).toBe(false); + expect(g.hasNodeSequence(fullNode.id)).toBe(true); + expect(g.isCachingNodeSequence(fullNode.id)).toBe(false); done(); }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: [fullNode.key] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: [fullNode.id], + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); }); }); describe("Graph.cacheSequence$", () => { it("should not be cached", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - expect(graph.hasSequence(sequenceKey)).toBe(false); + expect(graph.hasSequence(sequenceId)).toBe(false); }); it("should not be caching", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - expect(graph.isCachingSequence(sequenceKey)).toBe(false); + expect(graph.isCachingSequence(sequenceId)).toBe(false); }); it("should be caching", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(() => { /*noop*/ }); + graph.cacheSequence$(sequenceId).subscribe(() => { /*noop*/ }); - expect(graph.hasSequence(sequenceKey)).toBe(false); - expect(graph.isCachingSequence(sequenceKey)).toBe(true); + expect(graph.hasSequence(sequenceId)).toBe(false); + expect(graph.isCachingSequence(sequenceId)).toBe(true); }); it("should cache", (done: Function) => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const sequenceKey: string = "sequenceKey"; - const key: string = "key"; + const sequenceId = "sequenceId"; + const id = "id"; - graph.cacheSequence$(sequenceKey) + graph.cacheSequence$(sequenceId) .subscribe( (g: Graph): void => { - expect(g.hasSequence(sequenceKey)).toBe(true); - expect(g.isCachingSequence(sequenceKey)).toBe(false); - expect(g.getSequence(sequenceKey)).toBeDefined(); - expect(g.getSequence(sequenceKey).key).toBe(sequenceKey); - expect(g.getSequence(sequenceKey).keys.length).toBe(1); - expect(g.getSequence(sequenceKey).keys[0]).toBe(key); + expect(g.hasSequence(sequenceId)).toBe(true); + expect(g.isCachingSequence(sequenceId)).toBe(false); + expect(g.getSequence(sequenceId)).toBeDefined(); + expect(g.getSequence(sequenceId).id).toBe(sequenceId); + expect(g.getSequence(sequenceId).imageIds.length).toBe(1); + expect(g.getSequence(sequenceId).imageIds[0]).toBe(id); done(); }); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [key] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [id] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); }); it("should call api only once when caching the same sequence twice in succession", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - const sequenceByKeySpy: jasmine.Spy = spyOn(api, "sequenceByKey$"); - sequenceByKeySpy.and.returnValue(sequenceByKey); + const getSequences = new Subject(); + const sequenceByKeySpy = spyOn(api, "getSequences$"); + sequenceByKeySpy.and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(() => { /*noop*/ }); - graph.cacheSequence$(sequenceKey).subscribe(() => { /*noop*/ }); + graph.cacheSequence$(sequenceId).subscribe(() => { /*noop*/ }); + graph.cacheSequence$(sequenceId).subscribe(() => { /*noop*/ }); expect(sequenceByKeySpy.calls.count()).toBe(1); }); @@ -2291,40 +2497,47 @@ describe("Graph.resetSpatialEdges", () => { }); it("should use fallback keys", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); - imageByKeyFull.complete(); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); + getImages.complete(); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: ["prev", fullNode.key, "next"] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: ["prev", fullNode.id, "next"] + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); spyOn(graphCalculator, "boundingBoxCorners").and.returnValue([{ lat: 0, lon: 0 }, { lat: 0, lon: 0 }]); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); - const getPotentialSpy: jasmine.Spy = spyOn(edgeCalculator, "getPotentialEdges"); + const getPotentialSpy = spyOn(edgeCalculator, "getPotentialEdges"); getPotentialSpy.and.returnValue([]); spyOn(edgeCalculator, "computeStepEdges").and.returnValue([]); @@ -2333,18 +2546,18 @@ describe("Graph.resetSpatialEdges", () => { spyOn(edgeCalculator, "computePerspectiveToSphericalEdges").and.returnValue([]); spyOn(edgeCalculator, "computeSimilarEdges").and.returnValue([]); - graph.initializeCache(fullNode.key); - graph.cacheSpatialEdges(fullNode.key); + graph.initializeCache(fullNode.id); + graph.cacheSpatialEdges(fullNode.id); - const nodeSequenceResetSpy: jasmine.Spy = spyOn(node, "resetSequenceEdges").and.stub(); - const nodeSpatialResetSpy: jasmine.Spy = spyOn(node, "resetSpatialEdges").and.stub(); + const nodeSequenceResetSpy = spyOn(node, "resetSequenceEdges").and.stub(); + const nodeSpatialResetSpy = spyOn(node, "resetSpatialEdges").and.stub(); graph.resetSpatialEdges(); expect(nodeSequenceResetSpy.calls.count()).toBe(0); expect(nodeSpatialResetSpy.calls.count()).toBe(1); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); }); it("should have to re-encode hs after spatial edges reset", () => { @@ -2352,64 +2565,72 @@ describe("Graph.resetSpatialEdges", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const graphCalculator: GraphCalculator = new GraphCalculator(null); - const edgeCalculator: EdgeCalculator = new EdgeCalculator(); + const api = new APIWrapper(dataProvider); + const graphCalculator = new GraphCalculator(null); + const edgeCalculator = new EdgeCalculator(); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const encodeHsSpy: jasmine.Spy = spyOn(geometryProvider, "latLonToCellIds"); + const encodeHsSpy = spyOn(geometryProvider, "latLonToCellIds"); encodeHsSpy.and.returnValue([h]); - const fullNode: IFullNode = helper.createFullNode(); + const fullNode = helper.createFullNode(); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const graph: Graph = new Graph(api, undefined, graphCalculator, edgeCalculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const graph = new Graph(api, undefined, graphCalculator, edgeCalculator); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fetchResult: { [key: string]: IFullNode } = {}; - fetchResult[fullNode.key] = fullNode; - imageByKeyFull.next(fetchResult); - imageByKeyFull.complete(); + const fetchResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fetchResult); + getImages.complete(); - graph.cacheNodeSequence$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheNodeSequence$(fullNode.id).subscribe(() => { /*noop*/ }); - const result: { [key: string]: ISequence } = {}; - result[fullNode.sequence_key] = { key: fullNode.sequence_key, keys: ["prev", fullNode.key, "next"] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { + id: fullNode.sequence.id, + image_ids: ["prev", fullNode.id, "next"] + }, + node_id: fullNode.sequence.id, + }]; + getSequences.next(result); + getSequences.complete(); - expect(graph.hasTiles(fullNode.key)).toBe(false); - expect(graph.isCachingTiles(fullNode.key)).toBe(false); + expect(graph.hasTiles(fullNode.id)).toBe(false); + expect(graph.isCachingTiles(fullNode.id)).toBe(false); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHresult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHresult[h] = {}; - imagesByHresult[h]["0"] = fullNode; - imagesByH.next(imagesByHresult); + const coreImagesresult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesresult); - expect(graph.hasTiles(fullNode.key)).toBe(true); - expect(graph.isCachingTiles(fullNode.key)).toBe(false); + expect(graph.hasTiles(fullNode.id)).toBe(true); + expect(graph.isCachingTiles(fullNode.id)).toBe(false); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); spyOn(graphCalculator, "boundingBoxCorners").and.returnValue([{ lat: 0, lon: 0 }, { lat: 0, lon: 0 }]); - expect(graph.hasSpatialArea(fullNode.key)).toBe(true); + expect(graph.hasSpatialArea(fullNode.id)).toBe(true); - const getPotentialSpy: jasmine.Spy = spyOn(edgeCalculator, "getPotentialEdges"); + const getPotentialSpy = spyOn(edgeCalculator, "getPotentialEdges"); getPotentialSpy.and.returnValue([]); spyOn(edgeCalculator, "computeStepEdges").and.returnValue([]); @@ -2418,11 +2639,11 @@ describe("Graph.resetSpatialEdges", () => { spyOn(edgeCalculator, "computePerspectiveToSphericalEdges").and.returnValue([]); spyOn(edgeCalculator, "computeSimilarEdges").and.returnValue([]); - graph.initializeCache(fullNode.key); - graph.cacheSpatialEdges(fullNode.key); + graph.initializeCache(fullNode.id); + graph.cacheSpatialEdges(fullNode.id); - const nodeSequenceResetSpy: jasmine.Spy = spyOn(node, "resetSequenceEdges").and.stub(); - const nodeSpatialResetSpy: jasmine.Spy = spyOn(node, "resetSpatialEdges").and.stub(); + const nodeSequenceResetSpy = spyOn(node, "resetSequenceEdges").and.stub(); + const nodeSpatialResetSpy = spyOn(node, "resetSpatialEdges").and.stub(); graph.resetSpatialEdges(); @@ -2430,7 +2651,7 @@ describe("Graph.resetSpatialEdges", () => { expect(nodeSpatialResetSpy.calls.count()).toBe(1); const countBefore: number = encodeHsSpy.calls.count(); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); const countAfter: number = encodeHsSpy.calls.count(); expect(countAfter - countBefore).toBe(1); @@ -2450,36 +2671,38 @@ describe("Graph.reset", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose"); + const nodeDisposeSpy = spyOn(node, "dispose"); nodeDisposeSpy.and.stub(); graph.reset([]); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(node.key)).toBe(false); + expect(graph.hasNode(node.id)).toBe(false); }); it("should dispose cache initialized node", () => { @@ -2487,37 +2710,39 @@ describe("Graph.reset", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - graph.initializeCache(node.key); + const node = graph.getNode(fullNode.id); + graph.initializeCache(node.id); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose"); + const nodeDisposeSpy = spyOn(node, "dispose"); nodeDisposeSpy.and.stub(); graph.reset([]); expect(nodeDisposeSpy.calls.count()).toBe(1); - expect(graph.hasNode(node.key)).toBe(false); + expect(graph.hasNode(node.id)).toBe(false); }); it("should keep supplied node", () => { @@ -2525,43 +2750,45 @@ describe("Graph.reset", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - graph.initializeCache(node.key); + const node = graph.getNode(fullNode.id); + graph.initializeCache(node.id); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose"); + const nodeDisposeSpy = spyOn(node, "dispose"); nodeDisposeSpy.and.stub(); - const nodeResetSequenceSpy: jasmine.Spy = spyOn(node, "resetSequenceEdges"); + const nodeResetSequenceSpy = spyOn(node, "resetSequenceEdges"); nodeResetSequenceSpy.and.stub(); - const nodeResetSpatialSpy: jasmine.Spy = spyOn(node, "resetSpatialEdges"); + const nodeResetSpatialSpy = spyOn(node, "resetSpatialEdges"); nodeResetSpatialSpy.and.stub(); - graph.reset([node.key]); + graph.reset([node.id]); expect(nodeDisposeSpy.calls.count()).toBe(0); expect(nodeResetSequenceSpy.calls.count()).toBe(1); expect(nodeResetSpatialSpy.calls.count()).toBe(1); - expect(graph.hasNode(node.key)).toBe(true); + expect(graph.hasNode(node.id)).toBe(true); }); }); @@ -2577,44 +2804,46 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(1); - expect(graph.hasNode(fullNode.key)).toBe(false); + expect(graph.hasNode(fullNode.id)).toBe(false); }); it("should not remove prestored node if in kept sequence", () => { @@ -2622,45 +2851,47 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequencKey"; - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequencKey"; + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); - graph.uncache([], fullNode.sequence_key); + graph.uncache([], fullNode.sequence.id); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); }); it("should remove prestored node if cache initialized", () => { @@ -2668,44 +2899,46 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - const node: Node = graph.getNode(fullNode.key); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeDisposeSpy.calls.count()).toBe(1); - expect(graph.hasNode(fullNode.key)).toBe(false); + expect(graph.hasNode(fullNode.id)).toBe(false); }); it("should not remove prestored node when in keys to keep", () => { @@ -2713,46 +2946,48 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); - graph.uncache([fullNode.key]); + graph.uncache([fullNode.id]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); }); it("should not remove prestored node if below threshold", () => { @@ -2760,46 +2995,48 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 1, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); }); it("should remove prestored node accessed earliest", () => { @@ -2807,78 +3044,81 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); - const imageByKeyFullSpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const getImagesSpy = spyOn(api, "getImages$"); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 1, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - - const fullNode1: IFullNode = helper.createFullNode(); - fullNode1.key = "key1"; - const result1: { [key: string]: IFullNode } = {}; - result1[fullNode1.key] = fullNode1; + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const imageByKeyFull1: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - imageByKeyFullSpy.and.returnValue(imageByKeyFull1); + const fullNode1 = helper.createFullNode(); + fullNode1.id = "key1"; + const result1: ImagesContract = [{ + node: fullNode1, + node_id: fullNode1.id, + }]; - graph.cacheFull$(fullNode1.key).subscribe(() => { /*noop*/ }); + const getImages1 = new Subject(); + getImagesSpy.and.returnValue(getImages1); - imageByKeyFull1.next(result1); - imageByKeyFull1.complete(); + graph.cacheFull$(fullNode1.id).subscribe(() => { /*noop*/ }); - expect(graph.hasNode(fullNode1.key)).toBe(true); + getImages1.next(result1); + getImages1.complete(); - const fullNode2: IFullNode = helper.createFullNode(); - fullNode2.key = "key2"; - const result2: { [key: string]: IFullNode } = {}; - result2[fullNode2.key] = fullNode2; + expect(graph.hasNode(fullNode1.id)).toBe(true); - const imageByKeyFull2: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - imageByKeyFullSpy.and.returnValue(imageByKeyFull2); + const fullNode2 = helper.createFullNode(); + fullNode2.id = "key2"; + const result2: ImagesContract = [{ + node: fullNode2, + node_id: fullNode2.id, + }]; + const getImages2 = new Subject(); + getImagesSpy.and.returnValue(getImages2); - graph.cacheFull$(fullNode2.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode2.id).subscribe(() => { /*noop*/ }); - imageByKeyFull2.next(result2); - imageByKeyFull2.complete(); + getImages2.next(result2); + getImages2.complete(); - const node1: Node = graph.getNode(fullNode1.key); - graph.initializeCache(node1.key); + const node1 = graph.getNode(fullNode1.id); + graph.initializeCache(node1.id); - expect(graph.hasInitializedCache(node1.key)).toBe(true); + expect(graph.hasInitializedCache(node1.id)).toBe(true); - const node2: Node = graph.getNode(fullNode2.key); - graph.initializeCache(node2.key); + const node2 = graph.getNode(fullNode2.id); + graph.initializeCache(node2.id); - expect(graph.hasInitializedCache(node2.key)).toBe(true); + expect(graph.hasInitializedCache(node2.id)).toBe(true); - const nodeDisposeSpy1: jasmine.Spy = spyOn(node1, "dispose").and.stub(); - const nodeDisposeSpy2: jasmine.Spy = spyOn(node2, "dispose").and.stub(); + const nodeDisposeSpy1 = spyOn(node1, "dispose").and.stub(); + const nodeDisposeSpy2 = spyOn(node2, "dispose").and.stub(); - const time: number = new Date().getTime(); + const time = new Date().getTime(); while (new Date().getTime() === time) { - graph.hasNode(node2.key); + graph.hasNode(node2.id); } - graph.hasNode(node2.key); + graph.hasNode(node2.id); graph.uncache([]); expect(nodeDisposeSpy1.calls.count()).toBe(1); expect(nodeDisposeSpy2.calls.count()).toBe(0); - expect(graph.hasNode(fullNode1.key)).toBe(false); - expect(graph.hasNode(fullNode2.key)).toBe(true); + expect(graph.hasNode(fullNode1.id)).toBe(false); + expect(graph.hasNode(fullNode2.id)).toBe(true); }); @@ -2887,62 +3127,65 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - expect(graph.hasInitializedCache(fullNode.key)).toBe(true); + expect(graph.hasInitializedCache(fullNode.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(1); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.hasInitializedCache(fullNode.key)).toBe(false); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.hasInitializedCache(fullNode.id)).toBe(false); }); it("should not uncache cache initialized node if below threshold", () => { @@ -2950,64 +3193,67 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - graph.initializeCache(fullNode.key); + graph.initializeCache(fullNode.id); - expect(graph.hasInitializedCache(fullNode.key)).toBe(true); + expect(graph.hasInitializedCache(fullNode.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.hasInitializedCache(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.hasInitializedCache(fullNode.id)).toBe(true); }); it("should not uncache cache initialized node if key should be kept", () => { @@ -3015,63 +3261,66 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - graph.initializeCache(node.key); + const node = graph.getNode(fullNode.id); + graph.initializeCache(node.id); - expect(graph.hasInitializedCache(node.key)).toBe(true); + expect(graph.hasInitializedCache(node.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache"); + const nodeUncacheSpy = spyOn(node, "uncache"); nodeUncacheSpy.and.stub(); - graph.uncache([node.key]); + graph.uncache([node.id]); expect(nodeUncacheSpy.calls.count()).toBe(0); - expect(graph.hasNode(node.key)).toBe(true); - expect(graph.hasInitializedCache(node.key)).toBe(true); + expect(graph.hasNode(node.id)).toBe(true); + expect(graph.hasInitializedCache(node.id)).toBe(true); }); it("should not uncache cache initialized node if key in use", () => { @@ -3079,59 +3328,61 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - graph.initializeCache(node.key); + const node = graph.getNode(fullNode.id); + graph.initializeCache(node.id); - expect(graph.hasInitializedCache(node.key)).toBe(true); + expect(graph.hasInitializedCache(node.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(node.key); - observableFrom(graph.cacheTiles$(node.key)).pipe( + graph.hasTiles(node.id); + observableFrom(graph.cacheTiles$(node.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(node.key)).toBe(true); - expect(graph.hasInitializedCache(node.key)).toBe(true); + expect(graph.hasNode(node.id)).toBe(true); + expect(graph.hasInitializedCache(node.id)).toBe(true); }); it("should uncache cache initialized node accessed earliest", () => { @@ -3139,282 +3390,295 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFullSpy: jasmine.Spy = spyOn(api, "imageByKeyFull$"); + const getImagesSpy = spyOn(api, "getImages$"); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode1: IFullNode = helper.createFullNode(); - fullNode1.key = "key1"; - const result1: { [key: string]: IFullNode } = {}; - result1[fullNode1.key] = fullNode1; + const fullNode1 = helper.createFullNode(); + fullNode1.id = "key1"; + const result1: ImagesContract = [{ + node: fullNode1, + node_id: fullNode1.id, + }]; - const imageByKeyFull1: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - imageByKeyFullSpy.and.returnValue(imageByKeyFull1); + const getImages1 = new Subject(); + getImagesSpy.and.returnValue(getImages1); - graph.cacheFull$(fullNode1.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode1.id).subscribe(() => { /*noop*/ }); - imageByKeyFull1.next(result1); - imageByKeyFull1.complete(); + getImages1.next(result1); + getImages1.complete(); - expect(graph.hasNode(fullNode1.key)).toBe(true); + expect(graph.hasNode(fullNode1.id)).toBe(true); - const fullNode2: IFullNode = helper.createFullNode(); - fullNode2.key = "key2"; - const result2: { [key: string]: IFullNode } = {}; - result2[fullNode2.key] = fullNode2; + const fullNode2 = helper.createFullNode(); + fullNode2.id = "key2"; + const result2: ImagesContract = [{ + node: fullNode2, + node_id: fullNode2.id, + }]; - const imageByKeyFull2: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - imageByKeyFullSpy.and.returnValue(imageByKeyFull2); + const getImages2 = new Subject(); + getImagesSpy.and.returnValue(getImages2); - graph.cacheFull$(fullNode2.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode2.id).subscribe(() => { /*noop*/ }); - imageByKeyFull2.next(result2); - imageByKeyFull2.complete(); + getImages2.next(result2); + getImages2.complete(); - expect(graph.hasNode(fullNode2.key)).toBe(true); + expect(graph.hasNode(fullNode2.id)).toBe(true); - const node1: Node = graph.getNode(fullNode1.key); - graph.initializeCache(node1.key); + const node1 = graph.getNode(fullNode1.id); + graph.initializeCache(node1.id); - expect(graph.hasInitializedCache(node1.key)).toBe(true); + expect(graph.hasInitializedCache(node1.id)).toBe(true); - const node2: Node = graph.getNode(fullNode2.key); - graph.initializeCache(node2.key); + const node2 = graph.getNode(fullNode2.id); + graph.initializeCache(node2.id); - expect(graph.hasInitializedCache(node2.key)).toBe(true); + expect(graph.hasInitializedCache(node2.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode1.key); - observableFrom(graph.cacheTiles$(fullNode1.key)).pipe( + graph.hasTiles(fullNode1.id); + observableFrom(graph.cacheTiles$(fullNode1.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode1; - imagesByHResult[h]["1"] = fullNode2; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode1, fullNode2], + }; + coreImages.next(coreImagesResult); - const nodeUncacheSpy1: jasmine.Spy = spyOn(node1, "uncache").and.stub(); - const nodeUncacheSpy2: jasmine.Spy = spyOn(node2, "uncache").and.stub(); + const nodeUncacheSpy1 = spyOn(node1, "uncache").and.stub(); + const nodeUncacheSpy2 = spyOn(node2, "uncache").and.stub(); - const time: number = new Date().getTime(); + const time = new Date().getTime(); while (new Date().getTime() === time) { - graph.hasNode(node2.key); + graph.hasNode(node2.id); } - graph.hasNode(node2.key); + graph.hasNode(node2.id); graph.uncache([]); expect(nodeUncacheSpy1.calls.count()).toBe(1); - expect(graph.hasNode(node1.key)).toBe(true); - expect(graph.hasInitializedCache(node1.key)).toBe(false); + expect(graph.hasNode(node1.id)).toBe(true); + expect(graph.hasInitializedCache(node1.id)).toBe(false); expect(nodeUncacheSpy2.calls.count()).toBe(0); - expect(graph.hasNode(node2.key)).toBe(true); - expect(graph.hasInitializedCache(node2.key)).toBe(true); + expect(graph.hasNode(node2.id)).toBe(true); + expect(graph.hasInitializedCache(node2.id)).toBe(true); }); it("should uncache sequence", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(() => { /*noop*/ }); + graph.cacheSequence$(sequenceId).subscribe(() => { /*noop*/ }); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - expect(graph.hasSequence(sequenceKey)).toBe(true); + expect(graph.hasSequence(sequenceId)).toBe(true); - const sequence: Sequence = graph.getSequence(sequenceKey); + const sequence = graph.getSequence(sequenceId); - const sequenceDisposeSpy: jasmine.Spy = spyOn(sequence, "dispose"); + const sequenceDisposeSpy = spyOn(sequence, "dispose"); sequenceDisposeSpy.and.stub(); graph.uncache([]); expect(sequenceDisposeSpy.calls.count()).toBe(1); - expect(graph.hasSequence(sequence.key)).toBe(false); + expect(graph.hasSequence(sequence.id)).toBe(false); }); it("should not uncache sequence if specified to keep", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(() => { /*noop*/ }); + graph.cacheSequence$(sequenceId).subscribe(() => { /*noop*/ }); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - expect(graph.hasSequence(sequenceKey)).toBe(true); + expect(graph.hasSequence(sequenceId)).toBe(true); - const sequence: Sequence = graph.getSequence(sequenceKey); + const sequence = graph.getSequence(sequenceId); - const sequenceDisposeSpy: jasmine.Spy = spyOn(sequence, "dispose"); + const sequenceDisposeSpy = spyOn(sequence, "dispose"); sequenceDisposeSpy.and.stub(); - graph.uncache([], sequenceKey); + graph.uncache([], sequenceId); expect(sequenceDisposeSpy.calls.count()).toBe(0); - expect(graph.hasSequence(sequence.key)).toBe(true); + expect(graph.hasSequence(sequence.id)).toBe(true); }); it("should not uncache sequence if number below threshold", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper( + new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); - const sequenceByKey: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - spyOn(api, "sequenceByKey$").and.returnValue(sequenceByKey); + const getSequences = new Subject(); + spyOn(api, "getSequences$").and.returnValue(getSequences); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const sequenceKey: string = "sequenceKey"; + const sequenceId = "sequenceId"; - graph.cacheSequence$(sequenceKey).subscribe(() => { /*noop*/ }); + graph.cacheSequence$(sequenceId).subscribe(() => { /*noop*/ }); - const result: { [sequenceKey: string]: ISequence } = {}; - result[sequenceKey] = { key: sequenceKey, keys: [] }; - sequenceByKey.next(result); - sequenceByKey.complete(); + const result: SequencesContract = [{ + node: { id: sequenceId, image_ids: [] }, + node_id: sequenceId, + }]; + getSequences.next(result); + getSequences.complete(); - expect(graph.hasSequence(sequenceKey)).toBe(true); + expect(graph.hasSequence(sequenceId)).toBe(true); - const sequence: Sequence = graph.getSequence(sequenceKey); + const sequence = graph.getSequence(sequenceId); - const sequenceDisposeSpy: jasmine.Spy = spyOn(sequence, "dispose"); + const sequenceDisposeSpy = spyOn(sequence, "dispose"); sequenceDisposeSpy.and.stub(); graph.uncache([]); expect(sequenceDisposeSpy.calls.count()).toBe(0); - expect(graph.hasSequence(sequence.key)).toBe(true); + expect(graph.hasSequence(sequence.id)).toBe(true); }); it("should not uncache sequence accessed last", () => { - const api: APIWrapper = new APIWrapper(new FalcorDataProvider({ clientToken: "cid" })); - const calculator: GraphCalculator = new GraphCalculator(null); - - const sequenceByKeySpy: jasmine.Spy = spyOn(api, "sequenceByKey$"); - - const configuration: IGraphConfiguration = { + const api = new APIWrapper( + new FalcorDataProvider({ clientToken: "cid" })); + const calculator = new GraphCalculator(null); + const getSequencesSpy = spyOn(api, "getSequences$"); + const configuration: GraphConfiguration = { maxSequences: 1, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - - const sequenceKey1: string = "sequenceKey1"; - - const sequenceByKey1: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - sequenceByKeySpy.and.returnValue(sequenceByKey1); - - graph.cacheSequence$(sequenceKey1).subscribe(() => { /*noop*/ }); - - const result1: { [sequenceKey: string]: ISequence } = {}; - result1[sequenceKey1] = { key: sequenceKey1, keys: [] }; - sequenceByKey1.next(result1); - sequenceByKey1.complete(); - - expect(graph.hasSequence(sequenceKey1)).toBe(true); - - const sequence1: Sequence = graph.getSequence(sequenceKey1); - - const sequenceDisposeSpy1: jasmine.Spy = spyOn(sequence1, "dispose").and.stub(); - - const sequenceKey2: string = "sequenceKey2"; - - const sequenceByKey2: Subject<{ [key: string]: ISequence }> = new Subject<{ [key: string]: ISequence }>(); - sequenceByKeySpy.and.returnValue(sequenceByKey2); - - graph.cacheSequence$(sequenceKey2).subscribe(() => { /*noop*/ }); - - const result2: { [sequenceKey: string]: ISequence } = {}; - result2[sequenceKey2] = { key: sequenceKey2, keys: [] }; - sequenceByKey2.next(result2); - sequenceByKey2.complete(); - - expect(graph.hasSequence(sequenceKey2)).toBe(true); - - const sequence2: Sequence = graph.getSequence(sequenceKey2); - - const sequenceDisposeSpy2: jasmine.Spy = spyOn(sequence2, "dispose").and.stub(); - - const time: number = new Date().getTime(); + const graph = new Graph( + api, + undefined, + calculator, + undefined, + undefined, + configuration); + + const sequenceId1 = "sequenceId1"; + const sequences1 = new Subject(); + getSequencesSpy.and.returnValue(sequences1); + + graph.cacheSequence$(sequenceId1).subscribe(() => { /*noop*/ }); + + const result1: SequencesContract = [{ + node_id: sequenceId1, + node: { id: sequenceId1, image_ids: [] }, + }]; + sequences1.next(result1); + sequences1.complete(); + + expect(graph.hasSequence(sequenceId1)).toBe(true); + + const sequence1 = graph.getSequence(sequenceId1); + const sequenceDisposeSpy1 = spyOn(sequence1, "dispose").and.stub(); + + const sequenceId2 = "sequenceId2"; + const getSequences2 = new Subject(); + getSequencesSpy.and.returnValue(getSequences2); + + graph.cacheSequence$(sequenceId2).subscribe(() => { /*noop*/ }); + + const result2: SequencesContract = [{ + node_id: sequenceId2, + node: { id: sequenceId2, image_ids: [] }, + }]; + getSequences2.next(result2); + getSequences2.complete(); + + expect(graph.hasSequence(sequenceId2)).toBe(true); + const sequence2 = graph.getSequence(sequenceId2); + const sequenceDisposeSpy2 = spyOn(sequence2, "dispose").and.stub(); + + const time = new Date().getTime(); while (new Date().getTime() === time) { - graph.hasSequence(sequenceKey2); + graph.hasSequence(sequenceId2); } - graph.getSequence(sequenceKey2); - + graph.getSequence(sequenceId2); graph.uncache([]); expect(sequenceDisposeSpy1.calls.count()).toBe(1); - expect(graph.hasSequence(sequence1.key)).toBe(false); + expect(graph.hasSequence(sequence1.id)).toBe(false); expect(sequenceDisposeSpy2.calls.count()).toBe(0); - expect(graph.hasSequence(sequence2.key)).toBe(true); + expect(graph.hasSequence(sequence2.id)).toBe(true); }); it("should uncache node by uncaching tile", () => { @@ -3422,61 +3686,64 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose"); + const nodeDisposeSpy = spyOn(node, "dispose"); nodeDisposeSpy.and.stub(); graph.uncache([]); expect(nodeDisposeSpy.calls.count()).toBe(1); - expect(graph.hasNode(fullNode.key)).toBe(false); + expect(graph.hasNode(fullNode.id)).toBe(false); }); it("should not dispose node by uncaching tile if in specified sequence", () => { @@ -3484,63 +3751,66 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - fullNode.sequence_key = "sequenceKey"; - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + fullNode.sequence.id = "sequenceId"; + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); + const node = graph.getNode(fullNode.id); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); - graph.uncache([], fullNode.sequence_key); + graph.uncache([], fullNode.sequence.id); expect(nodeDisposeSpy.calls.count()).toBe(0); expect(nodeUncacheSpy.calls.count()).toBe(1); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); }); it("should not uncache node by uncaching tile when number below threshold", () => { @@ -3548,62 +3818,65 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 1, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 1, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); graph.uncache([]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); }); it("should not uncache and dispose node by uncaching tile when tile is related to kept key", () => { @@ -3611,62 +3884,65 @@ describe("Graph.uncache", () => { const dataProvider = new FalcorDataProvider( { clientToken: "cid" }, geometryProvider); - const api: APIWrapper = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const api = new APIWrapper(dataProvider); + const calculator = new GraphCalculator(null); - const h: string = "h"; + const h = "h"; spyOn(geometryProvider, "latLonToCellId").and.returnValue(h); spyOn(geometryProvider, "latLonToCellIds").and.returnValue([h]); - const imageByKeyFull: Subject<{ [key: string]: IFullNode }> = new Subject<{ [key: string]: IFullNode }>(); - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + spyOn(api, "getImages$").and.returnValue(getImages); - const configuration: IGraphConfiguration = { + const configuration: GraphConfiguration = { maxSequences: 0, maxUnusedNodes: 0, maxUnusedPreStoredNodes: 0, maxUnusedTiles: 0, }; - const graph: Graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); + const graph = new Graph(api, undefined, calculator, undefined, undefined, configuration); - const fullNode: IFullNode = helper.createFullNode(); - const result: { [key: string]: IFullNode } = {}; - result[fullNode.key] = fullNode; - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + const fullNode = helper.createFullNode(); + const result: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - imageByKeyFull.next(result); - imageByKeyFull.complete(); + getImages.next(result); + getImages.complete(); - expect(graph.hasNode(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); - const imagesByH: Subject<{ [key: string]: { [index: string]: ICoreNode } }> = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const imagesByHResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - imagesByHResult[h] = {}; - imagesByHResult[h]["0"] = fullNode; - imagesByH.next(imagesByHResult); + const coreImagesResult: CoreImagesContract = { + cell_id: h, + images: [fullNode], + }; + coreImages.next(coreImagesResult); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - const node: Node = graph.getNode(fullNode.key); - const nodeUncacheSpy: jasmine.Spy = spyOn(node, "uncache").and.stub(); - const nodeDisposeSpy: jasmine.Spy = spyOn(node, "dispose").and.stub(); + const node = graph.getNode(fullNode.id); + const nodeUncacheSpy = spyOn(node, "uncache").and.stub(); + const nodeDisposeSpy = spyOn(node, "dispose").and.stub(); - graph.uncache([node.key]); + graph.uncache([node.id]); expect(nodeUncacheSpy.calls.count()).toBe(0); expect(nodeDisposeSpy.calls.count()).toBe(0); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); }); }); @@ -3680,18 +3956,18 @@ describe("Graph.cacheCell$", () => { const calculator = new GraphCalculator(null); const cellId = "cellId"; - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill = new Subject<{ [key: string]: IFillNode }>(); - const imageByKeyFillSpy = - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + const getSpatialImagesSpy = + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const key = "full-key"; + const id = "full-id"; const fullNode = new NodeHelper().createFullNode(); - fullNode.key = key; + fullNode.id = id; const graph = new Graph(api, undefined, calculator); @@ -3699,28 +3975,30 @@ describe("Graph.cacheCell$", () => { .subscribe( (nodes: Node[]): void => { expect(nodes.length).toBe(1); - expect(nodes[0].key).toBe(key); + expect(nodes[0].id).toBe(id); expect(nodes[0].full).toBe(true); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFillSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(1); done(); }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = - {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); - - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[key] = fullNode; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); + + const spatialImages: SpatialImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); }); it("should not cache again if all cell nodes cached", (done: Function) => { @@ -3729,65 +4007,68 @@ describe("Graph.cacheCell$", () => { { clientToken: "token" }, geometryProvider); const api = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const calculator = new GraphCalculator(null); const cellId = "cell-id"; spyOn(geometryProvider, "latLonToCellIds").and.returnValue([cellId]); spyOn(geometryProvider, "latLonToCellId").and.returnValue(cellId); - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFull = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeyFullSpy = - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + const getImagesSpy = + spyOn(api, "getImages$").and.returnValue(getImages); - const imageByKeyFillSpy = - spyOn(api, "imageByKeyFill$").and.stub(); + const getSpatialImagesSpy = + spyOn(api, "getSpatialImages$").and.stub(); - const key = "full-key"; - const fullNode: IFullNode = new NodeHelper().createFullNode(); - fullNode.key = key; + const id = "full-id"; + const fullNode: ImageEnt = new NodeHelper().createFullNode(); + fullNode.id = id; - const graph: Graph = new Graph(api, undefined, calculator); + const graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode.id).subscribe(() => { /*noop*/ }); - const fullResult: { [key: string]: IFullNode } = {}; - fullResult[fullNode.key] = fullNode; - imageByKeyFull.next(fullResult); - imageByKeyFull.complete(); + const fullResult: ImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getImages.next(fullResult); + getImages.complete(); - graph.hasTiles(fullNode.key); - observableFrom(graph.cacheTiles$(fullNode.key)).pipe( + graph.hasTiles(fullNode.id); + observableFrom(graph.cacheTiles$(fullNode.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode; - imagesByH.next(tileResult); + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode], + }; + coreImages.next(tileResult); - expect(graph.hasNode(fullNode.key)).toBe(true); - expect(graph.hasTiles(fullNode.key)).toBe(true); + expect(graph.hasNode(fullNode.id)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFullSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getImagesSpy.calls.count()).toBe(1); graph.cacheCell$(cellId) .subscribe( (nodes: Node[]): void => { expect(nodes.length).toBe(1); - expect(nodes[0].key).toBe(key); + expect(nodes[0].id).toBe(id); expect(nodes[0].full).toBe(true); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFullSpy.calls.count()).toBe(1); - expect(imageByKeyFillSpy.calls.count()).toBe(0); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getImagesSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(0); done(); }); @@ -3799,87 +4080,91 @@ describe("Graph.cacheCell$", () => { { clientToken: "token" }, geometryProvider); const api = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const calculator = new GraphCalculator(null); const cellId = "cell-id"; spyOn(geometryProvider, "latLonToCellIds").and.returnValue([cellId]); spyOn(geometryProvider, "latLonToCellId").and.returnValue(cellId); - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFull = new Subject<{ [key: string]: IFullNode }>(); - const imageByKeyFullSpy = - spyOn(api, "imageByKeyFull$").and.returnValue(imageByKeyFull); + const getImages = new Subject(); + const getImagesSpy = + spyOn(api, "getImages$").and.returnValue(getImages); - const imageByKeyFill = new Subject<{ [key: string]: IFillNode }>(); - const imageByKeyFillSpy = - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + const getSpatialImagesSpy = + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); const key1 = "full-key-1"; const key2 = "full-key-2"; const fullNode1 = new NodeHelper().createFullNode(); - fullNode1.key = key1; + fullNode1.id = key1; const graph = new Graph(api, undefined, calculator); - graph.cacheFull$(fullNode1.key).subscribe(() => { /*noop*/ }); + graph.cacheFull$(fullNode1.id).subscribe(() => { /*noop*/ }); - const fullResult: { [key: string]: IFullNode } = {}; - fullResult[fullNode1.key] = fullNode1; - imageByKeyFull.next(fullResult); - imageByKeyFull.complete(); + const fullResult: ImagesContract = [{ + node: fullNode1, + node_id: fullNode1.id, + }]; + getImages.next(fullResult); + getImages.complete(); - graph.hasTiles(fullNode1.key); - observableFrom(graph.cacheTiles$(fullNode1.key)).pipe( + graph.hasTiles(fullNode1.id); + observableFrom(graph.cacheTiles$(fullNode1.id)).pipe( mergeAll()) .subscribe(() => { /*noop*/ }); const fullNode2 = new NodeHelper().createFullNode(); - fullNode2.key = key2; - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode1; - tileResult[cellId]["1"] = fullNode2; - imagesByH.next(tileResult); + fullNode2.id = key2; + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode1, fullNode2], + }; + coreImages.next(tileResult); - expect(graph.hasNode(fullNode1.key)).toBe(true); - expect(graph.hasNode(fullNode2.key)).toBe(true); - expect(graph.hasTiles(fullNode1.key)).toBe(true); - expect(graph.hasTiles(fullNode2.key)).toBe(true); + expect(graph.hasNode(fullNode1.id)).toBe(true); + expect(graph.hasNode(fullNode2.id)).toBe(true); + expect(graph.hasTiles(fullNode1.id)).toBe(true); + expect(graph.hasTiles(fullNode2.id)).toBe(true); - expect(graph.getNode(fullNode1.key).full).toBe(true); - expect(graph.getNode(fullNode2.key).full).toBe(false); + expect(graph.getNode(fullNode1.id).full).toBe(true); + expect(graph.getNode(fullNode2.id).full).toBe(false); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFullSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getImagesSpy.calls.count()).toBe(1); graph.cacheCell$(cellId) .subscribe( (nodes: Node[]): void => { expect(nodes.length).toBe(2); - expect([key1, key2].includes(nodes[0].key)).toBe(true); - expect([key1, key2].includes(nodes[1].key)).toBe(true); + expect([key1, key2].includes(nodes[0].id)).toBe(true); + expect([key1, key2].includes(nodes[1].id)).toBe(true); expect(nodes[0].full).toBe(true); expect(nodes[1].full).toBe(true); expect(graph.hasNode(key1)).toBe(true); expect(graph.hasNode(key2)).toBe(true); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFullSpy.calls.count()).toBe(1); - expect(imageByKeyFillSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getImagesSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(1); done(); }); - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[fullNode2.key] = fullNode2; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const spatialImages: SpatialImagesContract = [{ + node: fullNode2, + node_id: fullNode2.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); }); it("should cache cache tile once for the same cell", (done: Function) => { @@ -3888,24 +4173,24 @@ describe("Graph.cacheCell$", () => { { clientToken: "token" }, geometryProvider); const api = new APIWrapper(dataProvider); - const calculator: GraphCalculator = new GraphCalculator(null); + const calculator = new GraphCalculator(null); const cellId = "cell-id"; spyOn(geometryProvider, "latLonToCellIds").and.returnValue([cellId]); spyOn(geometryProvider, "latLonToCellId").and.returnValue(cellId); - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill = new Subject<{ [key: string]: IFillNode }>(); - const imageByKeyFillSpy = - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + const getSpatialImagesSpy = + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const key = "full-key"; + const id = "full-id"; const fullNode = new NodeHelper().createFullNode(); - fullNode.key = key; + fullNode.id = id; const graph = new Graph(api, undefined, calculator); @@ -3918,32 +4203,35 @@ describe("Graph.cacheCell$", () => { count++; expect(nodes.length).toBe(1); - expect(nodes[0].key).toBe(fullNode.key); + expect(nodes[0].id).toBe(fullNode.id); expect(nodes[0].full).toBe(true); - expect(graph.hasNode(key)).toBe(true); - expect(graph.hasTiles(fullNode.key)).toBe(true); - expect(graph.getNode(fullNode.key).full).toBe(true); + expect(graph.hasNode(id)).toBe(true); + expect(graph.hasTiles(fullNode.id)).toBe(true); + expect(graph.getNode(fullNode.id).full).toBe(true); }, undefined, (): void => { expect(count).toBe(2); - expect(imagesByHSpy.calls.count()).toBe(1); - expect(imageByKeyFillSpy.calls.count()).toBe(2); + expect(coreImagesSpy.calls.count()).toBe(1); + expect(getSpatialImagesSpy.calls.count()).toBe(2); done(); }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); - - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[fullNode.key] = fullNode; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); + + const spatialImages: SpatialImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); }); }); @@ -3956,7 +4244,7 @@ describe("Graph.updateCells$", () => { const api = new APIWrapper(dataProvider); const calculator = new GraphCalculator(null); - const imagesByHSpy = spyOn(api, "imagesByH$").and.stub(); + const coreImagesSpy = spyOn(api, "getCoreImages$").and.stub(); const graph = new Graph(api, undefined, calculator); @@ -3968,7 +4256,7 @@ describe("Graph.updateCells$", () => { undefined, (): void => { expect(count).toBe(0); - expect(imagesByHSpy.calls.count()).toBe(0); + expect(coreImagesSpy.calls.count()).toBe(0); done(); }); }); @@ -3981,52 +4269,54 @@ describe("Graph.updateCells$", () => { const api = new APIWrapper(dataProvider); const calculator = new GraphCalculator(null); - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const key = "full-key"; + const id = "full-id"; const fullNode = new NodeHelper().createFullNode(); - fullNode.key = key; + fullNode.id = id; const graph = new Graph(api, undefined, calculator); const cellId = "cellId"; graph.cacheCell$(cellId).subscribe(); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = - {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[key] = fullNode; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const spatialImages: SpatialImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); - const imagesByHUpdate = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - imagesByHSpy.calls.reset(); - imagesByHSpy.and.returnValue(imagesByHUpdate); + const coreImagesUpdate = + new Subject(); + coreImagesSpy.calls.reset(); + coreImagesSpy.and.returnValue(coreImagesUpdate); graph.updateCells$([cellId]) .subscribe( - (id: string): void => { - expect(id).toBe(cellId); - expect(imagesByHSpy.calls.count()).toBe(1); + (cid: string): void => { + expect(cid).toBe(cellId); + expect(coreImagesSpy.calls.count()).toBe(1); done(); }); - imagesByHUpdate.next(tileResult); - imagesByHUpdate.complete(); + coreImagesUpdate.next(tileResult); + coreImagesUpdate.complete(); }); it("should update currently caching cell", (done: Function) => { @@ -4037,54 +4327,56 @@ describe("Graph.updateCells$", () => { const api = new APIWrapper(dataProvider); const calculator = new GraphCalculator(null); - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); - const key = "full-key"; + const id = "full-id"; const fullNode = new NodeHelper().createFullNode(); - fullNode.key = key; + fullNode.id = id; const graph = new Graph(api, undefined, calculator); const cellId = "cellId"; graph.cacheCell$(cellId).subscribe(); - expect(graph.hasNode(key)).toBe(false); + expect(graph.hasNode(id)).toBe(false); - const imagesByHUpdate = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - imagesByHSpy.calls.reset(); - imagesByHSpy.and.returnValue(imagesByHUpdate); + const coreImagesUpdate = + new Subject(); + coreImagesSpy.calls.reset(); + coreImagesSpy.and.returnValue(coreImagesUpdate); graph.updateCells$([cellId]) .subscribe( - (id: string): void => { - expect(id).toBe(cellId); - expect(imagesByHSpy.calls.count()).toBe(1); + (cid: string): void => { + expect(cid).toBe(cellId); + expect(coreImagesSpy.calls.count()).toBe(1); done(); }); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = - {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode; - imagesByH.next(tileResult); - imagesByH.complete(); + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode], + }; + coreImages.next(tileResult); + coreImages.complete(); - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[key] = fullNode; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const spatialImages: SpatialImagesContract = [{ + node: fullNode, + node_id: fullNode.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); - expect(graph.hasNode(key)).toBe(true); + expect(graph.hasNode(id)).toBe(true); - imagesByHUpdate.next(tileResult); - imagesByHUpdate.complete(); + coreImagesUpdate.next(tileResult); + coreImagesUpdate.complete(); }); it("should add new nodes to existing cell", (done: Function) => { @@ -4095,41 +4387,43 @@ describe("Graph.updateCells$", () => { const api = new APIWrapper(dataProvider); const calculator = new GraphCalculator(null); - const imagesByH = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - const imagesByHSpy = - spyOn(api, "imagesByH$").and.returnValue(imagesByH); + const coreImages = + new Subject(); + const coreImagesSpy = + spyOn(api, "getCoreImages$").and.returnValue(coreImages); - const imageByKeyFill = new Subject<{ [key: string]: IFillNode }>(); - spyOn(api, "imageByKeyFill$").and.returnValue(imageByKeyFill); + const getSpatialImages = new Subject(); + spyOn(api, "getSpatialImages$").and.returnValue(getSpatialImages); const key1 = "full-key-1"; const fullNode1 = new NodeHelper().createFullNode(); - fullNode1.key = key1; + fullNode1.id = key1; const graph = new Graph(api, undefined, calculator); const cellId = "cellId"; graph.cacheCell$(cellId).subscribe(); - const tileResult: { [key: string]: { [index: string]: ICoreNode } } = - {}; - tileResult[cellId] = {}; - tileResult[cellId]["0"] = fullNode1; - imagesByH.next(tileResult); - imagesByH.complete(); + const tileResult: CoreImagesContract = { + cell_id: cellId, + images: [fullNode1], + }; + coreImages.next(tileResult); + coreImages.complete(); - const fillResult: { [key: string]: IFillNode } = {}; - fillResult[key1] = fullNode1; - imageByKeyFill.next(fillResult); - imageByKeyFill.complete(); + const spatialImages: SpatialImagesContract = [{ + node: fullNode1, + node_id: fullNode1.id, + }]; + getSpatialImages.next(spatialImages); + getSpatialImages.complete(); expect(graph.hasNode(key1)).toBe(true); - const imagesByHUpdate = - new Subject<{ [key: string]: { [index: string]: ICoreNode } }>(); - imagesByHSpy.calls.reset(); - imagesByHSpy.and.returnValue(imagesByHUpdate); + const coreImagesUpdate = + new Subject(); + coreImagesSpy.calls.reset(); + coreImagesSpy.and.returnValue(coreImagesUpdate); graph.updateCells$([cellId]) .subscribe( @@ -4141,15 +4435,15 @@ describe("Graph.updateCells$", () => { expect(graph.getNode(key2).full).toBe(false); - expect(imagesByHSpy.calls.count()).toBe(1); + expect(coreImagesSpy.calls.count()).toBe(1); done(); }); const key2 = "full-key-2"; const fullNode2 = new NodeHelper().createFullNode(); - fullNode2.key = key2; - tileResult[cellId]["1"] = fullNode2; - imagesByHUpdate.next(tileResult); - imagesByHUpdate.complete(); + fullNode2.id = key2; + tileResult.images.push(fullNode2); + coreImagesUpdate.next(tileResult); + coreImagesUpdate.complete(); }); }); diff --git a/spec/graph/GraphCalculator.spec.ts b/spec/graph/GraphCalculator.spec.ts index 25b035f54..80e7f2b49 100644 --- a/spec/graph/GraphCalculator.spec.ts +++ b/spec/graph/GraphCalculator.spec.ts @@ -1,4 +1,4 @@ -import { ILatLon } from "../../src/api/interfaces/ILatLon"; +import { LatLon } from "../../src/api/interfaces/LatLon"; import { GeoCoords } from "../../src/geo/GeoCoords"; import { GraphCalculator } from "../../src/graph/GraphCalculator"; @@ -22,7 +22,7 @@ describe("GraphCalculator.boundingBoxCorners", () => { let calculator: GraphCalculator = new GraphCalculator(geoCoords); let threshold: number = 1; - let bbox: [ILatLon, ILatLon] = calculator.boundingBoxCorners({ lat: 0, lon: 0 }, threshold); + let bbox: [LatLon, LatLon] = calculator.boundingBoxCorners({ lat: 0, lon: 0 }, threshold); expect(bbox.length).toBe(2); expect(bbox[0].lat).toBe(-1); diff --git a/spec/graph/GraphService.spec.ts b/spec/graph/GraphService.spec.ts index e62cbc5dd..4482d07e2 100644 --- a/spec/graph/GraphService.spec.ts +++ b/spec/graph/GraphService.spec.ts @@ -17,11 +17,11 @@ import { NodeHelper } from "../helper/NodeHelper"; import { Node } from "../../src/graph/Node"; import { APIWrapper } from "../../src/api/APIWrapper"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; +import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt"; import { Graph } from "../../src/graph/Graph"; import { GraphMode } from "../../src/graph/GraphMode"; import { GraphService } from "../../src/graph/GraphService"; -import { IEdgeStatus } from "../../src/graph/interfaces/IEdgeStatus"; +import { NavigationEdgeStatus } from "../../src/graph/interfaces/NavigationEdgeStatus"; import { Sequence } from "../../src/graph/Sequence"; import { DataProvider } from "../helper/ProviderHelper"; @@ -166,7 +166,7 @@ describe("GraphService.cacheSequence$", () => { const graphService: GraphService = new GraphService(graph); - graphService.cacheSequence$("sequenceKey").subscribe(() => { /*noop*/ }); + graphService.cacheSequence$("sequenceId").subscribe(() => { /*noop*/ }); cacheSequence$.next(graph); @@ -190,7 +190,7 @@ describe("GraphService.cacheSequence$", () => { const graphService: GraphService = new GraphService(graph); - graphService.cacheSequence$("sequenceKey").subscribe(() => { /*noop*/ }); + graphService.cacheSequence$("sequenceId").subscribe(() => { /*noop*/ }); cacheSequence$.next(graph); @@ -214,7 +214,7 @@ describe("GraphService.cacheSequence$", () => { const graphService: GraphService = new GraphService(graph); - graphService.cacheSequence$("sequenceKey").subscribe(() => { /*noop*/ }); + graphService.cacheSequence$("sequenceId").subscribe(() => { /*noop*/ }); cacheSequence$.next(graph); @@ -238,11 +238,11 @@ describe("GraphService.cacheSequenceNodes$", () => { cacheSequenceNodesSpy.and.returnValue(cacheSequenceNodes$); const getSequenceSpy: jasmine.Spy = spyOn(graph, "getSequence"); - getSequenceSpy.and.returnValue(new Sequence({ key: "skey", keys: [] })); + getSequenceSpy.and.returnValue(new Sequence({ id: "skey", image_ids: [] })); const graphService: GraphService = new GraphService(graph); - graphService.cacheSequenceNodes$("sequenceKey").subscribe(() => { /*noop*/ }); + graphService.cacheSequenceNodes$("sequenceId").subscribe(() => { /*noop*/ }); cacheSequenceNodes$.next(graph); @@ -264,11 +264,11 @@ describe("GraphService.cacheSequenceNodes$", () => { cacheSequenceNodesSpy.and.returnValue(cacheSequenceNodes$); const getSequenceSpy: jasmine.Spy = spyOn(graph, "getSequence"); - getSequenceSpy.and.returnValue(new Sequence({ key: "skey", keys: [] })); + getSequenceSpy.and.returnValue(new Sequence({ id: "skey", image_ids: [] })); const graphService: GraphService = new GraphService(graph); - graphService.cacheSequenceNodes$("sequenceKey").subscribe(() => { /*noop*/ }); + graphService.cacheSequenceNodes$("sequenceId").subscribe(() => { /*noop*/ }); cacheSequenceNodes$.next(graph); @@ -290,11 +290,11 @@ describe("GraphService.cacheSequenceNodes$", () => { cacheSequenceNodesSpy.and.returnValue(cacheSequenceNodes$); const getSequenceSpy: jasmine.Spy = spyOn(graph, "getSequence"); - getSequenceSpy.and.returnValue(new Sequence({ key: "skey", keys: [] })); + getSequenceSpy.and.returnValue(new Sequence({ id: "skey", image_ids: [] })); const graphService: GraphService = new GraphService(graph); - graphService.cacheSequenceNodes$("sequenceKey").subscribe(() => { /*noop*/ }); + graphService.cacheSequenceNodes$("sequenceId").subscribe(() => { /*noop*/ }); cacheSequenceNodes$.next(graph); @@ -316,11 +316,11 @@ describe("GraphService.cacheSequenceNodes$", () => { cacheSequenceNodesSpy.and.returnValue(cacheSequenceNodes$); const getSequenceSpy: jasmine.Spy = spyOn(graph, "getSequence"); - getSequenceSpy.and.returnValue(new Sequence({ key: "skey", keys: [] })); + getSequenceSpy.and.returnValue(new Sequence({ id: "skey", image_ids: [] })); const graphService: GraphService = new GraphService(graph); - const sequenceKey: string = "sequenceKey"; + const sequenceKey: string = "sequenceId"; const referenceNodeKey: string = "referenceNodeKey"; graphService.cacheSequenceNodes$(sequenceKey, referenceNodeKey).subscribe(() => { /*noop*/ }); @@ -434,7 +434,7 @@ describe("GraphService.graphMode$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (n: Node): void => { expect(n).toBeDefined(); @@ -455,10 +455,10 @@ describe("GraphService.graphMode$", () => { class TestNode extends Node { private _assetsCached: boolean; - private _sequenceEdges: IEdgeStatus; - private _spatialEdges: IEdgeStatus; + private _sequenceEdges: NavigationEdgeStatus; + private _spatialEdges: NavigationEdgeStatus; - constructor(core: ICoreNode) { + constructor(core: CoreImageEnt) { super(core); this._assetsCached = false; @@ -474,11 +474,11 @@ class TestNode extends Node { this._assetsCached = value; } - public get sequenceEdges(): IEdgeStatus { + public get sequenceEdges(): NavigationEdgeStatus { return this._sequenceEdges; } - public get spatialEdges(): IEdgeStatus { + public get spatialEdges(): NavigationEdgeStatus { return this._spatialEdges; } } @@ -525,7 +525,7 @@ describe("GraphService.cacheNode$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (): void => { expect(cacheFullSpy.calls.count()).toBe(1); @@ -577,7 +577,7 @@ describe("GraphService.cacheNode$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (): void => { expect(cacheFillSpy.calls.count()).toBe(1); @@ -627,7 +627,7 @@ describe("GraphService.cacheNode$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key).subscribe(() => { /*noop*/ }); + graphService.cacheNode$(node.id).subscribe(() => { /*noop*/ }); cacheFull$.next(graph); @@ -635,11 +635,11 @@ describe("GraphService.cacheNode$", () => { expect(cacheNodeSequenceSpy.calls.count()).toBe(1); expect(cacheNodeSequenceSpy.calls.first().args.length).toBe(1); - expect(cacheNodeSequenceSpy.calls.first().args[0]).toBe(node.key); + expect(cacheNodeSequenceSpy.calls.first().args[0]).toBe(node.id); expect(cacheSequenceEdgesSpy.calls.count()).toBe(1); expect(cacheSequenceEdgesSpy.calls.first().args.length).toBe(1); - expect(cacheSequenceEdgesSpy.calls.first().args[0]).toBe(node.key); + expect(cacheSequenceEdgesSpy.calls.first().args[0]).toBe(node.id); }); it("should cache spatial edges", () => { @@ -672,13 +672,13 @@ describe("GraphService.cacheNode$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key).subscribe(() => { /*noop*/ }); + graphService.cacheNode$(node.id).subscribe(() => { /*noop*/ }); cacheFull$.next(graph); expect(cacheSpatialEdgesSpy.calls.count()).toBe(1); expect(cacheSpatialEdgesSpy.calls.first().args.length).toBe(1); - expect(cacheSpatialEdgesSpy.calls.first().args[0]).toBe(node.key); + expect(cacheSpatialEdgesSpy.calls.first().args[0]).toBe(node.id); }); it("should cache spatial edges if in spatial mode", () => { @@ -715,7 +715,7 @@ describe("GraphService.cacheNode$", () => { graphService.setGraphMode(GraphMode.Spatial); - graphService.cacheNode$(node.key).subscribe(() => { /*noop*/ }); + graphService.cacheNode$(node.id).subscribe(() => { /*noop*/ }); cacheFull$.next(graph); @@ -752,7 +752,7 @@ describe("GraphService.cacheNode$", () => { graphService.setGraphMode(GraphMode.Sequence); - graphService.cacheNode$(node.key).subscribe(() => { /*noop*/ }); + graphService.cacheNode$(node.id).subscribe(() => { /*noop*/ }); cacheFull$.next(graph); @@ -804,7 +804,7 @@ describe("GraphService.reset$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (): void => { return; }, (e: Error): void => { @@ -863,7 +863,7 @@ describe("GraphService.reset$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (n: Node): void => { expect(n).toBeDefined(); @@ -921,7 +921,7 @@ describe("GraphService.reset$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (n: Node): void => { expect(n).toBeDefined(); @@ -956,7 +956,7 @@ describe("GraphService.setFilter$", () => { const graphService: GraphService = new GraphService(graph); - graphService.setFilter$(["==", "sequenceKey", "skey"]).subscribe(() => { /*noop*/ }); + graphService.setFilter$(["==", "sequenceId", "skey"]).subscribe(() => { /*noop*/ }); expect(resetSpatialEdgesSpy.calls.count()).toBe(1); @@ -964,7 +964,7 @@ describe("GraphService.setFilter$", () => { expect(setFilterSpy.calls.first().args.length).toBe(1); expect(setFilterSpy.calls.first().args[0].length).toBe(3); expect(setFilterSpy.calls.first().args[0][0]).toBe("=="); - expect(setFilterSpy.calls.first().args[0][1]).toBe("sequenceKey"); + expect(setFilterSpy.calls.first().args[0][1]).toBe("sequenceId"); expect(setFilterSpy.calls.first().args[0][2]).toBe("skey"); }); @@ -1009,7 +1009,7 @@ describe("GraphService.setFilter$", () => { spyOn(graph, "getNode").and.returnValue(node); - graphService.cacheNode$(node.key) + graphService.cacheNode$(node.id) .subscribe( (n: Node): void => { expect(n).toBeDefined(); @@ -1020,7 +1020,7 @@ describe("GraphService.setFilter$", () => { node.assetsCached = true; cacheAssets$.next(node); - graphService.setFilter$(["==", "sequenceKey", "skey"]).subscribe(() => { /*noop*/ }); + graphService.setFilter$(["==", "sequenceId", "skey"]).subscribe(() => { /*noop*/ }); cacheTiles$[0].next(graph); diff --git a/spec/graph/Node.spec.ts b/spec/graph/Node.spec.ts index f2531ddbe..e4650a6a6 100644 --- a/spec/graph/Node.spec.ts +++ b/spec/graph/Node.spec.ts @@ -1,8 +1,8 @@ import { NodeHelper } from "../helper/NodeHelper"; import { Node } from "../../src/graph/Node"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; -import { IMesh } from "../../src/api/interfaces/IMesh"; +import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt"; +import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt"; +import { MeshContract } from "../../src/api/contracts/MeshContract"; import { NodeCache } from "../../src/graph/NodeCache"; describe("Node", () => { @@ -13,7 +13,7 @@ describe("Node", () => { }); it("should create a node", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); expect(node).toBeDefined(); @@ -28,12 +28,12 @@ describe("Node.full", () => { }); it("should make node full", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); expect(node.full).toBe(false); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); node.makeFull(fillNode); @@ -41,7 +41,7 @@ describe("Node.full", () => { }); it("should throw when fill is null", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); expect(() => { node.makeFull(null); }).toThrowError(Error); @@ -56,20 +56,20 @@ describe("Node.dispose", () => { }); it("should clear core and fill properties", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); node.makeFull(fillNode); node.dispose(); expect(node.full).toBe(false); - expect(() => { return node.key; }).toThrowError(Error); + expect(() => { return node.id; }).toThrowError(Error); }); it("should dipose cache", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); let nodeCache: NodeCache = new NodeCache(undefined); @@ -92,14 +92,14 @@ describe("Node.uncache", () => { }); it("should handle when cache is not initilized", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); node.uncache(); }); it("should dispose node cache", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); let nodeCache: NodeCache = new NodeCache(undefined); @@ -114,7 +114,7 @@ describe("Node.uncache", () => { }); it("should be able to initialize cache again after uncache", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); let nodeCache: NodeCache = new NodeCache(undefined); @@ -137,16 +137,16 @@ describe("Node.merged", () => { }); it("should not be merged when not full", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); expect(node.merged).toBe(false); }); it("should not be merged because merge version is zero", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.merge_version = 0; @@ -156,9 +156,9 @@ describe("Node.merged", () => { }); it("should be merged because merge version present and larger than zero", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); fillNode.merge_version = 7; @@ -176,7 +176,7 @@ describe("Node.assetsCached", () => { }); it("should not be cached when core", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); expect(node.assetsCached).toBe(false); @@ -184,7 +184,7 @@ describe("Node.assetsCached", () => { class NodeCacheMock extends NodeCache { protected _overridingImage: HTMLImageElement; - protected _overridingMesh: IMesh; + protected _overridingMesh: MeshContract; constructor() { super(undefined); } @@ -196,19 +196,19 @@ describe("Node.assetsCached", () => { this._overridingImage = value; } - public get mesh(): IMesh { + public get mesh(): MeshContract { return this._overridingMesh; } - public set mesh(value: IMesh) { + public set mesh(value: MeshContract) { this._overridingMesh = value; } } it("should be cached when assets set", () => { - let coreNode: ICoreNode = helper.createCoreNode(); + let coreNode: CoreImageEnt = helper.createCoreNode(); let node: Node = new Node(coreNode); - let fillNode: IFillNode = helper.createFillNode(); + let fillNode: SpatialImageEnt = helper.createFillNode(); node.makeFull(fillNode); let nodeCache: NodeCacheMock = new NodeCacheMock(); diff --git a/spec/graph/NodeCache.spec.ts b/spec/graph/NodeCache.spec.ts index 311a7d6eb..50be33d5a 100644 --- a/spec/graph/NodeCache.spec.ts +++ b/spec/graph/NodeCache.spec.ts @@ -1,11 +1,11 @@ import { first, skip } from "rxjs/operators"; -import { FalcorDataProvider } from "../../src/api/FalcorDataProvider"; -import { EdgeDirection } from "../../src/graph/edge/EdgeDirection"; -import { IEdge } from "../../src/graph/edge/interfaces/IEdge"; -import { IEdgeStatus } from "../../src/graph/interfaces/IEdgeStatus"; +import { FalcorDataProvider } from "../../src/api/falcor/FalcorDataProvider"; +import { NavigationDirection } from "../../src/graph/edge/NavigationDirection"; +import { NavigationEdge } from "../../src/graph/edge/interfaces/NavigationEdge"; +import { NavigationEdgeStatus } from "../../src/graph/interfaces/NavigationEdgeStatus"; import { NodeCache } from "../../src/graph/NodeCache"; -import { ImageSize } from "../../src/viewer/ImageSize"; import { MockCreator } from "../helper/MockCreator"; +import { NodeHelper } from "../helper/NodeHelper"; global.URL.createObjectURL = jest.fn(); @@ -37,7 +37,7 @@ describe("NodeCache.sequenceEdges$", () => { nodeCache.sequenceEdges$.pipe( first()) .subscribe( - (edgeStatus: IEdgeStatus): void => { + (edgeStatus: NavigationEdgeStatus): void => { expect(edgeStatus.cached).toBe(false); expect(edgeStatus.edges.length).toBe(0); @@ -48,24 +48,24 @@ describe("NodeCache.sequenceEdges$", () => { it("should emit cached non empty edge status when sequence edges cached", (done: Function) => { let nodeCache: NodeCache = new NodeCache(undefined); - let sequenceEdge: IEdge = { + let sequenceEdge: NavigationEdge = { data: { - direction: EdgeDirection.Next, + direction: NavigationDirection.Next, worldMotionAzimuth: 0, }, - from: "key1", - to: "key2", + source: "key1", + target: "key2", }; nodeCache.sequenceEdges$.pipe( skip(1), first()) .subscribe( - (edgeStatus: IEdgeStatus): void => { + (edgeStatus: NavigationEdgeStatus): void => { expect(edgeStatus.cached).toBe(true); expect(edgeStatus.edges.length).toBe(1); - expect(edgeStatus.edges[0].from).toBe(sequenceEdge.from); - expect(edgeStatus.edges[0].to).toBe(sequenceEdge.to); + expect(edgeStatus.edges[0].source).toBe(sequenceEdge.source); + expect(edgeStatus.edges[0].target).toBe(sequenceEdge.target); expect(edgeStatus.edges[0].data.direction).toBe(sequenceEdge.data.direction); expect(edgeStatus.edges[0].data.worldMotionAzimuth).toBe(sequenceEdge.data.worldMotionAzimuth); @@ -80,20 +80,20 @@ describe("NodeCache.resetSequenceEdges", () => { it("should reset the sequence edges", () => { let nodeCache: NodeCache = new NodeCache(undefined); - let sequenceEdge: IEdge = { + let sequenceEdge: NavigationEdge = { data: { - direction: EdgeDirection.Next, + direction: NavigationDirection.Next, worldMotionAzimuth: null, }, - from: "key1", - to: "key2", + source: "key1", + target: "key2", }; nodeCache.cacheSequenceEdges([sequenceEdge]); expect(nodeCache.sequenceEdges.cached).toBe(true); expect(nodeCache.sequenceEdges.edges.length).toBe(1); - expect(nodeCache.sequenceEdges.edges[0].from).toBe(sequenceEdge.from); + expect(nodeCache.sequenceEdges.edges[0].source).toBe(sequenceEdge.source); nodeCache.resetSequenceEdges(); @@ -109,7 +109,7 @@ describe("NodeCache.spatialEdges$", () => { nodeCache.spatialEdges$.pipe( first()) .subscribe( - (edgeStatus: IEdgeStatus): void => { + (edgeStatus: NavigationEdgeStatus): void => { expect(edgeStatus.cached).toBe(false); expect(edgeStatus.edges.length).toBe(0); @@ -120,24 +120,24 @@ describe("NodeCache.spatialEdges$", () => { it("should emit cached non empty edge status when spatial edges cached", (done: Function) => { let nodeCache: NodeCache = new NodeCache(undefined); - let spatialEdge: IEdge = { + let spatialEdge: NavigationEdge = { data: { - direction: EdgeDirection.StepForward, + direction: NavigationDirection.StepForward, worldMotionAzimuth: 0, }, - from: "key1", - to: "key2", + source: "key1", + target: "key2", }; nodeCache.spatialEdges$.pipe( skip(1), first()) .subscribe( - (edgeStatus: IEdgeStatus): void => { + (edgeStatus: NavigationEdgeStatus): void => { expect(edgeStatus.cached).toBe(true); expect(edgeStatus.edges.length).toBe(1); - expect(edgeStatus.edges[0].from).toBe(spatialEdge.from); - expect(edgeStatus.edges[0].to).toBe(spatialEdge.to); + expect(edgeStatus.edges[0].source).toBe(spatialEdge.source); + expect(edgeStatus.edges[0].target).toBe(spatialEdge.target); expect(edgeStatus.edges[0].data.direction).toBe(spatialEdge.data.direction); expect(edgeStatus.edges[0].data.worldMotionAzimuth).toBe(spatialEdge.data.worldMotionAzimuth); @@ -152,20 +152,20 @@ describe("NodeCache.resetSpatialEdges", () => { it("should reset the spatial edges", () => { let nodeCache: NodeCache = new NodeCache(undefined); - let spatialEdge: IEdge = { + let spatialEdge: NavigationEdge = { data: { - direction: EdgeDirection.StepForward, + direction: NavigationDirection.StepForward, worldMotionAzimuth: 0, }, - from: "key1", - to: "key2", + source: "key1", + target: "key2", }; nodeCache.cacheSpatialEdges([spatialEdge]); expect(nodeCache.spatialEdges.cached).toBe(true); expect(nodeCache.spatialEdges.edges.length).toBe(1); - expect(nodeCache.spatialEdges.edges[0].from).toBe(spatialEdge.from); + expect(nodeCache.spatialEdges.edges[0].source).toBe(spatialEdge.source); nodeCache.resetSpatialEdges(); @@ -178,22 +178,22 @@ describe("NodeCache.dispose", () => { it("should clear all properties", () => { let nodeCache: NodeCache = new NodeCache(undefined); - let sequencEdge: IEdge = { + let sequencEdge: NavigationEdge = { data: { - direction: EdgeDirection.StepForward, + direction: NavigationDirection.StepForward, worldMotionAzimuth: 0, }, - from: "key1", - to: "key2", + source: "key1", + target: "key2", }; - let spatialEdge: IEdge = { + let spatialEdge: NavigationEdge = { data: { - direction: EdgeDirection.StepForward, + direction: NavigationDirection.StepForward, worldMotionAzimuth: 0, }, - from: "key1", - to: "key2", + source: "key1", + target: "key2", }; nodeCache.cacheSequenceEdges([sequencEdge]); @@ -220,7 +220,7 @@ describe("NodeCache.cacheImage$", () => { }; const dataProvider = new FalcorDataProvider({ clientToken: "cid" }); - spyOn(dataProvider, "getImage").and.returnValue(promise); + spyOn(dataProvider, "getImageBuffer").and.returnValue(promise); const imageMock: HTMLImageElement = new Image(); spyOn(window, "Image").and.returnValue(imageMock); @@ -234,7 +234,7 @@ describe("NodeCache.cacheImage$", () => { expect(nodeCache.image).toBeNull(); - nodeCache.cacheImage$({}, ImageSize.Size640) + nodeCache.cacheImage$(new NodeHelper().createFillNode()) .subscribe( (nc: NodeCache): void => { expect(nc.image).not.toBeNull(); @@ -254,7 +254,7 @@ describe("NodeCache.cacheImage$", () => { }; const dataProvider = new FalcorDataProvider({ clientToken: "cid" }); - spyOn(dataProvider, "getImage").and.returnValue(promise); + spyOn(dataProvider, "getImageBuffer").and.returnValue(promise); const imageMock: HTMLImageElement = new Image(); spyOn(window, "Image").and.returnValue(imageMock); @@ -268,7 +268,7 @@ describe("NodeCache.cacheImage$", () => { expect(nodeCache.image).toBeNull(); - nodeCache.cacheImage$({}, ImageSize.Size640).subscribe(); + nodeCache.cacheImage$(new NodeHelper().createFillNode()).subscribe(); imageMock.dispatchEvent(new CustomEvent("load")); @@ -284,7 +284,7 @@ describe("NodeCache.cacheImage$", () => { }; const dataProvider = new FalcorDataProvider({ clientToken: "cid" }); - spyOn(dataProvider, "getImage").and.returnValue(promise); + spyOn(dataProvider, "getImageBuffer").and.returnValue(promise); const imageMock: HTMLImageElement = new Image(); spyOn(window, "Image").and.returnValue(imageMock); @@ -308,7 +308,7 @@ describe("NodeCache.cacheImage$", () => { done(); }); - nodeCache.cacheImage$({}, ImageSize.Size640).subscribe(); + nodeCache.cacheImage$(new NodeHelper().createFillNode()).subscribe(); imageMock.dispatchEvent(new CustomEvent("load")); }); }); diff --git a/spec/graph/Sequence.spec.ts b/spec/graph/Sequence.spec.ts index cd165267e..31b137558 100644 --- a/spec/graph/Sequence.spec.ts +++ b/spec/graph/Sequence.spec.ts @@ -1,13 +1,13 @@ -import { ISequence } from "../../src/api/interfaces/ISequence"; +import { SequenceEnt } from "../../src/api/ents/SequenceEnt"; import { Sequence } from "../../src/graph/Sequence"; describe("Sequence", () => { let sequence: Sequence; beforeEach(() => { - let response: ISequence = { - key: "A", - keys: ["B", "C", "D", "E"], + let response: SequenceEnt = { + id: "A", + image_ids: ["B", "C", "D", "E"], }; sequence = new Sequence(response); @@ -18,18 +18,18 @@ describe("Sequence", () => { }); it("should find next key when it exists", () => { - expect(sequence.findNextKey("C")).toEqual("D"); + expect(sequence.findNext("C")).toEqual("D"); }); it("should find prev key when it exists", () => { - expect(sequence.findPrevKey("C")).toEqual("B"); + expect(sequence.findPrev("C")).toEqual("B"); }); it("should return null if no next key", () => { - expect(sequence.findNextKey("E")).toBe(null); + expect(sequence.findNext("E")).toBe(null); }); it("should return null if no prev key", () => { - expect(sequence.findPrevKey("B")).toBe(null); + expect(sequence.findPrev("B")).toBe(null); }); }); diff --git a/spec/graph/edge/EdgeCalculator.Pano.spec.ts b/spec/graph/edge/EdgeCalculator.Pano.spec.ts index 0b3f7379c..47e9adb44 100644 --- a/spec/graph/edge/EdgeCalculator.Pano.spec.ts +++ b/spec/graph/edge/EdgeCalculator.Pano.spec.ts @@ -2,9 +2,9 @@ import { Node } from "../../../src/graph/Node"; import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator"; import { EdgeCalculatorDirections } from "../../../src/graph/edge/EdgeCalculatorDirections"; import { EdgeCalculatorSettings } from "../../../src/graph/edge/EdgeCalculatorSettings"; -import { IPotentialEdge } from "../../../src/graph/edge/interfaces/IPotentialEdge"; +import { PotentialEdge } from "../../../src/graph/edge/interfaces/PotentialEdge"; import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper"; -import { EdgeDirection } from "../../../src/graph/edge/EdgeDirection"; +import { NavigationDirection } from "../../../src/graph/edge/NavigationDirection"; describe("EdgeCalculator.computeSphericalEdges", () => { let edgeCalculator: EdgeCalculator; @@ -14,7 +14,7 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; + let potentialEdge1: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -52,8 +52,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should have a spherical edge irrespective of rotation", () => { @@ -65,8 +65,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should not have a spherical edge with to long distance", () => { @@ -91,7 +91,7 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdges = edgeCalculator.computeSphericalEdges(node, [potentialEdge1]); for (let sphericalEdge of sphericalEdges) { - expect(sphericalEdge.data.direction === EdgeDirection.Spherical).toBe(false); + expect(sphericalEdge.data.direction === NavigationDirection.Spherical).toBe(false); } }); @@ -112,8 +112,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -152,8 +152,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should have a spherical edge closest to preferred distance", () => { @@ -166,8 +166,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should have a spherical edge with same sequence", () => { @@ -180,8 +180,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should have a spherical edge with same sequence", () => { @@ -194,8 +194,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should have a spherical edge with smallest motion change", () => { @@ -208,8 +208,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); }); @@ -222,10 +222,10 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; - let potentialEdge3: IPotentialEdge; - let potentialEdge4: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; + let potentialEdge3: PotentialEdge; + let potentialEdge4: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -276,8 +276,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge4.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge4.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should have a spherical edge in four directions", () => { @@ -293,21 +293,21 @@ describe("EdgeCalculator.computeSphericalEdges", () => { expect(sphericalEdges.length).toBe(4); let keys: string[] = [ - potentialEdge1.key, - potentialEdge2.key, - potentialEdge3.key, - potentialEdge4.key, + potentialEdge1.id, + potentialEdge2.id, + potentialEdge3.id, + potentialEdge4.id, ]; for (let key of keys) { let edge = null; for (let sphericalEdge of sphericalEdges) { - if (sphericalEdge.to === key) { + if (sphericalEdge.target === key) { edge = sphericalEdge; } } - expect(edge.data.direction).toBe(EdgeDirection.Spherical); + expect(edge.data.direction).toBe(NavigationDirection.Spherical); } }); @@ -324,19 +324,19 @@ describe("EdgeCalculator.computeSphericalEdges", () => { expect(sphericalEdges.length).toBe(2); let keys: string[] = [ - potentialEdge1.key, - potentialEdge3.key, + potentialEdge1.id, + potentialEdge3.id, ]; for (let key of keys) { let edge = null; for (let sphericalEdge of sphericalEdges) { - if (sphericalEdge.to === key) { + if (sphericalEdge.target === key) { edge = sphericalEdge; } } - expect(edge.data.direction).toBe(EdgeDirection.Spherical); + expect(edge.data.direction).toBe(NavigationDirection.Spherical); } }); @@ -352,8 +352,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); }); @@ -365,7 +365,7 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; + let potentialEdge1: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -402,8 +402,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step left edge", () => { @@ -416,8 +416,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepLeft); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepLeft); }); it("should have a step left edge for direction change", () => { @@ -430,8 +430,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepLeft); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepLeft); }); it("should have a step right edge", () => { @@ -444,8 +444,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepRight); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepRight); }); it("should have a step right edge for direction change", () => { @@ -458,8 +458,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepRight); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepRight); }); it("should have a step backward edge", () => { @@ -472,8 +472,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepBackward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepBackward); }); it("should have a step backward edge for direction change", () => { @@ -486,8 +486,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepBackward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepBackward); }); it("should have a step forward edge in opposite motion direction", () => { @@ -500,8 +500,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge in perpendicular motion direction", () => { @@ -514,8 +514,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge in perpendicular motion direction", () => { @@ -528,8 +528,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should not have a step forward edge when turn is to large", () => { @@ -577,8 +577,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -619,8 +619,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should prefer a step forward edge with preferred distance", () => { @@ -633,8 +633,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should prefer a step forward edge with smaller motion change", () => { @@ -647,8 +647,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should prefer a step forward edge with smaller motion change", () => { @@ -661,8 +661,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should prefer a step forward edge with same merge connected component", () => { @@ -675,8 +675,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); }); @@ -689,10 +689,10 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; - let potentialEdge3: IPotentialEdge; - let potentialEdge4: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; + let potentialEdge3: PotentialEdge; + let potentialEdge4: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -742,14 +742,14 @@ describe("EdgeCalculator.computeSphericalEdges", () => { expect(sphericalEdges.length).toBe(4); for (let sphericalEdge of sphericalEdges) { - if (sphericalEdge.to === potentialEdge1.key) { - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); - } else if (sphericalEdge.to === potentialEdge2.key) { - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepLeft); - } else if (sphericalEdge.to === potentialEdge3.key) { - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepBackward); - } else if (sphericalEdge.to === potentialEdge4.key) { - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepRight); + if (sphericalEdge.target === potentialEdge1.id) { + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); + } else if (sphericalEdge.target === potentialEdge2.id) { + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepLeft); + } else if (sphericalEdge.target === potentialEdge3.id) { + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepBackward); + } else if (sphericalEdge.target === potentialEdge4.id) { + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepRight); } } }); @@ -769,8 +769,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should not have a step left or right edge based on step forward edges", () => { @@ -791,8 +791,8 @@ describe("EdgeCalculator.computeSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.StepForward); }); }); @@ -804,8 +804,8 @@ describe("EdgeCalculator.computePerspectiveToSphericalEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -841,8 +841,8 @@ describe("EdgeCalculator.computePerspectiveToSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge1.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge1.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should not return a spherical edge when node is spherical", () => { @@ -869,8 +869,8 @@ describe("EdgeCalculator.computePerspectiveToSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should return the spherical edge preferring forward motion", () => { @@ -883,8 +883,8 @@ describe("EdgeCalculator.computePerspectiveToSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); it("should return the spherical edge preferring same connected component", () => { @@ -897,7 +897,7 @@ describe("EdgeCalculator.computePerspectiveToSphericalEdges", () => { let sphericalEdge = sphericalEdges[0]; - expect(sphericalEdge.to).toBe(potentialEdge2.key); - expect(sphericalEdge.data.direction).toBe(EdgeDirection.Spherical); + expect(sphericalEdge.target).toBe(potentialEdge2.id); + expect(sphericalEdge.data.direction).toBe(NavigationDirection.Spherical); }); }); diff --git a/spec/graph/edge/EdgeCalculator.Sequence.spec.ts b/spec/graph/edge/EdgeCalculator.Sequence.spec.ts index f38443afd..ff6ea1f27 100644 --- a/spec/graph/edge/EdgeCalculator.Sequence.spec.ts +++ b/spec/graph/edge/EdgeCalculator.Sequence.spec.ts @@ -1,8 +1,8 @@ import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator"; import { EdgeCalculatorDirections } from "../../../src/graph/edge/EdgeCalculatorDirections"; import { EdgeCalculatorSettings } from "../../../src/graph/edge/EdgeCalculatorSettings"; -import { EdgeDirection } from "../../../src/graph/edge/EdgeDirection"; -import { IEdge } from "../../../src/graph/edge/interfaces/IEdge"; +import { NavigationDirection } from "../../../src/graph/edge/NavigationDirection"; +import { NavigationEdge } from "../../../src/graph/edge/interfaces/NavigationEdge"; import { Node } from "../../../src/graph/Node"; import { Sequence } from "../../../src/graph/Sequence"; import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper"; @@ -28,7 +28,7 @@ describe("EdgeCalculator.computeSequenceEdges", () => { let sequenceKey: string = "skey"; let node: Node = helper.createCoreNode(key, { alt: 0, lat: 0, lon: 0 }, sequenceKey); - let sequence: Sequence = new Sequence({ key: sequenceKey, keys: [key] }); + let sequence: Sequence = new Sequence({ id: sequenceKey, image_ids: [key] }); expect(() => { edgeCalculator.computeSequenceEdges(node, sequence); }).toThrowError(Error); }); @@ -39,7 +39,7 @@ describe("EdgeCalculator.computeSequenceEdges", () => { let sequenceKey2: string = "skey2"; let node: Node = helper.createCoreNode(key, { alt: 0, lat: 0, lon: 0 }, sequenceKey1); - let sequence: Sequence = new Sequence({ key: sequenceKey2, keys: [key] }); + let sequence: Sequence = new Sequence({ id: sequenceKey2, image_ids: [key] }); expect(() => { edgeCalculator.computeSequenceEdges(node, sequence); }).toThrowError(Error); }); @@ -50,16 +50,16 @@ describe("EdgeCalculator.computeSequenceEdges", () => { let sequenceKey: string = "skey"; let node: Node = helper.createFullNode(key, { alt: 0, lat: 0, lon: 0 }, sequenceKey, [0, 0, 0]); - let sequence: Sequence = new Sequence({ key: sequenceKey, keys: [key, nextKey] }); + let sequence: Sequence = new Sequence({ id: sequenceKey, image_ids: [key, nextKey] }); - let sequenceEdges: IEdge[] = edgeCalculator.computeSequenceEdges(node, sequence); + let sequenceEdges: NavigationEdge[] = edgeCalculator.computeSequenceEdges(node, sequence); expect(sequenceEdges.length).toBe(1); - let sequenceEdge: IEdge = sequenceEdges[0]; + let sequenceEdge: NavigationEdge = sequenceEdges[0]; - expect(sequenceEdge.to).toBe(nextKey); - expect(sequenceEdge.data.direction).toBe(EdgeDirection.Next); + expect(sequenceEdge.target).toBe(nextKey); + expect(sequenceEdge.data.direction).toBe(NavigationDirection.Next); }); it("should return a prev edge", () => { @@ -68,16 +68,16 @@ describe("EdgeCalculator.computeSequenceEdges", () => { let sequenceKey: string = "skey"; let node: Node = helper.createFullNode(key, { alt: 0, lat: 0, lon: 0 }, sequenceKey, [0, 0, 0]); - let sequence: Sequence = new Sequence({ key: sequenceKey, keys: [prevKey, key] }); + let sequence: Sequence = new Sequence({ id: sequenceKey, image_ids: [prevKey, key] }); - let sequenceEdges: IEdge[] = edgeCalculator.computeSequenceEdges(node, sequence); + let sequenceEdges: NavigationEdge[] = edgeCalculator.computeSequenceEdges(node, sequence); expect(sequenceEdges.length).toBe(1); - let sequenceEdge: IEdge = sequenceEdges[0]; + let sequenceEdge: NavigationEdge = sequenceEdges[0]; - expect(sequenceEdge.to).toBe(prevKey); - expect(sequenceEdge.data.direction).toBe(EdgeDirection.Prev); + expect(sequenceEdge.target).toBe(prevKey); + expect(sequenceEdge.data.direction).toBe(NavigationDirection.Prev); }); it("should return a prev and a next edge", () => { @@ -88,17 +88,17 @@ describe("EdgeCalculator.computeSequenceEdges", () => { let sequenceKey: string = "skey"; let node: Node = helper.createFullNode(key, { alt: 0, lat: 0, lon: 0 }, sequenceKey, [0, 0, 0]); - let sequence: Sequence = new Sequence({ key: sequenceKey, keys: [prevKey, key, nextKey] }); + let sequence: Sequence = new Sequence({ id: sequenceKey, image_ids: [prevKey, key, nextKey] }); - let sequenceEdges: IEdge[] = edgeCalculator.computeSequenceEdges(node, sequence); + let sequenceEdges: NavigationEdge[] = edgeCalculator.computeSequenceEdges(node, sequence); expect(sequenceEdges.length).toBe(2); for (let sequenceEdge of sequenceEdges) { - if (sequenceEdge.to === prevKey) { - expect(sequenceEdge.data.direction).toBe(EdgeDirection.Prev); - } else if (sequenceEdge.to === nextKey) { - expect(sequenceEdge.data.direction).toBe(EdgeDirection.Next); + if (sequenceEdge.target === prevKey) { + expect(sequenceEdge.data.direction).toBe(NavigationDirection.Prev); + } else if (sequenceEdge.target === nextKey) { + expect(sequenceEdge.data.direction).toBe(NavigationDirection.Next); } } }); diff --git a/spec/graph/edge/EdgeCalculator.Similar.spec.ts b/spec/graph/edge/EdgeCalculator.Similar.spec.ts index 8c1838a67..e7f34360c 100644 --- a/spec/graph/edge/EdgeCalculator.Similar.spec.ts +++ b/spec/graph/edge/EdgeCalculator.Similar.spec.ts @@ -1,9 +1,9 @@ import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator"; import { EdgeCalculatorDirections } from "../../../src/graph/edge/EdgeCalculatorDirections"; import { EdgeCalculatorSettings } from "../../../src/graph/edge/EdgeCalculatorSettings"; -import { EdgeDirection } from "../../../src/graph/edge/EdgeDirection"; -import { IEdge } from "../../../src/graph/edge/interfaces/IEdge"; -import { IPotentialEdge } from "../../../src/graph/edge/interfaces/IPotentialEdge"; +import { NavigationDirection } from "../../../src/graph/edge/NavigationDirection"; +import { NavigationEdge } from "../../../src/graph/edge/interfaces/NavigationEdge"; +import { PotentialEdge } from "../../../src/graph/edge/interfaces/PotentialEdge"; import { Node } from "../../../src/graph/Node"; import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper"; @@ -16,7 +16,7 @@ describe("EdgeCalculator.computeSimilarEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge: IPotentialEdge; + let potentialEdge: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -49,24 +49,24 @@ describe("EdgeCalculator.computeSimilarEdges", () => { it("should have a similar edge", () => { potentialEdge.capturedAt = 24234; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(1); - let similarEdge: IEdge = similarEdges[0]; + let similarEdge: NavigationEdge = similarEdges[0]; - expect(similarEdge.to).toBe(potentialEdge.key); - expect(similarEdge.data.direction).toBe(EdgeDirection.Similar); + expect(similarEdge.target).toBe(potentialEdge.id); + expect(similarEdge.data.direction).toBe(NavigationDirection.Similar); }); it("should not have a similar edge if sequence is missing on potential edge", () => { potentialEdge.capturedAt = 24234; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = null; + potentialEdge.sequenceId = null; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(0); }); @@ -74,9 +74,9 @@ describe("EdgeCalculator.computeSimilarEdges", () => { it("should not have a similar edge if node is spherical and potential node is not spherical", () => { potentialEdge.sameMergeCC = true; potentialEdge.sameSequence = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(0); }); @@ -84,27 +84,27 @@ describe("EdgeCalculator.computeSimilarEdges", () => { it("should not have a similar edge if same sequence", () => { potentialEdge.sameMergeCC = true; potentialEdge.sameSequence = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(0); }); it("should have a similar edge even if not same merge cc", () => { potentialEdge.sameMergeCC = false; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(1); }); it("should have a similar edge if same merge cc", () => { potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(1); }); @@ -114,9 +114,9 @@ describe("EdgeCalculator.computeSimilarEdges", () => { potentialEdge.distance = 8; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(0); }); @@ -126,9 +126,9 @@ describe("EdgeCalculator.computeSimilarEdges", () => { potentialEdge.directionChange = 1; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(0); }); @@ -139,16 +139,16 @@ describe("EdgeCalculator.computeSimilarEdges", () => { potentialEdge.directionChange = 1; potentialEdge.spherical = true; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(1); - let similarEdge: IEdge = similarEdges[0]; + let similarEdge: NavigationEdge = similarEdges[0]; - expect(similarEdge.to).toBe(potentialEdge.key); - expect(similarEdge.data.direction).toBe(EdgeDirection.Similar); + expect(similarEdge.target).toBe(potentialEdge.id); + expect(similarEdge.data.direction).toBe(NavigationDirection.Similar); }); it("should not have a similar edge for the same user within min time diff", () => { @@ -157,11 +157,11 @@ describe("EdgeCalculator.computeSimilarEdges", () => { settings.similarMinTimeDifference = 100; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; potentialEdge.sameUser = true; potentialEdge.capturedAt = 1050; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(0); }); @@ -172,46 +172,46 @@ describe("EdgeCalculator.computeSimilarEdges", () => { settings.similarMinTimeDifference = 100; potentialEdge.sameMergeCC = true; - potentialEdge.sequenceKey = "other"; + potentialEdge.sequenceId = "other"; potentialEdge.sameUser = true; potentialEdge.capturedAt = 1200; - let similarEdges: IEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge]); expect(similarEdges.length).toBe(1); - let similarEdge: IEdge = similarEdges[0]; + let similarEdge: NavigationEdge = similarEdges[0]; - expect(similarEdge.to).toBe(potentialEdge.key); - expect(similarEdge.data.direction).toBe(EdgeDirection.Similar); + expect(similarEdge.target).toBe(potentialEdge.id); + expect(similarEdge.data.direction).toBe(NavigationDirection.Similar); }); it("should have a multiple similar edges from different sequences", () => { - let potentialEdge1: IPotentialEdge = helper.createPotentialEdge(); - let potentialEdge2: IPotentialEdge = helper.createPotentialEdge(); + let potentialEdge1: PotentialEdge = helper.createPotentialEdge(); + let potentialEdge2: PotentialEdge = helper.createPotentialEdge(); - potentialEdge1.key = "k1"; + potentialEdge1.id = "k1"; potentialEdge1.sameMergeCC = true; - potentialEdge1.sequenceKey = "s1"; + potentialEdge1.sequenceId = "s1"; - potentialEdge2.key = "k2"; + potentialEdge2.id = "k2"; potentialEdge2.sameMergeCC = true; - potentialEdge2.sequenceKey = "s2"; + potentialEdge2.sequenceId = "s2"; - let similarEdges: IEdge[] = + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge1, potentialEdge2]); expect(similarEdges.length).toBe(2); for (let similarEdge of similarEdges) { - expect(similarEdge.data.direction).toBe(EdgeDirection.Similar); + expect(similarEdge.data.direction).toBe(NavigationDirection.Similar); } - for (let key of [potentialEdge1.key, potentialEdge2.key]) { + for (let key of [potentialEdge1.id, potentialEdge2.id]) { let count: number = 0; for (let similarEdge of similarEdges) { - if (similarEdge.to === key) { + if (similarEdge.target === key) { count++; } } @@ -221,52 +221,52 @@ describe("EdgeCalculator.computeSimilarEdges", () => { }); it("should have only one similar edge for a sequence based on distance", () => { - let potentialEdge1: IPotentialEdge = helper.createPotentialEdge(); - let potentialEdge2: IPotentialEdge = helper.createPotentialEdge(); + let potentialEdge1: PotentialEdge = helper.createPotentialEdge(); + let potentialEdge2: PotentialEdge = helper.createPotentialEdge(); - potentialEdge1.key = "k1"; + potentialEdge1.id = "k1"; potentialEdge1.distance = 2; potentialEdge1.sameMergeCC = true; - potentialEdge1.sequenceKey = "s1"; + potentialEdge1.sequenceId = "s1"; - potentialEdge2.key = "k2"; + potentialEdge2.id = "k2"; potentialEdge2.distance = 1; potentialEdge2.sameMergeCC = true; - potentialEdge2.sequenceKey = "s1"; + potentialEdge2.sequenceId = "s1"; - let similarEdges: IEdge[] = + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge1, potentialEdge2]); expect(similarEdges.length).toBe(1); - let similarEdge: IEdge = similarEdges[0]; + let similarEdge: NavigationEdge = similarEdges[0]; - expect(similarEdge.to).toBe(potentialEdge2.key); - expect(similarEdge.data.direction).toBe(EdgeDirection.Similar); + expect(similarEdge.target).toBe(potentialEdge2.id); + expect(similarEdge.data.direction).toBe(NavigationDirection.Similar); }); it("should have only one similar edge for a sequence based on rotation", () => { - let potentialEdge1: IPotentialEdge = helper.createPotentialEdge(); - let potentialEdge2: IPotentialEdge = helper.createPotentialEdge(); + let potentialEdge1: PotentialEdge = helper.createPotentialEdge(); + let potentialEdge2: PotentialEdge = helper.createPotentialEdge(); - potentialEdge1.key = "k1"; + potentialEdge1.id = "k1"; potentialEdge1.rotation = 2; potentialEdge1.sameMergeCC = true; - potentialEdge1.sequenceKey = "s1"; + potentialEdge1.sequenceId = "s1"; - potentialEdge2.key = "k2"; + potentialEdge2.id = "k2"; potentialEdge2.rotation = 1; potentialEdge2.sameMergeCC = true; - potentialEdge2.sequenceKey = "s1"; + potentialEdge2.sequenceId = "s1"; - let similarEdges: IEdge[] = + let similarEdges: NavigationEdge[] = edgeCalculator.computeSimilarEdges(node, [potentialEdge1, potentialEdge2]); expect(similarEdges.length).toBe(1); - let similarEdge: IEdge = similarEdges[0]; + let similarEdge: NavigationEdge = similarEdges[0]; - expect(similarEdge.to).toBe(potentialEdge2.key); - expect(similarEdge.data.direction).toBe(EdgeDirection.Similar); + expect(similarEdge.target).toBe(potentialEdge2.id); + expect(similarEdge.data.direction).toBe(NavigationDirection.Similar); }); }); diff --git a/spec/graph/edge/EdgeCalculator.Step.spec.ts b/spec/graph/edge/EdgeCalculator.Step.spec.ts index dc0b576e3..e8d0eba8a 100644 --- a/spec/graph/edge/EdgeCalculator.Step.spec.ts +++ b/spec/graph/edge/EdgeCalculator.Step.spec.ts @@ -1,9 +1,9 @@ import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator"; import { EdgeCalculatorDirections } from "../../../src/graph/edge/EdgeCalculatorDirections"; import { EdgeCalculatorSettings } from "../../../src/graph/edge/EdgeCalculatorSettings"; -import { EdgeDirection } from "../../../src/graph/edge/EdgeDirection"; -import { IEdge } from "../../../src/graph/edge/interfaces/IEdge"; -import { IPotentialEdge } from "../../../src/graph/edge/interfaces/IPotentialEdge"; +import { NavigationDirection } from "../../../src/graph/edge/NavigationDirection"; +import { NavigationEdge } from "../../../src/graph/edge/interfaces/NavigationEdge"; +import { PotentialEdge } from "../../../src/graph/edge/interfaces/PotentialEdge"; import { Node } from "../../../src/graph/Node"; import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper"; @@ -15,14 +15,14 @@ describe("EdgeCalculator.computeStepEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge: IPotentialEdge; + let potentialEdge: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); directions = new EdgeCalculatorDirections(); - directions.steps[EdgeDirection.StepForward].useFallback = true; - directions.steps[EdgeDirection.StepBackward].useFallback = false; + directions.steps[NavigationDirection.StepForward].useFallback = true; + directions.steps[NavigationDirection.StepBackward].useFallback = false; edgeCalculator = new EdgeCalculator(settings, directions); @@ -45,59 +45,59 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should have a step forward edge", () => { potentialEdge.motionChange = 0; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step left edge", () => { potentialEdge.motionChange = Math.PI / 2; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepLeft); + expect(stepEdge.target).toBe(potentialEdge.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepLeft); }); it("should have a step right edge", () => { potentialEdge.motionChange = -Math.PI / 2; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepRight); + expect(stepEdge.target).toBe(potentialEdge.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepRight); }); it("should have a step back edge", () => { potentialEdge.motionChange = Math.PI; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepBackward); + expect(stepEdge.target).toBe(potentialEdge.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepBackward); }); it("should not have any edges because potential is spherical", () => { potentialEdge.spherical = true; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -105,7 +105,7 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should not have any edges because of max distance", () => { potentialEdge.distance = settings.stepMaxDistance + 1; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -113,7 +113,7 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should not have any edges because of direction change", () => { potentialEdge.directionChange = settings.stepMaxDirectionChange + Math.PI / 18; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -121,7 +121,7 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should not have any edges because of negative direction change", () => { potentialEdge.directionChange = -settings.stepMaxDirectionChange - Math.PI / 18; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -129,7 +129,7 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should not have any edges because of drift", () => { potentialEdge.motionChange = settings.stepMaxDrift + Math.PI / 18; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -137,7 +137,7 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should not have any edges because of negative drift", () => { potentialEdge.motionChange = -settings.stepMaxDrift - Math.PI / 18; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -146,29 +146,29 @@ describe("EdgeCalculator.computeStepEdges", () => { potentialEdge.distance = settings.stepMaxDistance + 1; potentialEdge.motionChange = 0; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges( + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges( node, [potentialEdge], - potentialEdge.key, + potentialEdge.id, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should not fallback to previous node with disabled fallback setting", () => { potentialEdge.distance = settings.stepMaxDistance + 1; potentialEdge.motionChange = Math.PI; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges( + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges( node, [potentialEdge], null, - potentialEdge.key); + potentialEdge.id); expect(stepEdges.length).toBe(0); }); @@ -176,7 +176,7 @@ describe("EdgeCalculator.computeStepEdges", () => { it("should not have any edges if node is spherical", () => { node = helper.createDefaultNode(true); - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge], null, null); expect(stepEdges.length).toBe(0); }); @@ -190,8 +190,8 @@ describe("EdgeCalculator.computeStepEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -212,84 +212,84 @@ describe("EdgeCalculator.computeStepEdges", () => { potentialEdge1.distance = settings.stepPreferredDistance + 1; potentialEdge2.distance = settings.stepPreferredDistance; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge based on preferred distance", () => { potentialEdge1.distance = settings.stepPreferredDistance - 1; potentialEdge2.distance = settings.stepPreferredDistance; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge for smallest motion change", () => { potentialEdge1.motionChange = settings.stepMaxDrift / 2; potentialEdge2.motionChange = settings.stepMaxDrift / 4; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge for smallest motion change", () => { potentialEdge1.motionChange = -settings.stepMaxDrift / 2; potentialEdge2.motionChange = -settings.stepMaxDrift / 4; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge for smallest vertical motion change", () => { potentialEdge1.verticalMotion = settings.stepMaxDrift / 2; potentialEdge2.verticalMotion = settings.stepMaxDrift / 4; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge for smallest vertical motion change", () => { potentialEdge1.verticalMotion = -settings.stepMaxDrift / 2; potentialEdge2.verticalMotion = -settings.stepMaxDrift / 4; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge for smallest combined motion change", () => { @@ -299,55 +299,55 @@ describe("EdgeCalculator.computeStepEdges", () => { potentialEdge2.motionChange = -settings.stepMaxDrift / 3; potentialEdge2.verticalMotion = -settings.stepMaxDrift / 3; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge with the same sequence", () => { potentialEdge1.sameSequence = false; potentialEdge2.sameSequence = true; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge with the same merge cc", () => { potentialEdge1.sameMergeCC = false; potentialEdge2.sameMergeCC = true; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); it("should have a step forward edge with smallest rotation", () => { potentialEdge1.rotation = 0.2; potentialEdge2.rotation = 0.1; - let stepEdges: IEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); + let stepEdges: NavigationEdge[] = edgeCalculator.computeStepEdges(node, [potentialEdge1, potentialEdge2], null, null); expect(stepEdges.length).toBe(1); - let stepEdge: IEdge = stepEdges[0]; + let stepEdge: NavigationEdge = stepEdges[0]; - expect(stepEdge.to).toBe(potentialEdge2.key); - expect(stepEdge.data.direction).toBe(EdgeDirection.StepForward); + expect(stepEdge.target).toBe(potentialEdge2.id); + expect(stepEdge.data.direction).toBe(NavigationDirection.StepForward); }); }); diff --git a/spec/graph/edge/EdgeCalculator.Turn.spec.ts b/spec/graph/edge/EdgeCalculator.Turn.spec.ts index db1581f7d..90fb33d71 100644 --- a/spec/graph/edge/EdgeCalculator.Turn.spec.ts +++ b/spec/graph/edge/EdgeCalculator.Turn.spec.ts @@ -1,9 +1,9 @@ import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator"; import { EdgeCalculatorDirections } from "../../../src/graph/edge/EdgeCalculatorDirections"; import { EdgeCalculatorSettings } from "../../../src/graph/edge/EdgeCalculatorSettings"; -import { EdgeDirection } from "../../../src/graph/edge/EdgeDirection"; -import { IEdge } from "../../../src/graph/edge/interfaces/IEdge"; -import { IPotentialEdge } from "../../../src/graph/edge/interfaces/IPotentialEdge"; +import { NavigationDirection } from "../../../src/graph/edge/NavigationDirection"; +import { NavigationEdge } from "../../../src/graph/edge/interfaces/NavigationEdge"; +import { PotentialEdge } from "../../../src/graph/edge/interfaces/PotentialEdge"; import { Node } from "../../../src/graph/Node"; import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper"; @@ -15,7 +15,7 @@ describe("EdgeCalculator.computeTurnEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge: IPotentialEdge; + let potentialEdge: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -42,7 +42,7 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge.directionChange = Math.PI / 2; potentialEdge.spherical = true; - let stepEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); + let stepEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); expect(stepEdges.length).toBe(0); }); @@ -50,40 +50,40 @@ describe("EdgeCalculator.computeTurnEdges", () => { it("should have a turn left edge", () => { potentialEdge.directionChange = Math.PI / 2; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnLeft); + expect(turnEdge.target).toBe(potentialEdge.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnLeft); }); it("should have a turn right edge", () => { potentialEdge.directionChange = -Math.PI / 2; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnRight); + expect(turnEdge.target).toBe(potentialEdge.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnRight); }); it("should have a u-turn edge", () => { potentialEdge.directionChange = Math.PI; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnU); + expect(turnEdge.target).toBe(potentialEdge.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnU); }); it("should not have a u-turn edge when node is spherical", () => { @@ -91,7 +91,7 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge.directionChange = Math.PI; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge]); expect(turnEdges.length).toBe(0); }); @@ -105,8 +105,8 @@ describe("EdgeCalculator.computeTurnEdges", () => { let helper: EdgeCalculatorHelper; let node: Node; - let potentialEdge1: IPotentialEdge; - let potentialEdge2: IPotentialEdge; + let potentialEdge1: PotentialEdge; + let potentialEdge2: PotentialEdge; beforeEach(() => { settings = new EdgeCalculatorSettings(); @@ -133,14 +133,14 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge2.directionChange = Math.PI / 2; potentialEdge2.sameSequence = true; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge2.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnLeft); + expect(turnEdge.target).toBe(potentialEdge2.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnLeft); }); it("should have a turn left with the same merge cc", () => { @@ -150,14 +150,14 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge2.directionChange = Math.PI / 2; potentialEdge2.sameMergeCC = true; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge2.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnLeft); + expect(turnEdge.target).toBe(potentialEdge2.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnLeft); }); it("should have a turn left edge with the smallest distance", () => { @@ -167,19 +167,19 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge2.directionChange = Math.PI / 2; potentialEdge2.distance = 3; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge2.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnLeft); + expect(turnEdge.target).toBe(potentialEdge2.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnLeft); }); it("should have a turn left edge with the smallest motion difference", () => { let motionChange: number = - directions.turns[EdgeDirection.TurnLeft].motionChange; + directions.turns[NavigationDirection.TurnLeft].motionChange; potentialEdge1.directionChange = Math.PI / 2; potentialEdge1.motionChange = 0.9 * motionChange; @@ -187,14 +187,14 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge2.directionChange = Math.PI / 2; potentialEdge2.motionChange = motionChange; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge2.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnLeft); + expect(turnEdge.target).toBe(potentialEdge2.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnLeft); }); it("should have a turn left edge for rig setup with smallest direction change", () => { @@ -204,14 +204,14 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge2.distance = 0.5 * settings.turnMaxRigDistance; potentialEdge2.directionChange = 1.1 * settings.turnMinRigDirectionChange; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge2.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnLeft); + expect(turnEdge.target).toBe(potentialEdge2.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnLeft); }); it("should have a turn right edge for rig setup with smallest direction change", () => { @@ -221,14 +221,14 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge2.distance = 0.5 * settings.turnMaxRigDistance; potentialEdge2.directionChange = -1.1 * settings.turnMinRigDirectionChange; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(1); - let turnEdge: IEdge = turnEdges[0]; + let turnEdge: NavigationEdge = turnEdges[0]; - expect(turnEdge.to).toBe(potentialEdge2.key); - expect(turnEdge.data.direction).toBe(EdgeDirection.TurnRight); + expect(turnEdge.target).toBe(potentialEdge2.id); + expect(turnEdge.data.direction).toBe(NavigationDirection.TurnRight); }); it("should not have a turn left edge for rig with too small angle", () => { @@ -238,7 +238,7 @@ describe("EdgeCalculator.computeTurnEdges", () => { potentialEdge1.distance = 0.5 * settings.turnMaxRigDistance; potentialEdge1.directionChange = -0.9 * settings.turnMinRigDirectionChange; - let turnEdges: IEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); + let turnEdges: NavigationEdge[] = edgeCalculator.computeTurnEdges(node, [potentialEdge1, potentialEdge2]); expect(turnEdges.length).toBe(0); }); diff --git a/spec/graph/edge/EdgeCalculator.spec.ts b/spec/graph/edge/EdgeCalculator.spec.ts index d3316853a..941102e3a 100644 --- a/spec/graph/edge/EdgeCalculator.spec.ts +++ b/spec/graph/edge/EdgeCalculator.spec.ts @@ -1,8 +1,8 @@ import { GeoCoords } from "../../../src/geo/GeoCoords"; -import { ILatLonAlt } from "../../../src/geo/interfaces/ILatLonAlt"; +import { LatLonAlt } from "../../../src/api/interfaces/LatLonAlt"; import { Spatial } from "../../../src/geo/Spatial"; import { EdgeCalculator } from "../../../src/graph/edge/EdgeCalculator"; -import { IPotentialEdge } from "../../../src/graph/edge/interfaces/IPotentialEdge"; +import { PotentialEdge } from "../../../src/graph/edge/interfaces/PotentialEdge"; import { Node } from "../../../src/graph/Node"; import { EdgeCalculatorHelper } from "../../helper/EdgeCalculatorHelper"; @@ -44,15 +44,15 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0], 2, "perspective", 0, 0); let enu: number[] = [10, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(0); @@ -63,22 +63,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]); let enu: number[] = [10, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.distance).toBeCloseTo(10, precision); expect(potentialEdge.motionChange).toBeCloseTo(0, precision); expect(potentialEdge.verticalMotion).toBeCloseTo(0, precision); @@ -95,15 +95,15 @@ describe("EdgeCalculator.getPotentialEdges", () => { let sequenceKey: string = "skey"; let edgeKey: string = "edgeKey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]); let enu: number[] = [10, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, null, [0, -Math.PI / 2, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); @@ -114,22 +114,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]); let enu: number[] = [3, -4, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.distance).toBeCloseTo(5, precision); }); @@ -138,22 +138,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [0, -Math.PI / 2, 0]); let enu: number[] = [5, 5, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [0, -Math.PI / 2, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.motionChange).toBeCloseTo(Math.PI / 4, precision); }); @@ -162,22 +162,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]); let enu: number[] = [5, 5, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.motionChange).toBeCloseTo(-Math.PI / 4, precision); }); @@ -186,22 +186,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]); let enu: number[] = [0, -10, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(Math.abs(potentialEdge.motionChange)).toBeCloseTo(Math.PI, precision); }); @@ -210,22 +210,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]); let enu: number[] = [3, 4, 5]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.verticalMotion).toBeCloseTo(Math.PI / 4, precision); }); @@ -234,22 +234,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, [Math.PI / 2, 0, 0]); let enu: number[] = [-3, 4, -5]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, [Math.PI / 2, 0, 0]); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.verticalMotion).toBeCloseTo(-Math.PI / 4, precision); }); @@ -258,22 +258,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 2)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.directionChange).toBeCloseTo(Math.PI / 2, precision); }); @@ -282,22 +282,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(-Math.PI / 2)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.directionChange).toBeCloseTo(-Math.PI / 2, precision); }); @@ -306,22 +306,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 4)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(-3 * Math.PI / 4)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(Math.abs(potentialEdge.directionChange)).toBeCloseTo(Math.PI, precision); }); @@ -330,22 +330,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 4)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 4, Math.PI / 4)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.verticalDirectionChange).toBeCloseTo(Math.PI / 4, precision); }); @@ -354,22 +354,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 4, 5 * Math.PI / 12)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 4, 7 * Math.PI / 12)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.verticalDirectionChange).toBeCloseTo(-Math.PI / 6, precision); }); @@ -378,22 +378,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(Math.PI / 2, Math.PI / 6)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(Math.PI / 2, 2 * Math.PI / 3)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.rotation).toBeCloseTo(Math.PI / 2, precision); }); @@ -407,22 +407,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let theta: number = spatial.relativeRotationAngle(r1, r2); - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, r1); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.rotation).toBeCloseTo(theta, precision); }); @@ -434,22 +434,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let r1: number[] = [0, 0, 0]; let r2: number[] = [0, 0, 0]; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, r1); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(0, precision); }); @@ -461,22 +461,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let r1: number[] = [0, 0, 0]; let r2: number[] = [0, 0, 0]; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, r1); let enu: number[] = [0, 1, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(Math.PI / 2, precision); }); @@ -488,22 +488,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let r1: number[] = [0, 0, 0]; let r2: number[] = [0, 0, 0]; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, r1); let enu: number[] = [-1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(Math.abs(potentialEdge.worldMotionAzimuth)).toBeCloseTo(Math.PI, precision); }); @@ -515,22 +515,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let r1: number[] = [0, 0, 0]; let r2: number[] = [0, 0, 0]; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, r1); let enu: number[] = [0, -1, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(-Math.PI / 2, precision); }); @@ -542,22 +542,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let r1: number[] = [0, 0, 0]; let r2: number[] = [0, 0, 0]; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, r1); let enu: number[] = [1, 1, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, r2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.worldMotionAzimuth).toBeCloseTo(Math.PI / 4, precision); }); @@ -566,22 +566,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.sameSequence).toBe(true); }); @@ -591,22 +591,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let sequenceKey: string = "skey"; let edgeSequenceKey: string = "edgeSkey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0)); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, edgeSequenceKey, createRotationVector(0)); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.sameSequence).toBe(false); }); @@ -617,22 +617,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let mergeCC: number = 45; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), mergeCC); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), mergeCC); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.sameMergeCC).toBe(true); }); @@ -644,22 +644,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let mergeCC1: number = 45; let mergeCC2: number = 22; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), mergeCC1); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), mergeCC2); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.sameMergeCC).toBe(false); }); @@ -668,22 +668,22 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), null); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), null); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.sameMergeCC).toBe(true); }); @@ -692,46 +692,46 @@ describe("EdgeCalculator.getPotentialEdges", () => { let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), 467); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), null); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.sameMergeCC).toBe(false); }); - it("should be spherical when camera type equirectangular", () => { + it("should be spherical when camera type spherical", () => { let key: string = "key"; let edgeKey: string = "edgeKey"; let sequenceKey: string = "skey"; - let lla: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let lla: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; let node: Node = helper.createFullNode(key, lla, sequenceKey, createRotationVector(0), 467); let enu: number[] = [1, 0, 0]; let geodetic: number[] = geoCoords.enuToGeodetic(enu[0], enu[1], enu[2], lla.lat, lla.lon, lla.alt); - let edgeLla: ILatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; - let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), 435, "equirectangular"); + let edgeLla: LatLonAlt = { alt: geodetic[2], lat: geodetic[0], lon: geodetic[1] }; + let edgeNode: Node = helper.createFullNode(edgeKey, edgeLla, sequenceKey, createRotationVector(0), 435, "spherical"); - let potentialEdges: IPotentialEdge[] = + let potentialEdges: PotentialEdge[] = edgeCalculator.getPotentialEdges(node, [edgeNode], []); expect(potentialEdges.length).toBe(1); - let potentialEdge: IPotentialEdge = potentialEdges[0]; + let potentialEdge: PotentialEdge = potentialEdges[0]; - expect(potentialEdge.key).toBe(edgeKey); + expect(potentialEdge.id).toBe(edgeKey); expect(potentialEdge.spherical).toBe(true); }); }); diff --git a/spec/helper/DOMRendererMockCreator.ts b/spec/helper/DOMRendererMockCreator.ts index d25a9ac5d..3ad0fd694 100644 --- a/spec/helper/DOMRendererMockCreator.ts +++ b/spec/helper/DOMRendererMockCreator.ts @@ -1,6 +1,6 @@ import { Subject } from "rxjs"; import { DOMRenderer } from "../../src/render/DOMRenderer"; -import { IVNodeHash } from "../../src/render/interfaces/IVNodeHash"; +import { VirtualNodeHash } from "../../src/render/interfaces/VirtualNodeHash"; import { MockCreator } from "./MockCreator"; import { MockCreatorBase } from "./MockCreatorBase"; @@ -9,8 +9,8 @@ export class DOMRendererMockCreator extends MockCreatorBase { public create(): DOMRenderer { const mock: DOMRenderer = new MockCreator().create(DOMRenderer, "DOMRenderer"); - this._mockProperty(mock, "element$", new Subject()); - this._mockProperty(mock, "render$", new Subject()); + this._mockProperty(mock, "element$", new Subject()); + this._mockProperty(mock, "render$", new Subject()); return mock; } diff --git a/spec/helper/EdgeCalculatorHelper.ts b/spec/helper/EdgeCalculatorHelper.ts index 30bef35f5..c2ce46ccd 100644 --- a/spec/helper/EdgeCalculatorHelper.ts +++ b/spec/helper/EdgeCalculatorHelper.ts @@ -1,24 +1,24 @@ import { Node } from "../../src/graph/Node"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; -import { ILatLonAlt } from "../../src/geo/interfaces/ILatLonAlt"; -import { IPotentialEdge } from "../../src/graph/edge/interfaces/IPotentialEdge"; -import { CameraProjectionType } from "../../src/api/interfaces/CameraProjectionType"; +import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt"; +import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt"; +import { LatLonAlt } from "../../src/api/interfaces/LatLonAlt"; +import { PotentialEdge } from "../../src/graph/edge/interfaces/PotentialEdge"; +import { CameraType } from "../../src/geo/interfaces/CameraType"; export class EdgeCalculatorHelper { - public createPotentialEdge(key: string = "pkey"): IPotentialEdge { + public createPotentialEdge(key: string = "pkey"): PotentialEdge { return { capturedAt: 0, directionChange: 0, distance: 0, spherical: false, - key: key, + id: key, motionChange: 0, rotation: 0, sameMergeCC: false, sameSequence: false, sameUser: false, - sequenceKey: "skey", + sequenceId: "skey", verticalDirectionChange: 0, verticalMotion: 0, worldMotionAzimuth: 0, @@ -27,14 +27,14 @@ export class EdgeCalculatorHelper { public createCoreNode( key: string, - latLonAlt: ILatLonAlt, + latLonAlt: LatLonAlt, sequenceKey: string): Node { - let coreNode: ICoreNode = { - cl: { lat: latLonAlt.lat, lon: latLonAlt.lon }, - key: key, - l: { lat: latLonAlt.lat, lon: latLonAlt.lon }, - sequence_key: sequenceKey, + let coreNode: CoreImageEnt = { + computed_geometry: { lat: latLonAlt.lat, lon: latLonAlt.lon }, + id: key, + geometry: { lat: latLonAlt.lat, lon: latLonAlt.lon }, + sequence: { id: sequenceKey }, }; return new Node(coreNode); @@ -42,32 +42,41 @@ export class EdgeCalculatorHelper { public createFullNode( key: string = "key", - latLonAlt: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }, + latLonAlt: LatLonAlt = { alt: 0, lat: 0, lon: 0 }, sequenceKey: string = "skey", r: number[] = [0, 0, 0], mergeCC: number = 2, - cameraType: CameraProjectionType = "perspective", + cameraType: CameraType = "perspective", capturedAt: number = 0, mergeVersion: number = 1): Node { let node: Node = this.createCoreNode(key, latLonAlt, sequenceKey); - let fillNode: IFillNode = { + let fillNode: SpatialImageEnt = { + altitude: 0, atomic_scale: 0, - c_rotation: r, - ca: 0, - calt: latLonAlt.alt, - camera_projection_type: cameraType, + computed_rotation: r, + compass_angle: 0, + computed_altitude: latLonAlt.alt, + camera_parameters: cameraType === "spherical" ? + [] : [1, 0, 0], + camera_type: cameraType, captured_at: capturedAt, - cca: 0, - cfocal: 0, - cluster_key: "ckey", + computed_compass_angle: 0, + cluster: { + id: "ckey", + url: "ckey-url", + }, + creator: { id: "ukey", username: "uname" }, + exif_orientation: 0, height: 0, + id: "key", merge_cc: mergeCC, merge_version: mergeVersion, - orientation: 0, + mesh: { id: "mesh-id", url: "mesh-url" }, private: false, - user: { key: "ukey", username: "uname" }, + owner: { id: null }, + thumb: { id: "thumb-id", url: "thumb-url" }, width: 0, }; @@ -79,10 +88,10 @@ export class EdgeCalculatorHelper { public createDefaultNode(spherical: boolean = false): Node { let key: string = "key"; let sequenceKey: string = "skey"; - let latLonAlt: ILatLonAlt = { alt: 0, lat: 0, lon: 0 }; + let latLonAlt: LatLonAlt = { alt: 0, lat: 0, lon: 0 }; - let cameraType: CameraProjectionType = spherical ? - "equirectangular" : + let cameraType: CameraType = spherical ? + "spherical" : null; return this.createFullNode(key, latLonAlt, sequenceKey, [0, 0, 0], 2, cameraType, 0); diff --git a/spec/helper/FrameHelper.ts b/spec/helper/FrameHelper.ts index f5d295d37..f69f12924 100644 --- a/spec/helper/FrameHelper.ts +++ b/spec/helper/FrameHelper.ts @@ -1,17 +1,17 @@ import { NodeHelper } from "./NodeHelper"; import { TransformHelper } from "./TransformHelper"; -import { IFrame } from "../../src/state/interfaces/IFrame"; +import { AnimationFrame } from "../../src/state/interfaces/AnimationFrame"; import { State } from "../../src/state/State"; import { Camera } from "../../src/geo/Camera"; -import { CameraProjectionType } from "../../src/api/interfaces/CameraProjectionType"; +import { CameraType } from "../../src/geo/interfaces/CameraType"; export class FrameHelper { private _nodeHelper: NodeHelper = new NodeHelper(); private _transformHelper: TransformHelper = new TransformHelper(); public createFrame( - cameraType: CameraProjectionType = "perspective"): IFrame { + cameraType: CameraType = "perspective"): AnimationFrame { const currentNode = this._nodeHelper.createNode(cameraType); diff --git a/spec/helper/GLRendererMockCreator.ts b/spec/helper/GLRendererMockCreator.ts index c316fc0f0..88f6ddba6 100644 --- a/spec/helper/GLRendererMockCreator.ts +++ b/spec/helper/GLRendererMockCreator.ts @@ -1,17 +1,17 @@ import { Subject } from "rxjs"; import { GLRenderer } from "../../src/render/GLRenderer"; -import { IGLRenderHash } from "../../src/render/interfaces/IGLRenderHash"; +import { GLRenderHash } from "../../src/render/interfaces/IGLRenderHash"; import { MockCreator } from "./MockCreator"; import { MockCreatorBase } from "./MockCreatorBase"; export class GLRendererMockCreator extends MockCreatorBase { public create(): GLRenderer { - const mock: GLRenderer = new MockCreator().create(GLRenderer, "GLRenderer"); + const mock = new MockCreator().create(GLRenderer, "GLRenderer"); this._mockProperty(mock, "webGLRenderer$", new Subject()); - this._mockProperty(mock, "render$", new Subject()); - this._mockProperty(mock, "postrender$", new Subject()); + this._mockProperty(mock, "render$", new Subject()); + this._mockProperty(mock, "opaqueRender$", new Subject()); return mock; } diff --git a/spec/helper/NavigatorMockCreator.ts b/spec/helper/NavigatorMockCreator.ts index c6cf4dbfe..398151dfe 100644 --- a/spec/helper/NavigatorMockCreator.ts +++ b/spec/helper/NavigatorMockCreator.ts @@ -20,7 +20,7 @@ export class NavigatorMockCreator extends MockCreatorBase { this._mockProperty(mock, "cacheService", new MockCreator().create(CacheService, "CacheService")); this._mockProperty(mock, "graphService", new GraphServiceMockCreator().create()); this._mockProperty(mock, "loadingService", new LoadingServiceMockCreator().create()); - this._mockProperty(mock, "movedToKey$", new Subject()); + this._mockProperty(mock, "movedToId$", new Subject()); this._mockProperty(mock, "panService", new PanServiceMockCreator().create()); this._mockProperty(mock, "playService", new PlayServiceMockCreator().create()); this._mockProperty(mock, "stateService", new StateServiceMockCreator().create()); diff --git a/spec/helper/NodeHelper.ts b/spec/helper/NodeHelper.ts index 1aeb0b285..53ddd47e0 100644 --- a/spec/helper/NodeHelper.ts +++ b/spec/helper/NodeHelper.ts @@ -1,7 +1,7 @@ -import { CameraProjectionType } from "../../src/api/interfaces/CameraProjectionType"; -import { ICoreNode } from "../../src/api/interfaces/ICoreNode"; -import { IFillNode } from "../../src/api/interfaces/IFillNode"; -import { IFullNode } from "../../src/api/interfaces/IFullNode"; +import { CameraType } from "../../src/geo/interfaces/CameraType"; +import { CoreImageEnt } from "../../src/api/ents/CoreImageEnt"; +import { SpatialImageEnt } from "../../src/api/ents/SpatialImageEnt"; +import { ImageEnt } from "../../src/api/ents/ImageEnt"; import { Node } from "../../src/graph/Node"; export class NodeHelper { @@ -11,79 +11,93 @@ export class NodeHelper { private _userKey: string = "ukey"; private _username: string = "uname"; - public createCoreNode(): ICoreNode { + public createCoreNode(): CoreImageEnt { return { - cl: { lat: 0, lon: 0 }, - key: this._nodeKey, - l: { lat: 0, lon: 0 }, - sequence_key: this._sequenceKey, + computed_geometry: { lat: 0, lon: 0 }, + id: this._nodeKey, + geometry: { lat: 0, lon: 0 }, + sequence: { id: this._sequenceKey }, }; } - public createFillNode(): IFillNode { + public createFillNode(): SpatialImageEnt { return { + altitude: 0, atomic_scale: 0, - c_rotation: [0, 0, 0], - ca: 0, - calt: 0, - camera_projection_type: "perspective", + camera_parameters: [1, 0, 0], + camera_type: "perspective", captured_at: 0, - cca: 0, - cfocal: 0, - cluster_key: this._clusterKey, - cluster_url: this._clusterKey = "_url", + computed_rotation: [0, 0, 0], + compass_angle: 0, + computed_altitude: 0, + computed_compass_angle: 0, + cluster: { + id: this._clusterKey, + url: this._clusterKey + "_url", + }, + creator: { id: this._userKey, username: this._username }, + exif_orientation: 0, height: 1, + id: "id", merge_cc: 0, merge_version: 0, - orientation: 0, + mesh: { id: "mesh-id", url: "mesh-url" }, + owner: { id: null }, private: false, - user: { key: this._userKey, username: this._username }, + thumb: { id: "thumb-id", url: "thumb-url" }, width: 1, }; } - public createFullNode(): IFullNode { + public createFullNode(): ImageEnt { return { + altitude: 0, atomic_scale: 0, - c_rotation: [0, 0, 0], - ca: 0, - calt: 0, - camera_projection_type: "perspective", + computed_rotation: [0, 0, 0], + compass_angle: 0, + computed_altitude: 0, + camera_parameters: [1, 0, 0], + camera_type: "perspective", captured_at: 0, - cca: 0, - cfocal: 0, - cl: { lat: 0, lon: 0 }, - cluster_key: this._clusterKey, - cluster_url: this._clusterKey = "_url", + computed_compass_angle: 0, + computed_geometry: { lat: 0, lon: 0 }, + cluster: { + id: this._clusterKey, + url: this._clusterKey + "_url", + }, + creator: { id: this._userKey, username: this._username }, + exif_orientation: 0, + geometry: { lat: 0, lon: 0 }, height: 1, - key: this._nodeKey, - l: { lat: 0, lon: 0 }, + id: this._nodeKey, merge_cc: 1, merge_version: 1, - orientation: 0, + mesh: { id: "mesh-id", url: "mesh-url" }, + owner: { id: null }, private: false, - sequence_key: this._sequenceKey, - user: { key: this._userKey, username: this._username }, + sequence: { id: this._sequenceKey }, + thumb: { id: "thumb-id", url: "thumb-url" }, width: 1, }; } - public createNode(cameraType: CameraProjectionType = "perspective"): Node { + public createNode(cameraType: CameraType = "perspective"): Node { let fullNode = this.createFullNode(); - fullNode.camera_projection_type = cameraType; + fullNode.camera_type = cameraType; let node = new Node(fullNode); node.makeFull(fullNode); return node; } public createUnmergedNode(): Node { - let fullNode: IFullNode = this.createFullNode(); + let fullNode: ImageEnt = this.createFullNode(); fullNode.atomic_scale = undefined; - fullNode.ca = undefined; - fullNode.calt = undefined; - fullNode.cfocal = undefined; - fullNode.cl = undefined; + fullNode.compass_angle = undefined; + fullNode.computed_altitude = undefined; + fullNode.camera_parameters = undefined; + fullNode.camera_type = undefined; + fullNode.computed_geometry = undefined; fullNode.merge_cc = undefined; fullNode.merge_version = undefined; diff --git a/spec/helper/PlayServiceMockCreator.ts b/spec/helper/PlayServiceMockCreator.ts index 535d54f23..40f9f64a8 100644 --- a/spec/helper/PlayServiceMockCreator.ts +++ b/spec/helper/PlayServiceMockCreator.ts @@ -1,5 +1,5 @@ import { Subject } from "rxjs"; -import { EdgeDirection } from "../../src/graph/edge/EdgeDirection"; +import { NavigationDirection } from "../../src/graph/edge/NavigationDirection"; import { PlayService } from "../../src/viewer/PlayService"; import { MockCreator } from "./MockCreator"; @@ -9,7 +9,7 @@ export class PlayServiceMockCreator extends MockCreatorBase { public create(): PlayService { const mock: PlayService = new MockCreator().create(PlayService, "PlayService"); - this._mockProperty(mock, "direction$", new Subject()); + this._mockProperty(mock, "direction$", new Subject()); this._mockProperty(mock, "playing$", new Subject()); this._mockProperty(mock, "speed$", new Subject()); diff --git a/spec/helper/StateServiceMockCreator.ts b/spec/helper/StateServiceMockCreator.ts index e07075919..6f123250b 100644 --- a/spec/helper/StateServiceMockCreator.ts +++ b/spec/helper/StateServiceMockCreator.ts @@ -5,8 +5,8 @@ import { MockCreatorBase } from "./MockCreatorBase"; import { Node } from "../../src/graph/Node"; import { Transform } from "stream"; -import { ILatLonAlt } from "../../src/geo/interfaces/ILatLonAlt"; -import { IFrame } from "../../src/state/interfaces/IFrame"; +import { LatLonAlt } from "../../src/api/interfaces/LatLonAlt"; +import { AnimationFrame } from "../../src/state/interfaces/AnimationFrame"; import { State } from "../../src/state/State"; import { StateService } from "../../src/state/StateService"; @@ -15,14 +15,14 @@ export class StateServiceMockCreator extends MockCreatorBase { const mock: StateService = new MockCreator().create(StateService, "StateService"); this._mockProperty(mock, "currentCamera$", new Subject()); - this._mockProperty(mock, "currentKey$", new Subject()); + this._mockProperty(mock, "currentId$", new Subject()); this._mockProperty(mock, "currentNode$", new Subject()); this._mockProperty(mock, "currentNodeExternal$", new Subject()); - this._mockProperty(mock, "currentState$", new Subject