util/GeoLink.h
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | #include <QRegularExpression> | ||
| 3 | #include <QUrl> | ||
| 4 | #include <cmath> | ||
| 5 | |||
| 6 | namespace GeoLink { | ||
| 7 | 14 | inline QUrl validated(const QString &input) { | |
| 8 |
1/3✗ Branch 3 → 4 not taken.
✓ Branch 3 → 6 taken 14 times.
✗ Branch 4 → 5 not taken.
|
14 | if (input.size() > 256) return {}; |
| 9 | // S106-219: the scheme is case-insensitive (RFC 3986 §3.1): GEO: is geo:. | ||
| 10 |
4/4✓ Branch 7 → 8 taken 14 times.
✓ Branch 8 → 9 taken 3 times.
✓ Branch 8 → 10 taken 11 times.
✓ Branch 9 → 11 taken 3 times.
|
14 | const QString value = input.startsWith(QLatin1String("geo:"), Qt::CaseInsensitive) ? input.mid(4) : input; |
| 11 | 2 | static const QRegularExpression pattern(QStringLiteral( | |
| 12 |
4/7✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 24 taken 13 times.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 24 not taken.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 107 → 108 not taken.
✗ Branch 107 → 109 not taken.
|
22 | R"(^([+-]?[0-9]+(?:\.[0-9]+)?),([+-]?[0-9]+(?:\.[0-9]+)?)(?:,([+-]?[0-9]+(?:\.[0-9]+)?))?(?:;u=([0-9]+(?:\.[0-9]+)?))?(?:\?z=([0-9]+))?\z)")); |
| 13 |
1/1✓ Branch 25 → 26 taken 14 times.
|
14 | const auto match = pattern.match(value); |
| 14 |
4/4✓ Branch 26 → 27 taken 14 times.
✓ Branch 27 → 28 taken 6 times.
✓ Branch 27 → 30 taken 8 times.
✓ Branch 28 → 29 taken 6 times.
|
14 | if (!match.hasMatch()) return {}; |
| 15 | 8 | bool latitudeOk = false, longitudeOk = false; | |
| 16 |
4/4✓ Branch 30 → 31 taken 8 times.
✓ Branch 31 → 32 taken 8 times.
✓ Branch 33 → 34 taken 8 times.
✓ Branch 34 → 35 taken 8 times.
|
8 | const double latitude = match.captured(1).toDouble(&latitudeOk), longitude = match.captured(2).toDouble(&longitudeOk); |
| 17 |
12/18✓ Branch 36 → 37 taken 8 times.
✗ Branch 36 → 46 not taken.
✓ Branch 37 → 38 taken 8 times.
✗ Branch 37 → 46 not taken.
✓ Branch 39 → 40 taken 8 times.
✗ Branch 39 → 46 not taken.
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 46 not taken.
✓ Branch 42 → 43 taken 8 times.
✗ Branch 42 → 46 not taken.
✓ Branch 43 → 44 taken 7 times.
✓ Branch 43 → 46 taken 1 time.
✓ Branch 44 → 45 taken 6 times.
✓ Branch 44 → 46 taken 1 time.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 47 taken 6 times.
✓ Branch 48 → 49 taken 2 times.
✓ Branch 48 → 51 taken 6 times.
|
8 | if (!latitudeOk || !longitudeOk || !std::isfinite(latitude) || !std::isfinite(longitude) || latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) |
| 18 |
1/1✓ Branch 49 → 50 taken 2 times.
|
2 | return {}; |
| 19 |
2/2✓ Branch 72 → 53 taken 12 times.
✓ Branch 72 → 73 taken 6 times.
|
18 | for (int field : {3, 4}) { |
| 20 |
3/3✓ Branch 53 → 54 taken 12 times.
✓ Branch 56 → 57 taken 10 times.
✓ Branch 56 → 58 taken 2 times.
|
12 | if (match.captured(field).isEmpty()) continue; |
| 21 | 2 | bool ok = false; | |
| 22 |
2/2✓ Branch 58 → 59 taken 2 times.
✓ Branch 59 → 60 taken 2 times.
|
2 | const double number = match.captured(field).toDouble(&ok); |
| 23 |
3/7✓ Branch 61 → 62 taken 2 times.
✗ Branch 61 → 64 not taken.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 2 times.
✗ Branch 66 → 67 not taken.
✓ Branch 66 → 69 taken 2 times.
✗ Branch 67 → 68 not taken.
|
2 | if (!ok || !std::isfinite(number)) return {}; |
| 24 | } | ||
| 25 |
3/3✓ Branch 73 → 74 taken 6 times.
✓ Branch 76 → 77 taken 2 times.
✓ Branch 76 → 85 taken 4 times.
|
6 | if (!match.captured(5).isEmpty()) { |
| 26 | 2 | bool ok = false; | |
| 27 |
2/2✓ Branch 77 → 78 taken 2 times.
✓ Branch 78 → 79 taken 2 times.
|
2 | const int zoom = match.captured(5).toInt(&ok); |
| 28 |
4/5✓ Branch 80 → 81 taken 1 time.
✓ Branch 80 → 82 taken 1 time.
✗ Branch 81 → 82 not taken.
✓ Branch 81 → 84 taken 1 time.
✓ Branch 82 → 83 taken 1 time.
|
2 | if (!ok || zoom > 22) return {}; |
| 29 | } | ||
| 30 |
2/2✓ Branch 88 → 89 taken 5 times.
✓ Branch 89 → 90 taken 5 times.
|
5 | return QUrl(QStringLiteral("geo:") + value); |
| 31 | 14 | } | |
| 32 | } // namespace GeoLink | ||
| 33 |