def test_on_complete(stc):
    sequencer = CStcSystem.Instance().GetObject("Sequencer")
    project = CStcSystem.Instance().GetObject("Project")
    ctor = CScriptableCreator()
    route_mix = ctor.Create("StmTemplateMix", project)
    route_mix.Set("MixInfo", get_example_table_data())
    cmd = ctor.Create(RPKG + ".CreateRouteMixCommand", sequencer)
    cmd.Set("MixInfo", get_example_table_data())
    cmd.SetCollection("TargetObjectList", [route_mix.GetObjectHandle()])
    cmd.Set("AutoExpandTemplateMix", False)
    cmd.Set("StmTemplateMix", route_mix.GetObjectHandle())

    # Mock get_this_cmd
    gtc_p = patch(RPKG + ".CreateRouteMixCommand.get_this_cmd",
                  new=MagicMock(return_value=cmd))
    gtc_p.start()

    # Call on_complete
    CreateRouteMixCmd.on_complete([])

    # Check the MixInfo
    mi = route_mix.Get("MixInfo")
    err_str, mi_dict = json_utils.load_json(mi)
    assert err_str == ""
    assert mi_dict.get("routeCount", 0) == 1000
    comp_list = mi_dict.get("components", [])
    assert len(comp_list) == 2
    gtc_p.stop()
def test_on_complete_fail(stc):
    sequencer = CStcSystem.Instance().GetObject("Sequencer")
    project = CStcSystem.Instance().GetObject("Project")
    ctor = CScriptableCreator()
    route_mix = ctor.Create("StmTemplateMix", project)
    route_mix.Set("MixInfo", get_example_table_data())
    cmd = ctor.Create(RPKG + ".CreateRouteMixCommand", sequencer)
    cmd.Set("MixInfo", get_example_table_data())
    cmd.SetCollection("TargetObjectList", [route_mix.GetObjectHandle()])
    cmd.Set("AutoExpandTemplateMix", False)
    cmd.Set("StmTemplateMix", route_mix.GetObjectHandle())

    # Mock get_this_cmd
    gtc_p = patch(RPKG + ".CreateRouteMixCommand.get_this_cmd",
                  new=MagicMock(return_value=cmd))
    gtc_p.start()

    # "Fail" one of the child commands
    iter_group_cmd = cmd.GetObject(PKG + ".IterationGroupCommand")

    # Call on_complete
    res = CreateRouteMixCmd.on_complete([iter_group_cmd])
    assert not res
    assert "CreateRouteMixCommand.on_complete(): No additional" \
        in cmd.Get("Status")
def test_validate(stc):
    sequencer = CStcSystem.Instance().GetObject("Sequencer")
    ctor = CScriptableCreator()
    cmd = ctor.Create(RPKG + ".CreateRouteMixCommand", sequencer)
    gtc_p = patch(RPKG + ".CreateRouteMixCommand.get_this_cmd",
                  new=MagicMock(return_value=cmd))
    gtc_p.start()

    # Signature
    # validate(TargetObjectList, TargetObjectTagList, MixInfo,
    #          MixTagName, AutoExpandTemplate)
    res = CreateRouteMixCmd.validate([], [], "", "", False)
    assert res == ""
    gtc_p.stop()
