added validation and document update
[des2015.git] / dsl / xtend / src / robots / missions / validation / TaskDSLValidator.xtend
index f3926b5..e9f20fb 100644 (file)
@@ -3,6 +3,14 @@
  */
 package robots.missions.validation
 
+import java.util.LinkedList
+import java.util.List
+import org.eclipse.xtext.validation.Check
+import robots.missions.taskDSL.Action
+import robots.missions.taskDSL.Behaviour
+import robots.missions.taskDSL.Mission
+import robots.missions.taskDSL.Robot
+
 //import org.eclipse.xtext.validation.Check
 /**
  * This class contains custom validation rules. 
@@ -10,23 +18,44 @@ package robots.missions.validation
  * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
  */
 class TaskDSLValidator extends AbstractTaskDSLValidator {
-//     @Check
-//     def checkOnlyOneBehaviourPerMissionEmptyTakeControl(Mission m) {
-//             var List<String> empty = new LinkedList<String>();
-//             var List<String> all = new LinkedList<String>();
-//             for(Behaviour b : m.behaviours){
-//                     if(b.tc == null){
-//                             empty.add(b.name);
-//                     }
-//                     all.add(b.name);
-//             }
-//             if(empty.size > 1){
-//                             warning("Multiple behaviours without takeControl predicate. You might want to remove some of: " + empty.toString(), m.eContainingFeature);
-//             }
-//             if(all.toSet().size() < all.size()){
-//                     warning("You have duplicate behaviours.", m, TaskDSLPackage.Literals::MISSION__BEHAVIOURS);
-//             }
-//     }
+       @Check
+       def checkRobot(Robot r){
+               if(r.acc == 0){
+                       warning("Acceleration set to zero, this could lead to non moving robot", null);
+               }
+               if(r.spd == 0){
+                       warning("Acceleration set to zero, this could lead to non moving robot", null);
+               }
+       }
+       
+       @Check
+       def checkBehavioursl(Mission m) {
+               var List<String> empty = new LinkedList<String>();
+               var List<String> all = new LinkedList<String>();
+               var List<String> warned = new LinkedList<String>();
+               for(Behaviour b : m.behaviours){
+                       if(b.tc == null){
+                               empty.add(b.name);
+                       }
+                       if(all.contains(b.name) && !warned.contains(b.name)){
+                               warning("Behaviour '" + b.name + "' multiple times in the behaviourlist.", null);
+                               warned.add(b.name);
+                       }
+                       all.add(b.name);
+               }
+               if(empty.size() > 1){
+                               warning("Multiple behaviours without takeControl predicate. You might want to remove some of: " + empty.toString(), null);
+               }
+       }
 
-//Validate if the random degrees are correct
+       @Check
+       def checkActions(Action a) {
+               if(a.turnType != null && a.turnType.turnDir == null){
+                       if(a.turnType.start == a.turnType.end){
+                               error("Start and end cannot be the same", null);
+                       } else if(a.turnType.start > a.turnType.end){
+                               error("Start should be smaller then end", null);
+                       }
+               }
+       }
 }