Imported Upstream version 16.3.2
[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 #include <iostream>
8
9 using boost::unit_test::test_case;
10 using std::cout;
11 using std::endl;
12 using namespace zypp;
13
14 enum class E
15 {
16   _0    = 0,
17   _1    = 1 << 0,
18   _2    = 1 << 1,
19   _3    = _2 | _1,
20   _4    = 1 << 2,
21   _5    = _4 | _1,
22   _8    = 1 << 3,
23 };
24
25 ZYPP_DECLARE_FLAGS( TFlags, E );
26 ZYPP_DECLARE_OPERATORS_FOR_FLAGS( TFlags );
27
28 inline std::ostream & operator<<( std::ostream & str, const E & obj )
29 { return str << TFlags(obj); }
30
31 static const TFlags T_6( E::_4 | E::_2 );
32 static const TFlags T_7( E::_4 | E::_2 | E::_1 );
33
34
35 BOOST_AUTO_TEST_CASE(flags)
36 {
37   TFlags t0;
38   BOOST_CHECK_EQUAL( t0, 0 );
39   BOOST_CHECK_EQUAL( E::_0, t0 );
40   BOOST_CHECK_EQUAL( t0, E::_0 );
41   BOOST_CHECK_EQUAL( t0, TFlags(0) );
42   BOOST_CHECK_EQUAL( ~t0, ~0 );
43   BOOST_CHECK_EQUAL( ~~t0, 0 );
44   BOOST_CHECK_EQUAL( ~t0, ~E::_0 );
45   BOOST_CHECK_EQUAL( ~~t0, E::_0 );
46
47   BOOST_CHECK_EQUAL( TFlags::none(), TFlags(0) );
48   BOOST_CHECK_EQUAL( TFlags::all(), ~TFlags(0) );
49
50   TFlags t1( E::_1 );
51   BOOST_CHECK_EQUAL( t1, 1 );
52   BOOST_CHECK_EQUAL( t1, E::_1 );
53   BOOST_CHECK_EQUAL( t1, TFlags(1) );
54
55   TFlags t;
56   //t = 1;      // must not compile: assign from int_type
57   t = E::_2;    // = enum
58   BOOST_CHECK_EQUAL( t, E::_2 );
59   t = T_6;      // = TFlags
60   BOOST_CHECK_EQUAL( t, T_6 );
61
62   // enum op enum
63   t = ~E::_1;           BOOST_CHECK_EQUAL( ~t, E::_1 );
64   t = E::_1 & E::_2;    BOOST_CHECK_EQUAL( t, E::_0 );
65   t = E::_1 | E::_2;    BOOST_CHECK_EQUAL( t, E::_3 );
66   t = E::_1 ^ E::_2;    BOOST_CHECK_EQUAL( t, E::_3 );
67
68   // enum op TFlags
69   t = E::_2 & T_6;      BOOST_CHECK_EQUAL( t, E::_2 );
70   t = E::_2 | T_6;      BOOST_CHECK_EQUAL( t, T_6 );
71   t = E::_2 ^ T_6;      BOOST_CHECK_EQUAL( t, E::_4 );
72
73   // TFlags op enum
74   t = ~T_7;             BOOST_CHECK_EQUAL( ~t, T_7 );
75   t = T_7 & E::_2;      BOOST_CHECK_EQUAL( t, E::_2 );
76   t = T_7 | E::_2;      BOOST_CHECK_EQUAL( t, T_7 );
77   t = T_7 ^ E::_2;      BOOST_CHECK_EQUAL( t, E::_5 );
78
79   // TFlags op TFlags
80   t = T_7 & T_6;        BOOST_CHECK_EQUAL( t, T_6 );
81   t = T_7 | T_6;        BOOST_CHECK_EQUAL( t, T_7 );
82   t = T_7 ^ T_7;        BOOST_CHECK_EQUAL( t, E::_0 );
83
84   t = E::_3;
85   BOOST_CHECK( ! t.testFlag( E::_0 ) ); // fails as t != 0
86   BOOST_CHECK( t.testFlag( E::_1 ) );
87   BOOST_CHECK( t.testFlag( E::_2 ) );
88   BOOST_CHECK( t.testFlag( E::_3 ) );
89   t.unsetFlag( E::_2 );         BOOST_CHECK( t.testFlag( E::_1 ) );
90   t.setFlag( E::_1, false );    BOOST_CHECK( t.testFlag( E::_0 ) );             // succeed as t == 0
91   t.setFlag( E::_3, true );     BOOST_CHECK( t.testFlag( E::_3 ) );
92 }