Browse Source

ObjImporter: port the test away from MeshData3D.

pull/371/head
Vladimír Vondruš 6 years ago
parent
commit
f782caaf52
  1. 508
      src/MagnumPlugins/ObjImporter/Test/ObjImporterTest.cpp

508
src/MagnumPlugins/ObjImporter/Test/ObjImporterTest.cpp

@ -26,13 +26,14 @@
#include <sstream>
#include <Corrade/Containers/Optional.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Trade/AbstractImporter.h"
#include "Magnum/Trade/MeshData3D.h"
#include "Magnum/Trade/MeshData.h"
#include "configure.h"
@ -154,592 +155,645 @@ ObjImporterTest::ObjImporterTest() {
void ObjImporterTest::pointMesh() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "pointMesh.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Points);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->attributeCount(), 1);
/* The points get reordered according to the index buffer. Might not be a
problem in general but it is when relying on the order */
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{2.0f, 3.0f, 5.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 0
}));
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{2.0f, 3.0f, 5.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 2, 0}),
TestSuite::Compare::Container);
}
void ObjImporterTest::lineMesh() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "lineMesh.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.0f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 1, 2
}));
CORRADE_COMPARE(data->attributeCount(), 1);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 1, 2}),
TestSuite::Compare::Container);
}
void ObjImporterTest::triangleMesh() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "triangleMesh.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Triangles);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.0f},
{2.5f, 0.0f, 1.0f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 3, 1, 0
}));
CORRADE_COMPARE(data->attributeCount(), 1);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.0f},
{2.5f, 0.0f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 2, 3, 1, 0}),
TestSuite::Compare::Container);
}
void ObjImporterTest::mixedPrimitives() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "mixedPrimitives.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(0));
CORRADE_VERIFY(!importer->mesh(0));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): mixed primitive MeshPrimitive::Points and MeshPrimitive::Lines\n");
}
void ObjImporterTest::positionsOnly() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "triangleMesh.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_VERIFY(!data->hasNormals());
CORRADE_VERIFY(!data->hasTextureCoords2D());
CORRADE_COMPARE(data->attributeCount(), 1);
CORRADE_VERIFY(data->hasAttribute(MeshAttribute::Position));
}
void ObjImporterTest::textureCoordinates() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "textureCoordinates.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_VERIFY(!data->hasNormals());
CORRADE_COMPARE(data->textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(data->textureCoords2D(0), (std::vector<Vector2>{
{1.0f, 0.5f},
{1.0f, 0.5f},
{0.5f, 1.0f},
{0.5f, 1.0f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 3, 1, 0
}));
CORRADE_COMPARE(data->attributeCount(), 2);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data->attribute<Vector2>(MeshAttribute::TextureCoordinates),
Containers::arrayView<Vector2>({
{1.0f, 0.5f},
{1.0f, 0.5f},
{0.5f, 1.0f},
{0.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 2, 3, 1, 0}),
TestSuite::Compare::Container);
}
void ObjImporterTest::normals() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "normals.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_VERIFY(!data->hasTextureCoords2D());
CORRADE_COMPARE(data->normalArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(data->normals(0), (std::vector<Vector3>{
{1.0f, 0.5f, 3.5f},
{1.0f, 0.5f, 3.5f},
{0.5f, 1.0f, 0.5f},
{0.5f, 1.0f, 0.5f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 3, 1, 0
}));
CORRADE_COMPARE(data->attributeCount(), 2);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Normal),
Containers::arrayView<Vector3>({
{1.0f, 0.5f, 3.5f},
{1.0f, 0.5f, 3.5f},
{0.5f, 1.0f, 0.5f},
{0.5f, 1.0f, 0.5f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 2, 3, 1, 0}),
TestSuite::Compare::Container);
}
void ObjImporterTest::textureCoordinatesNormals() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "textureCoordinatesNormals.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Lines);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(data->normalArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(data->textureCoords2D(0), (std::vector<Vector2>{
{1.0f, 0.5f},
{1.0f, 0.5f},
{0.5f, 1.0f},
{0.5f, 1.0f},
{0.5f, 1.0f}
}));
CORRADE_COMPARE(data->normals(0), (std::vector<Vector3>{
{1.0f, 0.5f, 3.5f},
{0.5f, 1.0f, 0.5f},
{0.5f, 1.0f, 0.5f},
{1.0f, 0.5f, 3.5f},
{0.5f, 1.0f, 0.5f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 3, 1, 0, 4, 2
}));
CORRADE_COMPARE(data->attributeCount(), 3);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data->attribute<Vector2>(MeshAttribute::TextureCoordinates),
Containers::arrayView<Vector2>({
{1.0f, 0.5f},
{1.0f, 0.5f},
{0.5f, 1.0f},
{0.5f, 1.0f},
{0.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Normal),
Containers::arrayView<Vector3>({
{1.0f, 0.5f, 3.5f},
{0.5f, 1.0f, 0.5f},
{0.5f, 1.0f, 0.5f},
{1.0f, 0.5f, 3.5f},
{0.5f, 1.0f, 0.5f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 2, 3, 1, 0, 4, 2}),
TestSuite::Compare::Container);
}
void ObjImporterTest::emptyFile() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->meshCount(), 1);
}
void ObjImporterTest::unnamedMesh() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "emptyFile.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->mesh3DName(0), "");
CORRADE_COMPARE(importer->mesh3DForName(""), -1);
CORRADE_COMPARE(importer->meshCount(), 1);
CORRADE_COMPARE(importer->meshName(0), "");
CORRADE_COMPARE(importer->meshForName(""), -1);
}
void ObjImporterTest::namedMesh() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "namedMesh.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 1);
CORRADE_COMPARE(importer->mesh3DName(0), "MyMesh");
CORRADE_COMPARE(importer->mesh3DForName("MyMesh"), 0);
CORRADE_COMPARE(importer->meshCount(), 1);
CORRADE_COMPARE(importer->meshName(0), "MyMesh");
CORRADE_COMPARE(importer->meshForName("MyMesh"), 0);
}
void ObjImporterTest::moreMeshes() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "moreMeshes.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 3);
CORRADE_COMPARE(importer->meshCount(), 3);
CORRADE_COMPARE(importer->mesh3DName(0), "PointMesh");
CORRADE_COMPARE(importer->mesh3DForName("PointMesh"), 0);
const Containers::Optional<MeshData3D> data = importer->mesh3D(0);
CORRADE_COMPARE(importer->meshName(0), "PointMesh");
CORRADE_COMPARE(importer->meshForName("PointMesh"), 0);
const Containers::Optional<MeshData> data = importer->mesh(0);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Points);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(data->indices(), (std::vector<UnsignedInt>{
0, 1
}));
CORRADE_COMPARE(importer->mesh3DName(1), "LineMesh");
CORRADE_COMPARE(importer->mesh3DForName("LineMesh"), 1);
const Containers::Optional<MeshData3D> data1 = importer->mesh3D(1);
CORRADE_COMPARE(data->attributeCount(), 2);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Normal),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1}),
TestSuite::Compare::Container);
CORRADE_COMPARE(importer->meshName(1), "LineMesh");
CORRADE_COMPARE(importer->meshForName("LineMesh"), 1);
const Containers::Optional<MeshData> data1 = importer->mesh(1);
CORRADE_VERIFY(data1);
CORRADE_COMPARE(data1->primitive(), MeshPrimitive::Lines);
CORRADE_COMPARE(data1->positionArrayCount(), 1);
CORRADE_COMPARE(data1->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}));
CORRADE_COMPARE(data1->indices(), (std::vector<UnsignedInt>{
0, 1, 1, 0
}));
CORRADE_COMPARE(importer->mesh3DName(2), "TriangleMesh");
CORRADE_COMPARE(importer->mesh3DForName("TriangleMesh"), 2);
const Containers::Optional<MeshData3D> data2 = importer->mesh3D(2);
CORRADE_COMPARE(data1->attributeCount(), 2);
CORRADE_COMPARE_AS(data1->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data1->attribute<Vector2>(MeshAttribute::TextureCoordinates),
Containers::arrayView<Vector2>({
{0.5f, 2.0f},
{0.0f, 1.5f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data1->isIndexed());
CORRADE_COMPARE(data1->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data1->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 1, 0}),
TestSuite::Compare::Container);
CORRADE_COMPARE(importer->meshName(2), "TriangleMesh");
CORRADE_COMPARE(importer->meshForName("TriangleMesh"), 2);
const Containers::Optional<MeshData> data2 = importer->mesh(2);
CORRADE_VERIFY(data2);
CORRADE_COMPARE(data2->primitive(), MeshPrimitive::Triangles);
CORRADE_COMPARE(data2->positionArrayCount(), 1);
CORRADE_COMPARE(data2->positions(0), (std::vector<Vector3>{
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.5f}
}));
CORRADE_COMPARE(data2->indices(), (std::vector<UnsignedInt>{
0, 1, 2, 2, 1, 0
}));
CORRADE_COMPARE(data2->attributeCount(), 3);
CORRADE_COMPARE_AS(data2->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.0f, 1.5f, 1.0f},
{2.0f, 3.0f, 5.5f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data2->attribute<Vector3>(MeshAttribute::Normal),
Containers::arrayView<Vector3>({
{0.5f, 2.0f, 3.0f},
{0.5f, 2.0f, 3.0f},
{0.5f, 2.0f, 3.0f}
}), TestSuite::Compare::Container);
CORRADE_COMPARE_AS(data2->attribute<Vector2>(MeshAttribute::TextureCoordinates),
Containers::arrayView<Vector2>({
{0.5f, 2.0f},
{0.5f, 2.0f},
{0.5f, 2.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data2->isIndexed());
CORRADE_COMPARE(data2->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data2->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0, 1, 2, 2, 1, 0}),
TestSuite::Compare::Container);
}
void ObjImporterTest::unnamedFirstMesh() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "unnamedFirstMesh.obj")));
CORRADE_COMPARE(importer->mesh3DCount(), 2);
CORRADE_COMPARE(importer->meshCount(), 2);
CORRADE_COMPARE(importer->mesh3DName(0), "");
CORRADE_COMPARE(importer->mesh3DForName(""), -1);
CORRADE_COMPARE(importer->meshName(0), "");
CORRADE_COMPARE(importer->meshForName(""), -1);
CORRADE_COMPARE(importer->mesh3DName(1), "SecondMesh");
CORRADE_COMPARE(importer->mesh3DForName("SecondMesh"), 1);
CORRADE_COMPARE(importer->meshName(1), "SecondMesh");
CORRADE_COMPARE(importer->meshForName("SecondMesh"), 1);
}
void ObjImporterTest::wrongFloat() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj")));
const Int id = importer->mesh3DForName("WrongFloat");
const Int id = importer->meshForName("WrongFloat");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): error while converting numeric data\n");
}
void ObjImporterTest::wrongInteger() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj")));
const Int id = importer->mesh3DForName("WrongInteger");
const Int id = importer->meshForName("WrongInteger");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): error while converting numeric data\n");
}
void ObjImporterTest::unmergedIndexOutOfRange() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj")));
const Int id = importer->mesh3DForName("PositionIndexOutOfRange");
const Int id = importer->meshForName("PositionIndexOutOfRange");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): index 1 out of range for 1 vertices\n");
}
void ObjImporterTest::mergedIndexOutOfRange() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj")));
const Int id = importer->mesh3DForName("TextureIndexOutOfRange");
const Int id = importer->meshForName("TextureIndexOutOfRange");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): index 2 out of range for 1 vertices\n");
}
void ObjImporterTest::zeroIndex() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumbers.obj")));
const Int id = importer->mesh3DForName("ZeroIndex");
const Int id = importer->meshForName("ZeroIndex");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): index 0 out of range for 1 vertices\n");
}
void ObjImporterTest::explicitOptionalPositionCoordinate() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj")));
const Int id = importer->mesh3DForName("SupportedPositionW");
const Int id = importer->meshForName("SupportedPositionW");
CORRADE_VERIFY(id > -1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(id);
const Containers::Optional<MeshData> data = importer->mesh(id);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{1.5f, 2.0f, 3.0f}
}));
CORRADE_COMPARE(data->attributeCount(), 1);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{1.5f, 2.0f, 3.0f}
}), TestSuite::Compare::Container);
}
void ObjImporterTest::explicitOptionalTextureCoordinate() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj")));
const Int id = importer->mesh3DForName("SupportedTextureW");
const Int id = importer->meshForName("SupportedTextureW");
CORRADE_VERIFY(id > -1);
const Containers::Optional<MeshData3D> data = importer->mesh3D(id);
const Containers::Optional<MeshData> data = importer->mesh(id);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(data->textureCoords2D(0), (std::vector<Vector2>{
{0.5f, 0.7f}
}));
CORRADE_COMPARE(data->attributeCount(MeshAttribute::TextureCoordinates), 1);
CORRADE_COMPARE_AS(data->attribute<Vector2>(MeshAttribute::TextureCoordinates),
Containers::arrayView<Vector2>({
{0.5f, 0.7f}
}), TestSuite::Compare::Container);
}
void ObjImporterTest::unsupportedOptionalPositionCoordinate() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj")));
const Int id = importer->mesh3DForName("UnsupportedPositionW");
const Int id = importer->meshForName("UnsupportedPositionW");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): homogeneous coordinates are not supported\n");
}
void ObjImporterTest::unsupportedOptionalTextureCoordinate() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "optionalCoordinates.obj")));
const Int id = importer->mesh3DForName("UnsupportedTextureW");
const Int id = importer->meshForName("UnsupportedTextureW");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): 3D texture coordinates are not supported\n");
}
void ObjImporterTest::shortFloatData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("ShortFloat");
const Int id = importer->meshForName("ShortFloat");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): invalid float array size\n");
}
void ObjImporterTest::longFloatData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("LongFloat");
const Int id = importer->meshForName("LongFloat");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): invalid float array size\n");
}
void ObjImporterTest::longOptionalFloatData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("LongOptionalFloat");
const Int id = importer->meshForName("LongOptionalFloat");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): invalid float array size\n");
}
void ObjImporterTest::longIndexData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("InvalidIndices");
const Int id = importer->meshForName("InvalidIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): invalid index data\n");
}
void ObjImporterTest::wrongPointIndexData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("WrongPointIndices");
const Int id = importer->meshForName("WrongPointIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): wrong index count for point\n");
}
void ObjImporterTest::wrongLineIndexData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("WrongLineIndices");
const Int id = importer->meshForName("WrongLineIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): wrong index count for line\n");
}
void ObjImporterTest::wrongTriangleIndexData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("WrongTriangleIndices");
const Int id = importer->meshForName("WrongTriangleIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): wrong index count for triangle\n");
}
void ObjImporterTest::polygonIndexData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongNumberCount.obj")));
const Int id = importer->mesh3DForName("PolygonIndices");
const Int id = importer->meshForName("PolygonIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): polygons are not supported\n");
}
void ObjImporterTest::missingPositionData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj")));
const Int id = importer->mesh3DForName("MissingPositionData");
const Int id = importer->meshForName("MissingPositionData");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): incomplete position data\n");
}
void ObjImporterTest::missingPositionIndices() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj")));
const Int id = importer->mesh3DForName("MissingPositionIndices");
const Int id = importer->meshForName("MissingPositionIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): incomplete position data\n");
}
void ObjImporterTest::missingNormalData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj")));
const Int id = importer->mesh3DForName("MissingNormalData");
const Int id = importer->meshForName("MissingNormalData");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): incomplete normal data\n");
}
void ObjImporterTest::missingNormalIndices() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj")));
const Int id = importer->mesh3DForName("MissingNormalIndices");
const Int id = importer->meshForName("MissingNormalIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): incomplete normal data\n");
}
void ObjImporterTest::missingTextureCoordinateData() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj")));
const Int id = importer->mesh3DForName("MissingTextureData");
const Int id = importer->meshForName("MissingTextureData");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): incomplete texture coordinate data\n");
}
void ObjImporterTest::missingTextureCoordinateIndices() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "missingData.obj")));
const Int id = importer->mesh3DForName("MissingTextureIndices");
const Int id = importer->meshForName("MissingTextureIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): incomplete texture coordinate data\n");
}
void ObjImporterTest::wrongNormalIndexCount() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongIndexCount.obj")));
const Int id = importer->mesh3DForName("ShortNormalIndices");
const Int id = importer->meshForName("ShortNormalIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): some normal indices are missing\n");
}
void ObjImporterTest::wrongTextureCoordinateIndexCount() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "wrongIndexCount.obj")));
const Int id = importer->mesh3DForName("ShortTextureIndices");
const Int id = importer->meshForName("ShortTextureIndices");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): some texture coordinate indices are missing\n");
}
void ObjImporterTest::unsupportedKeyword() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj")));
const Int id = importer->mesh3DForName("UnsupportedKeyword");
const Int id = importer->meshForName("UnsupportedKeyword");
CORRADE_VERIFY(id > -1);
/* Everything should be parsed properly */
const Containers::Optional<MeshData3D> data = importer->mesh3D(id);
const Containers::Optional<MeshData> data = importer->mesh(id);
CORRADE_VERIFY(data);
CORRADE_COMPARE(data->primitive(), MeshPrimitive::Points);
CORRADE_COMPARE(data->positionArrayCount(), 1);
CORRADE_COMPARE(data->positions(0), (std::vector<Vector3>{
{0.0f, 1.0f, 2.0f}
}));
CORRADE_COMPARE(data->indices(), std::vector<UnsignedInt>{0});
CORRADE_COMPARE(data->attributeCount(), 1);
CORRADE_COMPARE_AS(data->attribute<Vector3>(MeshAttribute::Position),
Containers::arrayView<Vector3>({
{0.0f, 1.0f, 2.0f}
}), TestSuite::Compare::Container);
CORRADE_VERIFY(data->isIndexed());
CORRADE_COMPARE(data->indexType(), MeshIndexType::UnsignedInt);
CORRADE_COMPARE_AS(data->indices<UnsignedInt>(),
Containers::arrayView<UnsignedInt>({0}),
TestSuite::Compare::Container);
}
void ObjImporterTest::unknownKeyword() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("ObjImporter");
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(OBJIMPORTER_TEST_DIR, "keywords.obj")));
const Int id = importer->mesh3DForName("UnknownKeyword");
const Int id = importer->meshForName("UnknownKeyword");
CORRADE_VERIFY(id > -1);
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!importer->mesh3D(id));
CORRADE_VERIFY(!importer->mesh(id));
CORRADE_COMPARE(out.str(), "Trade::ObjImporter::mesh(): unknown keyword bleh\n");
}

Loading…
Cancel
Save