1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
// Copyright (c) 2006-2018 Maxim Khizhinsky
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <cds/opt/permutation.h>
#include <cds_test/ext_gtest.h>
namespace {
class Permutations: public ::testing::Test
{
protected:
static const size_t c_nMax = 1024;
template <typename Gen>
void test_with( Gen& gen, size_t nLen )
{
unsigned int arr[c_nMax];
for ( size_t nPass = 0; nPass < 10; ++nPass ) {
for ( size_t i = 0; i < c_nMax; ++i )
arr[i] = 0;
do {
typename Gen::integer_type i = gen;
++arr[ i ];
} while ( gen.next());
for ( size_t i = 0; i < nLen; ++i )
EXPECT_EQ( arr[i], 1u ) << "i=" << i;
for ( size_t i = nLen; i < c_nMax; ++i )
EXPECT_EQ( arr[i], 0u ) << "i=" << i;
gen.reset();
}
}
template <typename Gen>
void test()
{
for ( size_t nLen = 2; nLen <= c_nMax; ++nLen ) {
Gen gen( nLen );
test_with( gen, nLen );
}
}
template <typename Gen>
void test2()
{
for ( size_t nLen = 2; nLen <= c_nMax; nLen *= 2 ) {
Gen gen( nLen );
test_with( gen, nLen );
}
}
};
TEST_F( Permutations, random_permutation )
{
test< cds::opt::v::random_permutation<> >();
}
TEST_F( Permutations, random2_permutation )
{
test2< cds::opt::v::random2_permutation<> >();
}
TEST_F( Permutations, random_shuffle_permutation )
{
test< cds::opt::v::random_shuffle_permutation<> >();
}
} // namespace
|