def test_satisfy_xclock_satisfied_xclock():
    """Test satisfy_xclock for a satisfied clock trigger."""
    xtrigger_mgr = XtriggerManager(suite="sample_suite", user="******")
    # the clock xtrigger
    xtrig = SubFuncContext(label="wall_clock",
                           func_name="wall_clock",
                           func_args=[],
                           func_kwargs={})
    xtrig.out = "[\"True\", \"1\"]"
    xtrigger_mgr.add_clock("wall_clock", xtrig)
    # create a task
    tdef = TaskDef(name="foo",
                   rtcfg=None,
                   run_mode="live",
                   start_point=1,
                   spawn_ahead=False)
    tdef.xclock_label = "wall_clock"
    # cycle point for task proxy
    init()
    start_point = ISO8601Point('20000101T0000+05')
    # create task proxy
    itask = TaskProxy(tdef=tdef, start_point=start_point)
    itask.state.xclock = "wall_clock", True  # satisfied?
    # we are defining in the state of the TaskProxy. that its xclock trigger
    # has been satisfied, without actually adding it to the right dict.
    assert not xtrigger_mgr.sat_xclock
    xtrigger_mgr.satisfy_xclock(itask)
    # as it was already satisfied, the function should return immediately,
    # without touching sat_xclock, therefore, it must remain empty
    assert not xtrigger_mgr.sat_xclock
def test_satisfy_xclock_unsatisfied_xclock():
    """Test satisfy_xclock for an unsatisfied clock trigger."""
    xtrigger_mgr = XtriggerManager(suite="sample_suite", user="******")
    # the clock xtrigger
    xtrig = SubFuncContext(label="wall_clock",
                           func_name="wall_clock",
                           func_args=[],
                           func_kwargs={})
    xtrig.out = "[\"True\", \"1\"]"
    xtrigger_mgr.add_clock("wall_clock", xtrig)
    # create a task
    tdef = TaskDef(name="foo",
                   rtcfg=None,
                   run_mode="live",
                   start_point=1,
                   spawn_ahead=False)
    tdef.xclock_label = "wall_clock"
    # cycle point for task proxy
    init()
    start_point = ISO8601Point('20000101T0000+05')
    # create task proxy
    itask = TaskProxy(tdef=tdef, start_point=start_point)
    itask.state.xclock = "wall_clock", False  # satisfied?
    # we are defining in the state of the TaskProxy. that its xclock trigger
    # has **not** been satisfied.
    assert not xtrigger_mgr.sat_xclock
    xtrigger_mgr.satisfy_xclock(itask)
    # as it was satisfied by the satisfy_clock function, we must have its
    # signature in the dict. NB the signature is not the same as
    # get_signature(), as it is actually the signature for that moment
    # when it was satisfied.
    assert xtrigger_mgr.sat_xclock
def test_housekeeping_with_xclock_satisfied():
    """The housekeeping method makes sure only satisfied xclock function
    are kept."""
    xtrigger_mgr = XtriggerManager(suite="sample_suite", user="******")
    # the clock xtrigger
    xtrig = SubFuncContext(label="wall_clock",
                           func_name="wall_clock",
                           func_args=[],
                           func_kwargs={})
    xtrig.out = "[\"True\", \"1\"]"
    xtrigger_mgr.add_clock("wall_clock", xtrig)
    # create a task
    tdef = TaskDef(name="foo",
                   rtcfg=None,
                   run_mode="live",
                   start_point=1,
                   spawn_ahead=False)
    tdef.xclock_label = "wall_clock"
    # cycle point for task proxy
    # TODO: we need to call init, before we can use ISO8601 points in Cylc,
    #       why?
    init()
    start_point = ISO8601Point('20000101T0000+05')
    # create task proxy
    itask = TaskProxy(tdef=tdef, start_point=start_point)
    itask.state.xclock = "wall_clock", False  # satisfied?
    # satisfy xclock
    xtrigger_mgr.satisfy_xclock(itask)
    # tally
    xtrigger_mgr.collate([itask])
    assert xtrigger_mgr.sat_xclock
    xtrigger_mgr.housekeep()
    # here we still have the same number as before
    assert xtrigger_mgr.sat_xclock