Skip to content

Commit

Permalink
Merge branch 'herdaTestGen' of ssh://i12cvs.ira.uka.de/home/projekt/G…
Browse files Browse the repository at this point in the history
…IT_REPOS/key into KeY2.2
  • Loading branch information
danielgrahl committed May 23, 2014
2 parents 7b39492 + 2a1c383 commit 9b2f1cb
Show file tree
Hide file tree
Showing 7 changed files with 286 additions and 161 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class TestGenerationAction extends MainWindowAction {
private static final String NAME = "Generate Testcases";
private static final String TOOLTIP = "Generate test cases for open goals";

public static Proof originalProof;
//public static Proof originalProof;

public TestGenerationAction(MainWindow mainWindow) {
super(mainWindow);
Expand Down
13 changes: 10 additions & 3 deletions system/src/de/uka/ilkd/key/gui/testgen/TGInfoDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import javax.swing.WindowConstants;
import javax.swing.text.DefaultCaret;

import de.uka.ilkd.key.gui.KeYMediator;
import de.uka.ilkd.key.gui.MainWindow;
import de.uka.ilkd.key.smt.SMTProblem;
import de.uka.ilkd.key.smt.SMTSolver;
Expand All @@ -32,6 +33,8 @@ public class TGInfoDialog extends JDialog implements SolverLauncherListener {
private final JButton stopButton;
private final JButton exitButton;
private final JButton startButton;

private TGWorker worker;

public TGInfoDialog() {
super(MainWindow.getInstance());
Expand Down Expand Up @@ -63,8 +66,12 @@ public void actionPerformed(ActionEvent e) {
startButton = new JButton(new AbstractAction("Start") {
@Override
public void actionPerformed(ActionEvent e) {
TGWorker worker = new TGWorker(TGInfoDialog.this);
worker.start();
KeYMediator mediator = MainWindow.getInstance().getMediator();
mediator.stopInterface(true);
mediator.setInteractive(false);
worker = new TGWorker(TGInfoDialog.this);
mediator.addInterruptedListener(worker);
worker.execute();
}
});
exitButton.setEnabled(false);
Expand Down Expand Up @@ -140,7 +147,7 @@ public void launcherStarted(Collection<SMTProblem> problems,
public void launcherStopped(SolverLauncher launcher,
Collection<SMTSolver> problemSolvers) {
writeln("Finished solving SMT problems: " + problemSolvers.size());
final TestCaseGenerator tg = new TestCaseGenerator();
final TestCaseGenerator tg = new TestCaseGenerator(worker.getOriginalProof());
tg.setLogger(this);
problemSolvers = filterSolverResultsAndShowSolverStatistics(problemSolvers);
if (problemSolvers.size() > 0) {
Expand Down
42 changes: 19 additions & 23 deletions system/src/de/uka/ilkd/key/gui/testgen/TGWorker.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
import java.util.List;
import java.util.Vector;

import javax.swing.SwingWorker;

import de.uka.ilkd.key.collection.ImmutableList;
import de.uka.ilkd.key.gui.InterruptListener;
import de.uka.ilkd.key.gui.KeYMediator;
import de.uka.ilkd.key.gui.MainWindow;
import de.uka.ilkd.key.gui.SwingWorker3;
import de.uka.ilkd.key.gui.actions.TestGenerationAction;
import de.uka.ilkd.key.gui.configuration.ProofIndependentSettings;
import de.uka.ilkd.key.gui.macros.SemanticsBlastingMacro;
import de.uka.ilkd.key.gui.smt.ProofDependentSMTSettings;
Expand All @@ -35,18 +35,19 @@
import de.uka.ilkd.key.smt.SolverType;
import de.uka.ilkd.key.util.Debug;

public class TGWorker extends SwingWorker3 implements InterruptListener {
public class TGWorker extends SwingWorker<Void, Void> implements InterruptListener {
private TGInfoDialog tgInfoDialog;
private boolean stop;
private SolverLauncher launcher;
private Vector<Proof> proofs;
private Proof originalProof;

public TGWorker(TGInfoDialog tgInfoDialog){
this.tgInfoDialog = tgInfoDialog;
}

@Override
public Object construct() {
public Void doInBackground() {

TestGenerationSettings settings = ProofIndependentSettings.DEFAULT_INSTANCE.getTestGenerationSettings();

Expand Down Expand Up @@ -76,6 +77,7 @@ public Object construct() {
.writeln("No test data constraints were extracted.");
}
final KeYMediator mediator = getMediator();
originalProof = mediator.getSelectedProof();
final Collection<SMTProblem> problems = new LinkedList<SMTProblem>();
tgInfoDialog
.writeln("Test data generation: appling semantic blasting macro on proofs");
Expand Down Expand Up @@ -107,7 +109,7 @@ public Object construct() {
}
}
tgInfoDialog.writeln("\nDone applying semantic blasting.");
mediator.setProof(TestGenerationAction.originalProof);
mediator.setProof(originalProof);
// getMediator().setInteractive(true);
// getMediator().startInterface(true);
final Proof proof = mediator.getSelectedProof();
Expand Down Expand Up @@ -142,17 +144,17 @@ public Object construct() {
* finalise the GUI stuff
*/
@Override
public void finished() {
public void done() {
removeGeneratedProofs();
getMediator().setInteractive(true);
getMediator().startInterface(true);
getMediator().removeInterruptedListener(this);
TestGenerationAction.originalProof = null;
originalProof = null;
}

@Override
public void interruptionPerformed() {
interrupt();
cancel(true);
tgInfoDialog.writeln("\nStopping test case generation.");
stop = true;
if (launcher != null) {
Expand All @@ -173,20 +175,10 @@ private void removeGeneratedProofs() {
p.dispose();
}
}
getMediator().setProof(TestGenerationAction.originalProof);
getMediator().setProof(originalProof);
}

/*
* initiate the GUI stuff and relay to superclass
*/
@Override
public void start() {
//tgInfoDialog = new TGInfoDialog();
getMediator().stopInterface(true);
getMediator().setInteractive(false);
getMediator().addInterruptedListener(this);
super.start();
}


private KeYMediator getMediator(){
return MainWindow.getInstance().getMediator();
Expand Down Expand Up @@ -257,12 +249,12 @@ private Vector<Proof> createProofsForTesting(KeYMediator mediator,
boolean removeDuplicatePathConditions) {
final Vector<Proof> res = new Vector<Proof>();
final Proof oldProof = mediator.getSelectedProof();
TestGenerationAction.originalProof = oldProof;
originalProof = oldProof;
final List<Node> nodes = new LinkedList<Node>();
final ImmutableList<Goal> oldGoals = oldProof.openGoals();
if (TestGenerationAction.originalProof.closed()) {
if (originalProof.closed()) {
getNodesWithEmptyModalities(
TestGenerationAction.originalProof.root(), nodes);
originalProof.root(), nodes);
} else {
for (final Goal goal : oldGoals) {
nodes.add(goal.node());
Expand Down Expand Up @@ -323,4 +315,8 @@ private boolean hasModalities(Term t, boolean checkUpdates) {
}
return res;
}

public Proof getOriginalProof(){
return originalProof;
}
}
8 changes: 7 additions & 1 deletion system/src/de/uka/ilkd/key/smt/SMTProblem.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ public SMTProblem(Goal goal) {
name = "Goal " + goal.node().serialNr();
term = goalToTerm(goal);
}

public SMTProblem(Term t){
this.goal = null;
name = "Term "+t.toString();
this.term = t;
}

public Goal getGoal() {
return goal;
Expand Down Expand Up @@ -157,4 +163,4 @@ private Term goalToTerm(Goal g) {
return sequentToTerm(sequent);
}

}
}
133 changes: 133 additions & 0 deletions system/src/de/uka/ilkd/key/testgen/ModelGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package de.uka.ilkd.key.testgen;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import de.uka.ilkd.key.gui.KeYMediator;
import de.uka.ilkd.key.gui.configuration.ProofIndependentSettings;
import de.uka.ilkd.key.gui.smt.ProofDependentSMTSettings;
import de.uka.ilkd.key.gui.smt.ProofIndependentSMTSettings;
import de.uka.ilkd.key.gui.smt.SMTSettings;
import de.uka.ilkd.key.gui.testgen.TestGenerationSettings;
import de.uka.ilkd.key.logic.Namespace;
import de.uka.ilkd.key.logic.Term;
import de.uka.ilkd.key.logic.TermBuilder;
import de.uka.ilkd.key.logic.op.Function;
import de.uka.ilkd.key.logic.sort.Sort;
import de.uka.ilkd.key.smt.SMTProblem;
import de.uka.ilkd.key.smt.SMTSolver;
import de.uka.ilkd.key.smt.SMTSolverResult;
import de.uka.ilkd.key.smt.SolverLauncher;
import de.uka.ilkd.key.smt.SolverLauncherListener;
import de.uka.ilkd.key.smt.SolverType;
import de.uka.ilkd.key.smt.model.Model;

public class ModelGenerator implements SolverLauncherListener{

private KeYMediator mediator;
//the current term for which we look for models
private Term term;
//models that have been found until now
private List<Model> models;
//how many models we are looking for
private int target;


public ModelGenerator(Term t, int target, KeYMediator mediator) {
this.mediator = mediator;
this.term = t;
this.target = target;
models = new LinkedList<Model>();
}


/**
* Try finding a model for the term with z3.
*/
private void launch(){
SolverLauncher launcher = prepareLauncher();
SolverType solver = SolverType.Z3_CE_SOLVER;
SMTProblem problem = new SMTProblem(term);
launcher.addListener(this);
launcher.launch(problem, mediator.getServices(), solver);
}
/**
* Creates a SolverLauncher with the appropriate settings.
* @return
*/
private SolverLauncher prepareLauncher(){
TestGenerationSettings settings = ProofIndependentSettings.DEFAULT_INSTANCE.getTestGenerationSettings();
final ProofIndependentSMTSettings piSettings = ProofIndependentSettings.DEFAULT_INSTANCE
.getSMTSettings().clone();

piSettings.setMaxConcurrentProcesses(settings.getNumberOfProcesses());
final ProofDependentSMTSettings pdSettings = ProofDependentSMTSettings.getDefaultSettingsData();
pdSettings.invariantForall = settings.invaraiantForAll();
// invoke z3 for counterexamples
final SMTSettings smtsettings = new SMTSettings(pdSettings,
piSettings, null);

return new SolverLauncher(smtsettings);
}

@Override
public void launcherStopped(SolverLauncher launcher,
Collection<SMTSolver> finishedSolvers) {

for(SMTSolver solver : finishedSolvers){

SMTSolverResult result = solver.getFinalResult();
if(result.equals(SMTSolverResult.ThreeValuedTruth.VALID) && models.size() < target){
Model model = solver.getSocket().getQuery().getModel();
models.add(model);
addModelToTerm(model);
launch();
}
else{
finish();
}
}
}
/**
* Changes the term such that when evaluated again with z3 another model will be generated.
* If we have a model (c1=v1 & c2 = v2 & ...) where c1, c2, ... are integer constants we change the term t to the following form:
* t & !(c1=v1 & c2 = v2 & ...)
*
* @param m
*/
private void addModelToTerm(Model m){
Sort intSort = mediator.getServices().getTypeConverter().getIntegerLDT().targetSort();
TermBuilder tb = mediator.getServices().getTermBuilder();
Namespace functions = mediator.getServices().getNamespaces().functions();
Term tmodel=tb.tt();
for(String c : m.getConstants().keySet()){

Sort sort = m.getTypes().getOriginalConstantType(c);
if(sort.equals(intSort)){
String val = m.getConstants().get(c);
int value = Integer.parseInt(val);
Function f = (Function) functions.lookup(c);
Term termConst = tb.func(f);
Term termVal = tb.zTerm(value);
Term termEquals = tb.equals(termConst, termVal);
tmodel = tb.and(tmodel,termEquals);
}
}
if(!tmodel.equals(tb.tt())){
Term notTerm = tb.not(tmodel);
term = tb.add(term, notTerm);
}
}

private void finish(){

}

@Override
public void launcherStarted(Collection<SMTProblem> problems,
Collection<SolverType> solverTypes, SolverLauncher launcher) {


}
}
Loading

0 comments on commit 9b2f1cb

Please sign in to comment.