Simgear::test_precipitation test coverage

Lines:     0.0% >> 92.3%
Functions: 0.0% >> 97.1%

Memory leaks resolved - reclaiming 169kb in 126 blocks
No memory leaks remain
This commit is contained in:
xDraconian
2017-12-30 08:56:17 -06:00
committed by James Turner
parent e7356223bb
commit 7f7c632914
3 changed files with 252 additions and 14 deletions

View File

@@ -7,7 +7,7 @@
*
* @brief Precipitation effects to draw rain and snow.
*
* @par Licences
* @par License
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
@@ -25,7 +25,6 @@
*/
#include "precipitation.hxx"
//#include "visual_enviro.hxx"
#include <simgear/constants.h>
#include <osg/ClipNode>
@@ -65,7 +64,7 @@ bool SGPrecipitation::getEnabled() const
*/
osg::Group* SGPrecipitation::build(void)
{
osg::Group* group = new osg::Group;
osg::ref_ptr<osg::Group> group = new osg::Group;
_precipitationEffect->snow(0);
_precipitationEffect->rain(0);
@@ -73,8 +72,9 @@ osg::Group* SGPrecipitation::build(void)
if (_clip_distance!=0.0)
{
osg::ref_ptr<osg::ClipNode> clipNode = new osg::ClipNode;
clipNode->addClipPlane( new osg::ClipPlane( 0 ) );
clipNode->getClipPlane(0)->setClipPlane( 0.0, 0.0, -1.0, -_clip_distance );
osg::ref_ptr<osg::ClipPlane> clipPlane = new osg::ClipPlane(0);
clipNode->addClipPlane(clipPlane.get());
clipNode->getClipPlane(0)->setClipPlane(0.0, 0.0, -1.0, -_clip_distance);
clipNode->setReferenceFrame(osg::ClipNode::ABSOLUTE_RF);
clipNode->addChild(_precipitationEffect.get());
@@ -87,7 +87,7 @@ osg::Group* SGPrecipitation::build(void)
group->setNodeMask( ~(simgear::CASTSHADOW_BIT | simgear::MODELLIGHT_BIT) );
return group;
return group.release();
}
@@ -140,8 +140,8 @@ void SGPrecipitation::setRainDropletSize(float size)
/**
* @brief Define the illumination multiplier
*
* This function permits you to define and change the rain droplet size
* which is used if external droplet size control is enabled
* This function permits you to define and change the brightness
* of the precipitation.
*/
void SGPrecipitation::setIllumination(float illumination)
@@ -163,10 +163,9 @@ void SGPrecipitation::setSnowFlakeSize(float size)
/**
* @brief Define the rain droplet size
* @brief Define the clip plane distance
*
* This function permits you to define and change the rain droplet size
* which is used if external droplet size control is enabled
* This function permits you to define and change the clip plane distance.
*/
void SGPrecipitation::setClipDistance(float distance)
@@ -224,7 +223,7 @@ void SGPrecipitation::setWindProperty(double heading, double speed)
* Be careful, if snow and rain intensity are greater than '0', snow effect
* will be first.
*
* The settings come from the osgParticule/PrecipitationEffect.cpp exemple.
* The settings come from the osgParticle/PrecipitationEffect.cpp example.
*/
bool SGPrecipitation::update(void)
{

View File

@@ -34,7 +34,7 @@
class SGPrecipitation : public osg::Referenced
{
private:
protected:
bool _freeze;
bool _enabled;
bool _droplet_external;
@@ -66,7 +66,7 @@ public:
void setIllumination(float);
void setClipDistance(float);
void setEnabled( bool );
void setEnabled(bool);
bool getEnabled() const;
};

View File

@@ -0,0 +1,239 @@
/**************************************************************************
* test_precipitation.cxx -- unit-tests for SGPrecipitation class
*
* Copyright (C) 2017 Scott Giese (xDraconian) - <scttgs0@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $Id$
**************************************************************************/
#include <cmath>
#include <memory>
#include <osg/Group>
#include <simgear/constants.h>
#include <simgear/misc/test_macros.hxx>
#include "precipitation.hxx"
using std::cout;
using std::cerr;
using std::endl;
class SGPrecipitationTestFixture : public SGPrecipitation
{
public:
osg::ref_ptr<osg::Group> _group;
void test_configuration()
{
_group = build();
SG_VERIFY(getEnabled());
SG_VERIFY(_precipitationEffect);
SG_CHECK_EQUAL_EP(_rain_intensity, 0.0f);
SG_CHECK_EQUAL_EP(_snow_intensity, 0.0f);
SG_VERIFY(!_freeze);
}
void test_rain()
{
int count = 500;
do {
if (--count == 0) {
cerr << "error: method setRainIntensity took too long.";
exit(EXIT_FAILURE);
}
float saveRainIntensity = _rain_intensity;
setRainIntensity(0.4f);
update();
SG_CHECK_GE(_rain_intensity, saveRainIntensity);
} while (std::fabs(_rain_intensity - 0.4f) > 0.00001f);
SG_CHECK_EQUAL_EP2(_rain_intensity, 0.4f, 0.00001f);
}
void test_rain_external()
{
int count = 500;
do {
if (--count == 0) {
cerr << "error: method setRainIntensity-external took too long.";
exit(EXIT_FAILURE);
}
float saveRainIntensity = _rain_intensity;
setRainIntensity(0.25f);
update();
SG_CHECK_LE(_rain_intensity, saveRainIntensity);
} while (std::fabs(_rain_intensity - 0.25f) > 0.00001f);
// call once more to ensure we have intensity precisely set
setRainIntensity(0.25f);
update();
SG_CHECK_EQUAL_EP2(_rain_intensity, 0.25f, 0.00001f);
}
void test_freeze()
{
float saveParticleSize = _precipitationEffect->getParticleSize();
float saveParticleSpeed = std::fabs(_precipitationEffect->getParticleSpeed());
// change rain to snow
// expect particle size to increase
// expect particle speed to decrease
setFreezing(true);
update();
SG_CHECK_GT(_precipitationEffect->getParticleSize(), saveParticleSize);
SG_CHECK_LT(std::fabs(_precipitationEffect->getParticleSpeed()), saveParticleSpeed);
}
void test_snow()
{
int count = 500;
do {
if (--count == 0) {
cerr << "error: method setSnowIntensity took too long.";
exit(EXIT_FAILURE);
}
float saveSnowIntensity = _snow_intensity;
// not a typo - when freezing is enabled, snow intensity is keep in sync with rain intensity
setRainIntensity(0.3f);
update();
SG_CHECK_LE(_snow_intensity, saveSnowIntensity);
} while (std::fabs(_snow_intensity - 0.3f) > 0.00001f);
SG_CHECK_EQUAL_EP2(_snow_intensity, 0.3f, 0.00001f);
}
void test_snow_external()
{
setRainDropletSize(0.025f);
setSnowFlakeSize(0.04f);
setDropletExternal(true);
int count = 600;
do {
if (--count == 0) {
cerr << "error: method setSnowIntensity-external took too long.";
exit(EXIT_FAILURE);
}
float saveSnowIntensity = _snow_intensity;
setSnowIntensity(0.55f);
update();
SG_CHECK_GE(_snow_intensity, saveSnowIntensity);
} while (std::fabs(_snow_intensity - 0.55f) > 0.00001f);
// call once more to ensure we have intensity precisely set
setSnowIntensity(0.55f);
update();
SG_CHECK_EQUAL_EP2(_snow_intensity, 0.55f, 0.00001f);
}
void test_unfreeze()
{
float saveParticleSize = _precipitationEffect->getParticleSize();
float saveParticleSpeed = std::fabs(_precipitationEffect->getParticleSpeed());
// change snow to rain
// expect particle size to decrease
// expect particle speed to increase
setFreezing(false);
update();
SG_CHECK_LT(_precipitationEffect->getParticleSize(), saveParticleSize);
SG_CHECK_GT(std::fabs(_precipitationEffect->getParticleSpeed()), saveParticleSpeed);
}
void test_no_precipitation()
{
setEnabled(false);
SG_VERIFY(!getEnabled());
update();
// intensity drops to zero, so we should see this reflected in the particles
SG_CHECK_EQUAL_EP(_precipitationEffect->getParticleSize(), 0.01f);
SG_CHECK_EQUAL_EP(_precipitationEffect->getParticleSpeed(), -2.0f);
setEnabled(true);
}
void test_illumination()
{
setIllumination(0.87f);
SG_CHECK_EQUAL_EP(_illumination, 0.87f);
}
void test_clipping()
{
setClipDistance(6.5);
SG_CHECK_EQUAL_EP(_clip_distance, 6.5f);
}
void test_wind()
{
setWindProperty(87.0f, 0.7f);
auto vec = _wind_vec;
SG_CHECK_EQUAL_EP2(vec[0], 0.011166f, 0.00001f);
SG_CHECK_EQUAL_EP2(vec[1], -0.213068f, 0.00001f);
SG_CHECK_EQUAL_EP2(vec[2], 0.0f, 0.00001f);
}
};
int main(int argc, char* argv[])
{
auto fixture = std::unique_ptr<SGPrecipitationTestFixture>(new SGPrecipitationTestFixture);
fixture->test_configuration();
fixture->test_rain();
fixture->test_freeze();
fixture->test_snow();
fixture->test_unfreeze();
fixture->test_no_precipitation();
fixture->test_snow_external();
fixture->test_rain_external();
fixture->test_illumination();
fixture->test_clipping();
fixture->test_wind();
fixture->test_no_precipitation();
cout << "all tests passed OK" << endl;
return EXIT_SUCCESS;
}