diff --git a/CMakeLists.txt b/CMakeLists.txt index 15b11b2..4abe30d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,19 +12,32 @@ if(NOT CMAKE_BUILD_TYPE) endif() set(SRC_FILES - ${CMAKE_CURRENT_LIST_DIR}/main.cpp - ${CMAKE_CURRENT_LIST_DIR}/gamecube.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/main.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/gamecube.cpp ) set(INCLUDE_DIRS + ${CMAKE_CURRENT_LIST_DIR}/includes ${CMAKE_CURRENT_LIST_DIR}/linux + ${CMAKE_CURRENT_LIST_DIR}/raylib ) - +include_directories(${CMAKE_CURRENT_LIST_DIR}/raylib) add_executable(${EXECUTABLE_NAME} ${SRC_FILES}) target_include_directories(${EXECUTABLE_NAME} PRIVATE ${INCLUDE_DIRS}) target_link_libraries(${EXECUTABLE_NAME} PRIVATE - ${CMAKE_CURRENT_LIST_DIR}/linux/libgamematrix.a - ${CMAKE_CURRENT_LIST_DIR}/linux/libraylib.a + ${CMAKE_CURRENT_LIST_DIR}/windows/libgamematrix.a + ${CMAKE_CURRENT_LIST_DIR}/windows/libraylib.a + opengl32 + gdi32 + winmm +) +target_link_libraries(${EXECUTABLE_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/mac_x86/libgamematrix.a + ${CMAKE_CURRENT_LIST_DIR}/mac_x86/libraylib.a +) +target_link_libraries(${EXECUTABLE_NAME} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/mac_arm/libgamematrix.a + ${CMAKE_CURRENT_LIST_DIR}/mac_arm/libraylib.a ) # Checks if OSX and links appropriate frameworks (Only required on MacOS) @@ -33,3 +46,33 @@ if (APPLE) target_link_libraries(Prog3B "-framework Cocoa") target_link_libraries(Prog3B "-framework OpenGL") endif() + +add_executable(tests + src/tests.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/gamecube.cpp +) +target_include_directories(tests PRIVATE ${INCLUDE_DIRS}) + +target_link_libraries(tests PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/windows/libgamematrix.a + ${CMAKE_CURRENT_LIST_DIR}/windows/libraylib.a + opengl32 + gdi32 + winmm +) +target_link_libraries(tests PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/mac_x86/libgamematrix.a + ${CMAKE_CURRENT_LIST_DIR}/mac_x86/libraylib.a +) +target_link_libraries(tests PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/mac_arm/libgamematrix.a + ${CMAKE_CURRENT_LIST_DIR}/mac_arm/libraylib.a +) + +if (APPLE) + target_link_libraries(Prog3B PRIVATE "-framework IOKit") + target_link_libraries(Prog3B PRIVATE "-framework Cocoa") + target_link_libraries(Prog3B PRIVATE "-framework OpenGL") +endif() + + diff --git a/src/tests.cpp b/src/tests.cpp new file mode 100644 index 0000000..3b797cc --- /dev/null +++ b/src/tests.cpp @@ -0,0 +1,99 @@ +#include +#include +#include +#include "gamematrix.h" + +using Matrix4 = std::array,4>; +using Vec3 = std::array; + +bool eq(double a, double b) { + return std::fabs(a - b) < 0.0001; +} + +Matrix4 identity() { + Matrix4 I{}; + for (int i = 0; i < 4; i++) { + I[i][i] = 1.0; + } + return I; +} + +Vec3 applyMatrix(const Matrix4& M, const Vec3& v) { + Vec3 r{0,0,0}; + + r[0] = M[0][0]*v[0] + M[0][1]*v[1] + M[0][2]*v[2] + M[0][3]; + r[1] = M[1][0]*v[0] + M[1][1]*v[1] + M[1][2]*v[2] + M[1][3]; + r[2] = M[2][0]*v[0] + M[2][1]*v[1] + M[2][2]*v[2] + M[2][3]; + + return r; +} + +void testMatmulIdentity() { + Matrix4 A = identity(); + Matrix4 B = identity(); + Matrix4 C = gameMatrix::matmul(A, B); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + double expected = (i == j ? 1.0 : 0.0); + if (!eq(C[i][j], expected)) { + std::cout << "[FAIL] matmul Identity\n"; + return; + } + } + } + + std::cout << "[OK] matmul Identity\n"; +} + +void testTranslate() { + Vec3 pos{1,2,3}; + Matrix4 T = gameMatrix::translate(pos); + + if (eq(T[0][3], 1) && eq(T[1][3], 2) && eq(T[2][3], 3)) + std::cout << "[OK] translate\n"; + else + std::cout << "[FAIL] translate\n"; +} + +void testRotZ90() { + Vec3 v{1,0,0}; + Matrix4 R = gameMatrix::rot3D(90, 'z'); + Vec3 r = applyMatrix(R, v); + + if (eq(r[0], 0) && eq(r[1], 1) && eq(r[2], 0)) + std::cout << "[OK] rotZ 90°\n"; + else + std::cout << "[FAIL] rotZ 90°\n"; +} + +void testRotX180() { + Vec3 v{0,1,0}; + Matrix4 R = gameMatrix::rot3D(180, 'x'); + Vec3 r = applyMatrix(R, v); + + if (eq(r[0], 0) && eq(r[1], -1) && eq(r[2], 0)) + std::cout << "[OK] rotX 180°\n"; + else + std::cout << "[FAIL] rotX 180°\n"; +} + +void testRotY270() { + Vec3 v{1,0,0}; + Matrix4 R = gameMatrix::rot3D(270, 'y'); + Vec3 r = applyMatrix(R, v); + + if (eq(r[0], 0) && eq(r[1], 0) && eq(r[2], -1)) + std::cout << "[OK] rotY 270°\n"; + else + std::cout << "[FAIL] rotY 270°\n"; +} + +int main() { + testMatmulIdentity(); + testTranslate(); + testRotZ90(); + testRotX180(); + testRotY270(); + return 0; +} diff --git a/tests.txt b/tests.txt new file mode 100644 index 0000000..362182f --- /dev/null +++ b/tests.txt @@ -0,0 +1,36 @@ +============================================================ +Projekt: gamematrix (C++ Library) +Rolle: Tester +Datei: tests.txt +============================================================ + +# 1. Testplan Übersicht + +Ziel: Überprüfung der Funktionen matmul(), translate(), rot3D(). + +--------------------------------------------------------------------------------------------------------------- +| Funktion | Testfall | Eingabe | Erwartetes Ergebnis | Bemerkung | +|---------|------------------------|----------------------------------------------|---------------------------|---------------------------------| +| matmul | Identity * Identity | 4x4 Identity Matrizen | Identity | Basisfall | +| translate | Verschiebung | Vec3(1,2,3) | Matrix mit Translation | Letzte Spalte prüfen | +| rot3D | Rotation Z 90° | angle=90, axis='z', v=(1,0,0) | (0,1,0) | Anwendung auf Vektor | +| rot3D | Rotation X 180° | angle=180, axis='x', v=(0,1,0) | (0,-1,0) | Anwendung auf Vektor | +| rot3D | Rotation Y 270° | angle=270, axis='y', v=(1,0,0) | (0,0,-1) | Anwendung auf Vektor | +--------------------------------------------------------------------------------------------------------------- + +# 2. Testdaten + +- Matrizen für matmul: zwei Identity-Matrizen +- Vektoren für translate: Vec3(1,2,3) +- Vektoren für rot3D: (1,0,0), (0,1,0) + +# 3. Abnahmekriterien + +- Alle Testfälle laufen ohne Fehler durch. +- Ergebnisse stimmen mit erwarteten Ergebnissen überein. +- Keine unerwarteten Exceptions. +- Tester dokumentiert Erfolg oder Fehler im Terminal. + +============================================================ +Hinweis: Datei wird vom Tester gepflegt. +============================================================