File: TestSettingInstance.py

package info (click to toggle)
uranium 5.0.0-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,304 kB
  • sloc: python: 31,765; sh: 132; makefile: 12
file content (138 lines) | stat: -rw-r--r-- 4,954 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# Copyright (c) 2016 Ultimaker B.V.
# Uranium is released under the terms of the LGPLv3 or higher.

import pytest

# import UM.Settings
import UM.Settings.SettingFunction
import UM.Settings.SettingDefinition
import UM.Settings.SettingInstance

from copy import deepcopy


##  A very basic copy of the instance container.
#
#   Since validator makes have use of this we need it to make validators work.
class MockContainer():
    def __init__(self):
        super().__init__()

        self._instances = []

    def getProperty(self, key, property_name, context = None):
        for instance in self._instances:
            if instance.definition.key == key:
                try:
                    value = getattr(instance, property_name)
                except AttributeError:
                    break

                if isinstance(value, UM.Settings.SettingFunction.SettingFunction):
                    return value(self)
                else:
                    return value

        return None

    def addInstance(self, instance):
        self._instances.append(instance)

    def isDirty(self):
        return True

@pytest.fixture
def setting_definition():
    definition = UM.Settings.SettingDefinition.SettingDefinition("test", None)
    definition.deserialize({
        "label": "Test",
        "type": "float",
        "description": "A Test Setting",
        "default_value": 10.0,
        "maximum_value": "mock_test * 10"
    })
    return definition

@pytest.fixture
def instance_container():
    return MockContainer()

def test_create(setting_definition, instance_container):
    instance = UM.Settings.SettingInstance.SettingInstance(setting_definition, instance_container)

    assert instance.definition == setting_definition
    assert instance.container == instance_container

def test_setProperty(setting_definition, instance_container):
    instance = UM.Settings.SettingInstance.SettingInstance(setting_definition, instance_container)
    instance_container.addInstance(instance)

    instance.setProperty("value", 20.0)
    assert instance.value == 20.0
    assert instance.state == UM.Settings.SettingInstance.InstanceState.User
    assert instance.validationState(instance_container) == UM.Settings.Validator.ValidatorState.Valid

    with pytest.raises(AttributeError):
        instance.setProperty("something", 10)

test_validationState_data = [
    {"value": 10.0, "state": UM.Settings.Validator.ValidatorState.Valid},
    {"value": 4.0, "state": UM.Settings.Validator.ValidatorState.MinimumWarning},
    {"value": 19.0, "state": UM.Settings.Validator.ValidatorState.MaximumWarning},
    {"value": -1.0, "state": UM.Settings.Validator.ValidatorState.MinimumError},
    {"value": 33.0, "state": UM.Settings.Validator.ValidatorState.MaximumError},
]
@pytest.mark.parametrize("data", test_validationState_data)
def test_validationState(data, instance_container):
    definition = UM.Settings.SettingDefinition.SettingDefinition("test", None)
    definition.deserialize({
        "label": "Test",
        "type": "float",
        "description": "A Test Setting",
        "default_value": 10.0,
        "minimum_value": "0.0",
        "maximum_value": "20.0",
        "minimum_value_warning": "5.0",
        "maximum_value_warning": "15.0",
    })

    instance = UM.Settings.SettingInstance.SettingInstance(definition, instance_container)
    instance_container.addInstance(instance)

    # Ensure the instance is filled with proper values for the validation range
    instance.setProperty("minimum_value", 0.0)
    instance.setProperty("maximum_value", 20.0)
    instance.setProperty("minimum_value_warning", 5.0)
    instance.setProperty("maximum_value_warning", 15.0)

    instance.setProperty("value", data["value"])

    assert instance.validationState(instance_container) == data["state"]


def test_getNonExistingAttribute(setting_definition, instance_container):
    instance = UM.Settings.SettingInstance.SettingInstance(setting_definition, instance_container)

    with pytest.raises(AttributeError):
        instance.blarg


def test_compare(setting_definition, instance_container):
    instance = UM.Settings.SettingInstance.SettingInstance(setting_definition, instance_container)
    instance_container.addInstance(instance)
    assert instance != 12

    instance2 = deepcopy(instance)
    assert instance == instance2
    instance_container.addInstance(instance2)
    instance2.setProperty("maximum_value", 2000.0)

    # The direction should not matter (Before adding this test it did, so best to leave it in!)
    # In this case, we are testing instance 2 having the max_value property, but instance doesn't have it.
    assert instance2 != instance
    assert instance != instance2

    instance.setProperty("maximum_value", 9001)
    # In this case, we are testing instance 2 having the max_value property, but instance doesn't have it.
    assert instance2 != instance
    assert instance != instance2