1import pytest
2from _pytest.store import Store
3from _pytest.store import StoreKey
4
5
6def test_store() -> None:
7    store = Store()
8
9    key1 = StoreKey[str]()
10    key2 = StoreKey[int]()
11
12    # Basic functionality - single key.
13    assert key1 not in store
14    store[key1] = "hello"
15    assert key1 in store
16    assert store[key1] == "hello"
17    assert store.get(key1, None) == "hello"
18    store[key1] = "world"
19    assert store[key1] == "world"
20    # Has correct type (no mypy error).
21    store[key1] + "string"
22
23    # No interaction with another key.
24    assert key2 not in store
25    assert store.get(key2, None) is None
26    with pytest.raises(KeyError):
27        store[key2]
28    with pytest.raises(KeyError):
29        del store[key2]
30    store[key2] = 1
31    assert store[key2] == 1
32    # Has correct type (no mypy error).
33    store[key2] + 20
34    del store[key1]
35    with pytest.raises(KeyError):
36        del store[key1]
37    with pytest.raises(KeyError):
38        store[key1]
39
40    # setdefault
41    store[key1] = "existing"
42    assert store.setdefault(key1, "default") == "existing"
43    assert store[key1] == "existing"
44    key_setdefault = StoreKey[bytes]()
45    assert store.setdefault(key_setdefault, b"default") == b"default"
46    assert store[key_setdefault] == b"default"
47
48    # Can't accidentally add attributes to store object itself.
49    with pytest.raises(AttributeError):
50        store.foo = "nope"  # type: ignore[attr-defined]
51
52    # No interaction with anoter store.
53    store2 = Store()
54    key3 = StoreKey[int]()
55    assert key2 not in store2
56    store2[key2] = 100
57    store2[key3] = 200
58    assert store2[key2] + store2[key3] == 300
59    assert store[key2] == 1
60    assert key3 not in store
61