def test_run_fail(stc):
    sequencer = CStcSystem.Instance().GetObject("Sequencer")
    ctor = CScriptableCreator()
    cmd = ctor.Create(RPKG + ".CreateRouteMixCommand", sequencer)

    plLogger = PLLogger.GetLogger("test_CreateRouteMixCommand.test_run_fail")
    plLogger.LogInfo("start")

    # Mock get_this_cmd
    gtc_p = patch(RPKG + ".CreateRouteMixCommand.get_this_cmd",
                  new=MagicMock(return_value=cmd))
    gtc_p.start()

    # Signature
    # run(TargetObjectList, TargetObjectTagList, MixInfo,
    #          MixTagName, AutoExpandTemplate)

    # Invalid JSON
    res = CreateRouteMixCmd.run([], [], '{"invalid_json"}',
                                "UnitTestRouteMix", False)
    assert not res
    assert "is not valid JSON" in cmd.Get("Status")

    # Invalid Sequence
    iter_group_cmd = cmd.GetObject(PKG + ".IterationGroupCommand")
    tmpl_cmd2 = ctor.Create(PKG + ".CreateTemplateConfigCommand",
                            iter_group_cmd)
    cmd_list = iter_group_cmd.GetCollection("CommandList")
    cmd_list.append(tmpl_cmd2.GetObjectHandle())
    iter_group_cmd.SetCollection("CommandList", cmd_list)

    res = CreateRouteMixCmd.run([], [], get_example_table_data(),
                                "UnitTestRouteMix", False)
    assert not res
    assert "Invalid Sequence: " in cmd.Get("Status")
    gtc_p.stop()
def test_re_init(stc):
    hnd_reg = CHandleRegistry.Instance()
    sequencer = CStcSystem.Instance().GetObject("Sequencer")
    ctor = CScriptableCreator()

    # Create the command.  init() is called when the command is created
    cmd = ctor.Create(RPKG + ".CreateRouteMixCommand", sequencer)

    # Mock get_this_cmd
    gtc_p = patch(RPKG + ".CreateRouteMixCommand.get_this_cmd",
                  new=MagicMock(return_value=cmd))
    gtc_p.start()

    # Check that init() was invoked
    cmd_hnd_list = cmd.GetCollection("CommandList")
    assert len(cmd_hnd_list) == 1
    grp_cmd = hnd_reg.Find(cmd_hnd_list[0])
    assert grp_cmd.IsTypeOf(PKG + ".IterationGroupCommand")
    child_list = cmd.GetObjects("Command")
    assert len(child_list) == 1
    assert child_list[0].GetObjectHandle() == grp_cmd.GetObjectHandle()

    # Make some change in the contained sequence to simulate
    # an author modifying the contained sequence
    cmd_hnd_list = grp_cmd.GetCollection("CommandList")
    while_cmd = hnd_reg.Find(cmd_hnd_list[0])
    assert while_cmd.IsTypeOf("SequencerWhileCommand")

    cmd_hnd_list = while_cmd.GetCollection("CommandList")
    assert len(cmd_hnd_list) == 2

    iter_valid_cmd = ctor.Create(PKG + ".IteratorValidateCommand", while_cmd)
    cmd_hnd_list.append(iter_valid_cmd.GetObjectHandle())
    while_cmd.SetCollection("CommandList", cmd_hnd_list)

    # Call init() again.  This is invoked when the command is "created"
    # again.  This appears to happen when a saved sequence with this
    # command in it is loaded.
    CreateRouteMixCmd.init()

    # Check that the original sequence did not change, that is,
    # the sequence wasn't pre-filled again.
    cmd_hnd_list = cmd.GetCollection("CommandList")
    assert len(cmd_hnd_list) == 1
    grp_cmd = hnd_reg.Find(cmd_hnd_list[0])
    assert grp_cmd.IsTypeOf(PKG + ".IterationGroupCommand")
    child_list = cmd.GetObjects("Command")
    assert len(child_list) == 1
    assert child_list[0].GetObjectHandle() == grp_cmd.GetObjectHandle()

    # Find the inserted command to prove that the original sequence
    # was not overwritten
    cmd_hnd_list = grp_cmd.GetCollection("CommandList")
    while_cmd = hnd_reg.Find(cmd_hnd_list[0])
    assert while_cmd.IsTypeOf("SequencerWhileCommand")
    cmd_hnd_list = while_cmd.GetCollection("CommandList")
    assert len(cmd_hnd_list) == 3

    conf_cmd = hnd_reg.Find(cmd_hnd_list[0])
    assert conf_cmd
    assert conf_cmd.IsTypeOf(PKG + ".IteratorConfigMixParamsCommand")

    tmpl_cmd = hnd_reg.Find(cmd_hnd_list[1])
    assert tmpl_cmd
    assert tmpl_cmd.IsTypeOf(PKG + ".CreateTemplateConfigCommand")

    valid_cmd = hnd_reg.Find(cmd_hnd_list[2])
    assert valid_cmd
    assert valid_cmd.IsTypeOf(PKG + ".IteratorValidateCommand")
    gtc_p.stop()
