mapillary-js/spec/viewer/ComponentController.spec.ts
Oscar Lorentzon eeeb4efb82 feat(marker): claim wheel when dragging marker
Do not allow zooming with scroll wheel when dragging a marker.
Subscribe to filtered wheel in scroll zoom handler so that
it can be disabled by other components claiming the wheel.
2017-09-27 07:12:02 +00:00

311 lines
13 KiB
TypeScript

/// <reference path="../../typings/index.d.ts" />
import {Subject} from "rxjs/Subject";
import {
ComponentService,
CoverComponent,
CoverState,
ICoverConfiguration,
} from "../../src/Component";
import {Node} from "../../src/Graph";
import {EventEmitter} from "../../src/Utils";
import {
ComponentController,
Container,
Navigator,
Observer,
Viewer,
} from "../../src/Viewer";
import {ContainerMockCreator} from "../helper/ContainerMockCreator.spec";
import {NavigatorMockCreator} from "../helper/NavigatorMockCreator.spec";
import {NodeMockCreator} from "../helper/NodeMockCreator.spec";
describe("ComponentController.ctor", () => {
it("should be defined", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
"key",
{},
componentService);
expect(componentController).toBeDefined();
});
it("should always have cover activated initially", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
const componentService1: ComponentService = new ComponentService(container, navigator);
const componentController1: ComponentController =
new ComponentController(container, navigator, observer, "key", {}, componentService1);
expect(componentService1.coverActivated).toBe(true);
const componentService2: ComponentService = new ComponentService(container, navigator);
const componentController2: ComponentController =
new ComponentController(container, navigator, observer, "key", { cover: true }, componentService2);
expect(componentService2.coverActivated).toBe(true);
const componentService3: ComponentService = new ComponentService(container, navigator);
const componentController3: ComponentController =
new ComponentController(container, navigator, observer, "key", { cover: false }, componentService3);
expect(componentService3.coverActivated).toBe(true);
const componentService4: ComponentService = new ComponentService(container, navigator);
const componentController4: ComponentController =
new ComponentController(container, navigator, observer, null, {}, componentService4);
expect(componentService4.coverActivated).toBe(true);
const componentService5: ComponentService = new ComponentService(container, navigator);
const componentController5: ComponentController =
new ComponentController(container, navigator, observer, null, { cover: false }, componentService5);
expect(componentService5.coverActivated).toBe(true);
expect(
!!componentController1 &&
!!componentController2 &&
!!componentController3 &&
!!componentController4 &&
!!componentController5).toBe(true);
});
});
describe("ComponentController.navigable", () => {
it("should be navigable if no key is supplied", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
null,
{},
componentService);
expect(componentController.navigable).toBe(true);
});
it("should not be navigable if key is supplied", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
"key",
{},
componentService);
expect(componentController.navigable).toBe(false);
});
it("should not change when initialized without key and moved to key", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
(<jasmine.Spy>container.mouseService.filtered$).and.returnValue(new Subject<MouseEvent>());
(<jasmine.Spy>container.mouseService.filteredWheel$).and.returnValue(new Subject<MouseEvent>());
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
null,
{},
componentService);
expect(componentController.navigable).toBe(true);
expect(componentService.coverActivated).toBe(true);
const coverComponent: CoverComponent = componentService.getCover();
const key: string = "key";
coverComponent.configuration$
.skip(1) // skip initial default configuration
.take(1)
.subscribe(
(c: ICoverConfiguration): void => {
expect(c.key).toBe(key);
});
let navigableChangedCount: number = 0;
eventEmitter.on(
Viewer.navigablechanged,
(navigable: boolean): void => {
navigableChangedCount++;
});
(<Subject<string>>navigator.movedToKey$).next(key);
expect(componentController.navigable).toBe(true);
expect(navigableChangedCount).toBe(0);
expect(componentService.coverActivated).toBe(false);
});
it("should change when initialized with key and cover false and node retrieved", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
(<jasmine.Spy>container.mouseService.filtered$).and.returnValue(new Subject<MouseEvent>());
(<jasmine.Spy>container.mouseService.filteredWheel$).and.returnValue(new Subject<MouseEvent>());
const moveToKey$: Subject<Node> = new Subject<Node>();
(<jasmine.Spy>navigator.moveToKey$).and.returnValue(moveToKey$);
const key: string = "key";
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
key,
{ cover: false },
componentService);
expect(componentController.navigable).toBe(false);
expect(componentService.coverActivated).toBe(true);
const coverComponent: CoverComponent = componentService.getCover();
let configurationCount: number = 0;
coverComponent.configuration$
.first(
(c: ICoverConfiguration): boolean => {
return c.state === CoverState.Hidden;
})
.subscribe(
(c: ICoverConfiguration): void => {
configurationCount++;
expect(c.key).toBe(key);
});
let navigableChangedCount: number = 0;
eventEmitter.on(
Viewer.navigablechanged,
(navigable: boolean): void => {
navigableChangedCount++;
expect(navigable).toBe(true);
});
(<Subject<string>>navigator.stateService.currentKey$).next(null);
moveToKey$.next(new NodeMockCreator().create({ key: "key"}));
expect(componentController.navigable).toBe(true);
expect(configurationCount).toBe(1);
expect(navigableChangedCount).toBe(1);
expect(componentService.coverActivated).toBe(false);
});
it("should not change when initialized with key and cover false and node retrieval fail", () => {
spyOn(console, "error").and.stub();
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
(<jasmine.Spy>container.mouseService.filtered$).and.returnValue(new Subject<MouseEvent>());
const moveToKey$: Subject<Node> = new Subject<Node>();
(<jasmine.Spy>navigator.moveToKey$).and.returnValue(moveToKey$);
const key: string = "key";
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
key,
{ cover: false },
componentService);
expect(componentController.navigable).toBe(false);
expect(componentService.coverActivated).toBe(true);
let navigableChangedCount: number = 0;
eventEmitter.on(
Viewer.navigablechanged,
(navigable: boolean): void => {
navigableChangedCount++;
});
(<Subject<string>>navigator.stateService.currentKey$).next(null);
moveToKey$.error(new Error("Move to key failed"));
expect(componentController.navigable).toBe(false);
expect(navigableChangedCount).toBe(0);
expect(componentService.coverActivated).toBe(true);
});
it("should change when activating cover after successful deactivation", () => {
const container: Container = new ContainerMockCreator().create();
const navigator: Navigator = new NavigatorMockCreator().create();
const componentService: ComponentService = new ComponentService(container, navigator);
const eventEmitter: EventEmitter = new EventEmitter();
const observer: Observer = new Observer(eventEmitter, navigator, container);
(<jasmine.Spy>container.mouseService.filtered$).and.returnValue(new Subject<MouseEvent>());
(<jasmine.Spy>container.mouseService.filteredWheel$).and.returnValue(new Subject<MouseEvent>());
const moveToKey$: Subject<Node> = new Subject<Node>();
(<jasmine.Spy>navigator.moveToKey$).and.returnValue(moveToKey$);
const key: string = "key";
const componentController: ComponentController =
new ComponentController(
container,
navigator,
observer,
key,
{ cover: false },
componentService);
(<Subject<string>>navigator.stateService.currentKey$).next(null);
moveToKey$.next(new NodeMockCreator().create({ key: "key"}));
expect(componentController.navigable).toBe(true);
expect(componentService.coverActivated).toBe(false);
let navigableChangedCount: number = 0;
eventEmitter.on(
Viewer.navigablechanged,
(navigable: boolean): void => {
navigableChangedCount++;
expect(navigable).toBe(false);
});
componentController.activateCover();
expect(navigableChangedCount).toBe(1);
expect(componentController.navigable).toBe(false);
expect(componentService.coverActivated).toBe(true);
});
});