Fix Flags<> api to be more consistent and add testcase.
[platform/upstream/libzypp.git] / tests / zypp / Flags_test.cc
1 //
2 // tests for Flags
3 //
4 #include <boost/test/auto_unit_test.hpp>
5 #include "zypp/base/Logger.h"
6 #include "zypp/base/Flags.h"
7
8 using boost::unit_test::test_case;
9 using std::cout;
10 using std::endl;
11 using namespace zypp;
12
13 enum TBits
14 {
15   T_0   = 0,
16   T_1   = 1 << 0,
17   T_2   = 1 << 1,
18   T_3   = T_2 | T_1,
19   T_4   = 1 << 2,
20   T_5   = T_4 | T_1,
21   T_8   = 1 << 3,
22 };
23
24 ZYPP_DECLARE_FLAGS( TFlags, TBits );
25 ZYPP_DECLARE_OPERATORS_FOR_FLAGS( TFlags );
26
27 static const TFlags T_6( T_4 | T_2 );
28 static const TFlags T_7( T_4 | T_2 | T_1 );
29
30 BOOST_AUTO_TEST_CASE(flags)
31 {
32   TFlags t0;
33   BOOST_CHECK_EQUAL( t0, 0 );
34   BOOST_CHECK_EQUAL( t0, T_0 );
35   BOOST_CHECK_EQUAL( t0, TFlags(0) );
36   BOOST_CHECK_EQUAL( ~t0, ~0 );
37   BOOST_CHECK_EQUAL( ~~t0, 0 );
38   BOOST_CHECK_EQUAL( ~t0, ~T_0 );
39   BOOST_CHECK_EQUAL( ~~t0, T_0 );
40
41   TFlags t1( T_1 );
42   BOOST_CHECK_EQUAL( t1, 1 );
43   BOOST_CHECK_EQUAL( t1, T_1 );
44   BOOST_CHECK_EQUAL( t1, TFlags(1) );
45
46   TFlags t;
47   // t = 1;     // must not compile: assign from int_type
48   t = T_2;      // = enum
49   BOOST_CHECK_EQUAL( t, T_2 );
50   t = T_6;      // = TFlags
51   BOOST_CHECK_EQUAL( t, T_6 );
52
53   // enum op enum
54   t = ~T_1;      BOOST_CHECK_EQUAL( ~t, T_1 );
55   t = T_1 & T_2; BOOST_CHECK_EQUAL( t, T_0 );
56   t = T_1 | T_2; BOOST_CHECK_EQUAL( t, T_3 );
57   t = T_1 ^ T_2; BOOST_CHECK_EQUAL( t, T_3 );
58
59   // enum op TFlags
60   t = T_2 & T_6; BOOST_CHECK_EQUAL( t, T_2 );
61   t = T_2 | T_6; BOOST_CHECK_EQUAL( t, T_6 );
62   t = T_2 ^ T_6; BOOST_CHECK_EQUAL( t, T_4 );
63
64   // TFlags op enum
65   t = ~T_7;      BOOST_CHECK_EQUAL( ~t, T_7 );
66   t = T_7 & T_2; BOOST_CHECK_EQUAL( t, T_2 );
67   t = T_7 | T_2; BOOST_CHECK_EQUAL( t, T_7 );
68   t = T_7 ^ T_2; BOOST_CHECK_EQUAL( t, T_5 );
69
70   // TFlags op enum
71   t = T_7 & T_6; BOOST_CHECK_EQUAL( t, T_6 );
72   t = T_7 | T_6; BOOST_CHECK_EQUAL( t, T_7 );
73   t = T_7 ^ T_7; BOOST_CHECK_EQUAL( t, T_0 );
74
75
76   t = T_3;
77   BOOST_CHECK( t.testFlag( T_1 ) );
78   BOOST_CHECK( t.testFlag( T_2 ) );
79   BOOST_CHECK( t.testFlag( T_3 ) );
80   t.unsetFlag( T_2 );           BOOST_CHECK( t.testFlag( T_1 ) );
81   t.setFlag( T_1, false );      BOOST_CHECK( t.testFlag( T_0 ) );
82   t.setFlag( T_3, true );       BOOST_CHECK( t.testFlag( T_3 ) );
83 }