def test_reset():
    res = CreateRouteMixCmd.reset()
    assert res
def test_run(stc):
    sequencer = CStcSystem.Instance().GetObject("Sequencer")
    project = CStcSystem.Instance().GetObject("Project")
    ctor = CScriptableCreator()
    hnd_reg = CHandleRegistry.Instance()
    cmd = ctor.Create(RPKG + ".CreateRouteMixCommand", sequencer)

    plLogger = PLLogger.GetLogger("test_CreateRouteMixCommand.test_run")
    plLogger.LogInfo("start")

    # Mock get_this_cmd
    gtc_p = patch(RPKG + ".CreateRouteMixCommand.get_this_cmd",
                  new=MagicMock(return_value=cmd))
    gtc_p.start()

    # Signature
    # run(TargetObjectList, TargetObjectTagList, MixInfo,
    #          MixTagName, AutoExpandTemplate)
    CreateRouteMixCmd.run([], [], get_example_table_data(),
                          "UnitTestRouteMix", False)

    # Check the created StmTemplateMix
    route_mix_hnd = cmd.Get("StmTemplateMix")
    route_mix = hnd_reg.Find(route_mix_hnd)
    assert route_mix

    # Check the Route Mix Tag
    tags = project.GetObject("Tags")
    assert tags
    user_tag_list = tags.GetObjects("Tag")
    assert len(user_tag_list)
    exp_tag = None
    for user_tag in user_tag_list:
        if user_tag.Get("Name") == "UnitTestRouteMix":
            exp_tag = user_tag
            break
    assert exp_tag
    tag_target = exp_tag.GetObject("StmTemplateMix", RelationType("UserTag", 1))
    assert tag_target
    assert tag_target.GetObjectHandle() == route_mix.GetObjectHandle()

    # Find the tagged commands
    tag_json = cmd.Get("GroupCommandTagInfo")
    assert tag_json != ""
    err_str, tag_dict = json_utils.load_json(tag_json)
    assert err_str == ""

    # Iterator
    tagged_obj_list = tag_utils.get_tagged_objects_from_string_names(
        [tag_dict["rowIterator"]])
    assert len(tagged_obj_list) == 1
    obj_iter = tagged_obj_list[0]
    assert obj_iter.IsTypeOf(PKG + ".ObjectIteratorCommand")
    assert obj_iter.Get("StepVal") == 1.0
    assert obj_iter.Get("MaxVal") == 1.0
    assert obj_iter.Get("MinVal") == 0.0
    assert obj_iter.Get("IterMode") == "STEP"
    assert obj_iter.Get("ValueType") == "RANGE"

    # Configurator
    tagged_obj_list = tag_utils.get_tagged_objects_from_string_names(
        [tag_dict["rowConfigurator"]])
    assert len(tagged_obj_list) == 1
    config_cmd = tagged_obj_list[0]
    assert config_cmd.IsTypeOf(
        PKG + ".IteratorConfigMixParamsCommand")
    assert config_cmd.Get("StmTemplateMix") == route_mix.GetObjectHandle()
    assert config_cmd.Get("TagData") == cmd.Get("GroupCommandTagInfo")

    # CreateTemplateConfigCommand
    tagged_obj_list = tag_utils.get_tagged_objects_from_string_names(
        [tag_dict["templateConfigurator"]])
    assert len(tagged_obj_list) == 1
    tmpl_cmd = tagged_obj_list[0]
    assert tmpl_cmd.IsTypeOf(PKG + ".CreateTemplateConfigCommand")
    assert tmpl_cmd.Get("StmTemplateMix") == route_mix.GetObjectHandle()
    gtc_p.stop()