cesium-native/Cesium3DTilesContent/test/TestSkirtMeshMetadata.cpp

272 lines
9.2 KiB
C++

#include <CesiumGltfContent/SkirtMeshMetadata.h>
#include <CesiumUtility/JsonValue.h>
#include <CesiumUtility/Math.h>
#include <doctest/doctest.h>
#include <optional>
using namespace CesiumGltfContent;
using namespace CesiumUtility;
TEST_CASE("Test converting skirt mesh metadata to gltf extras") {
SkirtMeshMetadata skirtMeshMetadata;
skirtMeshMetadata.noSkirtIndicesBegin = 0;
skirtMeshMetadata.noSkirtIndicesCount = 12;
skirtMeshMetadata.meshCenter = glm::dvec3(23.4, 12.3, 11.0);
skirtMeshMetadata.skirtWestHeight = 12.2;
skirtMeshMetadata.skirtSouthHeight = 0.2;
skirtMeshMetadata.skirtEastHeight = 24.2;
skirtMeshMetadata.skirtNorthHeight = 10.0;
JsonValue::Object extras =
SkirtMeshMetadata::createGltfExtras(skirtMeshMetadata);
REQUIRE(extras.find("skirtMeshMetadata") != extras.end());
JsonValue& gltfSkirt = extras["skirtMeshMetadata"];
const auto* pNoSkirtRange =
gltfSkirt.getValuePtrForKey<JsonValue::Array>("noSkirtRange");
REQUIRE(pNoSkirtRange);
REQUIRE((*pNoSkirtRange)[0].getSafeNumberOrDefault<double>(-1.0) == 0.0);
REQUIRE((*pNoSkirtRange)[1].getSafeNumberOrDefault<double>(-1.0) == 12.0);
const auto* pMeshCenter =
gltfSkirt.getValuePtrForKey<JsonValue::Array>("meshCenter");
REQUIRE(Math::equalsEpsilon(
(*pMeshCenter)[0].getSafeNumberOrDefault<double>(0.0),
skirtMeshMetadata.meshCenter.x,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
(*pMeshCenter)[1].getSafeNumberOrDefault<double>(0.0),
skirtMeshMetadata.meshCenter.y,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
(*pMeshCenter)[2].getSafeNumberOrDefault<double>(0.0),
skirtMeshMetadata.meshCenter.z,
Math::Epsilon7));
const std::optional<double> maybeSkirtWestHeight =
gltfSkirt.getSafeNumericalValueForKey<double>("skirtWestHeight");
REQUIRE(maybeSkirtWestHeight);
REQUIRE(Math::equalsEpsilon(
*maybeSkirtWestHeight,
skirtMeshMetadata.skirtWestHeight,
Math::Epsilon7));
const std::optional<double> maybeSkirtSouthHeight =
gltfSkirt.getSafeNumericalValueForKey<double>("skirtSouthHeight");
REQUIRE(maybeSkirtSouthHeight);
REQUIRE(Math::equalsEpsilon(
*maybeSkirtSouthHeight,
skirtMeshMetadata.skirtSouthHeight,
Math::Epsilon7));
const std::optional<double> maybeSkirtEastHeight =
gltfSkirt.getSafeNumericalValueForKey<double>("skirtEastHeight");
REQUIRE(maybeSkirtEastHeight);
REQUIRE(Math::equalsEpsilon(
*maybeSkirtEastHeight,
skirtMeshMetadata.skirtEastHeight,
Math::Epsilon7));
const std::optional<double> maybeSkirtNorthHeight =
gltfSkirt.getSafeNumericalValueForKey<double>("skirtNorthHeight");
REQUIRE(maybeSkirtNorthHeight);
REQUIRE(Math::equalsEpsilon(
*maybeSkirtNorthHeight,
skirtMeshMetadata.skirtNorthHeight,
Math::Epsilon7));
}
TEST_CASE("Test converting gltf extras to skirt mesh metadata") {
// mock gltf extras for skirt mesh metadata
JsonValue::Object gltfSkirtMeshMetadata = {
{"noSkirtRange", JsonValue::Array{0, 12, 24, 48}},
{"meshCenter", JsonValue::Array{1.0, 2.0, 3.0}},
{"skirtWestHeight", 12.4},
{"skirtSouthHeight", 10.0},
{"skirtEastHeight", 2.4},
{"skirtNorthHeight", 1.4}};
SUBCASE("Gltf Extras has correct format") {
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
SkirtMeshMetadata skirtMeshMetadata =
*SkirtMeshMetadata::parseFromGltfExtras(extras);
REQUIRE(skirtMeshMetadata.noSkirtIndicesBegin == 0);
REQUIRE(skirtMeshMetadata.noSkirtIndicesCount == 12);
REQUIRE(skirtMeshMetadata.noSkirtVerticesBegin == 24);
REQUIRE(skirtMeshMetadata.noSkirtVerticesCount == 48);
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.meshCenter.x,
1.0,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.meshCenter.y,
2.0,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.meshCenter.z,
3.0,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.skirtWestHeight,
12.4,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.skirtSouthHeight,
10.0,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.skirtEastHeight,
2.4,
Math::Epsilon7));
REQUIRE(Math::equalsEpsilon(
skirtMeshMetadata.skirtNorthHeight,
1.4,
Math::Epsilon7));
}
SUBCASE("Gltf Extras has incorrect noSkirtRange field") {
SUBCASE("missing noSkirtRange field") {
gltfSkirtMeshMetadata.erase("noSkirtRange");
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("noSkirtRange field has wrong type") {
gltfSkirtMeshMetadata["noSkirtRange"] = 12;
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("noSkirtRange field has only one element array") {
gltfSkirtMeshMetadata["noSkirtRange"] = JsonValue::Array{0};
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("noSkirtRange field has two elements array but not integer") {
gltfSkirtMeshMetadata["noSkirtRange"] =
JsonValue::Array{"first", "second"};
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
}
SUBCASE("Gltf Extras has incorrect meshCenter field") {
SUBCASE("missing meshCenter field") {
gltfSkirtMeshMetadata.erase("meshCenter");
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("meshCenter field has wrong type") {
gltfSkirtMeshMetadata["meshCenter"] = 12;
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("meshCenter field is 2 elements array") {
gltfSkirtMeshMetadata["meshCenter"] = JsonValue::Array{1.0, 2.0};
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("meshCenter field is 3 elements array but wrong type") {
gltfSkirtMeshMetadata["meshCenter"] = JsonValue::Array{1.0, 2.0, "third"};
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
}
SUBCASE("Gltf Extras has incorrect skirtWestHeight field") {
SUBCASE("missing skirtWestHeight field") {
gltfSkirtMeshMetadata.erase("skirtWestHeight");
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("skirtWestHeight field has wrong type") {
gltfSkirtMeshMetadata["skirtWestHeight"] = "string";
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
}
SUBCASE("Gltf Extras has incorrect skirtSouthHeight field") {
SUBCASE("missing skirtSouthHeight field") {
gltfSkirtMeshMetadata.erase("skirtSouthHeight");
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("skirtSouthHeight field has wrong type") {
gltfSkirtMeshMetadata["skirtSouthHeight"] = "string";
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
}
SUBCASE("Gltf Extras has incorrect skirtEastHeight field") {
SUBCASE("missing skirtEastHeight field") {
gltfSkirtMeshMetadata.erase("skirtEastHeight");
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("skirtEastHeight field has wrong type") {
gltfSkirtMeshMetadata["skirtEastHeight"] = "string";
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
}
SUBCASE("Gltf Extras has incorrect skirtNorthHeight field") {
SUBCASE("missing skirtNorthHeight field") {
gltfSkirtMeshMetadata.erase("skirtNorthHeight");
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
SUBCASE("skirtNorthHeight field has wrong type") {
gltfSkirtMeshMetadata["skirtNorthHeight"] = "string";
JsonValue::Object extras = {{"skirtMeshMetadata", gltfSkirtMeshMetadata}};
REQUIRE(SkirtMeshMetadata::parseFromGltfExtras(extras) == std::nullopt);
}
}
}