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)
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']))
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'])
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)
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']))
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
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']))
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
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)
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)
def test_Order_constraintname(): x = constraint.Order(direction='left_to_right', instances=['M1', 'M2']) assert x.constraint == 'order'
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'])
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'])