Browse Source

MeshTools: adapt flipFaceWinding(), flipNormals() and tipsify() tests.

pull/371/head
Vladimír Vondruš 6 years ago
parent
commit
75eefdbe70
  1. 65
      src/Magnum/MeshTools/Test/FlipNormalsTest.cpp
  2. 29
      src/Magnum/MeshTools/Test/TipsifyTest.cpp

65
src/Magnum/MeshTools/Test/FlipNormalsTest.cpp

@ -24,7 +24,9 @@
*/
#include <sstream>
#include <Corrade/Containers/StridedArrayView.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/Utility/DebugStl.h>
#include "Magnum/Math/Vector3.h"
@ -36,44 +38,69 @@ struct FlipNormalsTest: TestSuite::Tester {
explicit FlipNormalsTest();
void wrongIndexCount();
void flipFaceWinding();
template<class T> void flipFaceWinding();
void flipNormals();
template<class T> void flipNormalsFaceWinding();
};
FlipNormalsTest::FlipNormalsTest() {
addTests({&FlipNormalsTest::wrongIndexCount,
&FlipNormalsTest::flipFaceWinding,
&FlipNormalsTest::flipNormals});
&FlipNormalsTest::flipFaceWinding<UnsignedByte>,
&FlipNormalsTest::flipFaceWinding<UnsignedShort>,
&FlipNormalsTest::flipFaceWinding<UnsignedInt>,
&FlipNormalsTest::flipNormals,
&FlipNormalsTest::flipNormalsFaceWinding<UnsignedByte>,
&FlipNormalsTest::flipNormalsFaceWinding<UnsignedShort>,
&FlipNormalsTest::flipNormalsFaceWinding<UnsignedInt>});
}
void FlipNormalsTest::wrongIndexCount() {
std::stringstream ss;
Error redirectError{&ss};
std::vector<UnsignedInt> indices{0, 1};
MeshTools::flipFaceWinding(indices);
UnsignedByte indices[2];
MeshTools::flipFaceWindingInPlace(Containers::stridedArrayView(indices));
CORRADE_COMPARE(ss.str(), "MeshTools::flipNormals(): index count is not divisible by 3!\n");
}
void FlipNormalsTest::flipFaceWinding() {
std::vector<UnsignedInt> indices{0, 1, 2,
3, 4, 5};
MeshTools::flipFaceWinding(indices);
template<class T> void FlipNormalsTest::flipFaceWinding() {
setTestCaseTemplateName(Math::TypeTraits<T>::name());
T indices[]{0, 1, 2, 3, 4, 5};
MeshTools::flipFaceWindingInPlace(indices);
CORRADE_COMPARE(indices, (std::vector<UnsignedInt>{0, 2, 1,
3, 5, 4}));
CORRADE_COMPARE_AS(Containers::arrayView(indices),
Containers::arrayView<T>({0, 2, 1, 3, 5, 4}),
TestSuite::Compare::Container);
}
void FlipNormalsTest::flipNormals() {
std::vector<Vector3> normals{Vector3::xAxis(),
Vector3::yAxis(),
Vector3::zAxis()};
MeshTools::flipNormals(normals);
CORRADE_COMPARE(normals, (std::vector<Vector3>{-Vector3::xAxis(),
-Vector3::yAxis(),
-Vector3::zAxis()}));
Vector3 normals[]{Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis()};
MeshTools::flipNormalsInPlace(normals);
CORRADE_COMPARE_AS(Containers::arrayView(normals),
Containers::arrayView<Vector3>({
-Vector3::xAxis(), -Vector3::yAxis(), -Vector3::zAxis()
}), TestSuite::Compare::Container);
}
template<class T> void FlipNormalsTest::flipNormalsFaceWinding() {
setTestCaseTemplateName(Math::TypeTraits<T>::name());
T indices[]{0, 1, 2, 3, 4, 5};
Vector3 normals[]{Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis()};
MeshTools::flipNormalsInPlace(indices, normals);
CORRADE_COMPARE_AS(Containers::arrayView(indices),
Containers::arrayView<T>({0, 2, 1, 3, 5, 4}),
TestSuite::Compare::Container);
CORRADE_COMPARE_AS(Containers::arrayView(normals),
Containers::arrayView<Vector3>({
-Vector3::xAxis(), -Vector3::yAxis(), -Vector3::zAxis()
}), TestSuite::Compare::Container);
}
}}}}

29
src/Magnum/MeshTools/Test/TipsifyTest.cpp

@ -28,6 +28,7 @@
#include <Corrade/TestSuite/Compare/Container.h>
#include "Magnum/Magnum.h"
#include "Magnum/Math/TypeTraits.h"
#include "Magnum/MeshTools/Tipsify.h"
#include "Magnum/MeshTools/Implementation/Tipsify.h"
@ -37,7 +38,7 @@ struct TipsifyTest: TestSuite::Tester {
explicit TipsifyTest();
void buildAdjacency();
void tipsify();
template<class T> void tipsify();
void oneDegenerateTriangle();
};
@ -85,7 +86,9 @@ constexpr std::size_t VertexCount = 19;
TipsifyTest::TipsifyTest() {
addTests({&TipsifyTest::buildAdjacency,
&TipsifyTest::tipsify,
&TipsifyTest::tipsify<UnsignedByte>,
&TipsifyTest::tipsify<UnsignedShort>,
&TipsifyTest::tipsify<UnsignedInt>,
&TipsifyTest::oneDegenerateTriangle});
}
@ -134,11 +137,15 @@ void TipsifyTest::buildAdjacency() {
}), TestSuite::Compare::Container);
}
void TipsifyTest::tipsify() {
std::vector<UnsignedInt> indices{std::begin(Indices), std::end(Indices)};
MeshTools::tipsify(indices, VertexCount, 3);
template<class T> void TipsifyTest::tipsify() {
setTestCaseTemplateName(Math::TypeTraits<T>::name());
CORRADE_COMPARE(indices, (std::vector<UnsignedInt>{
T indices[Containers::arraySize(Indices)];
for(std::size_t i = 0; i != Containers::arraySize(Indices); ++i)
indices[i] = Indices[i];
MeshTools::tipsifyInPlace(indices, VertexCount, 3);
CORRADE_COMPARE_AS(Containers::arrayView(indices), Containers::arrayView<T>({
4, 1, 0,
9, 5, 4,
1, 4, 5,
@ -158,16 +165,18 @@ void TipsifyTest::tipsify() {
2, 1, 5,
14, 15, 11, /* from dead-end vertex stack */
16, 17, 18 /* arbitrary vertex */
}));
}), TestSuite::Compare::Container);
}
void TipsifyTest::oneDegenerateTriangle() {
/* There used to be an OOB access (neighbors[++ti]) caught by ASan, this
triggers it */
std::vector<UnsignedInt> indices{0, 0, 0};
MeshTools::tipsify(indices, 1, 2);
UnsignedInt indices[]{0, 0, 0};
MeshTools::tipsifyInPlace(indices, 1, 2);
CORRADE_COMPARE(indices, (std::vector<UnsignedInt>{0, 0, 0}));
CORRADE_COMPARE_AS(Containers::arrayView(indices),
Containers::arrayView<UnsignedInt>({0, 0, 0}),
TestSuite::Compare::Container);
}
}}}}

Loading…
Cancel
Save