1
|
|
|
|
2
|
|
|
import unittest |
3
|
|
|
import sys |
4
|
|
|
import time |
5
|
|
|
sys.path.insert(0, "python-opcua") # necessary on travis |
6
|
|
|
sys.path.insert(0, ".") |
7
|
|
|
|
8
|
|
|
from opcua import ua, Server |
9
|
|
|
|
10
|
|
|
from PyQt5.QtCore import QTimer, QSettings, QModelIndex, Qt, QCoreApplication |
11
|
|
|
from PyQt5.QtWidgets import QApplication, QTreeView, QAbstractItemDelegate |
12
|
|
|
from PyQt5.QtTest import QTest |
13
|
|
|
|
14
|
|
|
from uawidgets.attrs_widget import AttrsWidget |
15
|
|
|
|
16
|
|
|
|
17
|
|
|
class TestAttrsWidget(unittest.TestCase): |
18
|
|
|
def setUp(self): |
19
|
|
|
self.server = Server() |
20
|
|
|
self.server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/") |
21
|
|
|
self.server.start() |
22
|
|
|
self.widget = AttrsWidget(QTreeView()) |
23
|
|
|
|
24
|
|
|
def tearDown(self): |
25
|
|
|
self.server.stop() |
26
|
|
|
|
27
|
|
|
def find_item(self, text): |
28
|
|
|
idxlist = self.widget.model.match(self.widget.model.index(0, 0), Qt.DisplayRole, text, 1, Qt.MatchExactly | Qt.MatchRecursive) |
29
|
|
|
idx = idxlist[0] |
30
|
|
|
return idx |
31
|
|
|
|
32
|
|
|
def modify_item(self, text, val, match_to_use=0): |
33
|
|
|
""" |
34
|
|
|
modify the current item and set its displayed value to 'val' |
35
|
|
|
""" |
36
|
|
|
idxlist = self.widget.model.match(self.widget.model.index(0, 0), Qt.DisplayRole, text, match_to_use + 1, Qt.MatchExactly | Qt.MatchRecursive) |
37
|
|
|
if not idxlist: |
38
|
|
|
raise RuntimeError("Item with text '{}' not found".format(text)) |
39
|
|
|
idx = idxlist[match_to_use] |
40
|
|
|
self.widget.view.setCurrentIndex(idx) |
41
|
|
|
idx = idx.sibling(idx.row(), 1) |
42
|
|
|
self.widget.view.edit(idx) |
43
|
|
|
editor = self.widget.view.focusWidget() |
44
|
|
|
if not editor: |
45
|
|
|
print(app.focusWidget()) |
46
|
|
|
print("NO EDITOR WIDGET") |
47
|
|
|
#QTest.keyClick(self.widget.view, Qt.Key_Return) |
48
|
|
|
from IPython import embed |
49
|
|
|
embed() |
50
|
|
|
raise RuntimeError("Could not get editor widget!, it does not have the focus") |
51
|
|
|
|
52
|
|
|
if hasattr(editor, "current_node"): |
53
|
|
|
editor.current_node = val |
54
|
|
|
elif hasattr(editor, "setCurrentText"): |
55
|
|
|
editor.setCurrentText(val) |
56
|
|
|
else: |
57
|
|
|
editor.setText(val) |
58
|
|
|
self.widget.view.commitData(editor) |
59
|
|
|
self.widget.view.closeEditor(editor, QAbstractItemDelegate.NoHint) |
60
|
|
|
self.widget.view.reset() |
61
|
|
|
|
62
|
|
|
def modify_value(self, val): |
63
|
|
|
self.modify_item("Value", val, 1) |
64
|
|
|
|
65
|
|
|
def test_display_objects_node(self): |
66
|
|
|
objects = self.server.nodes.objects |
67
|
|
|
self.widget.show_attrs(objects) |
68
|
|
|
self.modify_item("BrowseName", "5:titi") |
69
|
|
|
self.assertEqual(objects.get_browse_name().to_string(), "5:titi") |
70
|
|
|
self.modify_item("BrowseName", "0:Objects") # restore states for other tests |
71
|
|
|
|
72
|
|
|
def test_display_var_double(self): |
73
|
|
|
objects = self.server.nodes.objects |
74
|
|
|
myvar = objects.add_variable(1, "myvar1", 9.99, ua.VariantType.Double) |
75
|
|
|
self.widget.show_attrs(myvar) |
76
|
|
|
self.modify_value("8.45") |
77
|
|
|
self.assertEqual(myvar.get_value(), 8.45) |
78
|
|
|
|
79
|
|
|
def test_display_var_bytes(self): |
80
|
|
|
objects = self.server.nodes.objects |
81
|
|
|
myvar = objects.add_variable(1, "myvar_bytes", b"jkl", ua.VariantType.ByteString) |
82
|
|
|
self.widget.show_attrs(myvar) |
83
|
|
|
self.modify_value("titi") |
84
|
|
|
self.assertEqual(myvar.get_value(), b"titi") |
85
|
|
|
|
86
|
|
|
def test_change_data_type(self): |
87
|
|
|
objects = self.server.nodes.objects |
88
|
|
|
myvar = objects.add_variable(1, "myvar1", 9.99, ua.VariantType.Double) |
89
|
|
|
self.widget.show_attrs(myvar) |
90
|
|
|
dtype = myvar.get_data_type() |
91
|
|
|
self.assertEqual(dtype, ua.NodeId(ua.ObjectIds.Double)) |
92
|
|
|
new_dtype = ua.NodeId(ua.ObjectIds.String) |
93
|
|
|
self.modify_item("DataType", self.server.get_node(new_dtype)) |
94
|
|
|
self.assertEqual(myvar.get_data_type(), new_dtype) |
95
|
|
|
|
96
|
|
|
def test_change_value_rank(self): # need to find a way to modify combo box with QTest |
97
|
|
|
objects = self.server.nodes.objects |
98
|
|
|
myvar = objects.add_variable(1, "myvar1", 9.99, ua.VariantType.Double) |
99
|
|
|
self.widget.show_attrs(myvar) |
100
|
|
|
rank = myvar.get_value_rank() |
101
|
|
|
self.modify_item("ValueRank", "ThreeDimensions") |
102
|
|
|
self.assertEqual(myvar.get_value_rank(), ua.ValueRank.ThreeDimensions) |
103
|
|
|
|
104
|
|
|
|
105
|
|
|
|
106
|
|
|
|
107
|
|
|
|
108
|
|
|
if __name__ == "__main__": |
109
|
|
|
app = QApplication(sys.argv) |
110
|
|
|
unittest.main() |
111
|
|
|
|
112
|
|
|
|
113
|
|
|
|