From fcd329ba550b43ef9d560ecaff0f06a0f4023db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 24 May 2020 14:25:03 +0200 Subject: [PATCH] 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++. --- .../MeshTools/Test/RemoveDuplicatesTest.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/Magnum/MeshTools/Test/RemoveDuplicatesTest.cpp b/src/Magnum/MeshTools/Test/RemoveDuplicatesTest.cpp index 2adb3ebe7..d301c2751 100644 --- a/src/Magnum/MeshTools/Test/RemoveDuplicatesTest.cpp +++ b/src/Magnum/MeshTools/Test/RemoveDuplicatesTest.cpp @@ -23,6 +23,8 @@ DEALINGS IN THE SOFTWARE. */ +#include +#include #include #include #include @@ -70,6 +72,9 @@ struct RemoveDuplicatesTest: TestSuite::Tester { void removeDuplicatesMeshData(); void removeDuplicatesMeshDataAttributeless(); + + void soakTest(); + void soakTestFuzzy(); }; const struct { @@ -128,6 +133,9 @@ RemoveDuplicatesTest::RemoveDuplicatesTest() { Containers::arraySize(RemoveDuplicatesMeshDataData)); addTests({&RemoveDuplicatesTest::removeDuplicatesMeshDataAttributeless}); + + addRepeatedTests({&RemoveDuplicatesTest::soakTest, + &RemoveDuplicatesTest::soakTestFuzzy}, 10); } void RemoveDuplicatesTest::removeDuplicates() { @@ -639,6 +647,31 @@ void RemoveDuplicatesTest::removeDuplicatesMeshDataAttributeless() { "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{ + Containers::arrayCast(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)