Robię moduł, który rysuje po teksturach w pamięci (przez "teksturę" mam na myśli zwykły bufor, ciąg bajtów z danymi o poszczególnych pikselach. A "rysowanie" to ustawienie konkretnych bajtów. Nic wspólnego z renderingiem na tym etapie).
Moduł ten będzie miał funkcje potrzebne do zaimplementowania edytora graficznego np.
- rysuj linię
- rysuj prostokąt
- rysuj kółko
- rysuj coś specjalnym pędzlem
I zastanawiam się, jak to testować/
O ile pewne rzeczy będą trywialne - np. rysuj prostokąt - to sprawdzę, czy są odpowiednie piksele ustawione na wyjściu (tak, żeby uformowały kształt prostokąta)
To przy rysowaniu linii już może być zagwozdka. Zakładam, że linie mogą być pochylone w różnych kierunkach. A to rodzi potrzebę zastosowania jakiegoś algorytmu do ich rysowania. Ja dość naiwnie zamierzam po prostu policzyć różnicę współrzędnych x, y między 2 punktami i zaczynając od pierwszego punktu, w każdym kroku będę dodawać tę różnicę podzieloną przez długość linii.
Jednak - co jeśli zmienię algorytm rysowania linii na algorytm Bresenhama? A co jeśli dodam antyaliasing do linii? Ciężko będzie napisać testy do tego w ten sposób, żeby się nie rozwaliły. Owszem, mogę zrobić "snapshot" i testować, czy dana linia wygląda tak samo jak wcześniej, ale taki snapshot przy zmianie implementacji będzie do wyrzucenia. Podobnie rysowanie specjalnym pędzlem. Wystarczy, że lekko zmienię parametry i piksele będą całkiem inne.
Może w ogóle dać sobie spokój z pisaniem unit testów do tego i testować to wszystko ręcznie, patrząc, czy wygląda dobrze? Tylko, że to się sprawdzi na początku, a później będę miał dużo tych narzędzi i ciężko będzie co chwila wszystko przeklikiwać.
Może więc zastosować jakiś przybliżoną metodę testowania?
Np. załóżmy, że mam teksturę o wymiarach 1024x1024, to nie sprawdzam czy każdy z ponad miliona bajtów jest taki sam, tylko raczej dzieliłbym tę teksturę na mniejsze części (na kafelki, taką szachownicę zrobić) i dla każdego kafelka liczyć ile pikseli ma zapalonych (dla uproszczenia załóżmy tylko 2 kolory) i jeśli liczba pikseli w kafelku jest większa niż wartość progowa, wtedy kafelek jest ustawiony jako 1, jeśli nie, to 0.
Wtedy potencjalnie jakbym zmienił algorytm rysowania czy parametry pędzla, to trochę by się to zmieniło, ale jednak na zmniejszonej dokładności do kafelka, okazałoby się, że kafelki są jednak takie same wciąż i nie trzeba przepisywać testów?
Czyli podsumowując. Zastanawiam się, czy najlepiej testować te rzeczy:
- ręcznie?
- za pomocą snapshotów?
- za pomocą podzielenia na kafelki i zmniejszenia dokładności ?
- jeszcze inaczej?
Ktoś miał może do czynienia z tego typu problemem albo ma jakieś pomysły?