3#define DOCTEST_CONFIG_IMPLEMENT
5#include "doctest_utils.h"
9TEST_CASE(
"SolarPosition sun position Boulder") {
16 float theta_s = sp.getSunElevation() * 180.f /
M_PI;
17 float phi_s = sp.getSunAzimuth() * 180.f /
M_PI;
19 DOCTEST_CHECK(std::fabs(theta_s - 29.49f) <= 10.0f);
20 DOCTEST_CHECK(std::fabs(phi_s - 154.18f) <= 5.0f);
23TEST_CASE(
"SolarPosition ambient longwave model") {
30 float temperature = 290.f;
31 float humidity = 0.5f;
34 DOCTEST_CHECK_NOTHROW(LW = sp.getAmbientLongwaveFlux(temperature, humidity));
36 DOCTEST_CHECK(doctest::Approx(310.03192f).epsilon(1e-6f) == LW);
39TEST_CASE(
"SolarPosition sunrise and sunset") {
45 DOCTEST_CHECK_NOTHROW(sunrise = sp.getSunriseTime());
47 DOCTEST_CHECK_NOTHROW(sunset = sp.getSunsetTime());
49 DOCTEST_CHECK(!(sunrise.
hour == 0 && sunrise.
minute == 0));
50 DOCTEST_CHECK(!(sunset.
hour == 0 && sunset.
minute == 0));
53TEST_CASE(
"SolarPosition sun direction vector") {
59 DOCTEST_CHECK_NOTHROW(dir = sp.getSunDirectionVector());
60 DOCTEST_CHECK(dir.
x != 0.f);
61 DOCTEST_CHECK(dir.
y != 0.f);
62 DOCTEST_CHECK(dir.
z != 0.f);
65TEST_CASE(
"SolarPosition sun direction spherical") {
71 DOCTEST_CHECK_NOTHROW(dir = sp.getSunDirectionSpherical());
73 DOCTEST_CHECK(dir.
azimuth > 0.f);
76TEST_CASE(
"SolarPosition flux and fractions") {
81 DOCTEST_CHECK_NOTHROW(flux = sp.getSolarFlux(101325.f, 300.f, 0.5f, 0.02f));
82 DOCTEST_CHECK(flux > 0.f);
84 float diffuse_fraction;
85 DOCTEST_CHECK_NOTHROW(diffuse_fraction = sp.getDiffuseFraction(101325.f, 300.f, 0.5f, 0.02f));
86 DOCTEST_CHECK(diffuse_fraction >= 0.f);
87 DOCTEST_CHECK(diffuse_fraction <= 1.f);
90 DOCTEST_CHECK_NOTHROW(flux_par = sp.getSolarFluxPAR(101325.f, 300.f, 0.5f, 0.02f));
91 DOCTEST_CHECK(flux_par > 0.f);
94 DOCTEST_CHECK_NOTHROW(flux_nir = sp.getSolarFluxNIR(101325.f, 300.f, 0.5f, 0.02f));
95 DOCTEST_CHECK(flux_nir > 0.f);
98TEST_CASE(
"SolarPosition elevation, zenith, azimuth") {
103 DOCTEST_CHECK_NOTHROW(elevation = sp.getSunElevation());
104 DOCTEST_CHECK(elevation >= 0.f);
105 DOCTEST_CHECK(elevation <=
M_PI / 2.f);
108 DOCTEST_CHECK_NOTHROW(zenith = sp.getSunZenith());
109 DOCTEST_CHECK(zenith >= 0.f);
110 DOCTEST_CHECK(zenith <=
M_PI);
113 DOCTEST_CHECK_NOTHROW(azimuth = sp.getSunAzimuth());
114 DOCTEST_CHECK(azimuth >= 0.f);
115 DOCTEST_CHECK(azimuth <= 2.f *
M_PI);
118TEST_CASE(
"SolarPosition turbidity calibration") {
121 std::string label =
"test_flux_timeseries";
128 DOCTEST_CHECK_NOTHROW(turbidity = sp.calibrateTurbidityFromTimeseries(label));
129 DOCTEST_CHECK(turbidity > 0.f);
132TEST_CASE(
"SolarPosition invalid lat/long") {
144TEST_CASE(
"SolarPosition invalid solar angle") {
151 DOCTEST_CHECK_NOTHROW(flux = sp.getSolarFlux(101325.f, 300.f, 0.5f, 0.02f));
152 DOCTEST_CHECK(flux == 0.f);
156TEST_CASE(
"SolarPosition solor position overridden") {
163 DOCTEST_CHECK_NOTHROW(elevation = sp.getSunElevation());
164 DOCTEST_CHECK(elevation >= 0.f);
165 DOCTEST_CHECK(elevation <=
M_PI / 2.f);
168 DOCTEST_CHECK_NOTHROW(zenith = sp.getSunZenith());
169 DOCTEST_CHECK(zenith >= 0.f);
170 DOCTEST_CHECK(zenith <=
M_PI);
173 DOCTEST_CHECK_NOTHROW(azimuth = sp.getSunAzimuth());
174 DOCTEST_CHECK(azimuth >= 0.f);
175 DOCTEST_CHECK(azimuth <= 2.f *
M_PI);
178 DOCTEST_CHECK_NOTHROW(sun_vector = sp.getSunDirectionVector());
181 DOCTEST_CHECK_NOTHROW(sun_spherical = sp.getSunDirectionSpherical());
184TEST_CASE(
"SolarPosition cloud calibration") {
193 DOCTEST_CHECK_NOTHROW(sp.enableCloudCalibration(
"net_radiation"));
196 DOCTEST_CHECK_NOTHROW(flux = sp.getSolarFlux(101325.f, 300.f, 0.5f, 0.02f));
197 DOCTEST_CHECK(flux > 0.f);
199 float diffuse_fraction;
200 DOCTEST_CHECK_NOTHROW(diffuse_fraction = sp.getDiffuseFraction(101325.f, 300.f, 0.5f, 0.02f));
201 DOCTEST_CHECK(diffuse_fraction >= 0.f);
202 DOCTEST_CHECK(diffuse_fraction <= 1.f);
205 DOCTEST_CHECK_NOTHROW(flux_par = sp.getSolarFluxPAR(101325.f, 300.f, 0.5f, 0.02f));
206 DOCTEST_CHECK(flux_par > 0.f);
209 DOCTEST_CHECK_NOTHROW(flux_nir = sp.getSolarFluxNIR(101325.f, 300.f, 0.5f, 0.02f));
210 DOCTEST_CHECK(flux_nir > 0.f);
212 DOCTEST_CHECK_NOTHROW(sp.disableCloudCalibration());
215 DOCTEST_CHECK_THROWS_AS(sp.enableCloudCalibration(
"non_existent_timeseries"), std::runtime_error);
218TEST_CASE(
"SolarPosition turbidity calculation") {
225 DOCTEST_CHECK_NOTHROW(turbidity = sp.calibrateTurbidityFromTimeseries(
"net_radiation"));
226 DOCTEST_CHECK(turbidity > 0.f);
229 DOCTEST_CHECK_THROWS_AS(turbidity = sp.calibrateTurbidityFromTimeseries(
"non_existent_timeseries"), std::runtime_error);
233 return helios::runDoctestWithValidation(argc, argv);