Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkAbstractNodeSelectionWidgetTest.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 #include <QApplication>
18 
19 #include <mitkTestFixture.h>
20 #include <mitkTestingMacros.h>
22 
23 extern std::vector<std::string> globalCmdLineArgs;
24 
25 class TestWidget : public QmitkAbstractNodeSelectionWidget
26 {
27 public:
28  explicit TestWidget(QWidget* parent = nullptr) : QmitkAbstractNodeSelectionWidget(parent), m_UpdateInfo(0), m_OnNodePredicateChanged(0), m_OnDataStorageChanged(0),
29  m_OnInternalSelectionChanged(0), m_OnNodeAddedToStorage(0), m_OnNodeRemovedFromStorage(0), m_ReviseSelectionChanged(0), m_AllowEmissionOfSelection(0), m_Allow(true), m_NewSelectionEmited(0)
30  {
31  connect(this, &QmitkAbstractNodeSelectionWidget::CurrentSelectionChanged, this, &TestWidget::NewSelectionEmited);
32  };
33 
34  int m_UpdateInfo;
35  void UpdateInfo() override
36  {
37  m_UpdateInfo++;
38  };
39 
40  int m_OnNodePredicateChanged;
41  void OnNodePredicateChanged() override
42  {
43  m_OnNodePredicateChanged++;
44  };
45 
46  int m_OnDataStorageChanged;
47  void OnDataStorageChanged() override
48  {
49  m_OnDataStorageChanged++;
50  };
51 
52  int m_OnInternalSelectionChanged;
53  void OnInternalSelectionChanged() override
54  {
55  m_OnInternalSelectionChanged++;
56  };
57 
58  int m_OnNodeAddedToStorage;
59  void OnNodeAddedToStorage(const mitk::DataNode* /*node*/) override
60  {
61  m_OnNodeAddedToStorage++;
62  };
63 
64  int m_OnNodeRemovedFromStorage;
65  void OnNodeRemovedFromStorage(const mitk::DataNode* /*node*/) override
66  {
67  m_OnNodeRemovedFromStorage++;
68  };
69 
70  int m_ReviseSelectionChanged;
71  void ReviseSelectionChanged(const NodeList& /*oldInternalSelection*/, NodeList& /*newInternalSelection*/) override
72  {
73  m_ReviseSelectionChanged++;
74  };
75 
76  mutable int m_AllowEmissionOfSelection;
77  bool m_Allow;
78  bool AllowEmissionOfSelection(const NodeList& emissionCandidates) const override
79  {
80  m_AllowEmissionOfSelection++;
81  if (m_Allow) return QmitkAbstractNodeSelectionWidget::AllowEmissionOfSelection(emissionCandidates);
82 
83  return false;
84  };
85 
86  int m_NewSelectionEmited;
88  void NewSelectionEmited(NodeList selection)
89  {
90  m_NewSelectionEmited++;
91  m_LastNewEmision = selection;
92  };
93 };
94 
95 class QmitkAbstractNodeSelectionWidgetTestSuite : public mitk::TestFixture
96 {
97  CPPUNIT_TEST_SUITE(QmitkAbstractNodeSelectionWidgetTestSuite);
98  MITK_TEST(SetDataStorageTest);
99  MITK_TEST(DataStorageEventTest);
100  MITK_TEST(NodePredicateTest);
101  MITK_TEST(SelectOnlyVisibleNodesTest);
102  MITK_TEST(OtherSetterAndGetterTest);
103  MITK_TEST(AllowEmissionOfSelectionTest);
104  MITK_TEST(OnNodeModifiedTest);
105  MITK_TEST(SignalRecursionTest);
106  CPPUNIT_TEST_SUITE_END();
107 
109  mitk::DataNode::Pointer m_Node1;
110  mitk::DataNode::Pointer m_Node1_2;
111  mitk::DataNode::Pointer m_Node2;
112  mitk::DataNode::Pointer m_Node3;
113 
114  QApplication* m_TestApp;
115 
116 public:
117  void setUp() override
118  {
119  m_DataStorage = mitk::StandaloneDataStorage::New();
120  m_Node1 = mitk::DataNode::New();
121  m_Node1->SetName("node1_1");
122 
123  m_Node2 = mitk::DataNode::New();
124  m_Node2->SetName("node2");
125 
126  m_Node3 = mitk::DataNode::New();
127  m_Node3->SetName("node3");
128 
129  m_Node1_2 = mitk::DataNode::New();
130  m_Node1_2->SetName("node1_2");
131 
132  m_DataStorage->Add(m_Node1);
133  m_DataStorage->Add(m_Node2);
134  m_DataStorage->Add(m_Node3);
135  m_DataStorage->Add(m_Node1_2);
136 
137  mitk::RenderingTestHelper::ArgcHelperClass cmdLineArgs(globalCmdLineArgs);
138  auto argc = cmdLineArgs.GetArgc();
139  auto argv = cmdLineArgs.GetArgv();
140  m_TestApp = new QApplication(argc, argv);
141  }
142 
143  mitk::NodePredicateBase::Pointer GeneratTestPredicate(const std::string& name)
144  {
145  auto check = [name](const mitk::DataNode * node)
146  {
147  return node->GetName().find(name,0) == 0;
148  };
149  auto predicate = mitk::NodePredicateFunction::New(check);
150  return predicate.GetPointer();
151  }
152 
153  void tearDown() override
154  {
155  delete m_TestApp;
156  }
157 
158  void SetDataStorageTest()
159  {
160  TestWidget widget;
161 
162  widget.SetDataStorage(nullptr);
163  CPPUNIT_ASSERT_EQUAL(0, widget.m_UpdateInfo);
164  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
165  CPPUNIT_ASSERT_EQUAL_MESSAGE("Set same data storage but triggered change", 0, widget.m_OnDataStorageChanged);
166  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnInternalSelectionChanged);
167  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
168  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
169  CPPUNIT_ASSERT_EQUAL(0, widget.m_ReviseSelectionChanged);
170  CPPUNIT_ASSERT_EQUAL(0, widget.m_AllowEmissionOfSelection);
171  CPPUNIT_ASSERT_EQUAL(0, widget.m_NewSelectionEmited);
172 
173  widget.SetDataStorage(m_DataStorage);
174  CPPUNIT_ASSERT_EQUAL(1, widget.m_UpdateInfo);
175  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
176  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
177  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnInternalSelectionChanged);
178  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
179  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
180  CPPUNIT_ASSERT_EQUAL(1, widget.m_ReviseSelectionChanged);
181  CPPUNIT_ASSERT_EQUAL(1, widget.m_AllowEmissionOfSelection);
182  CPPUNIT_ASSERT_EQUAL(0, widget.m_NewSelectionEmited);
183 
184  widget.SetCurrentSelection({ m_Node1 });
185  CPPUNIT_ASSERT_EQUAL(2, widget.m_UpdateInfo);
186  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
187  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
188  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
189  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
190  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
191  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
192  CPPUNIT_ASSERT_EQUAL(2, widget.m_AllowEmissionOfSelection);
193  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
194  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget.m_LastNewEmision));
195  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget.GetSelectedNodes()));
196 
197  widget.SetDataStorage(m_DataStorage);
198  CPPUNIT_ASSERT_EQUAL(2, widget.m_UpdateInfo);
199  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
200  CPPUNIT_ASSERT_EQUAL_MESSAGE("Set same data storage but triggered change", 1, widget.m_OnDataStorageChanged);
201  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
202  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
203  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
204  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
205  CPPUNIT_ASSERT_EQUAL(2, widget.m_AllowEmissionOfSelection);
206  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
207  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget.GetSelectedNodes()));
208 
209  widget.SetDataStorage(nullptr);
210  CPPUNIT_ASSERT_EQUAL(3, widget.m_UpdateInfo);
211  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
212  CPPUNIT_ASSERT_EQUAL_MESSAGE("Set same data storage but triggered change", 2, widget.m_OnDataStorageChanged);
213  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
214  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
215  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
216  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
217  CPPUNIT_ASSERT_EQUAL(3, widget.m_AllowEmissionOfSelection);
218  CPPUNIT_ASSERT_EQUAL(2, widget.m_NewSelectionEmited);
219  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.m_LastNewEmision));
220  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.GetSelectedNodes()));
221  }
222 
223  void DataStorageEventTest()
224  {
225  TestWidget widget;
226  auto newNode = mitk::DataNode::New();
227 
228  widget.SetDataStorage(m_DataStorage);
229  m_DataStorage->Add(newNode);
230 
231  CPPUNIT_ASSERT_EQUAL(1, widget.m_UpdateInfo);
232  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
233  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
234  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnInternalSelectionChanged);
235  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodeAddedToStorage);
236  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
237  CPPUNIT_ASSERT_EQUAL(1, widget.m_ReviseSelectionChanged);
238  CPPUNIT_ASSERT_EQUAL(1, widget.m_AllowEmissionOfSelection);
239  CPPUNIT_ASSERT_EQUAL(0, widget.m_NewSelectionEmited);
240 
241  widget.SetCurrentSelection({ newNode });
242  m_DataStorage->Remove(m_Node1);
243  CPPUNIT_ASSERT_EQUAL(2, widget.m_UpdateInfo);
244  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
245  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
246  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
247  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodeAddedToStorage);
248  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodeRemovedFromStorage);
249  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
250  CPPUNIT_ASSERT_EQUAL(2, widget.m_AllowEmissionOfSelection);
251  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
252  CPPUNIT_ASSERT(EqualNodeSelections({ newNode }, widget.m_LastNewEmision));
253  CPPUNIT_ASSERT(EqualNodeSelections({ newNode }, widget.GetSelectedNodes()));
254 
255  m_DataStorage->Remove(newNode);
256  CPPUNIT_ASSERT_EQUAL(3, widget.m_UpdateInfo);
257  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
258  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
259  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
260  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodeAddedToStorage);
261  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnNodeRemovedFromStorage);
262  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
263  CPPUNIT_ASSERT_EQUAL(3, widget.m_AllowEmissionOfSelection);
264  CPPUNIT_ASSERT_EQUAL(2, widget.m_NewSelectionEmited);
265  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.m_LastNewEmision));
266  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.GetSelectedNodes()));
267 
268  widget.SetCurrentSelection({ m_Node2 });
269  m_DataStorage = nullptr;
270  CPPUNIT_ASSERT_EQUAL(5, widget.m_UpdateInfo);
271  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
272  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnDataStorageChanged);
273  CPPUNIT_ASSERT_EQUAL(5, widget.m_OnInternalSelectionChanged);
274  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodeAddedToStorage);
275  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnNodeRemovedFromStorage);
276  CPPUNIT_ASSERT_EQUAL(5, widget.m_ReviseSelectionChanged);
277  CPPUNIT_ASSERT_EQUAL(5, widget.m_AllowEmissionOfSelection);
278  CPPUNIT_ASSERT_EQUAL(4, widget.m_NewSelectionEmited);
279  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.m_LastNewEmision));
280  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.GetSelectedNodes()));
281  }
282 
283  void NodePredicateTest()
284  {
285  TestWidget widget;
286 
287  CPPUNIT_ASSERT(nullptr == widget.GetNodePredicate());
288  auto testPred = GeneratTestPredicate("node2");
289  widget.SetNodePredicate(testPred);
290  CPPUNIT_ASSERT(testPred == widget.GetNodePredicate());
291 
292  CPPUNIT_ASSERT_EQUAL(1, widget.m_UpdateInfo);
293  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
294  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnDataStorageChanged);
295  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnInternalSelectionChanged);
296  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
297  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
298  CPPUNIT_ASSERT_EQUAL(1, widget.m_ReviseSelectionChanged);
299  CPPUNIT_ASSERT_EQUAL(1, widget.m_AllowEmissionOfSelection);
300  CPPUNIT_ASSERT_EQUAL(0, widget.m_NewSelectionEmited);
301 
302  widget.SetDataStorage(m_DataStorage);
303 
304  widget.SetCurrentSelection({ m_Node3 });
305  CPPUNIT_ASSERT_EQUAL(3, widget.m_UpdateInfo);
306  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
307  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
308  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
309  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
310  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
311  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
312  CPPUNIT_ASSERT_EQUAL(3, widget.m_AllowEmissionOfSelection);
313  CPPUNIT_ASSERT_EQUAL(0, widget.m_NewSelectionEmited);
314  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.m_LastNewEmision));
315  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.GetSelectedNodes()));
316 
317  widget.SetCurrentSelection({ m_Node2 });
318  CPPUNIT_ASSERT_EQUAL(4, widget.m_UpdateInfo);
319  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
320  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
321  CPPUNIT_ASSERT_EQUAL(4, widget.m_OnInternalSelectionChanged);
322  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
323  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
324  CPPUNIT_ASSERT_EQUAL(4, widget.m_ReviseSelectionChanged);
325  CPPUNIT_ASSERT_EQUAL(4, widget.m_AllowEmissionOfSelection);
326  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
327  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node2 }, widget.m_LastNewEmision));
328  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node2 }, widget.GetSelectedNodes()));
329 
330  //change predicate while nodes are selected
331  widget.SetNodePredicate(GeneratTestPredicate("node1"));
332  CPPUNIT_ASSERT_EQUAL(5, widget.m_UpdateInfo);
333  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnNodePredicateChanged);
334  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
335  CPPUNIT_ASSERT_EQUAL(5, widget.m_OnInternalSelectionChanged);
336  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
337  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
338  CPPUNIT_ASSERT_EQUAL(5, widget.m_ReviseSelectionChanged);
339  CPPUNIT_ASSERT_EQUAL(5, widget.m_AllowEmissionOfSelection);
340  CPPUNIT_ASSERT_EQUAL(2, widget.m_NewSelectionEmited);
341  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.m_LastNewEmision));
342  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.GetSelectedNodes()));
343 
344  //change selection to mixed one (valid nodes and invalid ones)
345  widget.SetCurrentSelection({ m_Node1, m_Node2, m_Node1_2 });
346  CPPUNIT_ASSERT_EQUAL(6, widget.m_UpdateInfo);
347  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnNodePredicateChanged);
348  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
349  CPPUNIT_ASSERT_EQUAL(6, widget.m_OnInternalSelectionChanged);
350  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
351  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
352  CPPUNIT_ASSERT_EQUAL(6, widget.m_ReviseSelectionChanged);
353  CPPUNIT_ASSERT_EQUAL(6, widget.m_AllowEmissionOfSelection);
354  CPPUNIT_ASSERT_EQUAL(3, widget.m_NewSelectionEmited);
355  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node1_2 }, widget.m_LastNewEmision));
356  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node1_2 }, widget.GetSelectedNodes()));
357  }
358 
359  void SelectOnlyVisibleNodesTest()
360  {
361  TestWidget widget;
362 
363  CPPUNIT_ASSERT_EQUAL(true, widget.GetSelectOnlyVisibleNodes());
364 
365  CPPUNIT_ASSERT(nullptr == widget.GetNodePredicate());
366  auto testPred = GeneratTestPredicate("node2");
367  widget.SetNodePredicate(testPred);
368  widget.SetDataStorage(m_DataStorage);
369  widget.SetCurrentSelection({ m_Node3 });
370  CPPUNIT_ASSERT_EQUAL(3, widget.m_UpdateInfo);
371  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
372  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
373  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
374  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
375  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
376  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
377  CPPUNIT_ASSERT_EQUAL(3, widget.m_AllowEmissionOfSelection);
378  CPPUNIT_ASSERT_EQUAL(0, widget.m_NewSelectionEmited);
379  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.m_LastNewEmision));
380  CPPUNIT_ASSERT(EqualNodeSelections({}, widget.GetSelectedNodes()));
381 
382  widget.SetSelectOnlyVisibleNodes(false);
383  CPPUNIT_ASSERT_EQUAL(false, widget.GetSelectOnlyVisibleNodes());
384  CPPUNIT_ASSERT_EQUAL(3, widget.m_UpdateInfo);
385  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
386  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
387  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
388  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
389  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
390  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
391  CPPUNIT_ASSERT_EQUAL(4, widget.m_AllowEmissionOfSelection);
392  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
393  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.m_LastNewEmision));
394  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.GetSelectedNodes()));
395 
396  //change selection to mixed one (valid nodes and invalid ones)
397  widget.SetCurrentSelection({ m_Node1, m_Node2, m_Node1_2 });
398  CPPUNIT_ASSERT_EQUAL(4, widget.m_UpdateInfo);
399  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
400  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
401  CPPUNIT_ASSERT_EQUAL(4, widget.m_OnInternalSelectionChanged);
402  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
403  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
404  CPPUNIT_ASSERT_EQUAL(4, widget.m_ReviseSelectionChanged);
405  CPPUNIT_ASSERT_EQUAL(5, widget.m_AllowEmissionOfSelection);
406  CPPUNIT_ASSERT_EQUAL(2, widget.m_NewSelectionEmited);
407  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node2, m_Node1_2 }, widget.m_LastNewEmision));
408  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node2, m_Node1_2 }, widget.GetSelectedNodes()));
409 
410  //change predicate while nodes are selected
411  widget.SetNodePredicate(GeneratTestPredicate("node1"));
412  CPPUNIT_ASSERT_EQUAL(5, widget.m_UpdateInfo);
413  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnNodePredicateChanged);
414  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
415  CPPUNIT_ASSERT_EQUAL(5, widget.m_OnInternalSelectionChanged);
416  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
417  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
418  CPPUNIT_ASSERT_EQUAL(5, widget.m_ReviseSelectionChanged);
419  CPPUNIT_ASSERT_EQUAL(6, widget.m_AllowEmissionOfSelection);
420  CPPUNIT_ASSERT_EQUAL(2, widget.m_NewSelectionEmited);
421  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node2, m_Node1_2 }, widget.m_LastNewEmision));
422  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node2, m_Node1_2 }, widget.GetSelectedNodes()));
423 
424  widget.SetSelectOnlyVisibleNodes(true);
425  CPPUNIT_ASSERT_EQUAL(true, widget.GetSelectOnlyVisibleNodes());
426  CPPUNIT_ASSERT_EQUAL(5, widget.m_UpdateInfo);
427  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnNodePredicateChanged);
428  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
429  CPPUNIT_ASSERT_EQUAL(5, widget.m_OnInternalSelectionChanged);
430  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
431  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
432  CPPUNIT_ASSERT_EQUAL(5, widget.m_ReviseSelectionChanged);
433  CPPUNIT_ASSERT_EQUAL(7, widget.m_AllowEmissionOfSelection);
434  CPPUNIT_ASSERT_EQUAL(3, widget.m_NewSelectionEmited);
435  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node1_2 }, widget.m_LastNewEmision));
436  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node1_2 }, widget.GetSelectedNodes()));
437  }
438 
439  void OtherSetterAndGetterTest()
440  {
441  TestWidget widget;
442 
443  CPPUNIT_ASSERT("Error. Select data." == widget.GetInvalidInfo());
444  CPPUNIT_ASSERT("Empty. Make a selection." == widget.GetEmptyInfo());
445  CPPUNIT_ASSERT("Select a data node" == widget.GetPopUpTitel());
446  CPPUNIT_ASSERT("" == widget.GetPopUpHint());
447  CPPUNIT_ASSERT(false == widget.GetSelectionIsOptional());
448 
449  widget.SetInvalidInfo("SetInvalidInfo");
450  widget.SetEmptyInfo("SetEmptyInfo");
451  widget.SetPopUpTitel("SetPopUpTitel");
452  widget.SetPopUpHint("SetPopUpHint");
453  widget.SetSelectionIsOptional(true);
454 
455  CPPUNIT_ASSERT("SetInvalidInfo" == widget.GetInvalidInfo());
456  CPPUNIT_ASSERT("SetEmptyInfo" == widget.GetEmptyInfo());
457  CPPUNIT_ASSERT("SetPopUpTitel" == widget.GetPopUpTitel());
458  CPPUNIT_ASSERT("SetPopUpHint" == widget.GetPopUpHint());
459  CPPUNIT_ASSERT(true == widget.GetSelectionIsOptional());
460  }
461 
462  void AllowEmissionOfSelectionTest()
463  {
464  TestWidget widget;
465 
466  widget.SetDataStorage(m_DataStorage);
467  widget.SetCurrentSelection({ m_Node3 });
468  CPPUNIT_ASSERT_EQUAL(2, widget.m_UpdateInfo);
469  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
470  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
471  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
472  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
473  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
474  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
475  CPPUNIT_ASSERT_EQUAL(2, widget.m_AllowEmissionOfSelection);
476  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
477  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.m_LastNewEmision));
478  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.GetSelectedNodes()));
479 
480  widget.m_Allow = false;
481 
482  widget.SetCurrentSelection({ m_Node1 });
483  CPPUNIT_ASSERT_EQUAL(3, widget.m_UpdateInfo);
484  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
485  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
486  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
487  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
488  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
489  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
490  CPPUNIT_ASSERT_EQUAL(3, widget.m_AllowEmissionOfSelection);
491  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
492  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.m_LastNewEmision));
493  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget.GetSelectedNodes()));
494  }
495 
496  void OnNodeModifiedTest()
497  {
498  TestWidget widget;
499 
500  widget.SetDataStorage(m_DataStorage);
501  widget.SetCurrentSelection({ m_Node3 });
502 
503  //Check OnNodeModified behavour without predicate
504  m_Node3->SetName("NewName");
505  CPPUNIT_ASSERT_EQUAL(2, widget.m_UpdateInfo);
506  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
507  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
508  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
509  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
510  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
511  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
512  CPPUNIT_ASSERT_EQUAL(3, widget.m_AllowEmissionOfSelection);
513  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
514  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.m_LastNewEmision));
515  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.GetSelectedNodes()));
516 
517  //simulate behaviour if allowance is changed to true
518  widget.m_Allow = false;
519  m_Node3->SetName("NewName_temp");
520  widget.m_Allow = true;
521  m_Node3->SetName("NewName");
522  CPPUNIT_ASSERT_EQUAL(4, widget.m_UpdateInfo);
523  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
524  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
525  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
526  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
527  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
528  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
529  CPPUNIT_ASSERT_EQUAL(7, widget.m_AllowEmissionOfSelection);
530  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
531  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.m_LastNewEmision));
532  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.GetSelectedNodes()));
533 
534  //change irrelevant node
535  m_Node2->SetName("IrrelevantNode");
536  CPPUNIT_ASSERT_EQUAL(4, widget.m_UpdateInfo);
537  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
538  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
539  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
540  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
541  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
542  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
543  CPPUNIT_ASSERT_EQUAL(7, widget.m_AllowEmissionOfSelection);
544  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
545  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.m_LastNewEmision));
546  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node3 }, widget.GetSelectedNodes()));
547 
548  //test with predicate set
549  widget.SetNodePredicate(GeneratTestPredicate("node1"));
550  m_Node3->SetName("NowAlsoIrrelevantNode");
551  CPPUNIT_ASSERT_EQUAL(5, widget.m_UpdateInfo);
552  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
553  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
554  CPPUNIT_ASSERT_EQUAL(3, widget.m_OnInternalSelectionChanged);
555  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
556  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
557  CPPUNIT_ASSERT_EQUAL(3, widget.m_ReviseSelectionChanged);
558  CPPUNIT_ASSERT_EQUAL(8, widget.m_AllowEmissionOfSelection);
559  CPPUNIT_ASSERT_EQUAL(2, widget.m_NewSelectionEmited);
560  CPPUNIT_ASSERT(EqualNodeSelections({ }, widget.m_LastNewEmision));
561  CPPUNIT_ASSERT(EqualNodeSelections({ }, widget.GetSelectedNodes()));
562 
563  widget.SetCurrentSelection({ m_Node1, m_Node1_2 });
564  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1, m_Node1_2 }, widget.m_LastNewEmision));
565 
566  m_Node1->SetName("NodeSortedOutByPredicate");
567  CPPUNIT_ASSERT_EQUAL(7, widget.m_UpdateInfo);
568  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnNodePredicateChanged);
569  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
570  CPPUNIT_ASSERT_EQUAL(5, widget.m_OnInternalSelectionChanged);
571  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
572  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
573  CPPUNIT_ASSERT_EQUAL(5, widget.m_ReviseSelectionChanged);
574  CPPUNIT_ASSERT_EQUAL(10, widget.m_AllowEmissionOfSelection);
575  CPPUNIT_ASSERT_EQUAL(4, widget.m_NewSelectionEmited);
576  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1_2 }, widget.m_LastNewEmision));
577  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1_2 }, widget.GetSelectedNodes()));
578  }
579 
580  void SignalRecursionTest()
581  {
582  TestWidget widget;
583  widget.SetDataStorage(m_DataStorage);
584 
585  TestWidget widget2;
586  widget2.SetDataStorage(m_DataStorage);
587 
588  QmitkAbstractNodeSelectionWidget::connect(&widget, &QmitkAbstractNodeSelectionWidget::CurrentSelectionChanged, &widget2, &QmitkAbstractNodeSelectionWidget::SetCurrentSelection);
589  QmitkAbstractNodeSelectionWidget::connect(&widget2, &QmitkAbstractNodeSelectionWidget::CurrentSelectionChanged, &widget, &QmitkAbstractNodeSelectionWidget::SetCurrentSelection);
590 
591  widget.SetCurrentSelection({ m_Node1 });
592  CPPUNIT_ASSERT_EQUAL(2, widget.m_UpdateInfo);
593  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodePredicateChanged);
594  CPPUNIT_ASSERT_EQUAL(1, widget.m_OnDataStorageChanged);
595  CPPUNIT_ASSERT_EQUAL(2, widget.m_OnInternalSelectionChanged);
596  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeAddedToStorage);
597  CPPUNIT_ASSERT_EQUAL(0, widget.m_OnNodeRemovedFromStorage);
598  CPPUNIT_ASSERT_EQUAL(2, widget.m_ReviseSelectionChanged);
599  CPPUNIT_ASSERT_EQUAL(2, widget.m_AllowEmissionOfSelection);
600  CPPUNIT_ASSERT_EQUAL(1, widget.m_NewSelectionEmited);
601  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget.m_LastNewEmision));
602  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget.GetSelectedNodes()));
603 
604  CPPUNIT_ASSERT_EQUAL(2, widget2.m_UpdateInfo);
605  CPPUNIT_ASSERT_EQUAL(0, widget2.m_OnNodePredicateChanged);
606  CPPUNIT_ASSERT_EQUAL(1, widget2.m_OnDataStorageChanged);
607  CPPUNIT_ASSERT_EQUAL(2, widget2.m_OnInternalSelectionChanged);
608  CPPUNIT_ASSERT_EQUAL(0, widget2.m_OnNodeAddedToStorage);
609  CPPUNIT_ASSERT_EQUAL(0, widget2.m_OnNodeRemovedFromStorage);
610  CPPUNIT_ASSERT_EQUAL(2, widget2.m_ReviseSelectionChanged);
611  CPPUNIT_ASSERT_EQUAL(2, widget2.m_AllowEmissionOfSelection);
612  CPPUNIT_ASSERT_EQUAL(1, widget2.m_NewSelectionEmited);
613  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget2.m_LastNewEmision));
614  CPPUNIT_ASSERT(EqualNodeSelections({ m_Node1 }, widget2.GetSelectedNodes()));
615  }
616 
617 };
618 
virtual void OnNodeRemovedFromStorage(const mitk::DataNode *node)
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
QList< mitk::DataNode::Pointer > NodeList
virtual void ReviseSelectionChanged(const NodeList &oldInternalSelection, NodeList &newInternalSelection)
static Pointer New(const FunctionType &_arg)
void CurrentSelectionChanged(NodeList nodes)
mitk::DataStorage::Pointer m_DataStorage
virtual void OnNodeAddedToStorage(const mitk::DataNode *node)
std::vector< std::string > globalCmdLineArgs
static Pointer New()
bool MITKQTWIDGETS_EXPORT EqualNodeSelections(const QList< mitk::DataNode::Pointer > &selection1, const QList< mitk::DataNode::Pointer > &selection2)
Test fixture for parameterized tests.
The ArgcHelperClass class is a convinience class to convert a vector of strings to the standard c++ a...
Abstract base class for the selection of data from a data storage.
virtual bool AllowEmissionOfSelection(const NodeList &emissionCandidates) const
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57