From 0252201f9ed1f479fd17afcaf25e65f582abca41 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 18 Nov 2016 21:54:43 +0000 Subject: [PATCH] [libcxx] [test] D26816: Fix non-Standard assumptions when testing sample(). sample() isn't specified with a reproducible algorithm, so expecting exact output is non-Standard. Mark those tests with LIBCPP_ASSERT. In test_small_population(), we're guaranteed to get all of the elements, but not necessarily in their original order. When PopulationCategory is forward, we're guaranteed stability (and can therefore test equal()). Otherwise, we can only test is_permutation(). (As it happens, both libcxx and MSVC's STL provide stability in this scenario for input-only iterators.) git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@287383 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../alg.random.sample/sample.pass.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/test/std/algorithms/alg.modifying.operations/alg.random.sample/sample.pass.cpp b/test/std/algorithms/alg.modifying.operations/alg.random.sample/sample.pass.cpp index ed23d690c..0cb00e367 100644 --- a/test/std/algorithms/alg.modifying.operations/alg.random.sample/sample.pass.cpp +++ b/test/std/algorithms/alg.modifying.operations/alg.random.sample/sample.pass.cpp @@ -19,9 +19,11 @@ #include #include +#include #include #include "test_iterators.h" +#include "test_macros.h" struct ReservoirSampleExpectations { enum { os = 4 }; @@ -60,19 +62,23 @@ void test() { const unsigned os = Expectations::os; SampleItem oa[os]; const int *oa1 = Expectations::oa1; + ((void)oa1); // Prevent unused warning const int *oa2 = Expectations::oa2; + ((void)oa2); // Prevent unused warning std::minstd_rand g; SampleIterator end; end = std::sample(PopulationIterator(ia), PopulationIterator(ia + is), SampleIterator(oa), os, g); assert(end.base() - oa == std::min(os, is)); - assert(std::equal(oa, oa + os, oa1)); + // sample() is deterministic but non-reproducible; + // its results can vary between implementations. + LIBCPP_ASSERT(std::equal(oa, oa + os, oa1)); end = std::sample(PopulationIterator(ia), PopulationIterator(ia + is), SampleIterator(oa), os, std::move(g)); assert(end.base() - oa == std::min(os, is)); - assert(std::equal(oa, oa + os, oa2)); + LIBCPP_ASSERT(std::equal(oa, oa + os, oa2)); } template class PopulationIteratorType, class PopulationItem, @@ -122,7 +128,12 @@ void test_small_population() { PopulationIterator(ia + is), SampleIterator(oa), os, g); assert(end.base() - oa == std::min(os, is)); - assert(std::equal(oa, end.base(), oa1)); + typedef typename std::iterator_traits::iterator_category PopulationCategory; + if (std::is_base_of::value) { + assert(std::equal(oa, end.base(), oa1)); + } else { + assert(std::is_permutation(oa, end.base(), oa1)); + } } int main() {