test_editors.py 4.81 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
import pytest

from PyQt5 import QtCore
29
from PyQt5.QtCore import pyqtSlot
Samuel GAIST's avatar
Samuel GAIST committed
30
31
32
33
34
from PyQt5.QtCore import QStringListModel

from PyQt5.QtWidgets import QPushButton

from ..widgets.editor import AbstractAssetEditor
35
from ..widgets.field import FieldWidget
36
from ..backend.asset import AssetType
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
    """

    def __init__(self, parent=None):
45
        super(MockAssetEditor, self).__init__(AssetType.UNKNOWN, parent)
Samuel GAIST's avatar
Samuel GAIST committed
46
47
        self.dataformat_model = None
        self.add_field_button = QPushButton(self.tr("Add"))
48
        self.layout().addWidget(self.add_field_button)
Samuel GAIST's avatar
Samuel GAIST committed
49

50
        self.add_field_button.clicked.connect(self.__addField)
Samuel GAIST's avatar
Samuel GAIST committed
51

52
53
    @pyqtSlot()
    def __addField(self):
54
        self.layout().addWidget(FieldWidget(self.dataformat_model))
Samuel GAIST's avatar
Samuel GAIST committed
55
56
57
58

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

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

62
63
64
65
66
67
        for name, type_ in json_object["field"].items():
            field = FieldWidget(self.dataformat_model)
            field.format_name = name
            field.format_type = type_
            self.layout().addWidget(field)

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

Samuel GAIST's avatar
Samuel GAIST committed
71
72
        json_data = {}

73
74
75
76
        field_list = self.findChildren(FieldWidget)
        json_data["field"] = {}
        for field in field_list:
            json_data["field"][field.format_name] = field.format_type
Samuel GAIST's avatar
Samuel GAIST committed
77
78
79
80

        return json_data


Samuel GAIST's avatar
Samuel GAIST committed
81
82
83
84
85
86
87
88
@pytest.fixture()
def dataformat_model():
    return QStringListModel(["float32", "float64", "int32", "int64"])


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

89
    def test_json_load_and_dump_field_widget(self, qtbot, dataformat_model):
90
91
92
93
        json_reference = {
            "field": {"value32": "float32", "value64": "float64"},
            "description": "Short description test",
        }
Samuel GAIST's avatar
Samuel GAIST committed
94
95
96

        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
97
        widget.load_json(json_reference)
Samuel GAIST's avatar
Samuel GAIST committed
98

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

101
    def test_dataformat_creation_field_widget(self, qtbot, dataformat_model):
Samuel GAIST's avatar
Samuel GAIST committed
102
103
        widget = MockAssetEditor()
        widget.set_dataformat_model(dataformat_model)
Samuel GAIST's avatar
Samuel GAIST committed
104

Samuel GAIST's avatar
Samuel GAIST committed
105
        qtbot.mouseClick(widget.add_field_button, QtCore.Qt.LeftButton)
106
        fields = widget.findChildren(FieldWidget)
Samuel GAIST's avatar
Samuel GAIST committed
107

Samuel GAIST's avatar
Samuel GAIST committed
108
        assert len(fields) == 1
Samuel GAIST's avatar
Samuel GAIST committed
109

Samuel GAIST's avatar
Samuel GAIST committed
110
        field = fields[0]
Samuel GAIST's avatar
Samuel GAIST committed
111

Samuel GAIST's avatar
Samuel GAIST committed
112
113
        field.format_name = "value32"
        field.format_type = "float32"
Samuel GAIST's avatar
Samuel GAIST committed
114

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

Samuel GAIST's avatar
Samuel GAIST committed
117
        qtbot.mouseClick(widget.add_field_button, QtCore.Qt.LeftButton)
118
        fields = widget.findChildren(FieldWidget)
Samuel GAIST's avatar
Samuel GAIST committed
119

Samuel GAIST's avatar
Samuel GAIST committed
120
        assert len(fields) == 2
Samuel GAIST's avatar
Samuel GAIST committed
121

Samuel GAIST's avatar
Samuel GAIST committed
122
        field = fields[1]
Samuel GAIST's avatar
Samuel GAIST committed
123

Samuel GAIST's avatar
Samuel GAIST committed
124
125
        field.format_name = "value64"
        field.format_type = "float64"
Samuel GAIST's avatar
Samuel GAIST committed
126

127
        assert widget.dump_json() == {
128
            "field": {"value32": "float32", "value64": "float64"}
129
        }