paysages3d/src/tests/FluidMediumManager_Test.cpp

103 lines
3.6 KiB
C++

#include "BaseTestCase.h"
#include "SpaceSegment.h"
#include "Scenery.h"
#include "SoftwareRenderer.h"
#include "FluidMediumManager.h"
#include "FluidMediumInterface.h"
class FluidMediumManager_Test : public BaseTestCase {
protected:
virtual void setUp() {
scenery = new Scenery();
renderer = new SoftwareRenderer(scenery);
}
virtual void tearDown() {
delete renderer;
delete scenery;
}
Scenery *scenery;
SoftwareRenderer *renderer;
};
TEST_F(FluidMediumManager_Test, getTraversedMedia) {
FluidMediumManager manager(renderer);
int traversed;
FluidMediumSegment segments[10];
class FakeMedium : public FluidMediumInterface {
public:
void setCut(double ymin, double ymax) {
this->ymin = ymin;
this->ymax = ymax;
}
virtual bool checkInfluence(SpaceSegment &segment) const override {
return segment.intersectYInterval(this->ymin, this->ymax);
}
private:
double ymin = -2.0;
double ymax = -1.0;
};
SpaceSegment ray(Vector3(0.0, 0.0, 0.0), Vector3(8.0, 10.0, -4.0));
// Empty manager
traversed = manager.getTraversedMedia(segments, ray, 10);
ASSERT_EQ(0, traversed);
// Testing with 1 medium outside the range
FakeMedium m1;
manager.registerMedium(&m1);
traversed = manager.getTraversedMedia(segments, ray, 10);
ASSERT_EQ(0, traversed);
// Setting the medium in range
m1.setCut(1.0, 2.0);
traversed = manager.getTraversedMedia(segments, ray, 10);
ASSERT_EQ(1, traversed);
EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium);
EXPECT_VECTOR3_COORDS(segments[0].segment.getStart(), 0.8, 1.0, -0.4);
EXPECT_VECTOR3_COORDS(segments[0].segment.getEnd(), 1.6, 2.0, -0.8);
// Testing with 2 media
FakeMedium m2;
m2.setCut(4.0, 12.0);
manager.registerMedium(&m2);
traversed = manager.getTraversedMedia(segments, ray, 10);
ASSERT_EQ(2, traversed);
EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium);
EXPECT_VECTOR3_COORDS(segments[0].segment.getStart(), 0.8, 1.0, -0.4);
EXPECT_VECTOR3_COORDS(segments[0].segment.getEnd(), 1.6, 2.0, -0.8);
EXPECT_EQ((FluidMediumInterface *)&m2, segments[1].medium);
EXPECT_VECTOR3_COORDS(segments[1].segment.getStart(), 3.2, 4.0, -1.6);
EXPECT_VECTOR3_COORDS(segments[1].segment.getEnd(), 8.0, 10.0, -4.0);
// Testing with overlapping media
FakeMedium m3;
m3.setCut(3.0, 4.5);
manager.registerMedium(&m3);
traversed = manager.getTraversedMedia(segments, ray, 10);
ASSERT_EQ(3, traversed);
EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium);
EXPECT_VECTOR3_COORDS(segments[0].segment.getStart(), 0.8, 1.0, -0.4);
EXPECT_VECTOR3_COORDS(segments[0].segment.getEnd(), 1.6, 2.0, -0.8);
EXPECT_EQ((FluidMediumInterface *)&m2, segments[1].medium);
EXPECT_VECTOR3_COORDS(segments[1].segment.getStart(), 3.2, 4.0, -1.6);
EXPECT_VECTOR3_COORDS(segments[1].segment.getEnd(), 8.0, 10.0, -4.0);
EXPECT_EQ((FluidMediumInterface *)&m3, segments[2].medium);
EXPECT_VECTOR3_COORDS(segments[2].segment.getStart(), 2.4, 3.0, -1.2);
EXPECT_VECTOR3_COORDS(segments[2].segment.getEnd(), 3.6, 4.5, -1.8);
// Testing the segment count limit
traversed = manager.getTraversedMedia(segments, ray, 2);
ASSERT_EQ(2, traversed);
EXPECT_EQ((FluidMediumInterface *)&m1, segments[0].medium);
EXPECT_EQ((FluidMediumInterface *)&m2, segments[1].medium);
// Testing after clear
manager.clearMedia();
traversed = manager.getTraversedMedia(segments, ray, 10);
ASSERT_EQ(0, traversed);
}