def test_gon_init(): logger.debug('test_gon_init') FakeGon = make_fake_device(BaseGon) FakeGon(name='test', prefix_hor='hor', prefix_ver='ver', prefix_rot='rot', prefix_tip='tip', prefix_tilt='tilt') FakeGon = make_fake_device(GonWithDetArm) FakeGon(name='test', prefix_hor='hor', prefix_ver='ver', prefix_rot='rot', prefix_tip='tip', prefix_tilt='tilt', prefix_detver='detver', prefix_dettilt='dettilt', prefix_2theta='2theta') FakeGon = make_fake_device(XYZStage) FakeGon(name='test', prefix_x='x', prefix_y='y', prefix_z='z') FakeGon = make_fake_device(SamPhi) FakeGon(name='test', prefix_samz='samz', prefix_samphi='samphi') FakeGon = make_fake_device(Kappa) FakeGon(name='test', prefix_x='x', prefix_y='y', prefix_z='z', prefix_eta='eta', prefix_kappa='kappa', prefix_phi='phi')
def test_make_fake_device(): assert make_fake_device(EpicsSignal) == FakeEpicsSignal assert make_fake_device(EpicsSignalRO) == FakeEpicsSignalRO FakeSample = make_fake_device(Sample) my_fake = FakeSample('KITCHEN', name='kitchen') assert isinstance(my_fake, Sample) # Skipped assert my_fake.nothing.__class__ is Signal # Normal assert isinstance(my_fake.butter, FakeEpicsSignal) assert isinstance(my_fake.flour, FakeEpicsSignalRO) assert isinstance(my_fake.sink, FakeEpicsSignal) # Nested assert isinstance(my_fake.egg.yolk, FakeEpicsSignal) assert isinstance(my_fake.egg.whites, FakeEpicsSignalRO) # Dynamic assert isinstance(my_fake.fridge.milk, FakeEpicsSignal) assert isinstance(my_fake.fridge.cheese, FakeEpicsSignalRO) my_fake.read()
def fake_new_attenuator(request): """AT2L0, AT1K4 - attenuators new to LCLS-II.""" if request.param == 'at2l0': FakeAT2L0 = make_fake_device(AT2L0) return FakeAT2L0('AT2L0:', name='fake_at2l0') FakeAT1K4 = make_fake_device(AT1K4) return FakeAT1K4('AT1K4:', calculator_prefix='AT1K4:CALC', name='fake_at1k4')
def test_do_not_break_real_class(): make_fake_device(Sample) assert Sample.butter.cls is EpicsSignal assert Sample.egg.cls is SampleNested assert SampleNested.whites.cls is EpicsSignalRO assert Sample.fridge.defn['milk'][0] is EpicsSignal with pytest.raises(DisconnectedError): my_real = Sample('KITCHEN', name='kitchen') my_real.read()
def test_vh_init(): logger.debug('test_vh_init') FakeVH = make_fake_device(VonHamosFE) FakeVH(name='test', prefix_focus='zoom', prefix_energy='buzz') FakeVH('TST', name='test', prefix_focus='zoom', prefix_energy='buzz') FakeVH = make_fake_device(VonHamosFER) FakeVH(name='test', prefix_focus='zoom', prefix_energy='buzz', prefix_rot='whirl') FakeVH('TST', name='test', prefix_focus='zoom', prefix_energy='buzz', prefix_rot='whirl') FakeVH = make_fake_device(VonHamos4Crystal) FakeVH('TST', name='test', prefix_focus='zoom', prefix_energy='buzz')
def test_jet_init(): logger.debug('test_jet_init') FakeJet = make_fake_device(Injector) FakeJet(name='test', x_prefix='X', y_prefix='Y', z_prefix='Z') FakeJet = make_fake_device(InjectorWithFine) FakeJet(name='test', x_prefix='X', y_prefix='Y', z_prefix='Z', fine_x_prefix='x', fine_y_prefix='y', fine_z_prefix='z') FakeJet = make_fake_device(BeckhoffJet) FakeJet('TST', name='test')
def fake_pim(): FakePIM = make_fake_device(PIMMotor) FakePIM.state.cls = HotfixFakeEpicsSignal pim = FakePIM('Test:Yag', name='test') pim.state.sim_put(0) pim.state.sim_set_enum_strs(['Unknown'] + PIMMotor.states_list) return pim
def fake_mpod_module4Channel(): FakeMPODmodule = make_fake_device(MPODApalisModule4Channel) mpod_module4 = FakeMPODmodule('TEST:MPOD:MOD:4', name='TestM4') mpod_module4.voltage_ramp_speed.sim_put(10) mpod_module4.current_ramp_speed.sim_put(10) mpod_module4.faults.sim_put(0) return mpod_module4
def fake_inout(): Fake = make_fake_device(InOutRecordPositioner) Fake.state.cls = HotfixFakeEpicsSignal inout = Fake('Test:Ref', name='test') inout.state.sim_put(0) inout.state.sim_set_enum_strs(('Unknown', 'IN', 'OUT')) return inout
def make_fake_ccm(): fake_device_cache[ccm.CCMMotor] = FastMotor FakeCCM = make_fake_device(ccm.CCM) fake_ccm = FakeCCM(alio_prefix='ALIO', theta2fine_prefix='THETA', theta2coarse_prefix='THTA', chi2_prefix='CHI', x_down_prefix='X:DOWN', x_up_prefix='X:UP', y_down_prefix='Y:DOWN', y_up_north_prefix='Y:UP:NORTH', y_up_south_prefix='Y:UP:SOUTH', in_pos=8, out_pos=0, name='fake_ccm') fake_ccm.calc.alio.set(SAMPLE_ALIO) def init_pos(mot, pos=0): mot.user_readback.sim_put(0) mot.user_setpoint.sim_put(0) mot.user_setpoint.sim_set_limits((0, 0)) mot.motor_spg.sim_put(2) mot.part_number.sim_put('tasdf') init_pos(fake_ccm.x.down) init_pos(fake_ccm.x.up) init_pos(fake_ccm.y.down) init_pos(fake_ccm.y.up_north) init_pos(fake_ccm.y.up_south) fake_ccm.calc.energy_request.setpoint.sim_put(0) return fake_ccm
def quadem(): FakeQuadEM = make_fake_device(QuadEM) em = FakeQuadEM('quadem:', name='quadem') clear_fake_device(em) em.conf.port_name.put('NSLS_EM') for k in [ 'image', 'current1', 'current2', 'current3', 'current4', 'sum_all' ]: cc = getattr(em, k) if isinstance(cc, ImagePlugin): cc.plugin_type.sim_put(ImagePlugin._plugin_type) cc.nd_array_port.sim_put('NSLS_EM') elif isinstance(cc, StatsPlugin): cc.plugin_type.sim_put(StatsPlugin._plugin_type) cc.nd_array_port.sim_put('NSLS_EM') cc.enable.sim_set_enum_strs(['Disabled', 'Enabled']) cc.enable.put('Enabled') cc.port_name.sim_put(k.upper()) em.wait_for_connection() return em
def fake_prefocus(): FakePrefocus = make_fake_device(Prefocus) prefocus = FakePrefocus('TST:PFLS', name='prefocus') prefocus.state.sim_set_enum_strs(('Unknown', 'OUT', 'LENS1', 'LENS2', 'LENS3')) prefocus.state.sim_put(1) return prefocus
def quadem(): FakeQuadEM = make_fake_device(QuadEM) em = FakeQuadEM('quadem:', name='quadem') clear_fake_device(em) em.conf.port_name.put('NSLS_EM') for k in ['image', 'current1', 'current2', 'current3', 'current4', 'sum_all']: cc = getattr(em, k) if isinstance(cc, ImagePlugin): cc.plugin_type.sim_put(ImagePlugin._plugin_type) cc.nd_array_port.sim_put('NSLS_EM') elif isinstance(cc, StatsPlugin): cc.plugin_type.sim_put(StatsPlugin._plugin_type) cc.nd_array_port.sim_put('NSLS_EM') else: cc.plugin_type.sim_put('unknown') cc.enable.sim_set_enum_strs(['Disabled', 'Enabled']) cc.enable.put('Enabled') cc.port_name.sim_put(k.upper()) em.wait_for_connection() return em
def fake_gauge_set(): FakeGaugeSet = make_fake_device(GaugeSetPirani) gs = FakeGaugeSet('Test:Gauge', name='test', index='99') gs.gcc.state.sim_put(1) gs.gcc.pressure.sim_put(99) gs.gpi.pressure.sim_put(98) return gs
def fake_ionpump(): FakeIonPump = make_fake_device(IonPumpBase) pump = FakeIonPump('Test:pump', name='test') pump.state.sim_set_enum_strs(['OFF', 'ON']) pump.state.sim_put(1) pump._pressure.sim_put(99.) return pump
def fake_detector(): try: from ophyd import (SimDetector, CommonPlugins, SimDetectorCam, Component as Cpt, select_version) from ophyd.sim import make_fake_device except ImportError as ex: pytest.skip(f'ophyd version not compatible ({ex})') CommonPlugins_V32 = select_version(CommonPlugins, (3, 2)) class Detector(SimDetector, CommonPlugins_V32): cam = Cpt(SimDetectorCam, 'cam1:') cam2 = Cpt(SimDetectorCam, 'cam2:') FakeDetector = make_fake_device(Detector) det = FakeDetector('13SIM1:', name='det') for dotted, subdev in sorted(det.walk_subdevices(include_lazy=True)): if hasattr(subdev, 'nd_array_port'): subdev.port_name.sim_put(subdev.dotted_name) subdev.nd_array_port.sim_put('cam') elif hasattr(subdev, 'port_name'): subdev.port_name.sim_put(subdev.dotted_name) return det
def lxt(monkeypatch): """LaserTiming pseudopositioner device instance for testing.""" lxt = make_fake_device(LaserTiming)('prefix', name='lxt') lxt._fs_tgt_time.sim_set_limits(lxt.limits) lxt._fs_tgt_time.sim_put(0) wrap_pv_positioner_move(monkeypatch, lxt) return lxt
def fake_ccm(): FakeCCM = make_fake_device(ccm.CCM) fake_ccm = FakeCCM(alio_prefix='ALIO', theta2fine_prefix='THETA', x_down_prefix='X:DOWN', x_up_prefix='X:UP', y_down_prefix='Y:DOWN', y_up_north_prefix='Y:UP:NORTH', y_up_south_prefix='Y:UP:SOUTH', in_pos=8, out_pos=0, name='fake_ccm') fake_ccm.calc.alio.readback.sim_put(SAMPLE_ALIO) fake_ccm.calc.alio.setpoint.sim_put(SAMPLE_ALIO) def init_pos(mot, pos=0): mot.user_readback.sim_put(0) mot.user_setpoint.sim_put(0) mot.motor_spg.sim_put(2) init_pos(fake_ccm.x.down) init_pos(fake_ccm.x.up) init_pos(fake_ccm.y.down) init_pos(fake_ccm.y.up_north) init_pos(fake_ccm.y.up_south) return fake_ccm
def test_lasertiming_dmov_fail(): logger.debug('test_lasertiming_dmov_fail') FakeLaserTiming = make_fake_device(LaserTiming) lxt = FakeLaserTiming('FAKE:VIT', name='fstiming') # The move should timeout if the DMOV signal is never put to with pytest.raises(StatusTimeoutError): lxt.mv(1e-6, wait=True, timeout=1)
def fake_xfls(): FakeXFLS = make_fake_device(XFLS) FakeXFLS.state.cls = HotfixFakeEpicsSignal xfls = FakeXFLS('TST:XFLS', name='lens') xfls.state.sim_put(4) xfls.state.sim_set_enum_strs(('Unknown', 'LENS1', 'LENS2', 'LENS3', 'OUT')) return xfls
def test_beam_energy_request_behavior(): FakeCls = make_fake_device(BeamEnergyRequest) # No wait variant: reports done immediately, skips moves smaller than atol nowait = FakeCls('TST', name='nowait', skip_small_moves=True, atol=0.9) assert isinstance(nowait, FakeBeamEnergyRequestNoWait) nowait.setpoint.put(0) assert nowait.position == 0 nowait.move(0.1, timeout=0.1) assert nowait.position == 0 nowait.move(1, timeout=0.1) assert nowait.position == 1 # Wait variant: acr needs to put 0 to when moving and 1 back when done acrwait = FakeCls('TST', name='acrwait', acr_status_suffix='WAITER') assert isinstance(acrwait, FakeBeamEnergyRequestACRWait) acrwait.done.sim_put(1) st = acrwait.move(1, wait=False) try: st.wait(timeout=0.1) except Exception: ... assert not st.done acrwait.done.sim_put(0) try: st.wait(timeout=0.1) except Exception: ... assert not st.done acrwait.done.sim_put(1) try: st.wait(timeout=1) except Exception: ... assert st.done
def fake_pps(): FakePPS = make_fake_device(PPSStopper) FakePPS.state.cls = HotfixFakeEpicsSignal pps = FakePPS("PPS:H0:SUM", name="test_pps") pps.state.sim_set_enum_strs(['Unknown', 'IN', 'OUT']) pps.state.put('OUT') return pps
def fake_mesh(): FakeMesh = make_fake_device(Mesh) # Using SP channel = 1, RB channel = 2, scale = 1000 mesh = FakeMesh('Test:Mesh', 1, 2) mesh.write_sig.sim_put(1.0) mesh.read_sig.sim_put(1.05) # rb will be slightly off from sp return mesh
def transfocator(): FakeTransfocator = make_fake_device(Transfocator) # Create our base transfocator trans = FakeTransfocator("TST:LENS", name='Transfocator') # Set all the lens values to ridiculous values and out for lens in trans.xrt_lenses: lens._sig_z.sim_put(100.0) lens._sig_focus.sim_put(1000.0) lens._sig_radius.sim_put(100.0) remove(lens) for lens, z in zip(trans.tfs_lenses, np.linspace(250, 260, len(trans.tfs_lenses))): lens._sig_z.sim_put(z) lens._sig_focus.sim_put(1000.0) lens._sig_radius.sim_put(100.0) remove(lens) # Give two reasonable values so we can test calculations trans.prefocus_bot._sig_focus.sim_put(50.0) trans.tfs_02._sig_z.sim_put(275.) trans.tfs_02._sig_focus.sim_put(25.) # Use a nominal sample position trans.nominal_sample = 300.0 # Set a reasonable limit trans.xrt_limit.sim_put(-1.0) return trans
def fake_offset_ims(): off_ims = make_fake_device(OffsetMotor)('FAKE:OFFSET:IMS', motor_prefix='MOTOR:PREFIX', name='fake_offset_ims') motor_setup(off_ims.motor) # start with motor position at 1 off_ims.motor.user_readback.sim_put(1) return off_ims
def fake_class_setup(cls): """ Make the fake class and modify if needed """ FakeClass = make_fake_device(cls) if issubclass(FakeClass, PCDSMotorBase): FakeClass.motor_spg.cls = HotfixFakeEpicsSignal return FakeClass
def fake_lodcm(): FakeLODCM = make_fake_device(SimLODCM) # After the fake_lodcm setup: # fake_lodcm will have get_material() = 'C' by default # and get_reflection() = (1, 1, 1) by default lodcm = FakeLODCM('FAKE:LOM', name='fake_lom') lodcm.h1n_state.state.sim_put(1) lodcm.h1n_state.state.sim_set_enum_strs(['Unknown'] + H1N.states_list) lodcm.yag.state.sim_put(1) lodcm.yag.state.sim_set_enum_strs(['Unknown'] + YagLom.states_list) lodcm.dectris.state.sim_put(1) lodcm.dectris.state.sim_set_enum_strs(['Unknown'] + Dectris.states_list) lodcm.diode.state.sim_put(1) lodcm.diode.state.sim_set_enum_strs(['Unknown'] + Diode.states_list) lodcm.foil.state.sim_put(1) lodcm.foil.state.sim_set_enum_strs(['Unknown'] + Foil.states_list) lodcm.h1n_state.state.sim_put(1) # additional states for Crystal Tower 1 # set y1_state and chi1_state to 'C' lodcm.y1_state.state.sim_put(1) lodcm.y1_state.state.sim_set_enum_strs(['Unknown'] + Y1.states_list) lodcm.chi1_state.state.sim_put(1) lodcm.chi1_state.state.sim_set_enum_strs(['Unknown'] + CHI1.states_list) # additional states for Crystal Tower 2 # set y2_state, chi2_state and h2_state to 'C' lodcm.y2_state.state.sim_put(1) lodcm.y2_state.state.sim_set_enum_strs(['Unknown'] + Y2.states_list) lodcm.chi2_state.state.sim_put(1) lodcm.chi2_state.state.sim_set_enum_strs(['Unknown'] + CHI2.states_list) lodcm.h2n_state.state.sim_put(1) lodcm.h2n_state.state.sim_set_enum_strs(['Unknown'] + H2N.states_list) # set the reflection to default to (1, 1, 1) for both towers and both # materials lodcm.tower1.diamond_reflection.sim_put((1, 1, 1)) lodcm.tower1.silicon_reflection.sim_put((1, 1, 1)) lodcm.tower2.diamond_reflection.sim_put((1, 1, 1)) lodcm.tower2.silicon_reflection.sim_put((1, 1, 1)) lodcm.th1Si = make_fake_offset_ims('TH1SI:PREFIX', user_offset=-23) lodcm.th2Si = make_fake_offset_ims('TH2C:PREFIX', user_offset=-23) lodcm.th1C = make_fake_offset_ims('TH1C:PREFIX') lodcm.th2C = make_fake_offset_ims('TH2C:PREFIX') lodcm.z1Si = make_fake_offset_ims('TH1SI:PREFIX') lodcm.z2Si = make_fake_offset_ims('TH2C:PREFIX') lodcm.z1C = make_fake_offset_ims('TH1C:PREFIX') lodcm.z2C = make_fake_offset_ims('TH2C:PREFIX') lodcm.tower2.x2_retry_deadband.sim_put(-1) lodcm.tower2.z2_retry_deadband.sim_put(-1) return lodcm
def fake_pim(): FakePIM = make_fake_device(PIM) pim = FakePIM('Test:Yag', name='test') pim.state.state.sim_put(0) pim.state.state.sim_set_enum_strs(['Unknown'] + PIMY.states_list) pim.y_motor.error_severity.sim_put(0) pim.y_motor.bit_status.sim_put(0) pim.y_motor.motor_spg.sim_put(2) return pim
def fake_mps_limits(): FakeLimits = make_fake_device(MPSLimits) mps = FakeLimits("Tst:Mps:Lim", logic=lambda x, y: x, name='MPS Limits') # Not bypassed or faulted mps.in_limit.fault.sim_put(0) mps.in_limit.bypass.sim_put(0) mps.out_limit.fault.sim_put(0) mps.out_limit.bypass.sim_put(0) return mps
def test_clear_fake_device(): FakeSample = make_fake_device(Sample) my_fake = FakeSample('KITCHEN', name='kitchen') clear_fake_device(my_fake, default_value=49, default_string_value='string') assert my_fake.butter.value == 49 assert my_fake.flour.value == 49 assert my_fake.sink.value == 49 assert my_fake.egg.yolk.value == 'string' assert my_fake.egg.whites.value == 49
def fake_ipm(): FakeIPM = make_fake_device(IPM) ipm = FakeIPM("Test:My:IPM", name='test_ipm') ipm.diode.state.sim_put(0) ipm.diode.state.sim_set_enum_strs(['Unknown'] + InOutRecordPositioner.states_list) ipm.state.sim_put(0) ipm.state.sim_set_enum_strs(['Unknown'] + IPM.states_list) return ipm