BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
callbackcontainer.test.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // qt-mvvm: Model-view-view-model framework for large GUI applications
4 //
5 //! @file mvvm/tests/testmodel/callbackcontainer.test.cpp
6 //! @brief Implements class CLASS?
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2020
11 //! @authors Gennady Pospelov et al, Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
15 #include "google_test.h"
16 #include "mockwidgets.h"
17 #include "mvvm/model/mvvm_types.h"
18 #include "mvvm/model/sessionitem.h"
20 #include <memory>
21 
22 using namespace ModelView;
23 using ::testing::_;
24 
25 //! Testing CallbackContainer class.
26 
27 class CallbackContainerTest : public ::testing::Test {
28 public:
30 };
31 
33 
34 //! Callback container notifies single widget. Check if removal of widget disables notifications.
35 
37 {
38  CallbackMockWidget widget;
40 
41  signal.connect(std::bind(&CallbackMockWidget::onItemDestroy, &widget, std::placeholders::_1),
42  &widget);
43 
44  std::unique_ptr<SessionItem> item(new SessionItem);
45  EXPECT_CALL(widget, onItemDestroy(item.get())).Times(1);
46 
47  // perform action
48  signal(item.get());
49 
50  // removing client
51  signal.remove_client(&widget);
52  EXPECT_CALL(widget, onItemDestroy(_)).Times(0);
53 
54  // perform action
55  signal(item.get());
56 }
57 
58 //! Callback container notifies two widgets. Check if one widget is removed,
59 //! the second is still notified.
60 
62 {
63  CallbackMockWidget widget1, widget2;
65 
66  signal.connect([&](SessionItem* item) { widget1.onItemDestroy(item); }, &widget1);
67 
68  signal.connect([&](SessionItem* item) { widget2.onItemDestroy(item); }, &widget2);
69 
70  std::unique_ptr<SessionItem> item(new SessionItem);
71  EXPECT_CALL(widget1, onItemDestroy(item.get())).Times(1);
72  EXPECT_CALL(widget2, onItemDestroy(item.get())).Times(1);
73 
74  // perform action
75  signal(item.get());
76 
77  // removing one of client
78  signal.remove_client(&widget1);
79  EXPECT_CALL(widget1, onItemDestroy(_)).Times(0);
80  EXPECT_CALL(widget2, onItemDestroy(item.get())).Times(1);
81 
82  // perform action
83  signal(item.get());
84 }
85 
86 //! Callback function with two parameters.
87 
89 {
90  CallbackMockWidget widget1, widget2;
92 
93  signal.connect([&](SessionItem* item, int role) { widget1.onDataChange(item, role); },
94  &widget1);
95 
96  signal.connect([&](SessionItem* item, int role) { widget2.onDataChange(item, role); },
97  &widget2);
98 
99  int expected_role = 42;
100  std::unique_ptr<SessionItem> item(new SessionItem);
101  EXPECT_CALL(widget1, onDataChange(item.get(), expected_role)).Times(1);
102  EXPECT_CALL(widget2, onDataChange(item.get(), expected_role)).Times(1);
103 
104  // perform action
105  signal(item.get(), expected_role);
106 
107  // removing one of client
108  signal.remove_client(&widget1);
109  EXPECT_CALL(widget1, onDataChange(_, _)).Times(0);
110  EXPECT_CALL(widget2, onDataChange(item.get(), expected_role)).Times(1);
111 
112  // perform action
113  signal(item.get(), expected_role);
114 }
Defines class CLASS?
TEST_F(CallbackContainerTest, singleWidget)
Callback container notifies single widget. Check if removal of widget disables notifications.
Testing CallbackContainer class.
Mock class for CallbackContainer.
Definition: mockwidgets.h:28
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
void remove_client(U client)
Remove client from the list to call back.
void connect(T callback, U client)
Defines class CLASS?
Defines class CLASS?
Defines class CLASS?
materialitems.h Collection of materials to populate MaterialModel.
Defines class CLASS?