package com.mythlane.chainlightning.chain; import java.util.List; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; final class ParticleTrailTest { private static final double EPS = 1e-9; @Test void zeroDistance() { Vec3 p = new Vec3(2, 3, 4); List out = ParticleTrail.sample(p, p, 4.0); assertTrue(out.isEmpty()); } @Test void subBlockDistance() { // distance 0.5 along X with density 4 → ceil(2.0) = 2 Vec3 from = new Vec3(0, 0, 0); Vec3 to = new Vec3(0.5, 0, 0); List out = ParticleTrail.sample(from, to, 4.0); assertEquals(2, out.size()); // Both points strictly between endpoints for (Vec3 v : out) { assertTrue(from.distanceSquared(v) > EPS, "sample equals from"); assertTrue(to.distanceSquared(v) > EPS, "sample equals to"); } } @Test void integerDistanceCount() { Vec3 from = new Vec3(0, 0, 0); Vec3 to = new Vec3(5, 0, 0); List out = ParticleTrail.sample(from, to, 4.0); assertEquals(20, out.size()); } @Test void fractionalDistanceCount() { Vec3 from = new Vec3(0, 0, 0); Vec3 to = new Vec3(3.7, 0, 0); List out = ParticleTrail.sample(from, to, 4.0); // ceil(3.7 * 4) = ceil(14.8) = 15 assertEquals(15, out.size()); } @Test void endpointsExcluded() { Vec3 from = new Vec3(1, 2, 3); Vec3 to = new Vec3(7, 8, 9); List out = ParticleTrail.sample(from, to, 4.0); assertTrue(out.size() > 0); for (Vec3 v : out) { assertTrue(from.distanceSquared(v) > EPS, "sample equals from endpoint"); assertTrue(to.distanceSquared(v) > EPS, "sample equals to endpoint"); } } @Test void uniformSpacing() { Vec3 from = new Vec3(0, 0, 0); Vec3 to = new Vec3(5, 0, 0); List out = ParticleTrail.sample(from, to, 4.0); assertEquals(20, out.size()); double total = from.distance(to); double expectedSpacing = total / (out.size() + 1); // from -> first assertEquals(expectedSpacing, from.distance(out.get(0)), EPS); // last -> to assertEquals(expectedSpacing, out.get(out.size() - 1).distance(to), EPS); // consecutive for (int i = 1; i < out.size(); i++) { assertEquals(expectedSpacing, out.get(i - 1).distance(out.get(i)), EPS); } } }