Example #1
0
def test_assignment_str_literal_arg():
    # This caused an infinite recursion because the test in the library
    # is for 'Sequence' when it should be for 'list'
    input_1 = "hello"
    output = basic.Place()

    assignment = basic.assign(output, len, input_1)
    assignment()
    assert output.value == 5
Example #2
0
def test_assignment_variable_args():
    input_1 = basic.Place(value=1)
    input_2 = basic.Place(value=2)
    output = basic.Place()

    assignment = basic.assign(output, operator.add, input_1, input_2)
    assignment()
    assert output.value == 3

    input_2.value = 3
    assignment()
    assert output.value == 4
Example #3
0
def test_assignment_tuple_arg():
    input_1 = basic.Place(value=1)
    input_2 = basic.Place(value=2)
    input_3 = basic.Place(value=3)
    output = basic.Place()

    assignment = basic.assign(output, sum, (input_1, input_2, input_3))
    assignment()
    assert output.value == 6

    input_3.value = 4
    assignment()
    assert output.value == 7
Example #4
0
def test_assignment_coroutine_function():
    input_1 = basic.Place(value=1)
    input_2 = basic.Place(value=2)
    input_3 = basic.Place(value=3)
    output = basic.Place()

    assignment = basic.assign(output, async_sum, [input_1, input_2, input_3])
    assert inspect.iscoroutinefunction(assignment)
    asyncio.run(assignment())
    assert output.value == 6

    input_3.value = 4
    asyncio.run(assignment())
    assert output.value == 7
Example #5
0
def test_assignment_mixed_args():
    input_1 = basic.Place(value=1)
    input_2 = basic.Place(value=2)
    output = basic.Place()

    # Here, we test all three types of args, a list, variables and
    # literals
    assignment = basic.assign(output, sum, [input_1, input_2, 3])
    assignment()
    assert output.value == 6

    input_2.value = 3
    assignment()
    assert output.value == 7
Example #6
0
def test_single_dependency():

    input_cell = basic.Place(name="input_cell", value=99)
    output_cell = basic.Place(name="output_cell")
    add = basic.assign(output_cell, sum, [input_cell])

    graph = basic.DependencyGraph()
    basic.compute_sequential(graph)

    assert output_cell.value is None

    graph.add_dependency(add, input_cell)
    graph.add_dependency(output_cell, add)
    basic.compute_sequential(graph)

    assert output_cell.value == 99

    input_cell.value = 87
    basic.compute_sequential(graph)
    assert output_cell.value == 87
Example #7
0
def test_add_precedence():

    # add_precedence(A, B) is a synonym for add_dependency(B, A)

    input_cell = basic.Place(name="input_cell", value=99)
    output_cell = basic.Place(name="output_cell")
    add = basic.assign(output_cell, sum, [input_cell])

    graph = basic.DependencyGraph()
    basic.compute_sequential(graph)

    assert output_cell.value is None

    graph.add_precedence(input_cell, add)
    graph.add_precedence(add, output_cell)
    basic.compute_sequential(graph)

    assert output_cell.value == 99

    input_cell.value = 87
    basic.compute_sequential(graph)
    assert output_cell.value == 87
Example #8
0
def test_two_dependencies():

    input_cell_1 = basic.Place(name="input_cell_1", value=1)
    input_cell_2 = basic.Place(name="input_cell_2", value=2)
    child_cell_1 = basic.Place(name="child_cell_1")
    child_cell_2 = basic.Place(name="child_cell_2")
    output_cell = basic.Place(name="output_cell")

    add_1 = basic.assign(child_cell_1, sum, [input_cell_1, input_cell_2])
    add_2 = basic.assign(child_cell_2, sum, [input_cell_1, input_cell_2])

    add_3 = basic.assign(output_cell, sum, [child_cell_1, child_cell_2])

    graph = basic.DependencyGraph()

    # No dependencies declared yet
    basic.compute_sequential(graph)

    assert output_cell.value is None

    wrappers = {}
    computed_order = []

    def wrapper(cell):
        result = wrappers.get(cell, None)
        if not result:
            result = CellWrapper(cell, computed_order)
            wrappers[cell] = result
        return result

    # ======================================================================
    # Add a dependency and make sure that the computation order is correct.
    graph.add_dependency(wrapper(add_1), wrapper(input_cell_1))
    basic.compute_sequential(graph)

    assert len(computed_order) == 2
    assert is_before(input_cell_1, add_1, computed_order)

    # ======================================================================
    # Add a dependency and make sure that the computation order is correct.
    graph.add_dependency(wrapper(add_1), wrapper(input_cell_2))

    computed_order.clear()
    assert len(computed_order) == 0
    basic.compute_sequential(graph)

    assert len(computed_order) == 3
    assert is_before(input_cell_1, add_1, computed_order)
    assert is_before(input_cell_2, add_1, computed_order)

    # ======================================================================
    # Add more dependencies and make sure that the computation order is
    # correct.
    graph.add_dependency(wrapper(child_cell_1), wrapper(add_1))
    graph.add_dependency(wrapper(add_2), wrapper(input_cell_1))
    graph.add_dependency(wrapper(add_2), wrapper(input_cell_2))
    graph.add_dependency(wrapper(child_cell_2), wrapper(add_2))
    graph.add_dependency(wrapper(add_3), wrapper(child_cell_1))
    graph.add_dependency(wrapper(add_3), wrapper(child_cell_2))
    graph.add_dependency(wrapper(output_cell), wrapper(add_3))

    computed_order.clear()
    assert len(computed_order) == 0
    basic.compute_sequential(graph)
    assert len(computed_order) == 8

    assert is_before(input_cell_1, add_1, computed_order)
    assert is_before(input_cell_2, add_1, computed_order)
    assert is_before(input_cell_1, add_2, computed_order)
    assert is_before(input_cell_2, add_2, computed_order)
    assert is_before(add_1, child_cell_1, computed_order)
    assert is_before(add_2, child_cell_2, computed_order)
    assert is_before(child_cell_1, add_3, computed_order)
    assert is_before(child_cell_2, add_3, computed_order)
    assert is_before(add_3, output_cell, computed_order)

    assert output_cell.value == 6

    input_cell_2.value = 3
    basic.compute_sequential(graph)
    assert output_cell.value == 8
Example #9
0
def test_assignment_literal_args():
    output = basic.Place()

    assignment = basic.assign(output, operator.add, 1, 2)
    assignment()
    assert output.value == 3