test_editors.py 5.45 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
48
49
50
51
52
53
    """

    def __init__(self, parent=None):
        super(MockAssetEditor, self).__init__(parent)
        self.dataformat_model = None
        self.add_field_button = QPushButton(self.tr("Add"))
        layout = QVBoxLayout(self)
        layout.addWidget(self.add_field_button)

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

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

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

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

Samuel GAIST's avatar
Samuel GAIST committed
62
        for name, type_ in json_object.items():
63
            field = FieldWidget(self.dataformat_model)
Samuel GAIST's avatar
Samuel GAIST committed
64
65
66
67
68
69
            field.format_name = name
            field.format_type = type_
            self.layout().addWidget(field)

    def dump_json(self):
        """Returns the json representation of the asset"""
Samuel GAIST's avatar
Samuel GAIST committed
70

71
        field_list = self.findChildren(FieldWidget)
Samuel GAIST's avatar
Samuel GAIST committed
72
73
74
75
76
77
78
79

        json_data = {}

        for field in field_list:
            json_data[field.format_name] = field.format_type

        return json_data

80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
    def set_description(self, desc):
        """Sets the text description of the asset"""

        description = DescriptionWidget()
        description.short_description = desc
        self.layout().addWidget(description)

    def get_description(self):
        """Returns the text description of the asset"""

        description_list = self.findChildren(DescriptionWidget)

        text_data = None

        description = description_list[0]
        text_data = description.short_description

        return text_data

Samuel GAIST's avatar
Samuel GAIST committed
99

Samuel GAIST's avatar
Samuel GAIST committed
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
@pytest.fixture()
def dataformat_model():
    return QStringListModel(["float32", "float64", "int32", "int64"])


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

    def test_json_load_and_dump(self, qtbot, dataformat_model):
        json_reference = {"value32": "float32", "value64": "float64"}

        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
        widget.load_json(json_reference)

        assert widget.dump_json() == json_reference
Samuel GAIST's avatar
Samuel GAIST committed
116

Samuel GAIST's avatar
Samuel GAIST committed
117
118
119
    def test_dataformat_creation(self, qtbot, dataformat_model):
        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
Samuel GAIST's avatar
Samuel GAIST committed
120

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

Samuel GAIST's avatar
Samuel GAIST committed
124
        assert len(fields) == 1
Samuel GAIST's avatar
Samuel GAIST committed
125

Samuel GAIST's avatar
Samuel GAIST committed
126
        field = fields[0]
Samuel GAIST's avatar
Samuel GAIST committed
127

Samuel GAIST's avatar
Samuel GAIST committed
128
129
        field.format_name = "value32"
        field.format_type = "float32"
Samuel GAIST's avatar
Samuel GAIST committed
130

Samuel GAIST's avatar
Samuel GAIST committed
131
        assert widget.dump_json() == {"value32": "float32"}
Samuel GAIST's avatar
Samuel GAIST committed
132

Samuel GAIST's avatar
Samuel GAIST committed
133
        qtbot.mouseClick(widget.add_field_button, QtCore.Qt.LeftButton)
134
        fields = widget.findChildren(FieldWidget)
Samuel GAIST's avatar
Samuel GAIST committed
135

Samuel GAIST's avatar
Samuel GAIST committed
136
        assert len(fields) == 2
Samuel GAIST's avatar
Samuel GAIST committed
137

Samuel GAIST's avatar
Samuel GAIST committed
138
        field = fields[1]
Samuel GAIST's avatar
Samuel GAIST committed
139

Samuel GAIST's avatar
Samuel GAIST committed
140
141
        field.format_name = "value64"
        field.format_type = "float64"
Samuel GAIST's avatar
Samuel GAIST committed
142

Samuel GAIST's avatar
Samuel GAIST committed
143
        assert widget.dump_json() == {"value32": "float32", "value64": "float64"}
144
145
146
147
148
149
150
151
152

    def test_description_set_and_get(self, qtbot, dataformat_model):
        text_reference = "short descr1iption of a beat object"

        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
        widget.set_description(text_reference)

        assert widget.get_description() == text_reference