diff --git a/build.gradle b/build.gradle index 95b17659733ed9d1b571551f9498fd92419028e4..1a3534069db76a39ad0ed6e42056d5e7edf68bcf 100644 --- a/build.gradle +++ b/build.gradle @@ -15,13 +15,14 @@ repositories { configurations { // configuration that holds jars to copy into lib releaseJars } -def parser_version = '2.4.18-SNAPSHOT' +def parser_version = '2.4.20-SNAPSHOT' dependencies { compile (group: 'com.microsoft', name: 'tla2tools', version: '1.4.6') compile (group: 'de.prob', name: 'prologlib', version: parser_version) compile (group: 'de.prob', name: 'parserbase', version: parser_version) compile (group: 'de.prob', name: 'bparser', version: parser_version) + compile (group: 'de.prob', name: 'ltlparser', version: parser_version) testCompile (group: 'junit', name: 'junit', version: '4.+') testCompile (group: 'de.prob', name: 'tla2b', version: '1.0.3-SNAPSHOT') @@ -32,7 +33,9 @@ dependencies { } -test { exclude('de/b2tla/tlc/integration/**') } +test { + exclude('de/b2tla/tlc/integration/**') +} task integrationtests(type: Test){ diff --git a/src/main/java/de/b2tla/B2TLA.java b/src/main/java/de/b2tla/B2TLA.java index 55c61dca9837a9c84d36b901249ccc4ead2ba38e..e467d870e5d3b723303023842a512b0b269423c4 100644 --- a/src/main/java/de/b2tla/B2TLA.java +++ b/src/main/java/de/b2tla/B2TLA.java @@ -17,7 +17,6 @@ import de.b2tla.analysis.UsedStandardModules; import de.b2tla.analysis.UsedStandardModules.STANDARD_MODULES; import de.b2tla.exceptions.B2TLAIOException; import de.b2tla.exceptions.B2tlaException; -import de.b2tla.exceptions.TypeErrorException; import de.b2tla.tlc.TLCOutput; import de.b2tla.tlc.TLCOutputInfo; import de.b2tla.tlc.TLCOutput.ERROR; diff --git a/src/main/java/de/b2tla/Globals.java b/src/main/java/de/b2tla/Globals.java index d4c48fe61a0adc59ee270bdb3d77abbf9faaad3f..71c4420a8bd6fac61430889c76f5fe0e71b97754 100644 --- a/src/main/java/de/b2tla/Globals.java +++ b/src/main/java/de/b2tla/Globals.java @@ -2,6 +2,9 @@ package de.b2tla; public class Globals { public static int DEFERRED_SET_SIZE = 3; + public static int MAX_INT = 4; + public static int MIN_INT = -1; + public static boolean GOAL = true; public static boolean deadlockCheck = true; public static boolean runTLC = true; diff --git a/src/main/java/de/b2tla/analysis/AssignedVariablesFinder.java b/src/main/java/de/b2tla/analysis/AssignedVariablesFinder.java index edf6ced506188e61512cfc73128c08c5fddfad35..db67446d4db38d4a3a53af641967c83fd165d394 100644 --- a/src/main/java/de/b2tla/analysis/AssignedVariablesFinder.java +++ b/src/main/java/de/b2tla/analysis/AssignedVariablesFinder.java @@ -3,7 +3,6 @@ package de.b2tla.analysis; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; -import java.util.Iterator; import java.util.List; import de.b2tla.exceptions.SubstitutionException; diff --git a/src/main/java/de/b2tla/analysis/ConstantExpressionFinder.java b/src/main/java/de/b2tla/analysis/ConstantExpressionFinder.java index 9cd0f6a825b33e17a3cf286fa69513988983e467..c5e7731a33b4a6d4c44d1a458ab8f5b4498c2d87 100644 --- a/src/main/java/de/b2tla/analysis/ConstantExpressionFinder.java +++ b/src/main/java/de/b2tla/analysis/ConstantExpressionFinder.java @@ -27,7 +27,6 @@ import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.PMachineClause; import de.be4.classicalb.core.parser.node.Start; -import de.be4.classicalb.core.parser.node.TIdentifierLiteral; public class ConstantExpressionFinder extends DepthFirstAdapter { private MachineContext machineContext; diff --git a/src/main/java/de/b2tla/analysis/ConstantsEliminator.java b/src/main/java/de/b2tla/analysis/ConstantsEliminator.java index 4d47eb7f0f6196006f671d329d60d7d7d1fddc87..91bc43beac173391669bc968b7c8eb2dcd7400aa 100644 --- a/src/main/java/de/b2tla/analysis/ConstantsEliminator.java +++ b/src/main/java/de/b2tla/analysis/ConstantsEliminator.java @@ -8,10 +8,6 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; -import tla2sany.modanalyzer.ModuleContext; - -import de.b2tla.analysis.ConstantsEvaluator.ConstantsInTreeFinder; -import de.b2tla.analysis.ConstantsEvaluator.ValuesOfIdentifierFinder; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.ACardExpression; import de.be4.classicalb.core.parser.node.AConjunctPredicate; diff --git a/src/main/java/de/b2tla/analysis/DefinitionsOrder.java b/src/main/java/de/b2tla/analysis/DefinitionsOrder.java index cdc63b9d24569b11b553bdb55bc766eebb8d5982..579e13cec18a58df4004cfcbef3480e8ea0ba907 100644 --- a/src/main/java/de/b2tla/analysis/DefinitionsOrder.java +++ b/src/main/java/de/b2tla/analysis/DefinitionsOrder.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; -import java.util.LinkedList; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.ADefinitionExpression; diff --git a/src/main/java/de/b2tla/analysis/MachineContext.java b/src/main/java/de/b2tla/analysis/MachineContext.java index 7469c64a3cb4b6b76ec3724fba2e76b382670d1b..a11c76027012ecafc7087da56d5cb0ddb57e9875 100644 --- a/src/main/java/de/b2tla/analysis/MachineContext.java +++ b/src/main/java/de/b2tla/analysis/MachineContext.java @@ -3,7 +3,6 @@ package de.b2tla.analysis; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.HashSet; import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -62,7 +61,6 @@ import de.be4.classicalb.core.parser.node.POperation; import de.be4.classicalb.core.parser.node.PPredicate; import de.be4.classicalb.core.parser.node.PSet; import de.be4.classicalb.core.parser.node.Start; -import de.be4.classicalb.core.parser.node.TDefLiteralPredicate; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; public class MachineContext extends DepthFirstAdapter { @@ -924,10 +922,10 @@ public class MachineContext extends DepthFirstAdapter { * machine clauses getter */ - public AAbstractMachineParseUnit getAbstractMachineParseUnit(){ + public AAbstractMachineParseUnit getAbstractMachineParseUnit() { return abstractMachineParseUnit; } - + public AConstraintsMachineClause getConstraintMachineClause() { return constraintMachineClause; } @@ -947,8 +945,13 @@ public class MachineContext extends DepthFirstAdapter { public APropertiesMachineClause getPropertiesMachineClause() { return propertiesMachineClause; } - - public void setPropertiesMachineClaus(APropertiesMachineClause propertiesMachineClause){ + + public AAssertionsMachineClause getAssertionMachineClause() { + return assertionMachineClause; + } + + public void setPropertiesMachineClaus( + APropertiesMachineClause propertiesMachineClause) { this.propertiesMachineClause = propertiesMachineClause; } @@ -971,8 +974,9 @@ public class MachineContext extends DepthFirstAdapter { public ADefinitionsMachineClause getDefinitionMachineClause() { return definitionMachineClause; } - - public void setDefinitionsMachineClause(ADefinitionsMachineClause definitionMachineClause){ + + public void setDefinitionsMachineClause( + ADefinitionsMachineClause definitionMachineClause) { this.definitionMachineClause = definitionMachineClause; } diff --git a/src/main/java/de/b2tla/analysis/MachineDeclarationsCollector.java b/src/main/java/de/b2tla/analysis/MachineDeclarationsCollector.java index 9628ccba0523f19619af7bc5cb94b7b374f8f9b2..ee7f92d39c98b4e489d7f6297361d570184871a0 100644 --- a/src/main/java/de/b2tla/analysis/MachineDeclarationsCollector.java +++ b/src/main/java/de/b2tla/analysis/MachineDeclarationsCollector.java @@ -10,7 +10,6 @@ import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AConstantsMachineClause; import de.be4.classicalb.core.parser.node.ADeferredSetSet; -import de.be4.classicalb.core.parser.node.ADefinitionsMachineClause; import de.be4.classicalb.core.parser.node.AEnumeratedSetSet; import de.be4.classicalb.core.parser.node.AIdentifierExpression; import de.be4.classicalb.core.parser.node.AMachineHeader; @@ -18,9 +17,7 @@ import de.be4.classicalb.core.parser.node.AOperation; import de.be4.classicalb.core.parser.node.ASeesMachineClause; import de.be4.classicalb.core.parser.node.AVariablesMachineClause; import de.be4.classicalb.core.parser.node.Node; -import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; -import de.be4.classicalb.core.parser.node.Start; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; public class MachineDeclarationsCollector extends DepthFirstAdapter { diff --git a/src/main/java/de/b2tla/analysis/MissingVariablesFinder.java b/src/main/java/de/b2tla/analysis/MissingVariablesFinder.java index 0bd65c9eac24626f87d0d25220f1edd1e7635d10..d9bb6cd1088fbb90071d579e1fb0d72bd1cbbc84 100644 --- a/src/main/java/de/b2tla/analysis/MissingVariablesFinder.java +++ b/src/main/java/de/b2tla/analysis/MissingVariablesFinder.java @@ -25,7 +25,6 @@ import de.be4.classicalb.core.parser.node.ASelectSubstitution; import de.be4.classicalb.core.parser.node.ASelectWhenSubstitution; import de.be4.classicalb.core.parser.node.ASkipSubstitution; import de.be4.classicalb.core.parser.node.Node; -import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.PSubstitution; diff --git a/src/main/java/de/b2tla/analysis/PrecedenceCollector.java b/src/main/java/de/b2tla/analysis/PrecedenceCollector.java index 52f76a39fafd050e0ac3b94ebd207747e5deacbf..a93160939d47f92c41f0becf7ed5ca6fd132c017 100644 --- a/src/main/java/de/b2tla/analysis/PrecedenceCollector.java +++ b/src/main/java/de/b2tla/analysis/PrecedenceCollector.java @@ -6,16 +6,9 @@ import java.util.Hashtable; import de.b2tla.btypes.BType; import de.b2tla.btypes.IntegerType; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; -import de.be4.classicalb.core.parser.node.AAddExpression; import de.be4.classicalb.core.parser.node.AConvertBoolExpression; -import de.be4.classicalb.core.parser.node.AEqualPredicate; -import de.be4.classicalb.core.parser.node.AExistsPredicate; -import de.be4.classicalb.core.parser.node.AForallPredicate; import de.be4.classicalb.core.parser.node.AMinusOrSetSubtractExpression; import de.be4.classicalb.core.parser.node.AMultOrCartExpression; -import de.be4.classicalb.core.parser.node.ANotEqualPredicate; -import de.be4.classicalb.core.parser.node.ASetSubtractionExpression; -import de.be4.classicalb.core.parser.node.AUnionExpression; import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.Start; diff --git a/src/main/java/de/b2tla/analysis/PrimedNodesMarker.java b/src/main/java/de/b2tla/analysis/PrimedNodesMarker.java index 6ec4dd411f043f02823d81682becab7b703efe5d..a14730da4e82e5b785fee8a97916bfb87d5a5c3e 100644 --- a/src/main/java/de/b2tla/analysis/PrimedNodesMarker.java +++ b/src/main/java/de/b2tla/analysis/PrimedNodesMarker.java @@ -2,7 +2,6 @@ package de.b2tla.analysis; import java.util.ArrayList; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.List; import de.b2tla.exceptions.ScopeException; @@ -11,13 +10,11 @@ import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAssignSubstitution; import de.be4.classicalb.core.parser.node.ABecomesElementOfSubstitution; import de.be4.classicalb.core.parser.node.ABecomesSuchSubstitution; -import de.be4.classicalb.core.parser.node.AFunctionExpression; import de.be4.classicalb.core.parser.node.AIdentifierExpression; import de.be4.classicalb.core.parser.node.APrimedIdentifierExpression; import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.POperation; -import de.be4.classicalb.core.parser.node.TIdentifierLiteral; public class PrimedNodesMarker extends DepthFirstAdapter { private ArrayList<POperation> operations; diff --git a/src/main/java/de/b2tla/analysis/Renamer.java b/src/main/java/de/b2tla/analysis/Renamer.java index bd5650ee91e9d9c40fcece22047d2ac353f81bf3..131ea70defa09d9587096737f19a824dd4434880 100644 --- a/src/main/java/de/b2tla/analysis/Renamer.java +++ b/src/main/java/de/b2tla/analysis/Renamer.java @@ -179,6 +179,8 @@ public class Renamer extends DepthFirstAdapter { return res; } + private ArrayList<HashSet<String>> localContexts = new ArrayList<HashSet<String>>(); + private boolean exist(String name) { if (KEYWORDS.contains(name)) return true; @@ -186,15 +188,21 @@ public class Renamer extends DepthFirstAdapter { return true; if (SequencesKeywords.contains(name)) return true; + + for (int i = 0; i < localContexts.size(); i++) { + if(localContexts.get(i).contains(name)) + return true; + } return false; } - private void renameIdentifier(Node node) { + private String renameIdentifier(Node node) { AIdentifierExpression id = (AIdentifierExpression) node; String name = Utils.getIdentifierAsString(id.getIdentifier()); String newName = incName(name); namesTable.put(id, newName); + return newName; } private void evalDefinition(List<PExpression> params) { @@ -221,21 +229,40 @@ public class Renamer extends DepthFirstAdapter { evalDefinition(node.getParameters()); } + + // local variables + public void inAForallPredicate(AForallPredicate node) { evalBoundedVariables(node, node.getIdentifiers()); } + + public void outAForallPredicate(AForallPredicate node) { + removeLastContext(); + } public void inAExistsPredicate(AExistsPredicate node) { evalBoundedVariables(node, node.getIdentifiers()); } - + + public void outAExistsPredicate(AExistsPredicate node) { + removeLastContext(); + } + public void inALambdaExpression(ALambdaExpression node) { evalBoundedVariables(node, node.getIdentifiers()); } + + public void outALambdaExpression(ALambdaExpression node) { + removeLastContext(); + } public void inAComprehensionSetExpression(AComprehensionSetExpression node) { evalBoundedVariables(node, node.getIdentifiers()); } + + public void outAComprehensionSetExpression(AComprehensionSetExpression node) { + removeLastContext(); + } public void inAQuantifiedUnionExpression(AQuantifiedUnionExpression node) { evalBoundedVariables(node, node.getIdentifiers()); @@ -247,7 +274,6 @@ public class Renamer extends DepthFirstAdapter { } public void inAGeneralProductExpression(AGeneralProductExpression node) { - evalBoundedVariables(node, node.getIdentifiers()); } @@ -261,9 +287,16 @@ public class Renamer extends DepthFirstAdapter { } private void evalBoundedVariables(Node node, List<PExpression> params) { + HashSet<String> context = new HashSet<String>(); for (PExpression e : params) { - renameIdentifier(e); + String newName = renameIdentifier(e); + context.add(newName); } + localContexts.add(context); } + public void removeLastContext(){ + localContexts.remove(localContexts.size()-1); + } + } diff --git a/src/main/java/de/b2tla/analysis/StandardMadules.java b/src/main/java/de/b2tla/analysis/StandardMadules.java index 327ec05d8f25018e61a44f715a3651f1d257cea0..9e27cef2893222f460995144c244b6b6acf72409 100644 --- a/src/main/java/de/b2tla/analysis/StandardMadules.java +++ b/src/main/java/de/b2tla/analysis/StandardMadules.java @@ -1,15 +1,13 @@ package de.b2tla.analysis; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; public class StandardMadules { // Functions public static final String RANGE = "Range"; public static final String IMAGE = "Image"; - + public static final String TOTAL_INJECTIVE_FUNCTION = "TotalInjFunc"; public static final String TOTAL_SURJECTIVE_FUNCTION = "TotalSurFunc"; public static final String TOTAL_BIJECTIVE_FUNCTION = "TotalBijFunc"; @@ -18,7 +16,7 @@ public class StandardMadules { public static final String PARTIAL_INJECTIVE_FUNCTION = "ParInjFunc"; public static final String PARTIAL_SURJECTIVE_FUNCTION = "ParSurFunc"; public static final String PARITAL_BIJECTIVE_FUNCTION = "ParBijFunc"; - + // Relations public static final String RELATION = "Relation"; public static final String REL_DOMAIN = "RelDomain"; @@ -41,38 +39,34 @@ public class StandardMadules { public static final String REL_CLOSURE = "RelClosure"; public static final String REL_FNC = "RelFnc"; public static final String REL_REL = "RelRel"; - - - + // FunctionsAsRelations public static final String REL_CALL = "RelCall"; - + public static final String REL_TOTAL_FUNCTION = "RelTotalFunc"; public static final String REL_TOTAL_FUNCTION_ELEMENT_OF = "RelTotalFuncEleOf"; - + public static final String REL_TOTAL_INJECTIVE_FUNCTION = "RelTotalInjFunc"; public static final String REL_TOTAL_INJECTIVE_FUNCTION_ELEMENT_OF = "RelTotalInjFuncEleOf"; - + public static final String REL_TOTAL_SURJECTIVE_FUNCTION = "RelTotalSurFunc"; public static final String REL_TOTAL_SURJECTIVE_FUNCTION_ELEMENT_OF = "RelTotalSurFuncEleOf"; - + public static final String REL_TOTAL_BIJECTIVE_FUNCTION = "RelTotalBijFunc"; public static final String REL_TOTAL_BIJECTIVE_FUNCTION_ELEMENT_OF = "RelTotalBijFuncEleOf"; - + public static final String REL_PARTIAL_FUNCTION = "RelParFunc"; public static final String REL_PARTIAL_FUNCTION_ELEMENT_OF = "RelParFuncEleOf"; - + public static final String REL_PARTIAL_INJECTIVE_FUNCTION = "RelParInjFunc"; public static final String REL_PARTIAL_INJECTIVE_FUNCTION_ELEMENT_OF = "RelParInjFuncEleOf"; - + public static final String REL_PARTIAL_SURJECTIVE_FUNCTION = "RelParSurFunc"; public static final String REL_PARTIAL_SURJECTIVE_FUNCTION_ELEMENT_OF = "RelParSurFuncEleOf"; - + public static final String REL_PARTIAL_BIJECTIVE_FUNCTION = "RelParBijFunc"; public static final String REL_PARTIAL_BIJECTIVE_FUNCTION_ELEMENT_OF = "RelParBijFuncEleOf"; - - - + // SequencesExtended public static final String SEQUENCE_LAST_ELEMENT = "Last"; public static final String SEQUENCE_PREPEND_ELEMENT = "Prepend"; @@ -85,15 +79,22 @@ public class StandardMadules { public static final String SEQUENCE_PERMUTATION = "Perm"; public static final String SEQUENCE_REVERSE = "Rev"; public static final String SEQUENCE_GENERAL_CONCATINATION = "Conc"; - + public static final String SEQUENCE_TAKE_FIRST_ELEMENTS = "TakeFirstElements"; public static final String SEQUENCE_DROP_FIRST_ELEMENTS = "DropFirstElements"; - - + public static final String REL_INJECTIVE_SEQUENCES = "RelISeq"; public static final String REL_NOT_EMPTY_INJECTIVE_SEQUENCES = "RelISeq1"; - - + + /* + * BBuiltIns + */ + + public static final String MIN = "Min"; + public static final String MAX = "Max"; + public static final String GENERAL_SUMMATION = "Sigma"; + public static final String GENERAL_PRODUCT = "Pi"; + public static final ArrayList<String> Relations = new ArrayList<String>(); static { diff --git a/src/main/java/de/b2tla/analysis/TypeRestrictor.java b/src/main/java/de/b2tla/analysis/TypeRestrictor.java index 2f8ef13c528a1161e1335c1935ce4fa98bfbff33..1e15f7d514ee07d8b801779cb7a77768e933d695 100644 --- a/src/main/java/de/b2tla/analysis/TypeRestrictor.java +++ b/src/main/java/de/b2tla/analysis/TypeRestrictor.java @@ -17,6 +17,8 @@ import de.be4.classicalb.core.parser.node.AConstraintsMachineClause; import de.be4.classicalb.core.parser.node.AEqualPredicate; import de.be4.classicalb.core.parser.node.AExistsPredicate; import de.be4.classicalb.core.parser.node.AForallPredicate; +import de.be4.classicalb.core.parser.node.AGeneralProductExpression; +import de.be4.classicalb.core.parser.node.AGeneralSumExpression; import de.be4.classicalb.core.parser.node.AImplicationPredicate; import de.be4.classicalb.core.parser.node.AInitialisationMachineClause; import de.be4.classicalb.core.parser.node.ALambdaExpression; @@ -41,14 +43,13 @@ public class TypeRestrictor extends DepthFirstAdapter { private Hashtable<Node, ArrayList<NodeType>> restrictedTypesSet; private HashSet<Node> removedNodes; - - + public TypeRestrictor(Start start, MachineContext machineContext, Typechecker typechecker) { this.machineContext = machineContext; this.restrictedTypesSet = new Hashtable<Node, ArrayList<NodeType>>(); this.removedNodes = new HashSet<Node>(); - + cEF = new ConstantExpressionFinder(start, machineContext); start.apply(this); @@ -63,10 +64,10 @@ public class TypeRestrictor extends DepthFirstAdapter { return restrictedTypesSet.containsKey(node); } - public boolean removeNode(Node node){ + public boolean removeNode(Node node) { return this.removedNodes.contains(node); } - + private void putRestrictedType(Node identifier, NodeType expression) { ArrayList<NodeType> list = restrictedTypesSet.get(identifier); @@ -156,7 +157,7 @@ public class TypeRestrictor extends DepthFirstAdapter { } @Override - public void caseAForallPredicate(AForallPredicate node) { + public void inAForallPredicate(AForallPredicate node) { HashSet<Node> list = new HashSet<Node>(); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); @@ -164,16 +165,13 @@ public class TypeRestrictor extends DepthFirstAdapter { // e.apply(this); list.add(e); } - // TODO test if the expression is really a implication, currently a - // class cast exception is thrown AImplicationPredicate implication = (AImplicationPredicate) node .getImplication(); analysePredicate(implication.getLeft(), list); - node.getImplication().apply(this); } @Override - public void caseAExistsPredicate(AExistsPredicate node) { + public void inAExistsPredicate(AExistsPredicate node) { HashSet<Node> list = new HashSet<Node>(); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); @@ -181,13 +179,10 @@ public class TypeRestrictor extends DepthFirstAdapter { list.add(e); } analysePredicate(node.getPredicate(), list); - if (node.getPredicate() != null) { - node.getPredicate().apply(this); - } } @Override - public void caseAQuantifiedUnionExpression(AQuantifiedUnionExpression node) { + public void inAQuantifiedUnionExpression(AQuantifiedUnionExpression node) { HashSet<Node> list = new HashSet<Node>(); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); @@ -195,12 +190,10 @@ public class TypeRestrictor extends DepthFirstAdapter { list.add(e); } analysePredicate(node.getPredicates(), list); - node.getPredicates().apply(this); - node.getExpression().apply(this); } @Override - public void caseAQuantifiedIntersectionExpression( + public void inAQuantifiedIntersectionExpression( AQuantifiedIntersectionExpression node) { HashSet<Node> list = new HashSet<Node>(); List<PExpression> copy = new ArrayList<PExpression>( @@ -209,12 +202,10 @@ public class TypeRestrictor extends DepthFirstAdapter { list.add(e); } analysePredicate(node.getPredicates(), list); - node.getPredicates().apply(this); - node.getExpression().apply(this); } @Override - public void caseAComprehensionSetExpression(AComprehensionSetExpression node) { + public void inAComprehensionSetExpression(AComprehensionSetExpression node) { HashSet<Node> list = new HashSet<Node>(); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); @@ -223,11 +214,10 @@ public class TypeRestrictor extends DepthFirstAdapter { // e.apply(this); } analysePredicate(node.getPredicates(), list); - node.getPredicates().apply(this); } @Override - public void caseALambdaExpression(ALambdaExpression node) { + public void inALambdaExpression(ALambdaExpression node) { HashSet<Node> list = new HashSet<Node>(); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); @@ -235,10 +225,30 @@ public class TypeRestrictor extends DepthFirstAdapter { list.add(e); } analysePredicate(node.getPredicate(), list); - node.getPredicate().apply(this); - node.getExpression().apply(this); } + public void inAGeneralSumExpression(AGeneralSumExpression node) { + HashSet<Node> list = new HashSet<Node>(); + List<PExpression> copy = new ArrayList<PExpression>( + node.getIdentifiers()); + for (PExpression e : copy) { + list.add(e); + } + analysePredicate(node.getPredicates(), list); + } + + public void inAGeneralProductExpression(AGeneralProductExpression node) + { + HashSet<Node> list = new HashSet<Node>(); + List<PExpression> copy = new ArrayList<PExpression>( + node.getIdentifiers()); + for (PExpression e : copy) { + list.add(e); + } + analysePredicate(node.getPredicates(), list); + } + + private Hashtable<Node, HashSet<Node>> expectedIdentifieListTable = new Hashtable<Node, HashSet<Node>>(); @Override diff --git a/src/main/java/de/b2tla/analysis/Typechecker.java b/src/main/java/de/b2tla/analysis/Typechecker.java index 8f0eeb6f0bc0001210255d15444b600162cb3b10..ff335453d6038630fffbb6cb1a6334e21e4eca8e 100644 --- a/src/main/java/de/b2tla/analysis/Typechecker.java +++ b/src/main/java/de/b2tla/analysis/Typechecker.java @@ -173,17 +173,17 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { @Override public void caseADefinitionsMachineClause(ADefinitionsMachineClause node) { - List<PDefinition> copy = new ArrayList<PDefinition>( - node.getDefinitions()); - for (PDefinition e : copy) { - setType(e, new UntypedType()); - } - - for (PDefinition e : copy) { - e.apply(this); - } + List<PDefinition> copy = new ArrayList<PDefinition>( + node.getDefinitions()); + for (PDefinition e : copy) { + setType(e, new UntypedType()); + } + + for (PDefinition e : copy) { + e.apply(this); + } } - + @Override // d(a) == 1 public void caseAExpressionDefinitionDefinition( @@ -276,7 +276,6 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { } } - @Override public void caseAPropertiesMachineClause(final APropertiesMachineClause node) { if (node.getPredicates() != null) { @@ -679,22 +678,12 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { @Override public void caseAMaxIntExpression(AMaxIntExpression node) { - try { - IntegerType.getInstance().unify(getType(node), this); - } catch (UnificationException e) { - throw new TypeErrorException("Excepted '" + getType(node) - + "' , found 'INTEGER' in 'MAXINT'"); - } + unify(getType(node), IntegerType.getInstance(), node); } @Override public void caseAMinIntExpression(AMinIntExpression node) { - try { - IntegerType.getInstance().unify(getType(node), this); - } catch (UnificationException e) { - throw new TypeErrorException("Excepted '" + getType(node) - + "' , found 'INTEGER' in 'MININT'"); - } + unify(getType(node), IntegerType.getInstance(), node); } @Override @@ -913,26 +902,16 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { @Override public void caseASuccessorExpression(ASuccessorExpression node) { - SetType found = new SetType(new PairType(IntegerType.getInstance(), - IntegerType.getInstance())); - try { - found.unify(getType(node), this); - } catch (UnificationException e) { - throw new TypeErrorException("Excepted '" + getType(node) - + "' , found 'POW(INTEGER*INTEGER)' in ' succ '"); - } + FunctionType found = new FunctionType(IntegerType.getInstance(), + IntegerType.getInstance()); + unify(getType(node), found, node); } @Override public void caseAPredecessorExpression(APredecessorExpression node) { - SetType found = new SetType(new PairType(IntegerType.getInstance(), - IntegerType.getInstance())); - try { - found.unify(getType(node), this); - } catch (UnificationException e) { - throw new TypeErrorException("Excepted '" + getType(node) - + "' , found 'POW(INTEGER*INTEGER)' in ' pred '"); - } + FunctionType found = new FunctionType(IntegerType.getInstance(), + IntegerType.getInstance()); + unify(getType(node), found, node); } @Override diff --git a/src/main/java/de/b2tla/analysis/UnchangedVariablesFinder.java b/src/main/java/de/b2tla/analysis/UnchangedVariablesFinder.java index bb5f653c91715a0fa4f9cd41ad91743ead119a06..c4416bbc2c0c2bc61f206efc12f88894beeedad2 100644 --- a/src/main/java/de/b2tla/analysis/UnchangedVariablesFinder.java +++ b/src/main/java/de/b2tla/analysis/UnchangedVariablesFinder.java @@ -5,7 +5,6 @@ import java.util.Hashtable; import de.be4.classicalb.core.parser.node.Node; -import de.be4.classicalb.core.parser.node.Start; /** * @@ -25,7 +24,7 @@ public class UnchangedVariablesFinder { } public UnchangedVariablesFinder(MachineContext c) { - Start start = c.getTree(); +// Start start = c.getTree(); AssignedVariablesFinder aVF = new AssignedVariablesFinder(c); //start.apply(aVF); diff --git a/src/main/java/de/b2tla/analysis/UsedStandardModules.java b/src/main/java/de/b2tla/analysis/UsedStandardModules.java index 3b2cafa4bbd9120b69dd6887faf7e7e0881665db..924b3b754ac65af65b2fe1376088cc27723b3b20 100644 --- a/src/main/java/de/b2tla/analysis/UsedStandardModules.java +++ b/src/main/java/de/b2tla/analysis/UsedStandardModules.java @@ -3,12 +3,10 @@ package de.b2tla.analysis; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; -import java.util.Hashtable; import java.util.List; import java.util.Set; import java.util.Collections; -import de.b2tla.analysis.nodes.NodeType; import de.b2tla.btypes.BType; import de.b2tla.btypes.FunctionType; import de.b2tla.btypes.IntegerType; @@ -56,6 +54,7 @@ import de.be4.classicalb.core.parser.node.ALessEqualPredicate; import de.be4.classicalb.core.parser.node.ALessPredicate; import de.be4.classicalb.core.parser.node.AMaxExpression; import de.be4.classicalb.core.parser.node.AMinExpression; +import de.be4.classicalb.core.parser.node.AMinIntExpression; import de.be4.classicalb.core.parser.node.AMinusExpression; import de.be4.classicalb.core.parser.node.AMinusOrSetSubtractExpression; import de.be4.classicalb.core.parser.node.AModuloExpression; @@ -91,7 +90,6 @@ import de.be4.classicalb.core.parser.node.ASecondProjectionExpression; import de.be4.classicalb.core.parser.node.ASeq1Expression; import de.be4.classicalb.core.parser.node.ASeqExpression; import de.be4.classicalb.core.parser.node.ASizeExpression; -import de.be4.classicalb.core.parser.node.ASubsetStrictPredicate; import de.be4.classicalb.core.parser.node.ASuccessorExpression; import de.be4.classicalb.core.parser.node.ATailExpression; import de.be4.classicalb.core.parser.node.ATotalBijectionExpression; @@ -177,21 +175,18 @@ public class UsedStandardModules extends DepthFirstAdapter { searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); } - public void inAExistsPredicate(AExistsPredicate node) - { - searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); - } - - public void inALambdaExpression(ALambdaExpression node) - { - searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); - } - - public void inAComprehensionSetExpression(AComprehensionSetExpression node) - { - searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); - } - + public void inAExistsPredicate(AExistsPredicate node) { + searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); + } + + public void inALambdaExpression(ALambdaExpression node) { + searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); + } + + public void inAComprehensionSetExpression(AComprehensionSetExpression node) { + searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); + } + /** * Naturals */ @@ -245,14 +240,6 @@ public class UsedStandardModules extends DepthFirstAdapter { usedStandardModules.add(STANDARD_MODULES.Naturals); } - public void inAMinExpression(AMinExpression node) { - usedStandardModules.add(STANDARD_MODULES.Naturals); - } - - public void inAMaxExpression(AMaxExpression node) { - usedStandardModules.add(STANDARD_MODULES.Naturals); - } - public void inADivExpression(ADivExpression node) { usedStandardModules.add(STANDARD_MODULES.Naturals); } @@ -298,6 +285,10 @@ public class UsedStandardModules extends DepthFirstAdapter { usedStandardModules.add(STANDARD_MODULES.Integers); } + public void inAMinIntExpression(AMinIntExpression node) { + usedStandardModules.add(STANDARD_MODULES.Integers); + } + /** * FiniteSets */ @@ -308,6 +299,15 @@ public class UsedStandardModules extends DepthFirstAdapter { /** * BBuiltIns */ + + public void inAMinExpression(AMinExpression node) { + usedStandardModules.add(STANDARD_MODULES.BBuiltIns); + } + + public void inAMaxExpression(AMaxExpression node) { + usedStandardModules.add(STANDARD_MODULES.BBuiltIns); + } + public void inAGeneralSumExpression(AGeneralSumExpression node) { searchForIntegerTypeinTypesOFBoundedVariables(node.getIdentifiers()); usedStandardModules.add(STANDARD_MODULES.BBuiltIns); @@ -431,10 +431,13 @@ public class UsedStandardModules extends DepthFirstAdapter { // Function call public void inAFunctionExpression(AFunctionExpression node) { - BType type = typechecker.getType(node.getIdentifier()); - if (type instanceof SetType) { - usedStandardModules.add(STANDARD_MODULES.FunctionsAsRelations); + if (!(node.parent() instanceof AAssignSubstitution)) { + BType type = typechecker.getType(node.getIdentifier()); + if (type instanceof SetType) { + usedStandardModules.add(STANDARD_MODULES.FunctionsAsRelations); + } } + } public void inATotalFunctionExpression(ATotalFunctionExpression node) { @@ -491,7 +494,11 @@ public class UsedStandardModules extends DepthFirstAdapter { node.getLhsExpression()); for (PExpression e : copy) { if (e instanceof AFunctionExpression) { - usedStandardModules.add(STANDARD_MODULES.Relations); + BType type = typechecker.getType(((AFunctionExpression) e) + .getIdentifier()); + if (type instanceof SetType) { + usedStandardModules.add(STANDARD_MODULES.Relations); + } } } } diff --git a/src/main/java/de/b2tla/analysis/transformation/DefinitionsEliminator.java b/src/main/java/de/b2tla/analysis/transformation/DefinitionsEliminator.java index d46d4e9b85b3b58213859c63507115376b3926e7..908621ab9ac44de203fd4534e435003f30a0b5ab 100644 --- a/src/main/java/de/b2tla/analysis/transformation/DefinitionsEliminator.java +++ b/src/main/java/de/b2tla/analysis/transformation/DefinitionsEliminator.java @@ -2,21 +2,16 @@ package de.b2tla.analysis.transformation; import java.util.ArrayList; import java.util.Hashtable; -import java.util.List; import de.b2tla.analysis.DefinitionCollector; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; -import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit; import de.be4.classicalb.core.parser.node.ADefinitionExpression; import de.be4.classicalb.core.parser.node.ADefinitionPredicate; -import de.be4.classicalb.core.parser.node.ADefinitionsMachineClause; import de.be4.classicalb.core.parser.node.AExpressionDefinitionDefinition; import de.be4.classicalb.core.parser.node.AIdentifierExpression; import de.be4.classicalb.core.parser.node.APredicateDefinitionDefinition; -import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; -import de.be4.classicalb.core.parser.node.PMachineClause; import de.be4.classicalb.core.parser.node.Start; /** @@ -26,7 +21,7 @@ import de.be4.classicalb.core.parser.node.Start; * * Note: All parameters of a definition are replaced before calls of * sub-definitions are resolved. This behavior is similar to what ProB does by - * eliminatingall definitions. + * eliminating all definitions. * */ public class DefinitionsEliminator extends DepthFirstAdapter { diff --git a/src/main/java/de/b2tla/prettyprint/TLAPrinter.java b/src/main/java/de/b2tla/prettyprint/TLAPrinter.java index eac7f75e27198e576e0503ee52f72e8096efe9a1..a8656b065521d9145fa96d174a40ebce436de508 100644 --- a/src/main/java/de/b2tla/prettyprint/TLAPrinter.java +++ b/src/main/java/de/b2tla/prettyprint/TLAPrinter.java @@ -2,11 +2,11 @@ package de.b2tla.prettyprint; import java.util.ArrayList; import java.util.HashSet; -import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import de.b2tla.Globals; import de.b2tla.analysis.MachineContext; import de.b2tla.analysis.PrecedenceCollector; import de.b2tla.analysis.PrimedNodesMarker; @@ -742,6 +742,7 @@ public class TLAPrinter extends DepthFirstAdapter { public void caseAOperation(AOperation node) { String name = renamer.getNameOfRef(node); tlaModuleString.append(name); + List<PExpression> output = new ArrayList<PExpression>( node.getReturnValues()); List<PExpression> params = new ArrayList<PExpression>( @@ -949,6 +950,7 @@ public class TLAPrinter extends DepthFirstAdapter { */ inAExistsPredicate(node); tlaModuleString.append("\\E "); + List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); for (int i = 0; i < copy.size(); i++) { @@ -1172,24 +1174,18 @@ public class TLAPrinter extends DepthFirstAdapter { @Override public void caseAMinExpression(AMinExpression node) { - inAMinExpression(node); - tlaModuleString.append("CHOOSE min \\in "); - node.getExpression().apply(this); - tlaModuleString.append(" : \\A p \\in "); + tlaModuleString.append(MIN); + tlaModuleString.append("("); node.getExpression().apply(this); - tlaModuleString.append(" : min =< p"); - outAMinExpression(node); + tlaModuleString.append(")"); } @Override public void caseAMaxExpression(AMaxExpression node) { - inAMaxExpression(node); - tlaModuleString.append("(CHOOSE max \\in "); - node.getExpression().apply(this); - tlaModuleString.append(" : \\A p \\in "); + tlaModuleString.append(MAX); + tlaModuleString.append("("); node.getExpression().apply(this); - tlaModuleString.append(" : max >= p)"); - outAMaxExpression(node); + tlaModuleString.append(")"); } @Override @@ -1241,53 +1237,54 @@ public class TLAPrinter extends DepthFirstAdapter { @Override public void caseAGeneralProductExpression(AGeneralProductExpression node) { - inAGeneralProductExpression(node); - tlaModuleString.append("PI({"); - + tlaModuleString.append("Pi("); + tlaModuleString.append("{"); node.getExpression().apply(this); tlaModuleString.append(" : "); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); printIdentifierList(copy); - - tlaModuleString.append(" \\in { "); - - printIdentifierList(copy); - tlaModuleString.append(" \\in "); - printTypesOfIdentifierList(copy); - tlaModuleString.append(" : "); - node.getPredicates().apply(this); - tlaModuleString.append("}"); - + if (typeRestrictor.removeNode(node.getPredicates())) { + printTypesOfIdentifierList(copy); + } else { + tlaModuleString.append("{"); + printIdentifierList(copy); + tlaModuleString.append(" \\in "); + printTypesOfIdentifierList(copy); + tlaModuleString.append(" : "); + node.getPredicates().apply(this); + tlaModuleString.append("}"); + } tlaModuleString.append("}"); - outAGeneralProductExpression(node); + tlaModuleString.append(")"); } @Override public void caseAGeneralSumExpression(AGeneralSumExpression node) { - inAGeneralSumExpression(node); - tlaModuleString.append("SIGMA({"); - + tlaModuleString.append("Sigma("); + tlaModuleString.append("{"); node.getExpression().apply(this); tlaModuleString.append(" : "); List<PExpression> copy = new ArrayList<PExpression>( node.getIdentifiers()); printIdentifierList(copy); - - tlaModuleString.append(" \\in { "); - - printIdentifierList(copy); - tlaModuleString.append(" \\in "); - printTypesOfIdentifierList(copy); - tlaModuleString.append(" : "); - node.getPredicates().apply(this); + if (typeRestrictor.removeNode(node.getPredicates())) { + printTypesOfIdentifierList(copy); + } else { + tlaModuleString.append("{"); + printIdentifierList(copy); + tlaModuleString.append(" \\in "); + printTypesOfIdentifierList(copy); + tlaModuleString.append(" : "); + node.getPredicates().apply(this); + tlaModuleString.append("}"); + } tlaModuleString.append("}"); - tlaModuleString.append("})"); - outAGeneralSumExpression(node); + tlaModuleString.append(")"); } @Override @@ -1304,6 +1301,16 @@ public class TLAPrinter extends DepthFirstAdapter { outAPredecessorExpression(node); } + @Override + public void caseAMaxIntExpression(AMaxIntExpression node) { + tlaModuleString.append(Globals.MAX_INT); + } + + @Override + public void caseAMinIntExpression(AMinIntExpression node) { + tlaModuleString.append(Globals.MIN_INT); + } + /** * Function */ @@ -1509,7 +1516,8 @@ public class TLAPrinter extends DepthFirstAdapter { node.getRight().apply(this); tlaModuleString.append("]"); } else { - if (node.parent() instanceof AMemberPredicate && !typeRestrictor.removeNode(node.parent())) { + if (node.parent() instanceof AMemberPredicate + && !typeRestrictor.removeNode(node.parent())) { tlaModuleString.append(REL_TOTAL_FUNCTION_ELEMENT_OF); } else { tlaModuleString.append(REL_TOTAL_FUNCTION); @@ -1529,7 +1537,8 @@ public class TLAPrinter extends DepthFirstAdapter { if (subtype instanceof FunctionType) { tlaModuleString.append(funcName); } else { - if (node.parent() instanceof AMemberPredicate && !typeRestrictor.removeNode(node.parent())) { + if (node.parent() instanceof AMemberPredicate + && !typeRestrictor.removeNode(node.parent())) { tlaModuleString.append(relEleOfName); } else { tlaModuleString.append(relName); @@ -2146,7 +2155,8 @@ public class TLAPrinter extends DepthFirstAdapter { @Override public void caseAIseqExpression(AIseqExpression node) { - if (node.parent() instanceof AMemberPredicate && !typeRestrictor.removeNode(node.parent())) { + if (node.parent() instanceof AMemberPredicate + && !typeRestrictor.removeNode(node.parent())) { tlaModuleString.append(INJECTIVE_SEQUENCE_ELEMENT_OF); } else { tlaModuleString.append(INJECTIVE_SEQUENCE); @@ -2158,7 +2168,8 @@ public class TLAPrinter extends DepthFirstAdapter { @Override public void caseAIseq1Expression(AIseq1Expression node) { - if (node.parent() instanceof AMemberPredicate && !typeRestrictor.removeNode(node.parent())) { + if (node.parent() instanceof AMemberPredicate + && !typeRestrictor.removeNode(node.parent())) { tlaModuleString.append(INJECTIVE_SEQUENCE_1_ELEMENT_OF); } else { tlaModuleString.append(INJECTIVE_SEQUENCE_1); diff --git a/src/main/java/de/b2tla/tlc/ModuleMatcher.java b/src/main/java/de/b2tla/tlc/ModuleMatcher.java index 73451ef90613c9761b02907755868bd075f3b563..ac3d8160db8170bebe6b473fee84497f19d946c3 100644 --- a/src/main/java/de/b2tla/tlc/ModuleMatcher.java +++ b/src/main/java/de/b2tla/tlc/ModuleMatcher.java @@ -4,8 +4,6 @@ import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; -import de.b2tla.util.StopWatch; - import tla2sany.drivers.SANY; import tla2sany.modanalyzer.SpecObj; import tla2sany.semantic.ModuleNode; diff --git a/src/main/java/de/b2tla/tlc/TLCOutput.java b/src/main/java/de/b2tla/tlc/TLCOutput.java index 4de9fe894bfee57ea5e4ea29d5f9647e3d9a29e5..56c3f39828c56217e704ef65a22275b4602bd7d5 100644 --- a/src/main/java/de/b2tla/tlc/TLCOutput.java +++ b/src/main/java/de/b2tla/tlc/TLCOutput.java @@ -41,6 +41,10 @@ public class TLCOutput { parseTrace(); return trace; } + + public String getModuleName(){ + return moduleName; + } public boolean hasTrace() { return states.size() > 0; diff --git a/src/main/resources/standardModules/BBuiltIns.tla b/src/main/resources/standardModules/BBuiltIns.tla index d2b83006dcdfde7d65915ea7edde986c560e9a55..6abae1ba5c643af6ded07f6bae01b8912021e362 100644 --- a/src/main/resources/standardModules/BBuiltIns.tla +++ b/src/main/resources/standardModules/BBuiltIns.tla @@ -2,10 +2,18 @@ EXTENDS Integers, FiniteSets, TLC -RECURSIVE SIGMA(_) -SIGMA(S) == LET e == CHOOSE e \in S: TRUE - IN IF S = {} THEN 0 ELSE e + SIGMA(S \ {e}) - +RECURSIVE Sigma(_) +Sigma(S) == LET e == CHOOSE e \in S: TRUE + IN IF S = {} THEN 0 ELSE e + Sigma(S \ {e}) + +RECURSIVE Pi(_) +Pi(S) == LET e == CHOOSE e \in S: TRUE + IN IF S = {} THEN 0 ELSE e + Pi(S \ {e}) + +Max == CHOOSE x \in {1} : \A p \in {1} : x >= p + +Min == CHOOSE x \in {1} : \A p \in {1} : x =< p + succ[x \in Int] == x + 1 pred[x \in Int] == x - 1 diff --git a/src/test/java/de/b2tla/analysis/ConstantsTest.java b/src/test/java/de/b2tla/analysis/ConstantsTest.java index cea3868c0bb6cbdcd86f96490a80b7e6df5019fb..41b036cf53f0defce62d1d7f340220bcfbaef78b 100644 --- a/src/test/java/de/b2tla/analysis/ConstantsTest.java +++ b/src/test/java/de/b2tla/analysis/ConstantsTest.java @@ -3,7 +3,6 @@ package de.b2tla.analysis; import static de.b2tla.util.TestUtil.compare; -import org.junit.Ignore; import org.junit.Test; public class ConstantsTest { diff --git a/src/test/java/de/b2tla/analysis/DefinitionsOrderTest.java b/src/test/java/de/b2tla/analysis/DefinitionsOrderTest.java index 5c76e94f112b8d42f5b8630bc21d60bf1555d378..15d7285a480866c90c59a4b4d6432737dc7de566 100644 --- a/src/test/java/de/b2tla/analysis/DefinitionsOrderTest.java +++ b/src/test/java/de/b2tla/analysis/DefinitionsOrderTest.java @@ -2,7 +2,6 @@ package de.b2tla.analysis; import static de.b2tla.util.TestUtil.compare; -import org.junit.Ignore; import org.junit.Test; public class DefinitionsOrderTest { diff --git a/src/test/java/de/b2tla/analysis/PrecedenceTest.java b/src/test/java/de/b2tla/analysis/PrecedenceTest.java index 8f270131c2852749adb4cec1b6d9db4f608d562a..1b8d55bbf423ccd997e83e243dd190176cd5aec7 100644 --- a/src/test/java/de/b2tla/analysis/PrecedenceTest.java +++ b/src/test/java/de/b2tla/analysis/PrecedenceTest.java @@ -46,6 +46,19 @@ public class PrecedenceTest { compare(expected, machine); } + @Test + public void testMult() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES 1 * 2 * 3 = 6 \n" + + "END"; + + String expected = "---- MODULE test----\n" + + "EXTENDS Integers\n" + + "ASSUME 1 * 2 * 3 = 6\n" + + "======"; + compare(expected, machine); + } + @Test public void testAndOr() throws Exception { String machine = "MACHINE test\n" diff --git a/src/test/java/de/b2tla/analysis/PrimeTest.java b/src/test/java/de/b2tla/analysis/PrimeTest.java index acb8bd4b5b04cedd85d1f159c0c2585c43f7cf62..c755adfe48628400661969f9f9abff184452b88c 100644 --- a/src/test/java/de/b2tla/analysis/PrimeTest.java +++ b/src/test/java/de/b2tla/analysis/PrimeTest.java @@ -9,6 +9,7 @@ public class PrimeTest { @Test public void testOperationParameter() throws Exception { - //TODO + + } } diff --git a/src/test/java/de/b2tla/analysis/ScopeTest.java b/src/test/java/de/b2tla/analysis/ScopeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b526447b0135bbae08bf91d4a402eb96a2e72b99 --- /dev/null +++ b/src/test/java/de/b2tla/analysis/ScopeTest.java @@ -0,0 +1,161 @@ +package de.b2tla.analysis; + +import org.junit.Ignore; +import org.junit.Test; + +import static de.b2tla.util.TestUtil.checkMachine; +import de.b2tla.exceptions.ScopeException; + +public class ScopeTest { + + @Test(expected = ScopeException.class) + public void testDuplicateConstant() throws Exception { + String machine = "MACHINE test \n" + "CONSTANTS k, k \n" + + "PROPERTIES 1 = 1 \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testDuplicateSeenMachine() throws Exception { + String machine = "MACHINE test \n" + "SEES M1, M1 \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testConstraintsMissingMachineParameter() throws Exception { + String machine = "MACHINE test \n" + "CONSTRAINTS k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test + public void testConstraints() throws Exception { + String machine = "MACHINE test(k) \n" + "CONSTRAINTS k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testPropertiesUnknownIdentifier() throws Exception { + String machine = "MACHINE test \n" + "PROPERTIES k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test + public void testPropertiesConstant() throws Exception { + String machine = "MACHINE test \n" + "CONSTANTS k \n" + + "PROPERTIES k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test (expected = ScopeException.class) + public void testConstantsHasSameNameAsElementOfEnumeratedSet() throws Exception { + String machine = "MACHINE test \n" + "SETS k = {k1,k2} \n" + + "CONSTANTS k \n" + + "PROPERTIES k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testInvariantUnknownIdentifier() throws Exception { + String machine = "MACHINE test \n" + "INVARIANT k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test + public void testInvariantParameter() throws Exception { + String machine = "MACHINE test(k) \n" + "CONSTRAINTS k = 1\n" + + "INVARIANT k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test + public void testInvariantConstatnParameter() throws Exception { + String machine = "MACHINE test\n" + "CONSTANTS k \n" + + "PROPERTIES k = 1" + "INVARIANT k = 1 \n" + "END"; + checkMachine(machine); + } + + @Test + public void testInvariantVariable() throws Exception { + String machine = "MACHINE test\n" + "VARIABLES k \n" + + "INVARIANT k = 1 \n" + "INITIALISATION k := 1 \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testInitialisationUnknwonIdentifier() throws Exception { + String machine = "MACHINE test\n" + "VARIABLES k \n" + + "INVARIANT k = 1 \n" + "INITIALISATION k := a \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testOperationsUnknwonIdentifier() throws Exception { + String machine = "MACHINE test\n" + "OPERATIONS foo = a := 1" + "END"; + checkMachine(machine); + } + + @Test + public void testSubstitution() throws Exception { + String machine = "MACHINE test\n" + "VARIABLES x \n" + + "INVARIANT x = 1 \n" + "INITIALISATION x := 1 \n" + "END"; + checkMachine(machine); + } + + @Ignore //TODO + @Test(expected = ScopeException.class) + public void testConstantSubstitution() throws Exception { + String machine = "MACHINE test\n" + "CONSTANTS x \n" + + "PROPERTIES x = 1 \n" + "INITIALISATION x := 1 \n" + "END"; + checkMachine(machine); + } + + @Test + public void testSubstitution2() throws Exception { + String machine = "MACHINE test\n" + "CONSTANTS x \n" + + "PROPERTIES x = 1 \n" + "VARIABLES a \n" + + "INVARIANT a = 1 \n" + "INITIALISATION a := x \n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testUnkownOperation() throws Exception { + String machine = "MACHINE test\n" + "INITIALISATION foo \n" + "END"; + checkMachine(machine); + } + + @Test + public void testLocalVariableForAll() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES !x.(x : INT => x > 1) \n" + "END"; + checkMachine(machine); + } + + @Test + public void testLocalVariableExist() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES #x.(x : INT & x > 1) \n" + "END"; + checkMachine(machine); + } + + @Test + public void testLocalVariableLambda() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES %x.(x : INT | x + 1)(1) = 1\n" + "END"; + checkMachine(machine); + } + + @Test + public void testNestedLocalExists() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES #x.(x : INT & #x.(x + 1 = 1))\n" + "END"; + checkMachine(machine); + } + + @Test(expected = ScopeException.class) + public void testDuplicateLocalVariable() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES #(x,x).(1 = 1 & x = x)\n" + "END"; + checkMachine(machine); + } + +} diff --git a/src/test/java/de/b2tla/analysis/TypeRestrictionsTest.java b/src/test/java/de/b2tla/analysis/TypeRestrictionsTest.java index fefb9b2d8478bf3eb7f110fa0278a8e5b3bc0486..4a1f5f6b8315ff2d87afbf699038a0bd9a5930b2 100644 --- a/src/test/java/de/b2tla/analysis/TypeRestrictionsTest.java +++ b/src/test/java/de/b2tla/analysis/TypeRestrictionsTest.java @@ -2,7 +2,6 @@ package de.b2tla.analysis; import static de.b2tla.util.TestUtil.compare; -import org.junit.Ignore; import org.junit.Test; public class TypeRestrictionsTest { diff --git a/src/test/java/de/b2tla/analysis/UnchangedVariablesTest.java b/src/test/java/de/b2tla/analysis/UnchangedVariablesTest.java index 79ecc0bbb1d369886b40f4dfbb7f51dda4042535..6c0ef2c09d7ac9213f0e392dc5cc686bd27003e6 100644 --- a/src/test/java/de/b2tla/analysis/UnchangedVariablesTest.java +++ b/src/test/java/de/b2tla/analysis/UnchangedVariablesTest.java @@ -1,8 +1,8 @@ package de.b2tla.analysis; import static de.b2tla.util.TestUtil.compare; +import static de.b2tla.util.TestUtil.compareEquals; -import org.junit.Ignore; import org.junit.Test; import de.b2tla.exceptions.SubstitutionException; @@ -40,9 +40,8 @@ public class UnchangedVariablesTest { } - @Ignore @Test - public void testFunction() throws Exception { + public void testFunctionAssignment() throws Exception { String machine = "MACHINE test\n" + "VARIABLES x\n" + "INVARIANT x = %p.(p: {1}| 1)\n" @@ -51,15 +50,33 @@ public class UnchangedVariablesTest { + "END"; String expected = "---- MODULE test ----\n" - + "VARIABLES x, y \n" - + "Inv == x = 1 /\\ y = 1\n" - + "Init == x = 1 /\\ y = 1\n" - + "foo == IF x = 1 THEN x' = 2 /\\ UNCHANGED <<y>> ELSE y' = 2 /\\ UNCHANGED <<x>>\n" + + "VARIABLES x \n" + + "Invariant == x = [p \\in {1} |-> 1] \n" + + "Init == x = [p \\in {1} |-> 1] \n" + + "foo == x' = [x EXCEPT ![1] = 2] \n" + "Next == foo\n" + "===="; compare(expected, machine); } - @Ignore + @Test + public void testRelationAssignment() throws Exception { + String machine = "MACHINE test\n" + + "VARIABLES x\n" + + "INVARIANT x = {(1,2)}\n" + + "INITIALISATION x := {(1,2)}\n" + + "OPERATIONS foo = x(1):= 2 \n" + + "END"; + + String expected = "---- MODULE test ----\n" + + "EXTENDS Relations\n" + + "VARIABLES x\n" + + "Invariant == x = {<<1, 2>>}\n" + + "Init == x = {<<1, 2>>}\n" + + "foo == x' = RelOverride(x, {<<1, 2>>})\n\n" + + "Next == \\/ foo\n" + "===="; + compareEquals(expected, machine); + } + @Test public void testIfThenElse() throws Exception { String machine = "MACHINE test\n" + "VARIABLES x,y\n" @@ -76,7 +93,6 @@ public class UnchangedVariablesTest { compare(expected, machine); } - @Ignore @Test public void testChoice() throws Exception { String machine = "MACHINE test\n" + "VARIABLES x,y\n" diff --git a/src/test/java/de/b2tla/prettyprint/BBuildInsTest.java b/src/test/java/de/b2tla/prettyprint/BBuildInsTest.java index 62d857e17bfee851bad62207d89ca9f62f096190..f2758fa63633f8f1950c7b47492104844e1550ff 100644 --- a/src/test/java/de/b2tla/prettyprint/BBuildInsTest.java +++ b/src/test/java/de/b2tla/prettyprint/BBuildInsTest.java @@ -85,71 +85,100 @@ public class BBuildInsTest { + "===="; compareEquals(expected, machine); } + + @Test + public void testSigma() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES SIGMA(z).(z : {1,2,3}| z+z) = 12 \n" + "END"; + String expected = "---- MODULE test ----\n" + + "EXTENDS Naturals, BBuiltIns\n" + + "ASSUME Sigma({z + z : z \\in {1, 2, 3}}) = 12\n" + + "===="; + compareEquals(expected, machine); + } - @Ignore @Test - public void testPartialFunction() throws Exception { - String machine = "MACHINE test\n" + "CONSTANTS k\n" - + "PROPERTIES k = {1,2} +-> {1,2}\n" + "END"; + public void testSigma2() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES SIGMA(z).(z : {1,2,3} & 1=1| z+z) = 12\n" + "END"; String expected = "---- MODULE test ----\n" - + "EXTENDS Integers\n" - + "CONSTANTS k\n" - + "ASSUME k = [<<a, b>> \\in { <<a, b>> \\in (Int \\times Int) : a = b} |-> a + b][2, 2]\n" + + "EXTENDS Naturals, BBuiltIns\n" + + "ASSUME Sigma({z + z : z \\in {z \\in {1, 2, 3} : 1 = 1}}) = 12\n" + "===="; - // TODO partial function - compare(expected, machine); + compareEquals(expected, machine); } - // TODO include Standard module BBuiltIns @Test - public void testSigma() throws Exception { + public void testPi() throws Exception { String machine = "MACHINE test\n" - + "PROPERTIES SIGMA(z).(z : {1,2,3}| z) = 6 \n" + "END"; + + "PROPERTIES PI(z).(z : {1,2,3}| z+z) = 12 \n" + "END"; String expected = "---- MODULE test ----\n" - + "EXTENDS Integers, BBuiltIns\n" - + "ASSUME SIGMA({z : z \\in { z \\in Int : z \\in {1, 2, 3}}}) = 6\n" + + "EXTENDS Naturals, BBuiltIns\n" + + "ASSUME Pi({z + z : z \\in {1, 2, 3}}) = 12\n" + "===="; compareEquals(expected, machine); } - - @Ignore + @Test - public void testPI() throws Exception { + public void testPi2() throws Exception { String machine = "MACHINE test\n" - + "PROPERTIES PI(z).(z : {1,2,3}| z) = 6 \n" + "END"; - String expected = "---- MODULE test----\n" + "EXTENDS Integers\n" - + "ASSUME PI() = 1\n" + "======"; - compare(expected, machine); + + "PROPERTIES PI(z).(z : {1,2,3} & 1=1| z+z) = 12\n" + "END"; + String expected = "---- MODULE test ----\n" + + "EXTENDS Naturals, BBuiltIns\n" + + "ASSUME Pi({z + z : z \\in {z \\in {1, 2, 3} : 1 = 1}}) = 12\n" + + "===="; + compareEquals(expected, machine); } - @Ignore @Test public void testSucc() throws Exception { String machine = "MACHINE test\n" + "PROPERTIES succ(3) = 4 \n" + "END"; - String expected = "---- MODULE test----\n" + "EXTENDS BBuiltIns\n" - + "ASSUME succ(3) = 4\n" + "======"; + String expected = "---- MODULE test ----\n" + "EXTENDS BBuiltIns\n" + + "ASSUME succ[3] = 4\n" + "===="; compareEquals(expected, machine); } - @Ignore @Test public void testPred() throws Exception { String machine = "MACHINE test\n" + "PROPERTIES pred(2) = 1 \n" + "END"; - String expected = "---- MODULE test----\n" + "EXTENDS BBuiltIns\n" - + "ASSUME pred(2) = 1\n" + "======"; - compare(expected, machine); + String expected = "---- MODULE test ----\n" + "EXTENDS BBuiltIns\n" + + "ASSUME pred[2] = 1\n" + "===="; + compareEquals(expected, machine); } - @Ignore @Test - public void testMinInt() throws Exception { - // TODO read MinInt and MaxInt from Configuration file + public void testMin() throws Exception { + String machine = "MACHINE test\n" + "PROPERTIES min({1}) = 1 \n" + "END"; + String expected = "---- MODULE test ----\n" + "EXTENDS BBuiltIns\n" + + "ASSUME Min({1}) = 1\n" + "===="; + compareEquals(expected, machine); } - - @Ignore + + @Test + public void testMax() throws Exception { + String machine = "MACHINE test\n" + "PROPERTIES max({1}) = 1 \n" + "END"; + String expected = "---- MODULE test ----\n" + "EXTENDS BBuiltIns\n" + + "ASSUME Max({1}) = 1\n" + "===="; + compareEquals(expected, machine); + } + @Test public void testMaxInt() throws Exception { - + String machine = "MACHINE test\n" + + "PROPERTIES MAXINT = MAXINT \n" + "END"; + String expected = "---- MODULE test ----\n" + + "ASSUME 4 = 4\n" + "===="; + compare(expected, machine); } + @Test + public void testMinInt() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES MININT = MININT \n" + "END"; + String expected = "---- MODULE test ----\n" + + "EXTENDS Integers\n" + + "ASSUME -1 = -1\n" + "===="; + compare(expected, machine); + } + } diff --git a/src/test/java/de/b2tla/prettyprint/FunctionTest.java b/src/test/java/de/b2tla/prettyprint/FunctionTest.java index 28bf56f9b21270a6aaea99904a2f12ec0974c994..b032839b11b387bb323dc780c71d81fa10c156af 100644 --- a/src/test/java/de/b2tla/prettyprint/FunctionTest.java +++ b/src/test/java/de/b2tla/prettyprint/FunctionTest.java @@ -1,9 +1,6 @@ package de.b2tla.prettyprint; import static de.b2tla.util.TestUtil.*; -import static org.junit.Assert.*; - -import org.junit.Ignore; import org.junit.Test; @@ -116,4 +113,15 @@ public class FunctionTest { } + @Test + public void testPartialFunction() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES {} = {1,2} +-> {1,2}\n" + "END"; + String expected = "---- MODULE test ----\n" + + "EXTENDS Functions\n" + + "ASSUME {} = ParFunc({1, 2}, {1, 2})\n" + + "===="; + compareEquals(expected, machine); + } + } diff --git a/src/test/java/de/b2tla/prettyprint/NumbersTest.java b/src/test/java/de/b2tla/prettyprint/NumbersTest.java index 85cad918c28f53a439f4debce51b04f61456cc1d..5362a43193ce8ca8e4b342f13cfd91b5d45f06ed 100644 --- a/src/test/java/de/b2tla/prettyprint/NumbersTest.java +++ b/src/test/java/de/b2tla/prettyprint/NumbersTest.java @@ -141,31 +141,6 @@ public class NumbersTest { compare(expected, machine); } - @Test - public void testMin() throws Exception { - String machine = "MACHINE test\n" - + "PROPERTIES 1 = min({1,2,3})\n" - + "END"; - String expected = "---- MODULE test----\n" - + "EXTENDS Naturals \n" - + "ASSUME 1 = CHOOSE min \\in {1,2,3}: \\A p \\in {1,2,3}: min =< p \n" - + "======"; - compare(expected, machine); - } - - @Test - public void testMax() throws Exception { - String machine = "MACHINE test\n" - + "PROPERTIES 3 = max({1,2,3})\n" - + "END"; - String expected = "---- MODULE test----\n" - + "EXTENDS Naturals \n" - + "ASSUME 3 = CHOOSE max \\in {1,2,3}: \\A p \\in {1,2,3}: max >= p \n" - + "======"; - compare(expected, machine); - } - - @Test public void testAdd() throws Exception { String machine = "MACHINE test\n" diff --git a/src/test/java/de/b2tla/prettyprint/RelationTest.java b/src/test/java/de/b2tla/prettyprint/RelationTest.java index 8f8ae50701737936e4c9eb21ad8be186ed2f067a..47f160c9b36b6d0499c4e67a6908046c0fdf4cfb 100644 --- a/src/test/java/de/b2tla/prettyprint/RelationTest.java +++ b/src/test/java/de/b2tla/prettyprint/RelationTest.java @@ -1,13 +1,8 @@ package de.b2tla.prettyprint; import static de.b2tla.util.TestUtil.*; -import static org.junit.Assert.assertEquals; - -import org.junit.Ignore; import org.junit.Test; -import de.b2tla.B2TLA; - public class RelationTest { diff --git a/src/test/java/de/b2tla/tlc/integration/ErrorTest.java b/src/test/java/de/b2tla/tlc/integration/ErrorTest.java index ee4a5f675333f2b37dadceb9f364f7b0cb5113a7..b0c0aa4919dd4a9b5e708108f64e38b7acadee97 100644 --- a/src/test/java/de/b2tla/tlc/integration/ErrorTest.java +++ b/src/test/java/de/b2tla/tlc/integration/ErrorTest.java @@ -2,12 +2,10 @@ package de.b2tla.tlc.integration; import static org.junit.Assert.assertEquals; -import org.junit.Ignore; import org.junit.Test; import de.b2tla.B2TLA; import de.b2tla.tlc.TLCOutput; -import de.b2tla.tlc.TLCOutput.ERROR; public class ErrorTest { diff --git a/src/test/java/de/b2tla/typechecking/ArithmeticOperatorTest.java b/src/test/java/de/b2tla/typechecking/ArithmeticOperatorTest.java index 35e4e1ebc52e27f461912a870a0e0943628671d3..f037047f3254e331f0bbd74e7922412744b790b9 100644 --- a/src/test/java/de/b2tla/typechecking/ArithmeticOperatorTest.java +++ b/src/test/java/de/b2tla/typechecking/ArithmeticOperatorTest.java @@ -315,7 +315,7 @@ public class ArithmeticOperatorTest { String machine = "MACHINE test\n" + "CONSTANTS k \n" + "PROPERTIES k = succ \n" + "END"; TestTypechecker t = new TestTypechecker(machine); - assertEquals("POW(INTEGER*INTEGER)", t.constants.get("k").toString()); + assertEquals("FUNC(INTEGER,INTEGER)", t.constants.get("k").toString()); } @Test(expected = TypeErrorException.class) @@ -330,7 +330,7 @@ public class ArithmeticOperatorTest { String machine = "MACHINE test\n" + "CONSTANTS k \n" + "PROPERTIES k = pred \n" + "END"; TestTypechecker t = new TestTypechecker(machine); - assertEquals("POW(INTEGER*INTEGER)", t.constants.get("k").toString()); + assertEquals("FUNC(INTEGER,INTEGER)", t.constants.get("k").toString()); } @Test(expected = TypeErrorException.class) diff --git a/src/test/java/de/b2tla/util/TestUtil.java b/src/test/java/de/b2tla/util/TestUtil.java index efad08b14a96e6d4f29980fd0689615623487021..860d73bfbf5c927d92a980847524649da4723937 100644 --- a/src/test/java/de/b2tla/util/TestUtil.java +++ b/src/test/java/de/b2tla/util/TestUtil.java @@ -43,6 +43,17 @@ public class TestUtil { } // assertEquals(sb2.toString(), sb1.toString()); } + + public static void checkMachine(String machine) + throws Exception { + B2TlaTranslator b2tlaTranslator = new B2TlaTranslator(machine); + b2tlaTranslator.translate(); + System.out.println(b2tlaTranslator.getModuleString()); + + String name = b2tlaTranslator.getMachineName(); + de.tla2b.translation.Tla2BTranslator + .translateString(name, b2tlaTranslator.getModuleString(), null); + } public static void print(Start start) { final Ast2String ast2String2 = new Ast2String(); diff --git a/src/test/java/standard/PrecedenceTest.java b/src/test/java/standard/PrecedenceTest.java deleted file mode 100644 index 38a97c439aa6436e773e510cd70d4ba75b22f676..0000000000000000000000000000000000000000 --- a/src/test/java/standard/PrecedenceTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package standard; - - -import java.util.HashSet; -import java.util.Hashtable; - -import org.junit.Test; - - -import de.b2tla.analysis.Ast2String; -import de.b2tla.analysis.MachineContext; -import de.b2tla.analysis.PrecedenceCollector; -import de.b2tla.analysis.Typechecker; -import de.b2tla.analysis.UnchangedVariablesFinder; -import de.be4.classicalb.core.parser.BParser; -import de.be4.classicalb.core.parser.exceptions.BException; -import de.be4.classicalb.core.parser.node.Node; -import de.be4.classicalb.core.parser.node.Start; - -public class PrecedenceTest { - - - - @Test - public void testDisjunctionConjunction() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES 1 = 1 & 2 = 2 or 3 = 3 \n" - + "END"; - new Env(machine); - } - - - @Test - public void testMult() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES 1 * 2 * 3 = 6 \n" - + "END"; - new Env(machine); - } - - - - - class Env { - Hashtable<String, HashSet<Node>> unchangedVariablesOfOperation; - - public Env(String machine) throws BException { - - BParser parser = new BParser("Test"); - Start start = parser.parse(machine, false); - final Ast2String ast2String2 = new Ast2String(); - start.apply(ast2String2); - System.out.println(ast2String2.toString()); - - MachineContext c = new MachineContext(start); - Typechecker t = new Typechecker(c); - UnchangedVariablesFinder u = new UnchangedVariablesFinder(c); - - PrecedenceCollector p = new PrecedenceCollector(start, t.getTypes()); - - } - - } -} diff --git a/src/test/java/standard/PrinterTest.java b/src/test/java/standard/PrinterTest.java deleted file mode 100644 index c09000ad1245d1a96f3199eba4b2803439bcf8da..0000000000000000000000000000000000000000 --- a/src/test/java/standard/PrinterTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package standard; - -import org.junit.Test; - -import de.b2tla.analysis.Ast2String; -import de.b2tla.analysis.MachineContext; -import de.b2tla.analysis.PrecedenceCollector; -import de.b2tla.analysis.Typechecker; -import de.b2tla.analysis.UnchangedVariablesFinder; -import de.be4.classicalb.core.parser.BParser; -import de.be4.classicalb.core.parser.exceptions.BException; -import de.be4.classicalb.core.parser.node.Start; - -public class PrinterTest { - - @Test - public void test3() throws BException { - String machine = "MACHINE test\n" + "VARIABLES x,y\n" - + "INVARIANT x = 1 & y = 1\n" + "INITIALISATION x,y := 1,1 \n" - + "OPERATIONS foo = x := 1\n" - + " ;bar = IF x = 1 THEN x:= 2 ELSE y := 2 END \n" + "END"; - Env env = new Env(machine); - System.out.println(env.result); - // assertEquals(3,env.variablesTable.get("foo").size()); - } - - @Test - public void test4() throws BException { - String machine = "MACHINE test\n" + "VARIABLES x,y\n" - + "INVARIANT x = 1 & y = 1\n" + "INITIALISATION x,y := 1,1 \n" - + "OPERATIONS foo = CHOICE x := 1 OR x:= 2 END\n" - + " ;bar = y := 1 \n" + "END"; - Env env = new Env(machine); - System.out.println(env.result); - // assertEquals(3,env.variablesTable.get("foo").size()); - } - - @Test - public void testIF() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES 1 = 1 & 2 = 2 or 3 = 3 \n" + "END"; - Env env = new Env(machine); - System.out.println(env.result); - } - -} - -class Env { - String result; - - public Env(String machine) throws BException { - - BParser parser = new BParser("Test"); - Start start = parser.parse(machine, false); - final Ast2String ast2String2 = new Ast2String(); - start.apply(ast2String2); - System.out.println(ast2String2.toString()); - System.out.println(); - MachineContext c = new MachineContext(start); - Typechecker t = new Typechecker(c); - UnchangedVariablesFinder u = new UnchangedVariablesFinder(c); - PrecedenceCollector p = new PrecedenceCollector(start, t.getTypes()); - // TLAPrinter printer = new TLAPrinter(c, t, u, p); - // result = printer.getStringbuilder().toString(); TODO - } - -} diff --git a/src/test/java/standard/ScopeTest.java b/src/test/java/standard/ScopeTest.java deleted file mode 100644 index 4bf7bd1509ce6c613e6dd1996635cfd01ad278a2..0000000000000000000000000000000000000000 --- a/src/test/java/standard/ScopeTest.java +++ /dev/null @@ -1,229 +0,0 @@ -package standard; - -import org.junit.Ignore; -import org.junit.Test; - -import de.b2tla.analysis.Ast2String; -import de.b2tla.analysis.MachineContext; -import de.b2tla.exceptions.ScopeException; -import de.be4.classicalb.core.parser.BParser; -import de.be4.classicalb.core.parser.exceptions.BException; -import de.be4.classicalb.core.parser.node.Start; - -public class ScopeTest { - - @Test(expected = ScopeException.class) - public void testDuplicateConstant() throws BException { - String machine = "MACHINE test \n" + "CONSTANTS k, k \n" - + "PROPERTIES 1 = 1 \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testDuplicateSeenMachine() throws BException { - String machine = "MACHINE test \n" + "SEES M1, M1 \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testConstraintsMissingMachineParameter() throws BException { - String machine = "MACHINE test \n" + "CONSTRAINTS k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testConstraints() throws BException { - String machine = "MACHINE test(k) \n" + "CONSTRAINTS k = 1 \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testPropertiesUnknownIdentifier() throws BException { - String machine = "MACHINE test \n" + "PROPERTIES k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testPropertiesConstant() throws BException { - String machine = "MACHINE test \n" + "CONSTANTS k \n" - + "PROPERTIES k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testPropertiesDeferredSet() throws BException { - String machine = "MACHINE test \n" + "SETS k \n" - + "PROPERTIES k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testPropertiesEnumeratedSet() throws BException { - String machine = "MACHINE test \n" + "SETS k = {k1,k2} \n" - + "PROPERTIES k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testPropertiesElementOfEnumeratedSet() throws BException { - String machine = "MACHINE test \n" + "SETS k = {k1,k2} \n" - + "PROPERTIES k1 = 1 \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testInvariantUnknownIdentifier() throws BException { - String machine = "MACHINE test \n" + "INVARIANT k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testInvariantParameter() throws BException { - String machine = "MACHINE test(k) \n" + "CONSTRAINTS k = 1\n" - + "INVARIANT k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testInvariantConstatnParameter() throws BException { - String machine = "MACHINE test\n" + "CONSTANTS k \n" - + "PROPERTIES k = 1" + "INVARIANT k = 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testInvariantVariable() throws BException { - String machine = "MACHINE test\n" + "VARIABLES k \n" - + "INVARIANT k = 1 \n" + "INITIALISATION k := 1 \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testInitialisationUnknwonIdentifier() throws BException { - String machine = "MACHINE test\n" + "VARIABLES k \n" - + "INVARIANT k = 1 \n" + "INITIALISATION k := a \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testOperationsUnknwonIdentifier() throws BException { - String machine = "MACHINE test\n" + "OPERATIONS foo = a := 1" + "END"; - checkScope(machine); - } - - @Test - public void testSubstitution() throws BException { - String machine = "MACHINE test\n" + "VARIABLES x \n" - + "INVARIANT x = 1 \n" + "INITIALISATION x := 1 \n" + "END"; - checkScope(machine); - } - - @Ignore //TODO - @Test(expected = ScopeException.class) - public void testConstantSubstitution() throws BException { - String machine = "MACHINE test\n" + "CONSTANTS x \n" - + "PROPERTIES x = 1 \n" + "INITIALISATION x := 1 \n" + "END"; - checkScope(machine); - } - - @Test - public void testSubstitution2() throws BException { - String machine = "MACHINE test\n" + "CONSTANTS x \n" - + "PROPERTIES x = 1 \n" + "VARIABLES a \n" - + "INVARIANT a = 1 \n" + "INITIALISATION a := x \n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testUnkownOperation() throws BException { - String machine = "MACHINE test\n" + "INITIALISATION foo \n" + "END"; - checkScope(machine); - } - - @Test - public void testOperation() throws BException { - String machine = "MACHINE test\n" + "INITIALISATION foo \n" - + "OPERATIONS foo = skip \n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariableForAll() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES !x.(x : INT => x > 1) \n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariableExist() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES #x.(x : INT & x > 1) \n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariableLambda() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES %x.(x : INT | x + 1) = 1\n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariableUnion() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES UNION(x).(x : INT | x + 1) = 1\n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariableInter() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES INTER(x).(x : INT | x + 1) = 1\n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariablePi() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES PI(x).(x : INT | x + 1) = 1\n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalVariableSigma() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES SIGMA(x).(x : INT | x + 1) = 1\n" + "END"; - checkScope(machine); - } - - @Test - public void testLocalOperationParameter() throws BException { - String machine = "MACHINE test\n" - + "OPERATIONS foo(a) = PRE a = 1 THEN skip END\n" + "END"; - checkScope(machine); - } - - @Test - public void testNestedLocalExists() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES #x.(x : INT & #x.(x : INT & x = 1))\n" + "END"; - checkScope(machine); - } - - @Test(expected = ScopeException.class) - public void testDuplicateLocalVariable() throws BException { - String machine = "MACHINE test\n" - + "PROPERTIES #(x,x).(1 = 1 & x = x)\n" + "END"; - checkScope(machine); - } - - public void checkScope(String machine) throws BException { - BParser parser = new BParser("Test"); - Start start = parser.parse(machine, false); - final Ast2String ast2String2 = new Ast2String(); - start.apply(ast2String2); - - new MachineContext(start); - } - -}