/**
* Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis,
* Rick Salay.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alessio Di Sandro - Implementation.
*/
package edu.toronto.cs.se.modelepedia.tests;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.junit.Assert;
import org.junit.Test;
import org.osgi.framework.Bundle;
import edu.toronto.cs.se.mavo.MAVORoot;
import edu.toronto.cs.se.mmint.MIDTypeRegistry;
import edu.toronto.cs.se.mmint.mavo.constraint.MAVOMIDConstraintChecker;
import edu.toronto.cs.se.mmint.mavo.library.MAVOUtils;
import edu.toronto.cs.se.mmint.mid.MID;
import edu.toronto.cs.se.mmint.mid.Model;
import edu.toronto.cs.se.mmint.mid.operator.Operator;
import edu.toronto.cs.se.mmint.mid.operator.OperatorInput;
import edu.toronto.cs.se.mmint.mid.utils.MIDOperatorIOUtils;
import edu.toronto.cs.se.modelepedia.z3.mavo.EcoreMAVOToSMTLIB;
import edu.toronto.cs.se.modelepedia.z3.mavo.Z3MAVOModelParser;
import edu.toronto.cs.se.modelepedia.z3.reasoning.Z3ReasoningEngine;
public class Z3Test extends MMINTTest {
@Test
public void ecoreAllSAT() throws Exception {
/**
* TODO:
* 1) Refactor common code in a better way
* 2) Come up with interesting mavo input model(s)
* 3) Consider an intermediate test with the encoding and a property as input
*/
Bundle testBundle = Platform.getBundle(TESTS_BUNDLE_NAME);
MID instanceMID = createInstanceMID();
Model model = addInputModel(instanceMID, testBundle, "model/z3", "ecore.classdiagram_mavo");
Z3ReasoningEngine z3Reasoner = (Z3ReasoningEngine) MAVOMIDConstraintChecker.getMAVOReasoner("SMTLIB");
EcoreMAVOToSMTLIB ecore2smt = (EcoreMAVOToSMTLIB) MIDTypeRegistry.<Operator>getType(Z3ReasoningEngine.ECOREMAVOTOSMTLIB_OPERATOR_URI);
EList<Model> inputModels = new BasicEList<Model>();
inputModels.add(model);
EList<OperatorInput> inputs = ecore2smt.checkAllowedInputs(inputModels);
Map<String, MID> outputMIDsByName = MIDOperatorIOUtils.createSimpleOutputMIDsByName(ecore2smt, instanceMID);
ecore2smt.startInstance(inputs, null, new BasicEList<>(), outputMIDsByName, instanceMID);
Z3MAVOModelParser z3ModelParser = ecore2smt.getZ3MAVOModelParser();
MAVORoot rootMavoModelObj = (MAVORoot) model.getEMFInstanceRoot();
Set<String> concretizations = z3Reasoner.allSAT(z3ModelParser.getSMTLIBEncoding(), z3ModelParser, new HashSet<>(MAVOUtils.getAnnotatedMAVOModelObjects(rootMavoModelObj).values()), rootMavoModelObj);
Assert.assertEquals(46, concretizations.size());
}
}