예제 #1
0
def test_statement_and_main():
    yaml_str = """
- tab: "Statement and main"
  contexts:
  - arguments: [ '-a', 5, 7 ]
    stdout:
      data: 12
      config:
        tryFloatingPoint: true
    testcases:
      - statement: 'add(5, 7)'
        return: 12
    """
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert len(plan.tabs) == 1
    tab = plan.tabs[0]
    assert len(tab.runs) == 1
    run = tab.runs[0]
    assert run.run.input.main_call
    assert run.run.input.arguments == ['-a', '5', '7']
    assert run.run.output.stdout.data == '12'
    assert run.run.output.stdout.evaluator.options['tryFloatingPoint']
    assert len(run.contexts) == 1
    ctx = run.contexts[0]
    assert len(ctx.testcases) == 1
    test = ctx.testcases[0]
    assert isinstance(test.input, FunctionCall)
    assert test.output.result.value.data == 12
    assert test.output.result.value.type == BasicNumericTypes.INTEGER
예제 #2
0
def test_parse_one_tab_ctx():
    yaml_str = """
disableOptimizations: true
namespace: "solution"
tabs:
- tab: "Ctx"
  hidden: true
  contexts:
  - arguments: [ "--arg", "argument" ]
    stdin: "Input string"
    stdout: "Output string"
    stderr: "Error string"
    exitCode: 1
    """
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert plan.namespace == "solution"
    assert len(plan.tabs) == 1
    tab = plan.tabs[0]
    assert tab.hidden
    assert tab.name == "Ctx"
    assert len(tab.runs) == 1
    run = tab.runs[0]
    assert len(run.contexts) == 0
    run_input = run.run.input
    assert run_input.stdin.data == "Input string"
    assert run_input.arguments == ["--arg", "argument"]
    assert run_input.main_call
    run_output = run.run.output
    assert run_output.stderr.data == "Error string"
    assert run_output.stdout.data == "Output string"
    assert run_output.exit_code.value == 1
예제 #3
0
def _read_plan(config_dict: Dict[str, Any], evaluation_dir: Path) -> Plan:
    """
    Read testplan from JSON or YAML DSL

    :param config_dict: Configuration information
    :param evaluation_dir: Directory which must contain the testplan
    :return: The testplan
    """

    try:
        plan_file = evaluation_dir / config_dict["evaluation"]["testplan"]
    except KeyError:
        print(f"Not testplan given in the template configuration file",
              file=sys.stderr)
        sys.exit(6)
    _check_if_file_exists("Testplan", plan_file)

    with open(plan_file, 'r') as file:
        loaded_plan = file.read()

    suffix = plan_file.suffixes[-1].lower()
    if suffix in ('.yml', '.yaml'):
        schema_parser = SchemaParser()
        return schema_parser.load_str(loaded_plan)
    return _PlanModel.parse_raw(loaded_plan).__root__
예제 #4
0
def test_statements():
    yaml_str = """
- tab: "Statements"
  config:
    stdout:
      ignoreWhitespace: true
  contexts:
  - testcases:
    - statement: 'Safe safe = new Safe("Ignore whitespace")'
      stdout: "New safe"
    - expression: 'safe.content()'
      return: "Ignore whitespace"
  - testcases:
    - statement: 'Safe safe = new Safe(5 :: uint8)'
      stdout:
        data: "New safe"
        config:
          ignoreWhitespace: false
    - expression: 'safe.content()'
      return-raw: '5 :: uint8'
    """
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert len(plan.tabs) == 1
    tab = plan.tabs[0]
    assert len(tab.runs) == 1
    run = tab.runs[0]
    assert not run.run.input.main_call
    ctx0, ctx1 = run.contexts
    tests0, tests1 = ctx0.testcases, ctx1.testcases

    assert len(tests0) == 2
    assert isinstance(tests0[0].input, Assignment)
    assert tests0[0].output.stdout.data == "New safe"
    assert tests0[0].output.stdout.evaluator.options["ignoreWhitespace"]
    assert isinstance(tests0[1].input, FunctionCall)
    assert tests0[1].output.result.value.data == "Ignore whitespace"

    assert len(tests1) == 2
    assert isinstance(tests1[0].input, Assignment)
    assert tests1[0].output.stdout.data == "New safe"
    assert not tests1[0].output.stdout.evaluator.options["ignoreWhitespace"]
    assert isinstance(tests1[1].input, FunctionCall)
    assert tests1[1].output.result.value.data == 5
    assert tests1[1].output.result.value.type == AdvancedNumericTypes.U_INT_8
예제 #5
0
def test_statement_with_yaml_dict():
    yaml_str = """
- tab: "Feedback"
  contexts:
  - expression: "get_dict()"
    return:
        alpha: 5
        beta: 6
"""
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert len(plan.tabs) == 1
    tab = plan.tabs[0]
    assert len(tab.runs) == 1
    run = tab.runs[0]
    assert not run.run.input.main_call
    testcases = run.contexts[0].testcases
    assert len(testcases) == 1
    test = testcases[0]
    assert isinstance(test.input, FunctionCall)
    assert isinstance(test.output.result.value, ObjectType)

    pass
