66#include < boost/openmethod.hpp>
77#include < boost/openmethod/initialize.hpp>
88
9+ #define BOOST_TEST_MODULE test_rolex
10+ #include < boost/test/unit_test.hpp>
11+
912using boost::openmethod::virtual_ptr;
1013
1114struct Role {
12- virtual ~Role () {
13- }
15+ virtual ~Role () {}
1416};
1517
1618struct Employee : Role {
@@ -24,8 +26,7 @@ struct Manager : Employee {
2426struct Founder : Role {};
2527
2628struct Expense {
27- virtual ~Expense () {
28- }
29+ virtual ~Expense () {}
2930};
3031
3132struct Public : Expense {};
@@ -39,6 +40,7 @@ BOOST_OPENMETHOD_CLASSES(
3940 PrivateJet);
4041
4142BOOST_OPENMETHOD (pay, (virtual_ptr<Employee>), double );
43+
4244BOOST_OPENMETHOD (
4345 approve, (virtual_ptr<const Role>, virtual_ptr<const Expense>, double ),
4446 bool );
@@ -75,14 +77,6 @@ BOOST_OPENMETHOD_OVERRIDE(
7577 return true ;
7678}
7779
78- auto main () -> int {
79- boost::openmethod::initialize ();
80- }
81-
82- auto call_pay (Employee& emp) -> double {
83- return pay (emp);
84- }
85-
8680auto Employee::pay () -> double {
8781 return 3000 ;
8882}
@@ -91,10 +85,100 @@ auto Manager::pay() -> double {
9185 return Employee::pay () + 2000 ;
9286}
9387
88+ auto call_pay (Employee& emp) -> double {
89+ return pay (emp);
90+ }
91+
9492auto call_pay_vfunc (Employee& emp) -> double {
9593 return emp.pay ();
9694}
9795
9896auto call_approve (const Role& r, const Expense& e, double a) -> bool {
9997 return approve (r, e, a);
10098}
99+
100+ BOOST_AUTO_TEST_CASE (pay_employee) {
101+ boost::openmethod::initialize ();
102+ Employee e;
103+ BOOST_TEST (pay (e) == 3000 );
104+ BOOST_TEST (call_pay (e) == 3000 );
105+ BOOST_TEST (call_pay_vfunc (e) == 3000 );
106+ }
107+
108+ BOOST_AUTO_TEST_CASE (pay_manager_calls_next) {
109+ boost::openmethod::initialize ();
110+ Manager m;
111+ BOOST_TEST (pay (m) == 5000 );
112+ BOOST_TEST (call_pay (m) == 5000 );
113+ BOOST_TEST (call_pay_vfunc (m) == 5000 );
114+ }
115+
116+ BOOST_AUTO_TEST_CASE (approve_employee) {
117+ boost::openmethod::initialize ();
118+ Employee e;
119+ Bus bus;
120+ Metro metro;
121+ Taxi taxi;
122+ PrivateJet jet;
123+ // Employee may take public transport
124+ BOOST_TEST (approve (e, bus, 10 ) == true );
125+ BOOST_TEST (approve (e, metro, 10 ) == true );
126+ // Employee may not take taxi or private jet
127+ BOOST_TEST (approve (e, taxi, 10 ) == false );
128+ BOOST_TEST (approve (e, jet, 10 ) == false );
129+ }
130+
131+ BOOST_AUTO_TEST_CASE (approve_manager) {
132+ boost::openmethod::initialize ();
133+ Manager m;
134+ Bus bus;
135+ Metro metro;
136+ Taxi taxi;
137+ PrivateJet jet;
138+ // Manager inherits employee's public transport approval
139+ BOOST_TEST (approve (m, bus, 10 ) == true );
140+ BOOST_TEST (approve (m, metro, 10 ) == true );
141+ // Manager may also take a taxi
142+ BOOST_TEST (approve (m, taxi, 10 ) == true );
143+ // Manager may not take a private jet
144+ BOOST_TEST (approve (m, jet, 10 ) == false );
145+ }
146+
147+ BOOST_AUTO_TEST_CASE (approve_founder) {
148+ boost::openmethod::initialize ();
149+ Founder f;
150+ Bus bus;
151+ Metro metro;
152+ Taxi taxi;
153+ PrivateJet jet;
154+ // Founder approves all expenses
155+ BOOST_TEST (approve (f, bus, 10 ) == true );
156+ BOOST_TEST (approve (f, metro, 10 ) == true );
157+ BOOST_TEST (approve (f, taxi, 10 ) == true );
158+ BOOST_TEST (approve (f, jet, 10 ) == true );
159+ }
160+
161+ BOOST_AUTO_TEST_CASE (approve_base_role_denied) {
162+ boost::openmethod::initialize ();
163+ Role r;
164+ Bus bus;
165+ Taxi taxi;
166+ PrivateJet jet;
167+ // Base Role catches all — nothing approved
168+ BOOST_TEST (approve (r, bus, 10 ) == false );
169+ BOOST_TEST (approve (r, taxi, 10 ) == false );
170+ BOOST_TEST (approve (r, jet, 10 ) == false );
171+ }
172+
173+ BOOST_AUTO_TEST_CASE (approve_via_wrapper) {
174+ boost::openmethod::initialize ();
175+ Employee e;
176+ Manager m;
177+ Founder f;
178+ Bus bus;
179+ Taxi taxi;
180+ BOOST_TEST (call_approve (e, bus, 10 ) == true );
181+ BOOST_TEST (call_approve (e, taxi, 10 ) == false );
182+ BOOST_TEST (call_approve (m, taxi, 10 ) == true );
183+ BOOST_TEST (call_approve (f, taxi, 10 ) == true );
184+ }
0 commit comments