workadventure/back/tests/PositionNotifierTest.ts

182 lines
5.3 KiB
TypeScript
Raw Normal View History

import "jasmine";
import {World, ConnectCallback, DisconnectCallback } from "../src/Model/World";
import {Point} from "../src/Model/Websocket/MessageUserPosition";
import { Group } from "../src/Model/Group";
import {PositionNotifier} from "../src/Model/PositionNotifier";
2020-09-16 16:06:43 +02:00
import {User} from "../src/Model/User";
import {PointInterface} from "../src/Model/Websocket/PointInterface";
import {Zone} from "_Model/Zone";
2020-09-16 16:06:43 +02:00
import {Movable} from "_Model/Movable";
2020-09-16 16:10:20 +02:00
import {PositionInterface} from "_Model/PositionInterface";
2020-09-16 16:06:43 +02:00
function move(user: User, x: number, y: number, positionNotifier: PositionNotifier): void {
positionNotifier.updatePosition(user, {
x,
2020-09-16 16:06:43 +02:00
y
}, user.position);
user.position.x = x;
user.position.y = y;
}
describe("PositionNotifier", () => {
it("should receive notifications when player moves", () => {
let enterTriggered = false;
let moveTriggered = false;
let leaveTriggered = false;
2020-09-16 16:06:43 +02:00
const positionNotifier = new PositionNotifier(300, 300, (thing: Movable) => {
enterTriggered = true;
2020-09-16 16:10:20 +02:00
}, (thing: Movable, position: PositionInterface) => {
moveTriggered = true;
2020-09-16 16:06:43 +02:00
}, (thing: Movable) => {
leaveTriggered = true;
});
const user1 = new User(1, {
2020-09-16 16:06:43 +02:00
x: 500,
y: 500,
moving: false,
direction: 'down'
}, false);
const user2 = new User(2, {
2020-09-16 16:06:43 +02:00
x: -9999,
y: -9999,
moving: false,
direction: 'down'
}, false);
positionNotifier.setViewport(user1, {
left: 200,
right: 600,
top: 100,
bottom: 500
});
move(user2, 500, 500, positionNotifier);
expect(enterTriggered).toBe(true);
expect(moveTriggered).toBe(false);
enterTriggered = false;
// Move inside the zone
move(user2, 501, 500, positionNotifier);
expect(enterTriggered).toBe(false);
expect(moveTriggered).toBe(true);
moveTriggered = false;
// Move out of the zone in a zone that we don't track
move(user2, 901, 500, positionNotifier);
expect(enterTriggered).toBe(false);
expect(moveTriggered).toBe(false);
expect(leaveTriggered).toBe(true);
leaveTriggered = false;
// Move back in
move(user2, 500, 500, positionNotifier);
expect(enterTriggered).toBe(true);
expect(moveTriggered).toBe(false);
expect(leaveTriggered).toBe(false);
enterTriggered = false;
// Move out of the zone in a zone that we do track
move(user2, 200, 500, positionNotifier);
expect(enterTriggered).toBe(false);
expect(moveTriggered).toBe(true);
expect(leaveTriggered).toBe(false);
moveTriggered = false;
// Leave the room
positionNotifier.leave(user2);
2020-09-16 16:06:43 +02:00
positionNotifier.removeViewport(user2);
expect(enterTriggered).toBe(false);
expect(moveTriggered).toBe(false);
expect(leaveTriggered).toBe(true);
leaveTriggered = false;
});
it("should receive notifications when camera moves", () => {
let enterTriggered = false;
let moveTriggered = false;
let leaveTriggered = false;
2020-09-16 16:06:43 +02:00
const positionNotifier = new PositionNotifier(300, 300, (thing: Movable) => {
enterTriggered = true;
2020-09-16 16:10:20 +02:00
}, (thing: Movable, position: PositionInterface) => {
moveTriggered = true;
2020-09-16 16:06:43 +02:00
}, (thing: Movable) => {
leaveTriggered = true;
});
const user1 = new User(1, {
2020-09-16 16:06:43 +02:00
x: 500,
y: 500,
moving: false,
direction: 'down'
}, false);
const user2 = new User(2, {
2020-09-16 16:06:43 +02:00
x: -9999,
y: -9999,
moving: false,
direction: 'down'
}, false);
let newUsers = positionNotifier.setViewport(user1, {
left: 200,
right: 600,
top: 100,
bottom: 500
});
expect(newUsers.length).toBe(0);
move(user2, 500, 500, positionNotifier);
expect(enterTriggered).toBe(true);
expect(moveTriggered).toBe(false);
enterTriggered = false;
// Move the viewport but the user stays inside.
positionNotifier.setViewport(user1, {
left: 201,
right: 601,
top: 100,
bottom: 500
});
expect(enterTriggered).toBe(false);
expect(moveTriggered).toBe(false);
expect(leaveTriggered).toBe(false);
// Move the viewport out of the user.
positionNotifier.setViewport(user1, {
left: 901,
right: 1001,
top: 100,
bottom: 500
});
expect(enterTriggered).toBe(false);
expect(moveTriggered).toBe(false);
expect(leaveTriggered).toBe(true);
leaveTriggered = false;
// Move the viewport back on the user.
newUsers = positionNotifier.setViewport(user1, {
left: 200,
right: 600,
top: 100,
bottom: 500
});
expect(enterTriggered).toBe(true);
expect(moveTriggered).toBe(false);
expect(leaveTriggered).toBe(false);
enterTriggered = false;
expect(newUsers.length).toBe(1);
});
})