Poczytaj o array_fill (w kontekście metody initializeCheckerboard).
Przeczytałem, dzięki. Użyłem. Tylko nie jestem pewien czy aby dobrze taki kod jak stworzyłem się dobrze czyta.
Nazwa oraz sygnatura isMoveValid sugeruje, że metoda zwróci false w momencie, gdy ruch będzie nieprawidłowy - ona jednak rzuca wyjątek.
Dałem wyjątek żeby się pobawić testowaniem wyjątków. Ale tu masz 100% rację.
Metoda getWinner jest nieco zawoalowana - może więcej bardziej opisowych komentarzy (z prostymi rysunkami w ASCII itd.) pomogłoby w czytelności?
Jest, to prawda że zawalona, co do komentarzy to tylko te wymagane zostawiłem co dany kawałek robi. Ale dodam.
Dlaczego w metodzie testGetWinner wykonujesz $this->assertEquals($marker, $ticTacToe->getCheckerboardFieldValue($x, $y));?
Żeby potwierdzić czy pętla ustawiająca wartości pól dla testów nie ma błędów logicznych. Wydaje mi się, że powien zostać dla ewentualnej zmiany kodu testu.
Komentarz XxY w konstruktorze nic nie wnosi IMO.
Dałem go żeby pamiętać która oś to który wymiar tablicy.
testSetCheckboardSize jest zbędny - sprawdzasz w ten sposób konkretną implementację planszy do gry (fakt, że wykorzystuje tablice), a nie o to chodzi: powinieneś sprawdzać zachowanie.
Ok. Rozumiem, że powinna być w takim razie metoda, która zwraca wymiary planszy w klasie TicTacToe, a nie liczyć ilości z planszy. Tak?
"NULL" === $winner && $winner = null; co ta instrukcja robi?
Jeśli zmienna jest stringiem "NULL" ustawia ją na prawdziwego nulla, wiem że trudno się czyta, ale to przyzwyczajenie z którym walczę :D
IMO testSetO oraz testSetX są zbędne - zauważ, że testSetOMoveNotAllowed już pokrywa ten warunek. Tzn. jeśli by się okazało, że z jakiegoś powodu TicTacToe nie zapisuje informacji o ruchu gracza, wykrzaczy się testSetOMoveNotAllowed, więc tamte dwa początkowe testy są nadmiarowe.
Tak tu masz rację. Jestem trochę skonfundowany tym wszystkim, zacząłem sobie od testowania klas i oznaczałem co jest przetestowane przez annotacje @CoVerS. I jak widzisz w tdd miałem taki problem z tym że tego nie zrobiłem, bo nie wiem czy powinienem po fakcie oznaczać wszystko, nawet metody prywatne dla klasy jeśi metoda publiczna z nich korzysta?
Nadal szukam odpowiedzi na to czy jeśli zrobię ekstrakcję kodu do klas to czy je testować? np. tworzę CheckerboardInterface i później implementuje to w klasie Checkerboard i jej używam w TicTacToe (bo teoretycznie jest już to przetestowane)