Browse Source

MeshTools: add a soak test for removeDuplicates[Fuzzy]InPlace().

Something fishy going on in there, caused by the algorithm overwriting
the key values (and the map relying on them being immutable).
Interestingly enough the fuzzy variants works on GCC's libstdc++ even
though the key data get changed every entry, fails only on libc++.
pull/449/head
Vladimír Vondruš 6 years ago
parent
commit
fcd329ba55
  1. 33
      src/Magnum/MeshTools/Test/RemoveDuplicatesTest.cpp

33
src/Magnum/MeshTools/Test/RemoveDuplicatesTest.cpp

@ -23,6 +23,8 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <algorithm>
#include <random>
#include <sstream> #include <sstream>
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h> #include <Corrade/TestSuite/Compare/Container.h>
@ -70,6 +72,9 @@ struct RemoveDuplicatesTest: TestSuite::Tester {
void removeDuplicatesMeshData(); void removeDuplicatesMeshData();
void removeDuplicatesMeshDataAttributeless(); void removeDuplicatesMeshDataAttributeless();
void soakTest();
void soakTestFuzzy();
}; };
const struct { const struct {
@ -128,6 +133,9 @@ RemoveDuplicatesTest::RemoveDuplicatesTest() {
Containers::arraySize(RemoveDuplicatesMeshDataData)); Containers::arraySize(RemoveDuplicatesMeshDataData));
addTests({&RemoveDuplicatesTest::removeDuplicatesMeshDataAttributeless}); addTests({&RemoveDuplicatesTest::removeDuplicatesMeshDataAttributeless});
addRepeatedTests({&RemoveDuplicatesTest::soakTest,
&RemoveDuplicatesTest::soakTestFuzzy}, 10);
} }
void RemoveDuplicatesTest::removeDuplicates() { void RemoveDuplicatesTest::removeDuplicates() {
@ -639,6 +647,31 @@ void RemoveDuplicatesTest::removeDuplicatesMeshDataAttributeless() {
"MeshTools::removeDuplicates(): can't remove duplicates in an attributeless mesh\n"); "MeshTools::removeDuplicates(): can't remove duplicates in an attributeless mesh\n");
} }
void RemoveDuplicatesTest::soakTest() {
/* Array of 100 unique items with 10 duplicates each, randomly shuffled */
UnsignedInt data[1000];
for(std::size_t i = 0; i != Containers::arraySize(data); ++i)
data[i] = i / 10 + testCaseRepeatId()*909091;
std::shuffle(std::begin(data), std::end(data), std::minstd_rand{std::random_device{}()});
CORRADE_COMPARE(MeshTools::removeDuplicatesInPlace(
Containers::StridedArrayView2D<char>{
Containers::arrayCast<char>(Containers::arrayView(data)), {1000, 4}}
).second, 100);
}
void RemoveDuplicatesTest::soakTestFuzzy() {
/* Array of 100 unique items with 10 duplicates each, randomly shuffled */
Float data[1000];
for(std::size_t i = 0; i != Containers::arraySize(data); ++i)
data[i] = Float(Int(i/10) + testCaseRepeatId()*909091);
std::shuffle(std::begin(data), std::end(data), std::minstd_rand{std::random_device{}()});
CORRADE_COMPARE(MeshTools::removeDuplicatesFuzzyInPlace(
Containers::arrayCast<2, Float>(Containers::arrayView(data))).second,
100);
}
}}}} }}}}
CORRADE_TEST_MAIN(Magnum::MeshTools::Test::RemoveDuplicatesTest) CORRADE_TEST_MAIN(Magnum::MeshTools::Test::RemoveDuplicatesTest)

Loading…
Cancel
Save