initial code-up
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import NamedTuple
|
||||
from unittest.mock import MagicMock
|
||||
from gears import Gear
|
||||
from gears.connections import connect
|
||||
from gears.effect import effect_of, effect_of_2
|
||||
|
||||
|
||||
def test_get_set():
|
||||
g = Gear(1)
|
||||
assert g.get() == 1
|
||||
assert g() == 1
|
||||
g.set(3)
|
||||
|
||||
assert g.get() == 3
|
||||
assert g() == 3
|
||||
|
||||
|
||||
def test_basic_effect():
|
||||
g = Gear("E")
|
||||
|
||||
last_arg: str | None = None
|
||||
|
||||
@effect_of(g)
|
||||
def value_changed(v: str):
|
||||
nonlocal last_arg
|
||||
last_arg = v
|
||||
|
||||
assert last_arg == "E"
|
||||
|
||||
|
||||
def test_effect_of_2():
|
||||
g1 = Gear("E")
|
||||
g2 = Gear(3)
|
||||
|
||||
last_arg: tuple[str, int] | None = None
|
||||
|
||||
@effect_of_2(g1, g2)
|
||||
def value_changed(v1: str, v2: int):
|
||||
nonlocal last_arg
|
||||
last_arg = (v1, v2)
|
||||
|
||||
assert last_arg == ("E", 3)
|
||||
g2.set(4)
|
||||
assert last_arg == ("E", 4)
|
||||
|
||||
|
||||
def test_connect():
|
||||
my_str = Gear("123")
|
||||
my_int = connect(my_str, lambda s: int(s), lambda _, i: str(i))
|
||||
|
||||
assert my_int() == 123
|
||||
my_int.set(321)
|
||||
assert my_str() == "321"
|
||||
|
||||
|
||||
def test_connect_multiplication():
|
||||
mul1 = Gear(10.0)
|
||||
mul2 = connect(mul1, lambda x: x * 2.0, lambda _, y: y / 2.0)
|
||||
mul3 = connect(mul1, lambda x: x * 3.0, lambda _, y: y / 3.0)
|
||||
assert mul2() == 20
|
||||
assert mul3() == 30
|
||||
mul2.set(30)
|
||||
assert mul1() == 15
|
||||
assert mul3() == 45
|
||||
|
||||
|
||||
def test_connect_property():
|
||||
class Foo(NamedTuple):
|
||||
bar: int
|
||||
baz: int
|
||||
|
||||
foo = Gear(Foo(bar=1, baz=2))
|
||||
bar = connect(
|
||||
foo,
|
||||
lambda foo: foo.bar,
|
||||
lambda foo, bar: Foo(bar=bar, baz=foo.baz),
|
||||
)
|
||||
|
||||
assert bar() == 1
|
||||
bar.set(5)
|
||||
assert bar() == 5
|
||||
assert foo() == Foo(5, 2)
|
||||
|
||||
class IntEntryOld:
|
||||
on_value_changed: Signal[int]
|
||||
_val: int
|
||||
|
||||
def get_val(self, val: int): ...
|
||||
def set_val(self, val: int): ...
|
||||
|
||||
class IntEntry:
|
||||
def __init__(self, value: Gear[int]): ...
|
||||
|
||||
int_entry = IntEntry()
|
||||
|
||||
effect_of(bar)(int_entry.set_val)
|
||||
int_entry.on_value_changed.connect(bar.set)
|
||||
|
||||
@effect_of(bar)
|
||||
def update_ui(bar: int):
|
||||
int_entry.set_val(bar)
|
||||
|
||||
def update_model(bar_val: int):
|
||||
bar.set(bar_val)
|
||||
|
||||
int_entry.on_value_changed.connect(update_model)
|
||||
|
||||
|
||||
def hello(my_callback):
|
||||
my_callback(5)
|
||||
|
||||
|
||||
def test_demonstrate_magicmock():
|
||||
m = MagicMock()
|
||||
# print(f"{m.foo(4).bar[0]=}")
|
||||
# m.
|
||||
hello(m)
|
||||
# assert m.call_count == 1
|
||||
m.assert_called_once_with(5)
|
||||
Reference in New Issue
Block a user