TerrainGen coverage


terraingen/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
46 / 48
95.8%
Branches:
42 / 48
87.5%
Functions:
5 / 5
100.0%

random/value_distribution.cpp
Line Branch Exec Source
1 #include "terraingen/random/value_distribution.h"
2
3 #include <algorithm>
4 #include <cmath>
5 #include <numbers>
6 #include <stdexcept>
7
8 namespace terraingen {
9
10 1035847 double StandardNormal(double u1, double u2) {
11 1035847 return std::sqrt(-2.0 * std::log1p(-u1)) * std::cos(2.0 * std::numbers::pi * u2);
12 }
13
14 61778477 double ValueDistribution::Sample(double u1, double u2) const {
15 61778477 double value = a;
16
4/5
✓ Branch 0 taken 60589429 times.
✓ Branch 1 taken 545708 times.
✓ Branch 2 taken 64107 times.
✓ Branch 3 taken 579233 times.
✗ Branch 4 not taken.
61778477 switch (kind) {
17 60589429 case Kind::Constant:
18 60589429 break;
19 545708 case Kind::Uniform:
20 545708 value = a + (b - a) * u1;
21 545708 break;
22 64107 case Kind::Normal:
23 64107 value = a + b * StandardNormal(u1, u2);
24 64107 break;
25 579233 case Kind::LogNormal:
26 579233 value = a * std::exp(b * StandardNormal(u1, u2));
27 579233 break;
28 }
29
1/1
✓ Branch 1 taken 61778477 times.
123556954 return std::clamp(value, min, max);
30 }
31
32 992208 double ValueDistribution::Lowest() const {
33
3/4
✓ Branch 0 taken 990016 times.
✓ Branch 1 taken 1276 times.
✓ Branch 2 taken 916 times.
✗ Branch 3 not taken.
992208 switch (kind) {
34 990016 case Kind::Constant:
35 case Kind::Uniform:
36 990016 return std::clamp(a, min, max);
37 1276 case Kind::Normal:
38 1276 return min;
39 916 case Kind::LogNormal:
40 916 return std::fmax(0.0, min);
41 }
42 ✗ return min;
43 }
44
45 763115 double ValueDistribution::Highest() const {
46
3/4
✓ Branch 0 taken 15277 times.
✓ Branch 1 taken 745256 times.
✓ Branch 2 taken 2582 times.
✗ Branch 3 not taken.
763115 switch (kind) {
47 15277 case Kind::Constant:
48 15277 return std::clamp(a, min, max);
49 745256 case Kind::Uniform:
50 745256 return std::clamp(b, min, max);
51 2582 case Kind::Normal:
52 case Kind::LogNormal:
53 2582 return max;
54 }
55 ✗ return max;
56 }
57
58 1239418 void ValidateValueDistribution(const ValueDistribution& d) {
59
7/10
✓ Branch 1 taken 1239417 times.
✓ Branch 2 taken 1 time.
✓ Branch 4 taken 1239417 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1239417 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1239417 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1239416 times.
2478835 if (!(std::isfinite(d.a) && std::isfinite(d.b)) || std::isnan(d.min) || std::isnan(d.max) ||
60
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1239416 times.
1239417 d.min > d.max) {
61
1/1
✓ Branch 2 taken 2 times.
2 throw std::invalid_argument("Distribution parameters must be finite with min <= max");
62 }
63
4/4
✓ Branch 0 taken 986776 times.
✓ Branch 1 taken 252640 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 986773 times.
1239416 if (d.kind == ValueDistribution::Kind::Uniform && d.b < d.a) {
64
1/1
✓ Branch 2 taken 3 times.
3 throw std::invalid_argument("A uniform distribution needs b >= a");
65 }
66 3716952 if ((d.kind == ValueDistribution::Kind::Normal ||
67
6/6
✓ Branch 0 taken 1238126 times.
✓ Branch 1 taken 1287 times.
✓ Branch 2 taken 925 times.
✓ Branch 3 taken 1237201 times.
✓ Branch 4 taken 11 times.
✓ Branch 5 taken 1239402 times.
1241625 d.kind == ValueDistribution::Kind::LogNormal) &&
68
4/4
✓ Branch 0 taken 2211 times.
✓ Branch 1 taken 1 time.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2201 times.
2212 (d.b < 0.0 || !std::isfinite(d.max))) {
69 throw std::invalid_argument(
70
1/1
✓ Branch 2 taken 11 times.
11 "Normal and log-normal distributions need a non-negative spread and a finite max");
71 }
72
4/4
✓ Branch 0 taken 920 times.
✓ Branch 1 taken 1238482 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 919 times.
1239402 if (d.kind == ValueDistribution::Kind::LogNormal && !(d.a > 0.0)) {
73
1/1
✓ Branch 2 taken 1 time.
1 throw std::invalid_argument("A log-normal distribution needs a positive median");
74 }
75 1239401 }
76
77 } // namespace terraingen
78