LCOV - code coverage report
Current view: top level - tests/comparator - comparator_suite.cpp (source / functions) Hit Total Coverage
Test: v-set-coverage.info Lines: 50 50 100.0 %
Date: 2019-09-12 Functions: 20 20 100.0 %

          Line data    Source code
       1             : //
       2             : // Author: Vladimir Migashko <migashko@gmail.com>, (C) 2012
       3             : //
       4             : // Copyright: See COPYING file that comes with this distribution
       5             : //
       6             : 
       7             : #include <vset/multiset.hpp>
       8             : #include <fas/testing.hpp>
       9             : #include <fas/type_list.hpp>
      10             : #include <fas/typemanip.hpp>
      11             : #include <set>
      12             : 
      13             : #include <vset/comparators/compare.hpp>
      14             : #include <vset/comparators/compare_member.hpp>
      15             : #include <vset/comparators/compare_list.hpp>
      16             : #include <vset/comparators/pointer_compare.hpp>
      17             : 
      18             : 
      19             : struct data
      20             : {
      21             :   int data1;
      22             :   int data2;
      23             :   int data3;
      24             : };
      25             : 
      26             : data create_data(int data1, int data2, int data3);
      27             : 
      28             : struct cmp_data
      29             : {
      30          10 :   bool operator()(const data& l, const data& r) const
      31             :   {
      32          19 :     return l.data1 < r.data1 ||
      33          29 :     ( ! ( r.data1 < l.data1 ) && l.data2 > r.data2 ) ||
      34          23 :     ( ! ( r.data1 < l.data1 ) && ! ( r.data2 > l.data2 ) && l.data3 < r.data3 );
      35             :   }
      36             : };
      37             : 
      38             : struct cmp_data1
      39             : {
      40          10 :   bool operator()(const data& l, const data& r) const
      41             :   {
      42          10 :     if ( l.data1 < r.data1 )
      43           1 :       return true;
      44             : 
      45           9 :     if ( r.data1 < l.data1)
      46           1 :       return false;
      47             : 
      48           8 :     if ( l.data2 > r.data2 )
      49           2 :       return true;
      50             : 
      51           6 :     if ( r.data2 > l.data2 )
      52           2 :       return false;
      53             : 
      54           4 :     return l.data3 < r.data3;
      55             :   }
      56             : };
      57             : 
      58             : struct access_stub
      59             : {
      60             :   template<typename T>
      61             :   const T& operator()(const T& t) const
      62             :   {
      63             :     return t;  
      64             :   }
      65             : };
      66             : 
      67          83 : data create_data(int data1, int data2, int data3)
      68             : {
      69             :   data d;
      70          83 :   d.data1 = data1;
      71          83 :   d.data2 = data2;
      72          83 :   d.data3 = data3;
      73          83 :   return d;
      74             : }
      75             : 
      76             : 
      77             : template<typename C>
      78           4 : bool test(C c)
      79             : {
      80           4 :   bool flag = true;
      81           4 :   flag &= !c( create_data(1,2,3), create_data(1,2,3)) && !c( create_data(1,2,3), create_data(1,2,3) );
      82           4 :   flag &=  c( create_data(1,2,3), create_data(2,3,4)) && !c( create_data(2,3,4), create_data(1,2,3) );
      83           4 :   flag &=  c( create_data(2,3,3), create_data(2,2,2)) && !c( create_data(2,2,2), create_data(2,3,3) );
      84           4 :   flag &=  c( create_data(2,5,4), create_data(2,3,4)) && !c( create_data(2,3,4), create_data(2,5,4) );
      85           4 :   flag &=  c( create_data(2,3,2), create_data(2,3,3)) && !c( create_data(2,3,3), create_data(2,3,2) );
      86           4 :   return flag;
      87             : }
      88             : 
      89             : typedef fas::type_list_n<
      90             :   vset::compare< fas::member<data, int, &data::data1>, std::less<int> >,
      91             :   vset::compare< fas::member<data, int, &data::data2>, std::greater<int> >,
      92             :   vset::compare< fas::member<data, int, &data::data3>, std::less<int> >
      93             : >::type compare1_list;
      94             : 
      95             : typedef fas::type_list_n<
      96             :   vset::compare_member< data, int, &data::data1>,
      97             :   vset::compare_member< data, int, &data::data2, std::greater<int> >,
      98             :   vset::compare_member< data, int, &data::data3, std::less<int> >
      99             : >::type compare2_list;
     100             : 
     101             : 
     102             : struct cmp_data2: vset::compare_list<compare1_list> {};
     103             : struct cmp_data3: vset::compare_list<compare2_list> {};
     104             : 
     105           3 : UNIT(comparator_basic, "")
     106             : {
     107             :   using namespace fas::testing;
     108             :   using namespace vset;
     109             : 
     110           1 :   t << is_true<expect>( test(cmp_data() ) ) << FAS_TESTING_FILE_LINE;
     111           1 :   t << is_true<expect>( test(cmp_data1() ) ) << FAS_TESTING_FILE_LINE;
     112           1 :   t << is_true<expect>( test(cmp_data2() ) ) << FAS_TESTING_FILE_LINE;
     113           1 :   t << is_true<expect>( test(cmp_data3() ) ) << FAS_TESTING_FILE_LINE;
     114             : 
     115           1 :   t << nothing;
     116           1 : }
     117             : 
     118           3 : UNIT(comparator_set, "")
     119             : {
     120             :   using namespace fas::testing;
     121             :   using namespace vset;
     122           1 :   std::set<data, cmp_data> set1;
     123           1 :   set1.insert( create_data(1,2,3) );
     124           2 :   std::set<data, cmp_data2> set2;
     125           1 :   set2.insert( create_data(1,2,3) );
     126           2 :   std::set<data*, vset::pointer_compare<cmp_data2> > set3;
     127           1 :   set3.insert(new data( create_data(1,2,3) ) );
     128           2 :   std::set<int*, vset::pointer_compare<std::less<int> > > set4;
     129           1 :   int d[]={1,2,3};
     130           1 :   set4.insert(d);
     131           1 :   set4.insert(d+1);
     132           1 :   set4.insert(d+2);
     133           2 :   t << nothing;
     134           1 : }
     135             : 
     136           1 : BEGIN_SUITE(comparator_suite, "")
     137             :   ADD_UNIT(comparator_basic)
     138             :   ADD_UNIT(comparator_set)
     139           7 : END_SUITE(comparator_suite)

Generated by: LCOV version 1.10