1 | import chai from 'chai';
|
2 | import Floor from '../src/Floor';
|
3 | import Unit from '../src/units/Unit';
|
4 |
|
5 | const should = chai.should();
|
6 |
|
7 | describe('Position', function () {
|
8 | beforeEach(function () {
|
9 | this.unit = new Unit();
|
10 | this.floor = new Floor(6, 5);
|
11 | this.floor.addUnit(this.unit, 1, 2, 'north');
|
12 | this.position = this.unit.position;
|
13 | });
|
14 |
|
15 | it('should rotate clockwise', function () {
|
16 | this.position.direction.should.equal('north');
|
17 | ['east', 'south', 'west', 'north', 'east'].forEach((direction) => {
|
18 | this.position.rotate(1);
|
19 | this.position.direction.should.equal(direction);
|
20 | });
|
21 | });
|
22 |
|
23 | it('should rotate counterclockwise', function () {
|
24 | this.position.direction.should.equal('north');
|
25 | ['west', 'south', 'east', 'north', 'west'].forEach((direction) => {
|
26 | this.position.rotate(-1);
|
27 | this.position.direction.should.equal(direction);
|
28 | });
|
29 | });
|
30 |
|
31 | it('should get relative space in front', function () {
|
32 | this.floor.addUnit(new Unit(), 1, 1);
|
33 | this.position.getRelativeSpace(1).isEmpty().should.be.false;
|
34 | });
|
35 |
|
36 | it('should get relative object in front when rotated', function () {
|
37 | this.floor.addUnit(new Unit(), 2, 2);
|
38 | this.position.rotate(1);
|
39 | this.position.getRelativeSpace(1).isEmpty().should.be.false;
|
40 | });
|
41 |
|
42 | it('should get relative object diagonally', function () {
|
43 | this.floor.addUnit(new Unit(), 0, 1);
|
44 | this.position.getRelativeSpace(1, -1).isEmpty().should.be.false;
|
45 | });
|
46 |
|
47 | it('should get relative object diagonally when rotating', function () {
|
48 | this.floor.addUnit(new Unit(), 0, 1);
|
49 | this.position.rotate(2);
|
50 | this.position.getRelativeSpace(-1, 1).isEmpty().should.be.false;
|
51 | });
|
52 |
|
53 | it('should move object on floor relatively', function () {
|
54 | this.floor.getUnitAt(1, 2).should.equal(this.unit);
|
55 | this.position.move(-1, 2);
|
56 | should.equal(this.floor.getUnitAt(1, 2), undefined);
|
57 | this.floor.getUnitAt(3, 3).should.equal(this.unit);
|
58 | this.position.rotate(1);
|
59 | this.position.move(-1);
|
60 | should.equal(this.floor.getUnitAt(3, 3), undefined);
|
61 | this.floor.getUnitAt(2, 3).should.equal(this.unit);
|
62 | });
|
63 |
|
64 | it('should return distance from stairs as 0 when on stairs', function () {
|
65 | this.floor.placeStairs(1, 2);
|
66 | this.position.getDistanceFromStairs().should.equal(0);
|
67 | });
|
68 |
|
69 | it('should return distance from stairs in both directions', function () {
|
70 | this.floor.placeStairs(0, 3);
|
71 | this.position.getDistanceFromStairs().should.equal(2);
|
72 | });
|
73 |
|
74 | it('should return relative direction of stairs', function () {
|
75 | this.floor.placeStairs(0, 0);
|
76 | this.position.getRelativeDirectionOfStairs().should.equal('forward');
|
77 | });
|
78 |
|
79 | it('should return relative direction of given space', function () {
|
80 | this.position.getRelativeDirectionOf(this.floor.getSpaceAt(5, 3)).should.equal('right');
|
81 | this.position.rotate(1);
|
82 | this.position.getRelativeDirectionOf(this.floor.getSpaceAt(1, 4)).should.equal('right');
|
83 | });
|
84 |
|
85 | it('should be able to determine relative direction', function () {
|
86 | this.position.getRelativeDirection('north').should.equal('forward');
|
87 | this.position.getRelativeDirection('south').should.equal('backward');
|
88 | this.position.getRelativeDirection('west').should.equal('left');
|
89 | this.position.getRelativeDirection('east').should.equal('right');
|
90 | this.position.rotate(1);
|
91 | this.position.getRelativeDirection('north').should.equal('left');
|
92 | this.position.rotate(1);
|
93 | this.position.getRelativeDirection('north').should.equal('backward');
|
94 | this.position.rotate(1);
|
95 | this.position.getRelativeDirection('north').should.equal('right');
|
96 | });
|
97 |
|
98 | it('should return a space at the same location as position', function () {
|
99 | this.position.space.location.should.eql([1, 2]);
|
100 | });
|
101 |
|
102 | it('should return distance of given space', function () {
|
103 | this.position.getDistanceOf(this.floor.getSpaceAt(5, 3)).should.equal(5);
|
104 | this.position.getDistanceOf(this.floor.getSpaceAt(4, 2)).should.equal(3);
|
105 | });
|
106 | });
|