예제 #1
0
def test_Order_nblock_checking():
    x = constraint.Order(direction='left_to_right', instances=[])
    with pytest.raises(AssertionError):
        x.check(None)
    x = constraint.Order(direction='left_to_right', instances=['M1'])
    with pytest.raises(AssertionError):
        x.check(None)
예제 #2
0
def test_ConstraintDB_incremental_checking(db):
    '''
    ConstraintDB can be used to run experiments
    using checkpoint() and revert() methods. There
    is an overhead so use sparingly
    '''
    # Experiment 1 : Success
    db.append(
        constraint.Order(direction='left_to_right',
                         instances=['M1', 'M2', 'M3']))
    db.checkpoint()
    # Experiment 2 : Failure
    with pytest.raises(AssertionError):
        db.append(
            constraint.Order(direction='left_to_right', instances=['M3',
                                                                   'M2']))
    db.revert()
    # Experiment 3 : Success
    db.append(
        constraint.Order(direction='left_to_right', instances=['M4', 'M5']))
    db.checkpoint()
    # Experiment 4: Failure
    with pytest.raises(AssertionError):
        db.append(
            constraint.Order(direction='left_to_right', instances=['M3',
                                                                   'M2']))
    db.revert()
    # Experiment 5: Success
    db.append(
        constraint.Order(direction='left_to_right', instances=['M2', 'M5']))
예제 #3
0
def test_Order_input_sanitation():
    x = constraint.Order(direction='left_to_right', instances=['M1', 'M2'])
    x = constraint.Order(direction='left_to_right',
                         instances=['M1', 'M2', 'M3'])
    with pytest.raises(Exception):
        x = constraint.Order(direction='lefta_to_rightb',
                             instances=['M1', 'M2', 'M3'])
예제 #4
0
def test_Order_smt_checking(checker):
    x = constraint.Order(direction='left_to_right',
                         instances=['M1', 'M2', 'M3'])
    x.check(checker)
    x = constraint.Order(direction='left_to_right', instances=['M4', 'M5'])
    x.check(checker)
    x = constraint.Order(direction='left_to_right', instances=['M3', 'M2'])
    with pytest.raises(AssertionError):
        x.check(checker)
예제 #5
0
def test_Order_db_append(db):
    db.append(
        constraint.Order(direction='left_to_right',
                         instances=['M1', 'M2', 'M3']))
    db.append(
        constraint.Order(direction='left_to_right', instances=['M4', 'M5']))
    with pytest.raises(AssertionError):
        db.append(
            constraint.Order(direction='left_to_right', instances=['M3',
                                                                   'M2']))
예제 #6
0
def test_ConstraintDB_parent_relationship(db):
    with set_context(db):
        db.append(
            constraint.Order(direction='left_to_right', instances=['M1',
                                                                   'M2']))
        db.append(
            constraint.Order(direction='left_to_right', instances=['M1',
                                                                   'M3']))
        for const in db:
            assert const.parent == db
예제 #7
0
def test_Order_db_append(db):
    with set_context(db):
        db.append(
            constraint.Order(direction='left_to_right',
                             instances=['M1', 'M2', 'M3']))
        db.append(
            constraint.Order(direction='left_to_right', instances=['M4',
                                                                   'M5']))
        with pytest.raises(SolutionNotFoundError):
            db.append(
                constraint.Order(direction='left_to_right',
                                 instances=['M3', 'M2']))
예제 #8
0
def test_ConstraintDB_json(db):
    with set_context(db):
        db.append(
            constraint.Order(direction='left_to_right', instances=['M1',
                                                                   'M2']))
        db.append(
            constraint.Order(direction='left_to_right', instances=['M1',
                                                                   'M3']))
    fp = pathlib.Path(__file__).parent / 'const.json'
    fp.write_text(db.json())
    with set_context(db.parent):
        newdb = constraint.ConstraintDB.parse_file(fp)
    assert db == newdb
예제 #9
0
def test_ConstraintDB_nonincremental_revert(db):
    '''
    While it is possible to revert() back to a certain
    checkpoint() by name, needing to unroll multiple
    checkpoints can indicate suboptimal compiler design
    '''

    with set_context(db):
        constraint1 = constraint.Order(direction='left_to_right',
                                       instances=['M1', 'M2'])
        db.append(constraint1)
    idx = db.checkpoint()
    assert str(db.parent._checker.label(constraint1)) in str(
        db.parent._checker._solver)
    with set_context(db):
        constraint2 = constraint.Order(direction='left_to_right',
                                       instances=['M1', 'M3'])
        db.append(constraint2)
    db.checkpoint()
    assert str(db.parent._checker.label(constraint1)) in str(
        db.parent._checker._solver)
    assert str(db.parent._checker.label(constraint2)) in str(
        db.parent._checker._solver)
    with set_context(db):
        constraint3 = constraint.Order(direction='left_to_right',
                                       instances=['M2', 'M3'])
        db.append(constraint3)
    db.checkpoint()
    assert str(db.parent._checker.label(constraint1)) in str(
        db.parent._checker._solver)
    assert str(db.parent._checker.label(constraint2)) in str(
        db.parent._checker._solver)
    assert str(db.parent._checker.label(constraint3)) in str(
        db.parent._checker._solver)
    db.revert(idx)
    assert len(db) == 1
    assert len(db._commits) == 0
    assert str(db.parent._checker.label(constraint1)) in str(
        db.parent._checker._solver)
    assert str(db.parent._checker.label(constraint2)) not in str(
        db.parent._checker._solver)
    assert str(db.parent._checker.label(constraint3)) not in str(
        db.parent._checker._solver)
예제 #10
0
def test_ConstraintDB_nonincremental_revert(db):
    '''
    While it is possible to revert() back to a certain
    checkpoint() by name, needing to unroll multiple
    checkpoints can indicate suboptimal compiler design
    '''
    db.append(
        constraint.Order(direction='left_to_right', instances=['M1', 'M2']))
    idx = db.checkpoint()
    db.append(
        constraint.Order(direction='left_to_right', instances=['M1', 'M3']))
    db.checkpoint()
    db.append(
        constraint.Order(direction='left_to_right', instances=['M2', 'M3']))
    db.checkpoint()
    db.revert(idx)
    assert len(db) == 1
    assert len(db._commits) == 0
    if db._checker:
        assert 'M3' not in str(db._checker._solver)
예제 #11
0
def test_Order_constraintname():
    x = constraint.Order(direction='left_to_right', instances=['M1', 'M2'])
    assert x.constraint == 'order'
예제 #12
0
def test_Order_nblock_checking(db):
    with set_context(db):
        with pytest.raises(Exception):
            x = constraint.Order(direction='left_to_right', instances=[])
        with pytest.raises(Exception):
            x = constraint.Order(direction='left_to_right', instances=['M1'])
예제 #13
0
def test_Order_validate_instances(db):
    with set_context(db):
        with pytest.raises(Exception):
            x = constraint.Order(direction='left_to_right',
                                 instances=['undefined', 'M2'])
        x = constraint.Order(direction='left_to_right', instances=['M1', 'M2'])