예제 #6
0
def test_statement():
    yaml_str = """
- tab: "Feedback"
  contexts:
  - expression: "heir(8, 10)"
    return: [ 10, 4, 15, 11, 7, 5, 3, 2, 16, 12, 1, 6, 13, 9, 14, 8 ]
  - statement: "heir(8, 3)"
    return: [ 3, 6, 9, 12, 15, 2, 7, 1, 13, 8, 16, 10, 14, 4, 11, 5 ]
"""
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert len(plan.tabs) == 1
    tab = plan.tabs[0]
    assert len(tab.runs) == 1
    run = tab.runs[0]
    assert not run.run.input.main_call
    ctx0, ctx1 = run.contexts
    testcases0, testcases1 = ctx0.testcases, ctx1.testcases
    assert len(testcases0) == 1
    assert len(testcases1) == 1
    test0, test1 = testcases0[0], testcases1[0]
    assert isinstance(test0.input, FunctionCall)
    assert isinstance(test1.input, FunctionCall)
예제 #7
0
def test_parse_ctx_exception():
    yaml_str = """
- tab: "Ctx Exception"
  hidden: false
  contexts:
  - arguments: [ "--arg", "fail" ]
    exception: "Exception message"
  - arguments: [ "--arg", "fail2" ]
    exitCode: 10
- tab: "Ctx Error"
  contexts:
  - arguments: [ "--arg", "error" ]
    exception: "Error"
    """
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert len(plan.tabs) == 2
    tab = plan.tabs[0]
    assert not tab.hidden
    assert tab.name == "Ctx Exception"
    assert len(tab.runs) == 2
    run = tab.runs[0]
    assert len(run.contexts) == 0
    assert run.run.input.arguments == ["--arg", "fail"]
    assert run.run.output.exception.exception.message == "Exception message"
    run = tab.runs[1]
    assert len(run.contexts) == 0
    assert run.run.input.arguments == ["--arg", "fail2"]
    assert run.run.output.exit_code.value == 10
    tab = plan.tabs[1]
    assert tab.name == "Ctx Error"
    assert len(tab.runs) == 1
    run = tab.runs[0]
    assert len(run.contexts) == 0
    assert run.run.input.arguments == ["--arg", "error"]
    assert run.run.output.exception.exception.message == "Error"
예제 #8
0
def test_parse_ctx_with_config():
    yaml_str = """
- tab: "Config ctx"
  config:
    stdout:
      tryFloatingPoint: true
      applyRounding: true
      roundTo: 2
    stderr:
      ignoreWhitespace: true
      caseInsensitive: false
  contexts:
  - arguments: [ '-a', 2.125, 1.212 ]
    stdout: "3.34"
  - arguments: [ '-a', 2.125, 1.212 ]
    stdout:
      data: "3.337"
      config:
        roundTo: 3
  - config:
      stdout:
        roundTo: 1
    arguments: [ '-a', 2.125, 1.212 ]
    stdout: "3.3"
  - arguments: [ '-e' ]
    stderr: " Fail "
    """
    args = ['-a', "2.125", "1.212"]
    json_str = translate(yaml_str)
    plan = _PlanModel.parse_raw(json_str).__root__
    assert len(plan.tabs) == 1
    tab = plan.tabs[0]
    assert tab.hidden is None
    assert len(tab.runs) == 4
    ctx0, ctx1, ctx2, ctx3 = tab.runs
    # Check argument list
    assert ctx0.run.input.arguments == args
    assert ctx1.run.input.arguments == args
    assert ctx2.run.input.arguments == args
    assert ctx3.run.input.arguments == ['-e']

    stdout = ctx0.run.output.stdout
    assert stdout.data == '3.34'
    options = stdout.evaluator.options
    assert len(options) == 3
    assert options["tryFloatingPoint"]
    assert options["applyRounding"]
    assert options["roundTo"] == 2

    stdout = ctx1.run.output.stdout
    assert stdout.data == '3.337'
    options = stdout.evaluator.options
    assert len(options) == 3
    assert options["tryFloatingPoint"]
    assert options["applyRounding"]
    assert options["roundTo"] == 3

    stdout = ctx2.run.output.stdout
    assert stdout.data == '3.3'
    options = stdout.evaluator.options
    assert len(options) == 3
    assert options["tryFloatingPoint"]
    assert options["applyRounding"]
    assert options["roundTo"] == 1

    stderr = ctx3.run.output.stderr
    assert stderr.data == " Fail "
    options = stderr.evaluator.options
    assert len(options) == 2
    assert not options["caseInsensitive"]
    assert options["ignoreWhitespace"]