Completed
Push — Rover/base ( 9e0a4e )
by Albert
01:27
created

Map::normalizeCoordinate()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 39
ccs 22
cts 22
cp 1
rs 8.9848
c 0
b 0
f 0
cc 5
nc 5
nop 1
crap 5
1
<?php
2
3
namespace Kata\Rover;
4
5
final class Map
6
{
7
    private $max_coordinates;
8
    private $obstacles;
9
10 14
    public function __construct(Coordinates $max_coordinates, array $some_obstacles)
11
    {
12 14
        $this->max_coordinates = $max_coordinates;
13 14
        $this->obstacles = $this->normalize($some_obstacles);
14 14
    }
15
16 2
    public function obstacles(): array
17
    {
18 2
        return $this->obstacles;
19
    }
20
21 14
    private function normalize(array $some_obstacles): array
22
    {
23
        \array_walk($some_obstacles, function (&$current_coordinate) {
24 14
            $current_coordinate = $this->normalizeCoordinate($current_coordinate);
25 14
        });
26 14
        return $some_obstacles;
27
    }
28
29 14
    public function normalizeCoordinate(Coordinates $a_coordinate): Coordinates
30
    {
31 14
        if ($a_coordinate->coordinateX() > $this->max_coordinates->coordinateX()) {
32 1
            return $this->normalizeCoordinate(
33 1
                new Coordinates(
34 1
                    $a_coordinate->coordinateX() - $this->max_coordinates->coordinateX(),
35 1
                    $a_coordinate->coordinateY()
36
                )
37
            );
38
        }
39 14
        if ($a_coordinate->coordinateY() > $this->max_coordinates->coordinateY()) {
40 2
            return $this->normalizeCoordinate(
41 2
                new Coordinates(
42 2
                    $a_coordinate->coordinateX(),
43 2
                    $a_coordinate->coordinateY() - $this->max_coordinates->coordinateY()
44
                )
45
            );
46
        }
47
48 14
        if ($a_coordinate->coordinateX() < 0) {
49 3
            return $this->normalizeCoordinate(
50 3
                new Coordinates(
51 3
                    $this->max_coordinates->coordinateX() - abs($a_coordinate->coordinateX()),
52 3
                    $a_coordinate->coordinateY()
53
                )
54
            );
55
        }
56
57 14
        if ($a_coordinate->coordinateY() < 0) {
58 2
            return $this->normalizeCoordinate(
59 2
                new Coordinates(
60 2
                    $a_coordinate->coordinateX(),
61 2
                    $this->max_coordinates->coordinateY() - abs($a_coordinate->coordinateY())
62
                )
63
            );
64
        }
65
66 14
        return $a_coordinate;
67
    }
68
69 9
    public function isObstacle(Coordinates $a_coordinate): bool
70
    {
71 9
        foreach ($this->obstacles as $current_obstacle) {
72 9
            if ($a_coordinate->equals($current_obstacle)) {
73 9
                return true;
74
            }
75
        }
76
77 9
        return false;
78
    }
79
}
80