#define TINYGLTF_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION #include "tiny_gltf.h" #define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file #include "catch.hpp" #include #include #include #include #include #include TEST_CASE("parse-error", "[parse]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; bool ret = ctx.LoadASCIIFromString(&model, &err, &warn, "bora", strlen("bora"), /* basedir*/ ""); REQUIRE(false == ret); } TEST_CASE("datauri-in-glb", "[issue-79]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; bool ret = ctx.LoadBinaryFromFile(&model, &err, &warn, "../models/box01.glb"); if (!err.empty()) { std::cerr << err << std::endl; } REQUIRE(true == ret); } TEST_CASE("extension-with-empty-object", "[issue-97]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; bool ret = ctx.LoadASCIIFromFile(&model, &err, &warn, "../models/Extensions-issue97/test.gltf"); if (!err.empty()) { std::cerr << err << std::endl; } REQUIRE(true == ret); REQUIRE(model.extensionsUsed.size() == 1); REQUIRE(model.extensionsUsed[0].compare("VENDOR_material_some_ext") == 0); REQUIRE(model.materials.size() == 1); REQUIRE(model.materials[0].extensions.size() == 1); REQUIRE(model.materials[0].extensions.count("VENDOR_material_some_ext") == 1); // TODO(syoyo): create temp directory. { ret = ctx.WriteGltfSceneToFile(&model, "issue-97.gltf", true, true); REQUIRE(true == ret); tinygltf::Model m; // read back serialized glTF bool ret = ctx.LoadASCIIFromFile(&m, &err, &warn, "issue-97.gltf"); if (!err.empty()) { std::cerr << err << std::endl; } REQUIRE(true == ret); REQUIRE(m.extensionsUsed.size() == 1); REQUIRE(m.extensionsUsed[0].compare("VENDOR_material_some_ext") == 0); REQUIRE(m.materials.size() == 1); REQUIRE(m.materials[0].extensions.size() == 1); REQUIRE(m.materials[0].extensions.count("VENDOR_material_some_ext") == 1); } } TEST_CASE("invalid-primitive-indices", "[bounds-checking]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; // Loading is expected to fail, but not crash. bool ret = ctx.LoadASCIIFromFile( &model, &err, &warn, "../models/BoundsChecking/invalid-primitive-indices.gltf"); REQUIRE_THAT(err, Catch::Contains("primitive indices accessor out of bounds")); REQUIRE_FALSE(ret); } TEST_CASE("invalid-buffer-view-index", "[bounds-checking]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; // Loading is expected to fail, but not crash. bool ret = ctx.LoadASCIIFromFile( &model, &err, &warn, "../models/BoundsChecking/invalid-buffer-view-index.gltf"); REQUIRE_THAT(err, Catch::Contains("accessor[0] invalid bufferView")); REQUIRE_FALSE(ret); } TEST_CASE("invalid-buffer-index", "[bounds-checking]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; // Loading is expected to fail, but not crash. bool ret = ctx.LoadASCIIFromFile( &model, &err, &warn, "../models/BoundsChecking/invalid-buffer-index.gltf"); REQUIRE_THAT( err, Catch::Contains("image[0] buffer \"1\" not found in the scene.")); REQUIRE_FALSE(ret); } TEST_CASE("glb-invalid-length", "[bounds-checking]") { tinygltf::Model model; tinygltf::TinyGLTF ctx; std::string err; std::string warn; // This glb has a much longer length than the provided data and should fail // initial range checks. const unsigned char glb_invalid_length[] = "glTF" "\x20\x00\x00\x00" "\x6c\x66\x00\x00" // // | version | length | "\x02\x00\x00\x00" "\x4a\x53\x4f\x4e{}"; // // | model length | model format | bool ret = ctx.LoadBinaryFromMemory(&model, &err, &warn, glb_invalid_length, sizeof(glb_invalid_length)); REQUIRE_THAT(err, Catch::Contains("Invalid glTF binary.")); REQUIRE_FALSE(ret); }