Improved value-parameterized test f intrusive stack
[libcds.git] / test / stress / stack / intrusive_push_pop_fcstack.cpp
index abb70ce46daf20b965c9cc968efa64f1ec129756..cc5f5e99c34d10b7d7f9b5e1b0e8934735714f57 100644 (file)
@@ -38,8 +38,6 @@ namespace {
         unsigned int nCombinePassCount;
     };
 
-    static std::vector< fc_param > m_args;
-
     class intrusive_fcstack_push_pop
         : public cds_test::intrusive_stack_push_pop
         , public ::testing::WithParamInterface< fc_param >
@@ -47,45 +45,83 @@ namespace {
         typedef cds_test::intrusive_stack_push_pop base_class;
 
     public:
-        static void SetUpTestCase()
-        {
-            base_class::SetUpTestCase();
 
-            if ( s_bFCIterative ) {
-                for ( unsigned int nCompactFactor = 1; nCompactFactor <= s_nFCCompactFactor; nCompactFactor *= 2 ) {
-                    for ( unsigned int nPass = 1; nPass <= s_nFCCombinePassCount; nPass *= 2 )
-                        m_args.push_back( { nCompactFactor, nPass } );
+        static std::vector< fc_param > get_test_parameters()
+        {
+            cds_test::config const& cfg = cds_test::stress_fixture::get_config( "IntrusiveStack_PushPop" );
+            bool bFCIterative = cfg.get_bool( "FCIterate", s_bFCIterative );
+            unsigned int nFCCombinePassCount = cfg.get_uint( "FCCombinePassCount", s_nFCCombinePassCount );
+            unsigned int nFCCompactFactor = cfg.get_uint( "FCCompactFactor", s_nFCCompactFactor );
+
+            std::vector< fc_param > args;
+            if ( bFCIterative ) {
+                for ( unsigned int nCompactFactor = 1; nCompactFactor <= nFCCompactFactor; nCompactFactor *= 2 ) {
+                    for ( unsigned int nPass = 1; nPass <= nFCCombinePassCount; nPass *= 2 )
+                        args.push_back( { nCompactFactor, nPass } );
                 }
             }
 
-            if ( m_args.empty())
-                m_args.push_back( { 1, 1 } );
+            if ( args.empty() ) {
+                if ( nFCCompactFactor && nFCCombinePassCount )
+                    args.push_back( { nFCCompactFactor, nFCCombinePassCount } );
+                else
+                    args.push_back( { 0, 0 } );
+            }
+
+            return args;
         }
-        static void TearDownTestCase()
+
+#ifdef CDSTEST_GTEST_INSTANTIATE_TEST_CASE_P_HAS_4TH_ARG
+        static std::string get_test_parameter_name( testing::TestParamInfo<fc_param> const& p )
         {
-            m_args.clear();
+            if ( p.param.nCombinePassCount ) {
+                std::stringstream ss;
+                ss << "compact_factor" << p.param.nCompactFactor
+                   << "__combine_pass_count" << p.param.nCombinePassCount
+                   ;
+                return ss.str();
+            }
+            else {
+                return std::string( "with_defaults" );
+            }
         }
+#endif
 
     protected:
         typedef base_class::value_type<boost::intrusive::slist_base_hook<>> slist_value_type;
         typedef base_class::value_type<boost::intrusive::list_base_hook<>>  list_value_type;
 
-
         template <typename Stack>
         void test()
         {
             value_array<typename Stack::value_type> arrValue( s_nStackSize );
             if ( s_bFCIterative ) {
                 fc_param arg = GetParam();
-                propout() 
-                    << std::make_pair( "compact_factor", arg.nCompactFactor )
-                    << std::make_pair( "combine_pass_count", arg.nCombinePassCount );
-                Stack stack( arg.nCompactFactor, arg.nCombinePassCount );
-                do_test( stack, arrValue );
+                if ( arg.nCombinePassCount ) {
+                    propout() 
+                        << std::make_pair( "compact_factor", arg.nCompactFactor )
+                        << std::make_pair( "combine_pass_count", arg.nCombinePassCount );
+                    Stack stack( arg.nCompactFactor, arg.nCombinePassCount );
+                    do_test( stack, arrValue );
+                }
+                else {
+                    Stack stack;
+                    do_test( stack, arrValue );
+                }
             }
             else {
-                Stack stack;
-                do_test( stack, arrValue );
+                fc_param arg = GetParam();
+                if ( arg.nCombinePassCount ) {
+                    propout()
+                        << std::make_pair( "compact_factor", arg.nCompactFactor )
+                        << std::make_pair( "combine_pass_count", arg.nCombinePassCount );
+                    Stack stack( arg.nCompactFactor, arg.nCombinePassCount );
+                    do_test( stack, arrValue );
+                }
+                else {
+                    Stack stack;
+                    do_test( stack, arrValue );
+                }
             }
         }
     };
@@ -116,5 +152,14 @@ namespace {
 
 } // namespace
 
-INSTANTIATE_TEST_CASE_P( FC, intrusive_fcstack_push_pop, ::testing::ValuesIn( m_args ));
+#ifdef CDSTEST_GTEST_INSTANTIATE_TEST_CASE_P_HAS_4TH_ARG
+INSTANTIATE_TEST_CASE_P( FC,
+    intrusive_fcstack_push_pop,
+    ::testing::ValuesIn( intrusive_fcstack_push_pop::get_test_parameters()),
+    intrusive_fcstack_push_pop::get_test_parameter_name );
+#else
+INSTANTIATE_TEST_CASE_P( FC,
+    intrusive_fcstack_push_pop,
+    ::testing::ValuesIn( intrusive_fcstack_push_pop::get_test_parameters()));
+#endif