Completed
Push — master ( 1b63e6...266584 )
by Olivier
01:11
created

TestAttrsWidget.test_display_var_double()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
c 2
b 0
f 0
dl 0
loc 6
rs 9.4285
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