/**
* Copyright (c) 2012 itemis AG and others.
* 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:
* itemis AG - initial API and implementation
*
*/
package org.yakindu.sct.model.stext.test;
import org.eclipse.xtext.junit4.InjectWith;
import org.eclipse.xtext.junit4.XtextRunner;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.yakindu.base.expressions.expressions.PrimitiveValueExpression;
import org.yakindu.sct.model.stext.stext.DefaultTrigger;
import org.yakindu.sct.model.stext.stext.EventDefinition;
import org.yakindu.sct.model.stext.stext.InterfaceScope;
import org.yakindu.sct.model.stext.stext.InternalScope;
import org.yakindu.sct.model.stext.stext.LocalReaction;
import org.yakindu.sct.model.stext.stext.OperationDefinition;
import org.yakindu.sct.model.stext.stext.ReactionEffect;
import org.yakindu.sct.model.stext.stext.ReactionTrigger;
import org.yakindu.sct.model.stext.stext.TransitionReaction;
import org.yakindu.sct.model.stext.stext.VariableDefinition;
import org.yakindu.sct.model.stext.test.util.AbstractSTextTest;
import org.yakindu.sct.model.stext.test.util.STextInjectorProvider;
/**
* @author andreas muelder - Initial contribution and API
*
*/
@RunWith(XtextRunner.class)
@InjectWith(STextInjectorProvider.class)
public class StextParserRuleTest extends AbstractSTextTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testBoolLiteral() {
String rule = PrimitiveValueExpression.class.getSimpleName();
parseExpression("true", rule);
parseExpression("false", rule);
parseExpression("yes", rule);
parseExpression("no", rule);
}
@Test
public void testIntLiteral() {
String rule = PrimitiveValueExpression.class.getSimpleName();
parseExpression("0", rule);
parseExpression("4", rule);
parseExpression("42", rule);
}
@Test
public void testHexLiteral() {
String rule = PrimitiveValueExpression.class.getSimpleName();
parseExpression("0xFFB5C5", rule);
parseExpression("0XFFB5C5", rule);
}
@Test
public void testRealLiteral() {
String rule = PrimitiveValueExpression.class.getSimpleName();
parseExpression("0.2f", rule);
parseExpression("0.2F", rule);
parseExpression("0.2d", rule);
parseExpression("0.2D", rule);
}
@Test
public void testStringLiteral() {
String rule = PrimitiveValueExpression.class.getSimpleName();
parseExpression("'Hello World'", rule);
parseExpression("\"Hello World\"", rule);
parseExpression("''", rule);
}
@Test
public void testNullLiteral() {
String rule = PrimitiveValueExpression.class.getSimpleName();
parseExpression("null", rule);
}
/**
* VariableDefinition: {VariableDefinition} 'var' ((readonly?='readonly')? &
* (external?='external')?) name=ID ':' type=[types::Type|FQN] ('='
* initialValue=Expression)?;
*/
@Test
public void testVariableDefinition() {
String rule = VariableDefinition.class.getSimpleName();
parseExpression("var MyVar : integer", rule);
parseExpression("var MyVar : integer = 97", rule);
parseExpression("var readonly MyVar : integer", rule);
parseExpression("var external MyVar : integer", rule);
parseExpression("var readonly external MyVar : integer", rule);
parseExpression("var external readonly MyVar : integer", rule);
parseExpression("var MyVar : integer = 3 * 3", rule);
parseExpression("var MyVar : string = null", rule);
}
/**
* EventDefinition: (direction=Direction)? 'event' name=ID (':'
* type=[types::Type|FQN])? (derivation=EventDerivation)?;
*/
@Test
public void testEventDefinition() {
String rule = EventDefinition.class.getSimpleName();
parseExpression("event event1", rule);
parseExpression("event event1 : integer", rule);
parseExpression("local event event1 : boolean", rule);
parseExpression("in event event1 : integer", rule);
parseExpression("out event event1 : integer", rule);
parseExpression("event event1 : integer", rule);
parseExpression("event event1 : string", rule);
}
/**
* OperationDefinition: {OperationDefinition} 'operation' name=ID '('
* (parameters+=Parameter (',' parameters+=Parameter)*)? ')' (':'
* type=[types::Type|FQN])?;
*/
@Test
public void testOperationDefinition() {
String rule = OperationDefinition.class.getSimpleName();
parseExpression("operation myOpp()", rule);
parseExpression("operation myOpp() : boolean", rule);
parseExpression("operation myOpp(param1: integer)", rule);
parseExpression("operation myOpp(param1 : boolean) : integer", rule);
parseExpression("operation myOpp(param1 : boolean, param2 : real) : integer", rule);
parseExpression("operation myOpp(param1 : real, param2 : real) : integer", rule);
}
/**
* {ReactionTrigger} ((triggers+=EventSpec ("," triggers+=EventSpec)* (=>
* '[' guardExpression=Expression ']')?) | ('[' guardExpression=Expression
* ']'));
*/
@Test
public void testReactionTrigger() {
String rule = ReactionTrigger.class.getSimpleName();
// Internal Scope
parseExpression("intEvent", rule, internalScope());
parseExpression("after 10 s", rule);
parseExpression("after 10 ms", rule);
parseExpression("after 10 us", rule);
parseExpression("after 10 ns", rule);
parseExpression("every 10 ns", rule);
parseExpression("entry", rule);
parseExpression("exit", rule);
parseExpression("oncycle", rule);
parseExpression("always", rule);
parseExpression("intEvent, after 10s", rule, internalScope());
parseExpression("intEvent, after 10s, every 10 ms", rule, internalScope());
parseExpression("intEvent, after 10s [false == true]", rule, internalScope());
parseExpression("intEvent, after 10s ['' != null]", rule, internalScope());
parseExpression("intEvent, after 10s [5 > 10]", rule, internalScope());
parseExpression("ABC.intEvent", rule, interfaceScope());
}
/**
* DefaultTrigger returns sgraph::Trigger: {DefaultTrigger} ('default' |
* 'else') ;
*/
@Test
public void testDefaultTrigger() {
String rule = DefaultTrigger.class.getSimpleName();
// Internal Scope
parseExpression("default", rule);
parseExpression("else", rule);
}
/**
* ReactionEffect returns sgraph::Effect: {ReactionEffect}
* actions+=(Expression | EventRaisingExpression) (=> ';'
* actions+=(Expression|EventRaisingExpression) )* ; // (';')?;
*/
@Test
public void testReactionEffect() {
String rule = ReactionEffect.class.getSimpleName();
parseExpression("raise intEvent", rule, internalScope());
parseExpression("intVar = 5", rule, internalScope());
parseExpression("voidOp()", rule, internalScope());
parseExpression("intVar = intOp()", rule, internalScope());
parseExpression("raise ABC.intEvent : 5", rule, interfaceScope());
parseExpression("ABC.paramOp()", rule, interfaceScope());
parseExpression("ABC.paramOp(5,false)", rule, interfaceScope());
parseExpression("ABC.paramOp(null)", rule, interfaceScope());
parseExpression("ABC.paramOp(); raise ABC.voidEvent ", rule, interfaceScope());
}
@Test
@Ignore("Disabled entry / exit points for release")
public void testReactionProperties() {
// String rule = ReactionProperties.class.getSimpleName();
// parseExpression("> ABC.EntryPoint", interfaceScope(), rule);
// parseExpression("ABC.ExitPoint >", interfaceScope(), rule);
}
/**
* LocalReaction: (trigger=ReactionTrigger) =>('/' effect=ReactionEffect)
* ('#' properties=ReactionProperties)?;
*/
@Test
public void tesLocalReaction() {
String rule = LocalReaction.class.getSimpleName();
parseExpression("entry [ABC.intVar > 10] / raise ABC.intEvent", rule, interfaceScope());
}
/**
* TransitionReaction: {TransitionReaction} (trigger=ReactionTrigger)? ('/'
* effect=ReactionEffect)? ('#' properties=ReactionProperties)?;
*/
@Test
public void testTransitionReaction() {
String rule = TransitionReaction.class.getSimpleName();
parseExpression("after 10 s / raise ABC.intEvent", rule, interfaceScope());
}
/**
* {InterfaceScope} 'interface' (name=ID)? ':'
* (declarations+=(EventDeclarartion | VariableDeclaration |
* OperationDeclaration | Entrypoint | Exitpoint))*;
*/
@Test
public void testInterfaceScope() {
String rule = InterfaceScope.class.getSimpleName();
parseExpression("interface :", rule);
parseExpression("interface ABC:", rule);
parseExpression("interface : in event Event1", rule);
parseExpression("interface ABC : var myVar : integer", rule);
parseExpression("interface : operation myOpp()", rule);
}
/**
* InternalScope : {InternalScope} 'internal' ':'
* (declarations+=(EventDeclarartion | VariableDeclaration |
* OperationDeclaration | LocalReaction))*;
*/
@Test
public void testInternalScope() {
String rule = InternalScope.class.getSimpleName();
parseExpression("internal :", rule);
parseExpression("internal : event voidEvent", rule);
parseExpression("internal : var intVar : integer", rule);
parseExpression("internal : operation voidOp()", rule);
parseExpression("internal : every 10 ms / raise intEvent", rule, internalScope());
}
/**
* StateScope returns sgraph::Scope: {SimpleScope}
* (declarations+=(LocalReaction | Entrypoint | Exitpoint))*;
*/
@Test
public void testStateScope() {
}
}