Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
55 / 55
100.00% covered (success)
100.00%
13 / 13
CRAP
100.00% covered (success)
100.00%
1 / 1
SgfBoard
100.00% covered (success)
100.00%
55 / 55
100.00% covered (success)
100.00%
13 / 13
29
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 filterStonesPositions
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 getStoneCount
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getPositionsMirroredAround
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getPositionsHorizontallyMirroredAround
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getPositionsVerticallyMirroredAround
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getColorSwitchedStones
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getShiftedPositions
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getLowestPosition
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getStonesFlipedX
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getStonesFlipedY
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getDifferentStones
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
6
 decodePositionString
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5class SgfBoard
6{
7    /**
8     * @param array<int,int> $stones
9     * @param array{int,int} $info
10     * @param int $size
11     */
12    public function __construct(array $stones, array $info, int $size, $correctMoves = [])
13    {
14        $this->stones = $stones;
15        $this->correctMoves = $correctMoves;
16        $this->info = $info;
17        $this->size = $size;
18    }
19
20    public function filterStonesPositions($color): array
21    {
22        $result = [];
23        foreach ($this->stones as $position => $stone)
24            if ($stone == $color)
25                $result[] = $position;
26        return $result;
27    }
28
29    public function getStoneCount(): int
30    {
31        return count($this->stones);
32    }
33
34    public static function getPositionsMirroredAround(array $positions, int $pivot): array
35    {
36        $result = [];
37        foreach ($positions as $position => $color)
38            $result[BoardPosition::mirrorAround($position, $pivot)] = $color;
39        return $result;
40    }
41
42    public static function getPositionsHorizontallyMirroredAround(array $positions, int $pivot): array
43    {
44        $result = [];
45        foreach ($positions as $position => $color)
46            $result[BoardPosition::horizontallyMirroredAround($position, $pivot)] = $color;
47        return $result;
48    }
49
50    public static function getPositionsVerticallyMirroredAround(array $positions, int $pivot): array
51    {
52        $result = [];
53        foreach ($positions as $position => $color)
54            $result[BoardPosition::verticallyMirroredAround($position, $pivot)] = $color;
55        return $result;
56    }
57
58    public static function getColorSwitchedStones(array $stones): array
59    {
60        $result = [];
61        foreach ($stones as $position => $color)
62            $result[$position] = 1 - $color;
63        return $result;
64    }
65
66    public static function getShiftedPositions(array $positions, int $shift): array
67    {
68        $result = [];
69        foreach ($positions as $position => $color)
70            $result[BoardPosition::shift($position, $shift)] = $color;
71        return $result;
72    }
73
74    public static function getLowestPosition(array $positions): int
75    {
76        $result = BoardPosition::pack(31, 31);
77        foreach ($positions as $position => $color)
78            $result = BoardPosition::min($result, $position);
79        return $result;
80    }
81
82    public static function getStonesFlipedX(array $positions, int $size)
83    {
84        $result = [];
85        foreach ($positions as $position => $color)
86            $result[BoardPosition::flipX($position, $size)] = $color;
87        return $result;
88    }
89
90    public static function getStonesFlipedY(array $positions, int $size)
91    {
92        $result = [];
93        foreach ($positions as $position => $color)
94            $result[BoardPosition::flipY($position, $size)] = $color;
95        return $result;
96    }
97
98    public static function getDifferentStones(array $stonesA, array $stonesB): string
99    {
100        $result = '';
101        foreach ($stonesA as $position => $color)
102            if (!isset($stonesB[$position]) || $stonesB[$position] != $color)
103                $result .= BoardPosition::toLetters($position);
104        foreach ($stonesB as $position => $color)
105            if (!isset($stonesA[$position]))
106                $result .= BoardPosition::toLetters($position);
107        return $result;
108    }
109
110    public static function decodePositionString(string $input): array
111    {
112        $result = [];
113        $steps = (int) strlen($input) / 2;
114        for ($i = 0; $i < $steps; $i++)
115            $result[BoardPosition::fromLetters($input[$i * 2], $input[$i * 2 + 1])] = true;
116        return $result;
117    }
118
119    public array $stones = [];
120    public array $correctMoves = [];
121    public array $info;
122    public int $size;
123
124    public const int BLACK = 0;
125    public const int WHITE = 1;
126    public const int EMPTY = 2;
127}