diff --git a/Makefile b/Makefile index 93fe440..f28e9ca 100644 --- a/Makefile +++ b/Makefile @@ -22,4 +22,10 @@ src/controls.o: src/controls.c include/controls.h include/particle.h $(CC) $(CFLAGS) -c -o $@ $< clean: - rm -f src/*.o gravity_simulation \ No newline at end of file + rm -f src/*.o gravity_simulation + +tests/test_quadtree: tests/test_quadtree.c src/quadtree.c include/quadtree.h include/particle_struct.h + $(CC) $(CFLAGS) -o $@ tests/test_quadtree.c src/quadtree.c -lm + +test: tests/test_quadtree + ./tests/test_quadtree diff --git a/README.md b/README.md index 1d3fa13..09bf407 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,12 @@ To set up and compile the project on your local machine, follow these steps: ./gravity_simulation ``` +5. **Run the unit tests**: + + ```bash + make test + ``` + ## Usage To run the simulation: diff --git a/tests/test_quadtree.c b/tests/test_quadtree.c new file mode 100644 index 0000000..2cf93e3 --- /dev/null +++ b/tests/test_quadtree.c @@ -0,0 +1,38 @@ +#include "quadtree.h" +#include +#include +#include + +int main(void) { + QuadNode *root = createNode(0.0f, 0.0f, 1.0f, 1.0f); + + Particle p1 = { .x = 0.25f, .y = 0.25f, .vx = 0, .vy = 0, .ax = 0, .ay = 0, .mass = 2.0f }; + Particle p2 = { .x = 0.75f, .y = 0.75f, .vx = 0, .vy = 0, .ax = 0, .ay = 0, .mass = 3.0f }; + Particle p3 = { .x = 0.50f, .y = 0.50f, .vx = 0, .vy = 0, .ax = 0, .ay = 0, .mass = 5.0f }; + + insertParticle(root, &p1); + assert(fabs(root->mass - p1.mass) < 1e-6); + assert(fabs(root->centerX - p1.x) < 1e-6); + assert(fabs(root->centerY - p1.y) < 1e-6); + + insertParticle(root, &p2); + float totalMass = p1.mass + p2.mass; + float expectedX = (p1.x * p1.mass + p2.x * p2.mass) / totalMass; + float expectedY = (p1.y * p1.mass + p2.y * p2.mass) / totalMass; + assert(fabs(root->mass - totalMass) < 1e-6); + assert(fabs(root->centerX - expectedX) < 1e-6); + assert(fabs(root->centerY - expectedY) < 1e-6); + + insertParticle(root, &p3); + totalMass += p3.mass; + expectedX = (p1.x * p1.mass + p2.x * p2.mass + p3.x * p3.mass) / totalMass; + expectedY = (p1.y * p1.mass + p2.y * p2.mass + p3.y * p3.mass) / totalMass; + assert(fabs(root->mass - totalMass) < 1e-6); + assert(fabs(root->centerX - expectedX) < 1e-6); + assert(fabs(root->centerY - expectedY) < 1e-6); + + freeQuadtree(root); + printf("quadtree tests passed\n"); + return 0; +} +