test_editors.py 5.51 KB
Newer Older
Samuel GAIST's avatar
Samuel GAIST committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# vim: set fileencoding=utf-8 :
###############################################################################
#                                                                             #
# Copyright (c) 2019 Idiap Research Institute, http://www.idiap.ch/           #
# Contact: beat.support@idiap.ch                                              #
#                                                                             #
# This file is part of the beat.editor module of the BEAT platform.           #
#                                                                             #
# Commercial License Usage                                                    #
# Licensees holding valid commercial BEAT licenses may use this file in       #
# accordance with the terms contained in a written agreement between you      #
# and Idiap. For further information contact tto@idiap.ch                     #
#                                                                             #
# Alternatively, this file may be used under the terms of the GNU Affero      #
# Public License version 3 as published by the Free Software and appearing    #
# in the file LICENSE.AGPL included in the packaging of this file.            #
# The BEAT platform is distributed in the hope that it will be useful, but    #
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY  #
# or FITNESS FOR A PARTICULAR PURPOSE.                                        #
#                                                                             #
# You should have received a copy of the GNU Affero Public License along      #
# with the BEAT platform. If not, see http://www.gnu.org/licenses/.           #
#                                                                             #
###############################################################################
Samuel GAIST's avatar
Samuel GAIST committed
25

Samuel GAIST's avatar
Samuel GAIST committed
26
27
28
29
30
31
32
33
34
import pytest

from PyQt5 import QtCore
from PyQt5.QtCore import QStringListModel

from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QVBoxLayout

from ..widgets.editor import AbstractAssetEditor
35
from ..widgets.field import FieldWidget
36
from ..widgets.description import DescriptionWidget
Samuel GAIST's avatar
Samuel GAIST committed
37
38
39
40


class MockAssetEditor(AbstractAssetEditor):
    """
Samuel GAIST's avatar
Samuel GAIST committed
41
    Mock editor to show how to test an editor
Samuel GAIST's avatar
Samuel GAIST committed
42
43
44
45
46
47
    """

    def __init__(self, parent=None):
        super(MockAssetEditor, self).__init__(parent)
        self.dataformat_model = None
        self.add_field_button = QPushButton(self.tr("Add"))
48
        self.description = DescriptionWidget()
Samuel GAIST's avatar
Samuel GAIST committed
49
        layout = QVBoxLayout(self)
50
        layout.addWidget(self.description)
Samuel GAIST's avatar
Samuel GAIST committed
51
52
53
54
55
        layout.addWidget(self.add_field_button)

        self.add_field_button.clicked.connect(self.__add_field)

    def __add_field(self):
56
        self.layout().addWidget(FieldWidget(self.dataformat_model))
Samuel GAIST's avatar
Samuel GAIST committed
57
58
59
60

    def set_dataformat_model(self, model):
        self.dataformat_model = model

61
    def load_json(self, json_object, widget_type):
Samuel GAIST's avatar
Samuel GAIST committed
62
        """Load the json object passed as parameter"""
Samuel GAIST's avatar
Samuel GAIST committed
63

64
65
66
67
68
69
70
71
72
73
74
        if widget_type == "field":
            for name, type_ in json_object.items():
                field = FieldWidget(self.dataformat_model)
                field.format_name = name
                field.format_type = type_
                self.layout().addWidget(field)
        elif widget_type == "description":
            short_text = json_object["short_description"]
            self.description.form_description.setText(short_text)

    def dump_json(self, widget_type):
Samuel GAIST's avatar
Samuel GAIST committed
75
        """Returns the json representation of the asset"""
Samuel GAIST's avatar
Samuel GAIST committed
76

Samuel GAIST's avatar
Samuel GAIST committed
77
78
        json_data = {}

79
80
81
82
83
84
        if widget_type == "field":
            field_list = self.findChildren(FieldWidget)
            for field in field_list:
                json_data[field.format_name] = field.format_type
        elif widget_type == "description":
            json_data["short_description"] = self.description.short_description()
Samuel GAIST's avatar
Samuel GAIST committed
85
86
87
88

        return json_data


Samuel GAIST's avatar
Samuel GAIST committed
89
90
91
92
93
94
95
96
@pytest.fixture()
def dataformat_model():
    return QStringListModel(["float32", "float64", "int32", "int64"])


class TestMockEditor:
    """Test that the mock editor works correctly"""

97
    def test_json_load_and_dump_field_widget(self, qtbot, dataformat_model):
Samuel GAIST's avatar
Samuel GAIST committed
98
99
100
101
        json_reference = {"value32": "float32", "value64": "float64"}

        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
102
        widget.load_json(json_reference, "field")
Samuel GAIST's avatar
Samuel GAIST committed
103

104
        assert widget.dump_json("field") == json_reference
Samuel GAIST's avatar
Samuel GAIST committed
105

106
    def test_dataformat_creation_field_widget(self, qtbot, dataformat_model):
Samuel GAIST's avatar
Samuel GAIST committed
107
108
        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
Samuel GAIST's avatar
Samuel GAIST committed
109

Samuel GAIST's avatar
Samuel GAIST committed
110
        qtbot.mouseClick(widget.add_field_button, QtCore.Qt.LeftButton)
111
        fields = widget.findChildren(FieldWidget)
Samuel GAIST's avatar
Samuel GAIST committed
112

Samuel GAIST's avatar
Samuel GAIST committed
113
        assert len(fields) == 1
Samuel GAIST's avatar
Samuel GAIST committed
114

Samuel GAIST's avatar
Samuel GAIST committed
115
        field = fields[0]
Samuel GAIST's avatar
Samuel GAIST committed
116

Samuel GAIST's avatar
Samuel GAIST committed
117
118
        field.format_name = "value32"
        field.format_type = "float32"
Samuel GAIST's avatar
Samuel GAIST committed
119

120
        assert widget.dump_json("field") == {"value32": "float32"}
Samuel GAIST's avatar
Samuel GAIST committed
121

Samuel GAIST's avatar
Samuel GAIST committed
122
        qtbot.mouseClick(widget.add_field_button, QtCore.Qt.LeftButton)
123
        fields = widget.findChildren(FieldWidget)
Samuel GAIST's avatar
Samuel GAIST committed
124

Samuel GAIST's avatar
Samuel GAIST committed
125
        assert len(fields) == 2
Samuel GAIST's avatar
Samuel GAIST committed
126

Samuel GAIST's avatar
Samuel GAIST committed
127
        field = fields[1]
Samuel GAIST's avatar
Samuel GAIST committed
128

Samuel GAIST's avatar
Samuel GAIST committed
129
130
        field.format_name = "value64"
        field.format_type = "float64"
Samuel GAIST's avatar
Samuel GAIST committed
131

132
        assert widget.dump_json("field") == {"value32": "float32", "value64": "float64"}
133

134
135
    def test_json_load_and_dump_description_widget(self, qtbot):
        json_reference = {"short_description": "Short description test"}
136
137
138

        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
139
        widget.load_json(json_reference, "description")
140

141
        assert widget.dump_json("description") == json_reference