File: TestPreferences.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 (115 lines) | stat: -rw-r--r-- 4,241 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
from unittest.mock import MagicMock
import os
from io import StringIO
from UM.Preferences import Preferences
import pytest
from UM.Resources import Resources

Resources.addSearchPath(os.path.dirname(os.path.abspath(__file__)))


test_Preference_data = [
    {"key": "test/zomg", "default": 10},
    {"key": "test/BLORP", "default": "True"},
    {"key": "testing/BLORP", "default": "False"},
    {"key": "testing/omgzomg", "default": dict()}
]

test_newValues_data = [None, 10, "omgzomg", -20, 12.1, 2j, {"test", "more_test"}, [10, 20, 30], "True", "true", dict()]


# Preferences parses "True" to True and "False" to False
def parseValue(value):
    if value == "True":
        return True
    elif value == "False":
        return False
    else:
        return value


def test_readWrite():
    preferences = Preferences()
    path = Resources.getPath(Resources.Preferences, "preferences_test.cfg")
    preferences.readFromFile(path)

    # Check if it has been loaded correctly
    assert preferences.getValue("general/foo") == "omgzomg"
    assert preferences.getValue("general/derp") == True

    # Write contents of the preference to a buffer
    in_memory_storage = StringIO()
    preferences.writeToFile(in_memory_storage)  # type: ignore

    new_preferences = Preferences()
    # For some reason, if write was used, the read doesn't work. If we do it like this, it does work.
    new_preferences.readFromFile(StringIO(in_memory_storage.getvalue()))

    assert preferences.getValue("general/foo") == new_preferences.getValue("general/foo")
    assert preferences.getValue("test/more_test") == new_preferences.getValue("test/more_test")


def test_deserialize():
    preferences = Preferences()
    path = Resources.getPath(Resources.Preferences, "preferences_test.cfg")

    with open(path, "r", encoding="utf-8") as f:
        preferences.deserialize(f.read())
    assert preferences.getValue("general/foo") == "omgzomg"
    assert preferences.getValue("general/derp") == True


def test_malformattedKey():
    preferences = Preferences()
    with pytest.raises(Exception):
        preferences.addPreference("DERP", "DERP")


@pytest.mark.parametrize("preference", test_Preference_data)
def test_addPreference(preference):
    preferences = Preferences()
    preferences.addPreference(preference["key"], preference["default"])
    assert preferences.getValue(preference["key"]) == parseValue(preference["default"])

    # Attempt to add the preference again, but with a different default.
    preferences.addPreference(preference["key"], preference["key"])
    assert preferences.getValue(preference["key"]) == parseValue(preference["key"])


@pytest.mark.parametrize("preference", test_Preference_data)
def test_removePreference(preference):
    preferences = Preferences()
    preferences.addPreference(preference["key"], preference["default"])
    preferences.removePreference(preference["key"])
    assert preferences.getValue(preference["key"]) is None


@pytest.mark.parametrize("new_value", test_newValues_data)
def test_setResetValue(new_value):
    preferences = Preferences()
    default_value = "omgzomg"
    preferences.preferenceChanged.emit = MagicMock()
    preferences.addPreference("test/test", default_value)
    assert preferences.preferenceChanged.emit.call_count == 0
    preferences.setValue("test/test", new_value)
    assert preferences.getValue("test/test") == parseValue(new_value)

    if new_value != default_value:
        assert preferences.preferenceChanged.emit.call_count == 1

    preferences.resetPreference("test/test")
    if new_value != default_value:
        assert preferences.preferenceChanged.emit.call_count == 2
    else:
        # The preference never changed. Neither the set or the reset should trigger an emit.
        assert preferences.preferenceChanged.emit.call_count == 0

    assert preferences.getValue("test/test") == default_value


def test_nonExistingSetting():
    preferences = Preferences()
    # Test that attempting to modify a non existing setting in any way doesn't break things.
    preferences.setDefault("nonExistingPreference", "whatever")
    preferences.setValue("nonExistingPreference", "whatever")
    preferences.removePreference("nonExistingPreference")