From 8a6a1fc2df5022607835ccdef32783f0d02562b0 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Tue, 1 Mar 2022 12:12:07 +0000 Subject: [PATCH] Update AI_TEXTURE_TYPE_MAX Must be equal to the largest aiTextureType_XXX enum --- include/assimp/material.h | 2 +- test/unit/utMaterialSystem.cpp | 60 ++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/include/assimp/material.h b/include/assimp/material.h index 416dbc4a8..2ccd83763 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -331,7 +331,7 @@ enum aiTextureType { #endif }; -#define AI_TEXTURE_TYPE_MAX aiTextureType_UNKNOWN +#define AI_TEXTURE_TYPE_MAX aiTextureType_TRANSMISSION // ------------------------------------------------------------------------------- // Get a string for a given aiTextureType diff --git a/test/unit/utMaterialSystem.cpp b/test/unit/utMaterialSystem.cpp index 7b4560443..3016f8881 100644 --- a/test/unit/utMaterialSystem.cpp +++ b/test/unit/utMaterialSystem.cpp @@ -135,3 +135,63 @@ TEST_F(MaterialSystemTest, testMaterialNameAccess) { delete mat; } + +// ------------------------------------------------------------------------------------------------ +#if defined(_MSC_VER) +// Refuse to compile on Windows if any enum values are not explicitly handled in the switch +// TODO: Move this into assimp/Compiler as a macro and add clang/gcc versions so other code can use it +__pragma(warning(push)); +__pragma(warning(error : 4061)); // enumerator 'identifier' in switch of enum 'enumeration' is not explicitly handled by a case label +__pragma(warning(error : 4062)); // enumerator 'identifier' in switch of enum 'enumeration' is not handled +#endif + +TEST_F(MaterialSystemTest, testMaterialTextureTypeEnum) { + // Verify that AI_TEXTURE_TYPE_MAX equals the largest 'real' value in the enum + + int32_t maxTextureType = 0; + static constexpr int32_t bigNumber = 255; + EXPECT_GT(bigNumber, AI_TEXTURE_TYPE_MAX) << "AI_TEXTURE_TYPE_MAX too large for valid enum test, increase bigNumber"; + + // Loop until a value larger than any enum + for (int32_t i = 0; i < bigNumber; ++i) { + aiTextureType texType = static_cast(i); + switch (texType) { + default: break; +#ifndef SWIG + case _aiTextureType_Force32Bit: break; +#endif + // All the real values + case aiTextureType_NONE: + case aiTextureType_DIFFUSE: + case aiTextureType_SPECULAR: + case aiTextureType_AMBIENT: + case aiTextureType_EMISSIVE: + case aiTextureType_HEIGHT: + case aiTextureType_NORMALS: + case aiTextureType_SHININESS: + case aiTextureType_OPACITY: + case aiTextureType_DISPLACEMENT: + case aiTextureType_LIGHTMAP: + case aiTextureType_REFLECTION: + case aiTextureType_BASE_COLOR: + case aiTextureType_NORMAL_CAMERA: + case aiTextureType_EMISSION_COLOR: + case aiTextureType_METALNESS: + case aiTextureType_DIFFUSE_ROUGHNESS: + case aiTextureType_AMBIENT_OCCLUSION: + case aiTextureType_SHEEN: + case aiTextureType_CLEARCOAT: + case aiTextureType_TRANSMISSION: + case aiTextureType_UNKNOWN: + if (i > maxTextureType) + maxTextureType = i; + break; + } + } + + EXPECT_EQ(maxTextureType, AI_TEXTURE_TYPE_MAX) << "AI_TEXTURE_TYPE_MAX macro must be equal to the largest valid aiTextureType_XXX"; +} + +#if defined(_MSC_VER) +__pragma (warning(pop)) +#endif