40 model = assemble_model(
41 read_diagram(json.loads(STAND.read_text()), name=
"s"), diagram_id=
"s"
43 machine = load_machine(tables=TABLES)
44 return Session(model, machine, binding(model, machine, hookup), hookup=hookup)
53 read_diagram(json.loads(STAND.read_text()), name=
"s"), diagram_id=
"s"
57 assert hookup.knobs
and hookup.knobs[0].id == DOME,
"the stand's dome knob"
59 for state
in (
"Idle",
"Ready"):
60 plain.state = suggested.state = state
61 assert suggested.signals() == plain.signals()
62 assert suggested.binding.to_symbol == plain.binding.to_symbol
64 model.built.dome_loaders.keys() <= set(hookup.knobs[0].regulators)
65 or not model.built.dome_loaders
70 """LE4's layout with a hand-loaded regulator (drawn at 560). Linked to a knob at
71 400 psig the tanks lock up near 400; unlinked they lock up near 560. The test
72 can fail: a knob that drove nothing leaves both at 560."""
74 def lockup(knob_psig: float |
None) -> float:
75 session = _helium_stand()
76 if knob_psig
is not None:
77 (reg,) = [r
for r
in regulators(session.model)
if r.label ==
"DPR_HP"]
78 assert reg.kind ==
"plain"
80 knobs=(
Knob(
"cart",
"Cart regulator", (reg.id,), knob_psig),)
82 session.knobs = {
"cart": knob_psig}
83 session.prime(tank_psi=300.0, copv_psi=4500.0, state=
"Ready", hold_s=1.0)
84 for symbol
in press_valves(session):
85 session.set_valve(symbol,
True)
88 ullage = session.model.built.tanks[
"OT"].ullage
89 return psig(session.history[-1].pressures[ullage])
91 drawn, turned = lockup(
None), lockup(400.0)
92 assert turned < drawn - 100.0
93 assert turned == pytest.approx(400.0, abs=40.0)
99 machine, model = session.machine, session.model
101 n.id: n.label
or n.id
102 for n
in model.diagram.nodes
103 if n.id
in model.built.actuators
105 auto = bind(machine, labels, roles=model.built.valve_roles)
106 actuator, symbol = sorted(auto.to_symbol.items())[0]
107 other = next(s
for s
in labels
if s != symbol)
110 machine, labels, roles=model.built.valve_roles, overrides={actuator: other}
112 assert pinned.to_symbol[actuator] == other
113 assert actuator
in pinned.by_user
114 assert list(pinned.to_symbol.values()).
count(other) == 1,
"a valve is driven once"
117 machine, labels, roles=model.built.valve_roles, overrides={actuator:
""}
119 assert actuator
not in none.to_symbol
and actuator
in none.unmatched
122 machine, labels, roles=model.built.valve_roles, overrides={actuator:
"gone"}
124 assert stale.to_symbol[actuator] == symbol
and actuator
not in stale.by_user