Skip to content

Commit 4445efd

Browse files
author
Davide Faconti
committed
added failing unit test (issue #8)
1 parent d09f287 commit 4445efd

File tree

6 files changed

+73
-14
lines changed

6 files changed

+73
-14
lines changed

QtNodeEditor/resources/DefaultStyle.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"FlowViewStyle": {
3-
"BackgroundColor": [45, 45, 45],
4-
"FineGridColor": [33, 33, 33],
5-
"CoarseGridColor": [45, 45, 45]
3+
"BackgroundColor": [45, 45, 55],
4+
"FineGridColor": [45, 45, 55],
5+
"CoarseGridColor": [45, 45, 55]
66
},
77
"NodeStyle": {
88
"NormalBoundaryColor": [255, 255, 255],

bt_editor/bt_editor_base.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,29 @@ const AbstractTreeNode *AbsBehaviorTree::rootNode() const
2424
}
2525

2626

27-
const AbstractTreeNode *AbsBehaviorTree::findNode(const QString &instance_name)
27+
std::vector<const AbstractTreeNode*> AbsBehaviorTree::findNodes(const QString &instance_name)
28+
{
29+
std::vector<const AbstractTreeNode*> out;
30+
out.reserve( 4 );
31+
32+
for( const auto& node: _nodes)
33+
{
34+
if( node.instance_name == instance_name)
35+
{
36+
out.push_back( &node );
37+
}
38+
}
39+
return out;
40+
}
41+
42+
const AbstractTreeNode* AbsBehaviorTree::findFirstNode(const QString &instance_name)
2843
{
2944
for( const auto& node: _nodes)
3045
{
3146
if( node.instance_name == instance_name)
3247
{
33-
return &node;
48+
qDebug() << node.instance_name << " / " << instance_name ;
49+
return ( &node );
3450
}
3551
}
3652
return nullptr;

bt_editor/bt_editor_base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ class AbsBehaviorTree
120120

121121
const AbstractTreeNode* rootNode() const;
122122

123-
const AbstractTreeNode *findNode(const QString& instance_name);
123+
std::vector<const AbstractTreeNode*> findNodes(const QString& instance_name);
124+
125+
const AbstractTreeNode* findFirstNode(const QString& instance_name);
124126

125127
AbstractTreeNode* addNode(AbstractTreeNode* parent, AbstractTreeNode &&new_node );
126128

test/editor_test.cpp

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ private slots:
1818
void undoRedo();
1919
void testSubtree();
2020
void modifyCustomModel();
21+
void multipleSubtrees();
2122
};
2223

2324

@@ -80,7 +81,7 @@ void EditorTest::loadFile()
8081
// Next: expand the Subtree [DoorClosed]
8182
auto tree = getAbstractTree("MainTree");
8283

83-
auto subtree_abs_node = tree.findNode("DoorClosed");
84+
auto subtree_abs_node = tree.findFirstNode("DoorClosed");
8485
QVERIFY2(subtree_abs_node, "Can't find node with ID [DoorClosed]");
8586

8687
{
@@ -101,7 +102,7 @@ void EditorTest::loadFile()
101102
// Next: collapse again Subtree [DoorClosed]
102103
tree = getAbstractTree("MainTree");
103104

104-
subtree_abs_node = tree.findNode("DoorClosed");
105+
subtree_abs_node = tree.findFirstNode("DoorClosed");
105106
QVERIFY2(subtree_abs_node, "Can't find node with ID [DoorClosed]");
106107

107108
{
@@ -130,7 +131,7 @@ void EditorTest::undoRedo()
130131

131132
sleepAndRefresh( 500 );
132133

133-
auto pippo_node = abs_tree_A.findNode("Pippo");
134+
auto pippo_node = abs_tree_A.findFirstNode("Pippo");
134135
auto gui_node = pippo_node->graphic_node;
135136
QPoint pippo_screen_pos = view->mapFromScene(pippo_node->pos);
136137
const QPoint pos_offset(100,0);
@@ -190,7 +191,7 @@ void EditorTest::undoRedo()
190191
auto prev_tree = getAbstractTree();
191192
size_t prev_node_count = prev_tree.nodesCount();
192193

193-
auto node = prev_tree.findNode( "DoSequenceStar" );
194+
auto node = prev_tree.findFirstNode( "DoSequenceStar" );
194195

195196
QPoint pos = view->mapFromScene(node->pos);
196197
testMouseEvent(view, QEvent::MouseButtonDblClick, pos , Qt::LeftButton);
@@ -257,7 +258,7 @@ void EditorTest::testSubtree()
257258
auto main_tree = getAbstractTree("MainTree");
258259
auto closed_tree = getAbstractTree("DoorClosed");
259260

260-
auto subtree_abs_node = main_tree.findNode("DoorClosed");
261+
auto subtree_abs_node = main_tree.findFirstNode("DoorClosed");
261262
auto data_model = subtree_abs_node->graphic_node->nodeDataModel();
262263
auto subtree_model = dynamic_cast<SubtreeNodeModel*>(data_model);
263264

@@ -282,7 +283,7 @@ void EditorTest::testSubtree()
282283
sleepAndRefresh( 500 );
283284

284285
auto tree_after_remove = getAbstractTree("MainTree");
285-
auto fallback_node = tree_after_remove.findNode("root_Fallback");
286+
auto fallback_node = tree_after_remove.findFirstNode("root_Fallback");
286287

287288
QCOMPARE(fallback_node->children_index.size(), size_t(3) );
288289
QVERIFY2( main_win->getTabByName("DoorClosed") == nullptr, "Tab DoorClosed not deleted");
@@ -291,7 +292,7 @@ void EditorTest::testSubtree()
291292
//---------------------------------------
292293
// create again the subtree
293294

294-
auto closed_sequence_node = tree_after_remove.findNode("door_closed_sequence");
295+
auto closed_sequence_node = tree_after_remove.findFirstNode("door_closed_sequence");
295296
auto container = main_win->currentTabInfo();
296297
// This must fail and create a MessageBox
297298
testMessageBox(1000, TEST_LOCATION(), [&]()
@@ -349,13 +350,37 @@ void EditorTest::modifyCustomModel()
349350

350351
auto abs_tree = getAbstractTree();
351352

352-
auto jump_abs_node = abs_tree.findNode( jump_model.registration_ID );
353+
auto jump_abs_node = abs_tree.findFirstNode( jump_model.registration_ID );
353354
QVERIFY( jump_abs_node != nullptr);
354355
QCOMPARE( jump_abs_node->model, jump_model );
355356

356357
sleepAndRefresh( 500 );
357358
}
358359

360+
void EditorTest::multipleSubtrees()
361+
{
362+
QString file_xml = readFile(":/test_subtrees_issue_8.xml");
363+
main_win->on_actionClear_triggered();
364+
main_win->loadFromXML( file_xml );
365+
366+
auto abs_tree = getAbstractTree("MainTree");
367+
368+
auto sequence_node = abs_tree.findFirstNode("main_sequence");
369+
QVERIFY( sequence_node != nullptr );
370+
QCOMPARE( sequence_node->children_index.size(), 2 );
371+
372+
int index_1 = sequence_node->children_index[0];
373+
int index_2 = sequence_node->children_index[1];
374+
375+
auto first_child = abs_tree.node(index_1);
376+
auto second_child = abs_tree.node(index_2);
377+
378+
QCOMPARE( first_child->instance_name, "MoveToPredefinedPoint");
379+
QCOMPARE( second_child->instance_name, "PickingItem");
380+
381+
sleepAndRefresh( 500 );
382+
}
383+
359384
QTEST_MAIN(EditorTest)
360385

361386
#include "editor_test.moc"

test_data/test_files.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
<file>crossdoor_palette.xml</file>
55
<file>show_all.xml</file>
66
<file>crossdoor_trace.fbl</file>
7+
<file>test_subtrees_issue_8.xml</file>
78
</qresource>
89
</RCC>

test_data/test_subtrees_issue_8.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<root main_tree_to_execute = "MainTree">
2+
<BehaviorTree ID="SubtreeOne">
3+
<Action ID = "AdjustOrientation"/>
4+
</BehaviorTree>
5+
<BehaviorTree ID="MoveToPredefinedPoint">
6+
<Action ID = "LinearMove"/>
7+
</BehaviorTree>
8+
9+
<BehaviorTree ID="MainTree">
10+
<Sequence name="main_sequence">
11+
<SubTree ID = "MoveToPredefinedPoint"/>
12+
<SubTree ID = "SubtreeOne"/>
13+
</Sequence>
14+
</BehaviorTree>
15+
</root>

0 commit comments

Comments
 (0)