/*
* Copyright (C) 2014-2017 the original authors or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.sarl.lang.tests.general.parsing.aop;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import com.google.common.base.Strings;
import org.eclipse.xtext.common.types.JvmTypeConstraint;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.xbase.XNumberLiteral;
import org.eclipse.xtext.xbase.XStringLiteral;
import org.eclipse.xtext.xbase.XbasePackage;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import io.sarl.lang.sarl.SarlAction;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlConstructor;
import io.sarl.lang.sarl.SarlField;
import io.sarl.lang.sarl.SarlPackage;
import io.sarl.lang.sarl.SarlScript;
import io.sarl.lang.validation.IssueCodes;
import io.sarl.tests.api.AbstractSarlTest;
/**
* @author $Author: sgalland$
* @version $Name$ $Revision$ $Date$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@RunWith(Suite.class)
@SuiteClasses({
BehaviorParsingTest.TopElementTest.class,
BehaviorParsingTest.ActionTest.class,
BehaviorParsingTest.FieldTest.class,
BehaviorParsingTest.ConstructorTest.class,
BehaviorParsingTest.CapacityUsesTest.class,
BehaviorParsingTest.GenericTest.class,
})
@SuppressWarnings("all")
public class BehaviorParsingTest {
public static class TopElementTest extends AbstractSarlTest {
@Test
public void invalidExtend_0() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {",
"}",
"behavior B1 extends C1 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.CLASS_EXPECTED,
"Invalid supertype. Expecting a class");
}
@Test
public void invalidExtend_1() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"}",
"behavior B3 extends A1 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
IssueCodes.INVALID_EXTENDED_TYPE,
"Supertype must be of type 'io.sarl.lang.core.Behavior'");
}
@Test
public void invalidExtend_2() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 extends B1 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.CYCLIC_INHERITANCE,
"The inheritance hierarchy of 'B1' is inconsistent");
}
@Test
public void invalidExtend_3() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 extends B2 {",
"}",
"behavior B2 extends B1 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
IssueCodes.INVALID_EXTENDED_TYPE,
"Supertype must be of type 'io.sarl.lang.core.Behavior'");
}
@Test
public void invalidExtend_4() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 extends B2 {",
"}",
"behavior B2 extends B1 {",
"}",
"behavior B3 extends B2 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
IssueCodes.INVALID_EXTENDED_TYPE,
"Supertype must be of type 'io.sarl.lang.core.Behavior'");
}
@Test
public void invalidExtend_5() throws Exception {
SarlScript mas = file(multilineString(
"behavior B3 extends B2 {",
"}",
"behavior B2 extends B1 {",
"}",
"behavior B1 extends B2 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
IssueCodes.INVALID_EXTENDED_TYPE,
"Supertype must be of type 'io.sarl.lang.core.Behavior'");
}
@Test
public void duplicateTypeNames() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.test",
"behavior B1 {",
"}",
"behavior B2 {",
"}",
"behavior B1 {",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.DUPLICATE_TYPE_NAME,
"The type B1 is already defined");
}
@Test
public void behaviormodifier_public() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"public behavior B1 {}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.PUBLIC, beh.getVisibility());
assertEquals(0, beh.getMembers().size());
assertFalse(beh.isAbstract());
assertFalse(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void behaviormodifier_none() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.PUBLIC, beh.getVisibility());
assertEquals(0, beh.getMembers().size());
assertFalse(beh.isAbstract());
assertFalse(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void behaviormodifier_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"private behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_protected() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"protected behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_package() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"package behavior B1 {}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.DEFAULT, beh.getVisibility());
assertEquals(0, beh.getMembers().size());
assertFalse(beh.isAbstract());
assertFalse(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void behaviormodifier_abstract() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.PUBLIC, beh.getVisibility());
assertEquals(0, beh.getMembers().size());
assertTrue(beh.isAbstract());
assertFalse(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void behaviormodifier_static() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"static behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_dispatch() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"dispatch behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_final() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"final behavior B1 {}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.PUBLIC, beh.getVisibility());
assertEquals(0, beh.getMembers().size());
assertFalse(beh.isAbstract());
assertTrue(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void behaviormodifier_strictfp() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"strictfp behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_native() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"native behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_volatile() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"volatile behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_synchronized() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"synchronized behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_transient() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"transient behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void behaviormodifier_abstract_final() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract final behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER,
"The definition of B1 can either be abstract or final, not both");
}
@Test
public void modifier_abstract_action_error_0() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def name",
"}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT);
}
@Test
public void modifier_abstract_action_error_1() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" abstract def name",
"}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT);
}
@Test
public void modifier_abstract_action_warning() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {",
" def name",
"}"
), true);
validate(mas).assertWarning(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT);
//
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.PUBLIC, beh.getVisibility());
assertEquals(1, beh.getMembers().size());
assertTrue(beh.isAbstract());
assertFalse(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void modifier_abstract_action() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {",
" abstract def name",
"}"
), true);
validate(mas).assertNoIssues();
//
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(JvmVisibility.PUBLIC, beh.getVisibility());
assertEquals(1, beh.getMembers().size());
assertTrue(beh.isAbstract());
assertFalse(beh.isFinal());
assertFalse(beh.isStrictFloatingPoint());
}
@Test
public void behaviormodifier_public_package() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"public package behavior B1 {}"
), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlBehavior(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER,
"The definition of B1 can only set one of public / package / protected / private");
}
}
public static class ActionTest extends AbstractSarlTest {
@Test
public void modifier_override_notRecommended() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {",
" abstract def name",
"}",
"behavior B2 extends B1 {",
" def name { }",
"}"), false);
validate(mas).assertNoWarnings(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.MISSING_OVERRIDE);
}
@Test
public void modifier_override_invalid() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
"}",
"behavior B2 extends B1 {",
" override name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.OBSOLETE_OVERRIDE,
"The method name() of type B2 must override a superclass method");
}
@Test
public void modifier_override_valid() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {",
" abstract def name",
"}",
"behavior B2 extends B1 {",
" override name { }",
"}"), false);
validate(mas).assertNoIssues();
}
@Test
public void multipleActionDefinition() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int, b : int) { }",
" def myaction(a : int) { }",
" def myaction(a : int) { }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.DUPLICATE_METHOD,
"Duplicate method myaction(int) in type B1");
}
@Test
public void invalidActionName() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction {",
" System.out.println(\"ok\")",
" }",
" def $handle_myaction {",
" System.out.println(\"ko\")",
" }",
" def myaction2 {",
" System.out.println(\"ok\")",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MEMBER_NAME,
"Invalid action name '$handle_myaction'.");
}
@Test
public void incompatibleReturnType_0() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int) : int {",
" return 0",
" }",
"}",
"behavior B2 extends B1 {",
" def myaction(a : int) : float {",
" return 0f",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtext.xbase.validation.IssueCodes.INCOMPATIBLE_RETURN_TYPE);
}
@Test
public void incompatibleReturnType_1() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int) {",
" // void",
" }",
"}",
"behavior B2 extends B1 {",
" def myaction(a : int) : int {",
" return 0",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtext.xbase.validation.IssueCodes.INCOMPATIBLE_RETURN_TYPE);
}
@Test
public void incompatibleReturnType_2() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int) : int {",
" return 0",
" }",
"}",
"behavior B2 extends B1 {",
" def myaction(a : int) : void {",
" // void",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtext.xbase.validation.IssueCodes.INCOMPATIBLE_RETURN_TYPE);
}
@Test
public void incompatibleReturnType_3() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int) : int {",
" return 0",
" }",
"}",
"behavior B2 extends B1 {",
" def myaction(a : int) {",
" // int return type is inferred",
" }",
"}"
));
validate(mas).assertError(
XbasePackage.eINSTANCE.getXBlockExpression(),
org.eclipse.xtext.xbase.validation.IssueCodes.INCOMPATIBLE_TYPES,
"Type mismatch: cannot convert from null to int");
}
@Test
public void compatibleReturnType_0() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int) : Number {",
" return 0.0",
" }",
"}",
"behavior B2 extends B1 {",
" def myaction(a : int) : Double {",
" return 0.0",
" }",
"}"
), true);
assertEquals(2, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior1 = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior1.getName());
assertNull(behavior1.getExtends());
assertEquals(1, behavior1.getMembers().size());
//
SarlAction action1 = (SarlAction) behavior1.getMembers().get(0);
assertEquals("myaction", action1.getName());
assertTrue(action1.getFiredEvents().isEmpty());
assertTypeReferenceIdentifier(action1.getReturnType(), "java.lang.Number");
assertParameterNames(action1.getParameters(), "a");
assertParameterTypes(action1.getParameters(), "int");
assertParameterDefaultValues(action1.getParameters(), (Object) null);
//
SarlBehavior behavior2= (SarlBehavior) mas.getXtendTypes().get(1);
assertEquals("B2", behavior2.getName());
assertTypeReferenceIdentifier(behavior2.getExtends(), "B1");
assertEquals(1, behavior2.getMembers().size());
//
SarlAction action2 = (SarlAction) behavior2.getMembers().get(0);
assertEquals("myaction", action2.getName());
assertTrue(action2.getFiredEvents().isEmpty());
assertTypeReferenceIdentifier(action2.getReturnType(), "java.lang.Double");
assertParameterNames(action2.getParameters(), "a");
assertParameterTypes(action2.getParameters(), "int");
assertParameterDefaultValues(action2.getParameters(), (Object) null);
}
@Test
public void compatibleReturnType_1() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int) : float {",
" return 0f",
" }",
"}",
"behavior B2 extends B1 {",
" def myaction(a : int) : float {",
" return 0f",
" }",
"}"
), true);
assertEquals(2, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior1 = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior1.getName());
assertNull(behavior1.getExtends());
assertEquals(1, behavior1.getMembers().size());
//
SarlAction action1 = (SarlAction) behavior1.getMembers().get(0);
assertEquals("myaction", action1.getName());
assertTrue(action1.getFiredEvents().isEmpty());
assertTypeReferenceIdentifier(action1.getReturnType(), "float");
assertParameterNames(action1.getParameters(), "a");
assertParameterTypes(action1.getParameters(), "int");
assertParameterDefaultValues(action1.getParameters(), (Object) null);
//
SarlBehavior behavior2= (SarlBehavior) mas.getXtendTypes().get(1);
assertEquals("B2", behavior2.getName());
assertTypeReferenceIdentifier(behavior2.getExtends(), "B1");
assertEquals(1, behavior2.getMembers().size());
//
SarlAction action2 = (SarlAction) behavior2.getMembers().get(0);
assertEquals("myaction", action2.getName());
assertTrue(action2.getFiredEvents().isEmpty());
assertTypeReferenceIdentifier(action2.getReturnType(), "float");
assertParameterNames(action2.getParameters(), "a");
assertParameterTypes(action2.getParameters(), "int");
assertParameterDefaultValues(action2.getParameters(), (Object) null);
}
@Test
public void multipleParameterNames() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(a : int, b : int, c : int, b : int) {",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
org.eclipse.xtext.xbase.validation.IssueCodes.VARIABLE_NAME_SHADOWING,
"Duplicate local variable b");
}
@Test
public void modifier_public() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" public def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" private def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PRIVATE, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_protected() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" protected def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PROTECTED, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_package() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" package def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.DEFAULT, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_none() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_abstract() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {",
" abstract def name",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertTrue(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_no_abstract() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"abstract behavior B1 {",
" def name",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertTrue(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_static() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" static def name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_dispatch() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" dispatch def name { }",
"}"), false);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertTrue(act1.isDispatch());
assertFalse(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_final_var() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" final def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertTrue(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_strictfp() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" strictfp def name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_native() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" native def name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_volatile() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" volatile def name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_synchronized() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" synchronized def name { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertFalse(act1.isDispatch());
assertFalse(act1.isFinal());
assertTrue(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
@Test
public void modifier_transient() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" transient def name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_protected_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" protected private def name { }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER,
"public / package / protected / private");
}
@Test
public void modifier_dispatch_final() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" dispatch final def name(a : Integer) { }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlAction act1 = (SarlAction) beh.getMembers().get(0);
assertEquals("name", act1.getName());
assertEquals(JvmVisibility.PUBLIC, act1.getVisibility());
assertFalse(act1.isAbstract());
assertFalse(act1.isStatic());
assertTrue(act1.isDispatch());
assertTrue(act1.isFinal());
assertFalse(act1.isSynchonized());
assertFalse(act1.isStrictFloatingPoint());
}
}
public static class FieldTest extends AbstractSarlTest {
@Test
public void multipleVariableDefinition() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" var myfield : int",
" var myfield1 : String",
" var myfield : double",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.DUPLICATE_FIELD,
"Duplicate field myfield");
}
@Test
public void multipleValueDefinition() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val myfield : int = 4",
" val myfield1 : String = \"\"",
" val myfield : double = 5",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.DUPLICATE_FIELD,
"Duplicate field myfield");
}
@Test
public void invalidAttributeName_0() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" var myfield1 = 4.5",
" var $FORMAL_PARAMETER_DEFAULT_VALUE_MYFIELD = \"String\"",
" var myfield2 = true",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtext.xbase.validation.IssueCodes.VARIABLE_NAME_DISALLOWED,
"Invalid attribute name '$FORMAL_PARAMETER_DEFAULT_VALUE_MYFIELD'");
}
@Test
public void invalidAttributeName_1() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val myfield1 = 4.5",
" val $FORMAL_PARAMETER_DEFAULT_VALUE_MYFIELD = \"String\"",
" val myfield2 = true",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtext.xbase.validation.IssueCodes.VARIABLE_NAME_DISALLOWED,
"Invalid attribute name '$FORMAL_PARAMETER_DEFAULT_VALUE_MYFIELD'");
}
@Test
public void invalidAttributeName_2() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val myfield1 = 4.5",
" val this = \"String\"",
" val myfield2 = true",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtext.xbase.validation.IssueCodes.INVALID_IDENTIFIER,
"'this' is not a valid identifier");
}
@Test
public void invalidAttributeName_3() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val myfield1 = 4.5",
" val const = \"String\"",
" val myfield2 = true",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtext.xbase.validation.IssueCodes.INVALID_IDENTIFIER,
"'const' is not a valid identifier.");
}
@Test
public void invalidAttributeName_4() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val myfield1 = 4.5",
" val self = \"String\"",
" val myfield2 = true",
"}"
));
validate(mas).assertWarning(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtext.xbase.validation.IssueCodes.VARIABLE_NAME_DISCOURAGED,
"'self' is a discouraged name");
}
@Test
public void missedFinalFieldInitialization() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val field1 : int = 5",
" val field2 : String",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.FIELD_NOT_INITIALIZED,
"The blank final field field2 may not have been initialized");
}
@Test
public void completeFinalFieldInitialization() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" val field1 : int = 5",
" val field2 : String = \"\"",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(2, behavior.getMembers().size());
//
SarlField attr1 = (SarlField) behavior.getMembers().get(0);
assertEquals("field1", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "int");
assertXExpression(attr1.getInitialValue(), XNumberLiteral.class, "5");
//
SarlField attr2 = (SarlField) behavior.getMembers().get(1);
assertEquals("field2", attr2.getName());
assertTypeReferenceIdentifier(attr2.getType(), "java.lang.String");
assertXExpression(attr2.getInitialValue(), XStringLiteral.class, "");
}
@Test
public void fieldNameShadowing() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" protected val field1 : int = 5",
" def myaction(a : int) { }",
"}",
"behavior B2 extends B1 {",
" val field1 : int = 5",
" def myaction(a : int) { }",
"}"
));
validate(mas).assertWarning(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtext.xbase.validation.IssueCodes.VARIABLE_NAME_SHADOWING,
"The field 'field1' in 'B2' is hidding the inherited field 'B1.field1'.");
}
@Test
public void modifier_public() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" public var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" private var field : int",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlField attr1 = (SarlField) beh.getMembers().get(0);
assertEquals("field", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "int");
assertNull(attr1.getInitialValue());
assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility());
assertFalse(attr1.isExtension());
assertFalse(attr1.isFinal());
assertFalse(attr1.isStatic());
assertFalse(attr1.isTransient());
assertFalse(attr1.isVolatile());
}
@Test
public void modifier_protected() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" protected var field : int",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlField attr1 = (SarlField) beh.getMembers().get(0);
assertEquals("field", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "int");
assertNull(attr1.getInitialValue());
assertEquals(JvmVisibility.PROTECTED, attr1.getVisibility());
assertFalse(attr1.isExtension());
assertFalse(attr1.isFinal());
assertFalse(attr1.isStatic());
assertFalse(attr1.isTransient());
assertFalse(attr1.isVolatile());
}
@Test
public void modifier_package() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" package var field : int",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlField attr1 = (SarlField) beh.getMembers().get(0);
assertEquals("field", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "int");
assertNull(attr1.getInitialValue());
assertEquals(JvmVisibility.DEFAULT, attr1.getVisibility());
assertFalse(attr1.isExtension());
assertFalse(attr1.isFinal());
assertFalse(attr1.isStatic());
assertFalse(attr1.isTransient());
assertFalse(attr1.isVolatile());
}
@Test
public void modifier_none() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" var field : int",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlField attr1 = (SarlField) beh.getMembers().get(0);
assertEquals("field", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "int");
assertNull(attr1.getInitialValue());
assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility());
assertFalse(attr1.isExtension());
assertFalse(attr1.isFinal());
assertFalse(attr1.isStatic());
assertFalse(attr1.isTransient());
assertFalse(attr1.isVolatile());
}
@Test
public void modifier_abstract() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" abstract var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_static() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" static var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_dispatch() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" dispatch var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_final_var() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" final var field : int = 5",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER,
"var or val / final, not both");
}
@Test
public void modifier_strictfp() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" strictfp var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_native() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" native var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_volatile() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" volatile var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_synchronized() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" synchronized var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_transient() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" transient var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_protected_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" protected private var field : int",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlField(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER,
"public / package / protected / private");
}
}
public static class ConstructorTest extends AbstractSarlTest {
@Test
public void validImplicitSuperConstructor() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.test",
"behavior B1 {",
"}",
"behavior B2 extends B1 {",
" new (a : int) {",
" super(null)",
" }",
"}"
), true);
assertEquals(2, mas.getXtendTypes().size());
//
assertEquals("io.sarl.test", mas.getPackage());
//
SarlBehavior behavior1 = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior1.getName());
assertNull(behavior1.getExtends());
assertEquals(0, behavior1.getMembers().size());
//
SarlBehavior behavior2 = (SarlBehavior) mas.getXtendTypes().get(1);
assertEquals("B2", behavior2.getName());
assertTypeReferenceIdentifier(behavior2.getExtends(), "io.sarl.test.B1");
assertEquals(1, behavior2.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) behavior2.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "a");
assertParameterTypes(constructor.getParameters(), "int");
assertParameterDefaultValues(constructor.getParameters(), (Object) null);
}
@Test
public void missedImplicitSuperConstructor_1() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.test",
"behavior B1 {",
"}",
"behavior B2 extends B1 {",
" new (a : int) {",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.MUST_INVOKE_SUPER_CONSTRUCTOR,
"Undefined default constructor in the super-type");
}
@Test
public void missedImplicitSuperConstructor_2() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.test",
"behavior B1 {",
" new (a : int) {",
" super(null)",
" }",
"}",
"behavior B2 extends B1 {",
" new (a : int) {",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.MUST_INVOKE_SUPER_CONSTRUCTOR,
"Undefined default constructor in the super-type");
}
@Test
public void notMissedImplicitSuperConstructor() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.test",
"behavior B1 {",
" new (a : int) {",
" super(null)",
" }",
"}",
"behavior B2 extends B1 {",
"}"
));
validate(mas).assertNoErrors();
}
@Test
public void invalidArgumentTypeToSuperConstructor() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.test",
"behavior B1 {",
" new (a : int) {",
" super(null)",
" }",
"}",
"behavior B2 extends B1 {",
" new (a : int) {",
" super(\"\")",
" }",
"}"
));
validate(mas).assertError(
XbasePackage.eINSTANCE.getXStringLiteral(),
org.eclipse.xtext.xbase.validation.IssueCodes.INCOMPATIBLE_TYPES,
"Type mismatch: cannot convert from String to int");
}
@Test
public void modifier_public() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" public new { super(null) }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlConstructor cons = (SarlConstructor) beh.getMembers().get(0);
assertEquals(JvmVisibility.PUBLIC, cons.getVisibility());
assertFalse(cons.isStatic());
assertFalse(cons.isFinal());
}
@Test
public void modifier_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" private new { super(null) }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlConstructor cons = (SarlConstructor) beh.getMembers().get(0);
assertEquals(JvmVisibility.PRIVATE, cons.getVisibility());
assertFalse(cons.isStatic());
assertFalse(cons.isFinal());
}
@Test
public void modifier_protected() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" protected new { super(null) }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlConstructor cons = (SarlConstructor) beh.getMembers().get(0);
assertEquals(JvmVisibility.PROTECTED, cons.getVisibility());
assertFalse(cons.isStatic());
assertFalse(cons.isFinal());
}
@Test
public void modifier_package() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" package new { super(null) }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlConstructor cons = (SarlConstructor) beh.getMembers().get(0);
assertEquals(JvmVisibility.DEFAULT, cons.getVisibility());
assertFalse(cons.isStatic());
assertFalse(cons.isFinal());
}
@Test
public void modifier_none() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" new { super(null) }",
"}"), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
//
//
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", beh.getName());
assertNull(beh.getExtends());
assertEquals(1, beh.getMembers().size());
//
SarlConstructor cons = (SarlConstructor) beh.getMembers().get(0);
assertEquals(JvmVisibility.PUBLIC, cons.getVisibility());
assertFalse(cons.isStatic());
assertFalse(cons.isFinal());
}
@Test
public void modifier_abstract() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" abstract new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_static() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" static new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_dispatch() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" dispatch new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_final() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" final new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_strictfp() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" strictfp new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_native() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" native new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_volatile() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" volatile new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_synchronized() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" synchronized new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_transient() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" transient new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER);
}
@Test
public void modifier_protected_private() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" protected private new { super(null) }",
"}"), false);
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlConstructor(),
org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER,
"public / package / protected / private");
}
}
public static class CapacityUsesTest extends AbstractSarlTest {
@Test
public void multipleCapacityUses_0() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"capacity C2 {}",
"behavior B1 {",
" uses C1, C2, C1",
" def testFct { }",
"}"
));
validate(mas).assertWarning(
SarlPackage.eINSTANCE.getSarlCapacityUses(),
IssueCodes.REDUNDANT_CAPACITY_USE,
"Redundant use of the capacity 'C1'");
}
@Test
public void multipleCapacityUses_1() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"capacity C2 {}",
"behavior B1 {",
" uses C2",
" def testFct { }",
" uses C2, C1",
"}"
));
validate(mas).assertWarning(
SarlPackage.eINSTANCE.getSarlCapacityUses(),
IssueCodes.REDUNDANT_CAPACITY_USE,
"Redundant use of the capacity 'C2'");
}
}
public static class GenericTest extends AbstractSarlTest {
@Test
public void functionGeneric_X_sarlNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def setX(param : X) : void with X { var xxx : X }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(1, action.getTypeParameters().size());
//
JvmTypeParameter parameter = action.getTypeParameters().get(0);
assertEquals("X", parameter.getName());
assertNullOrEmpty(parameter.getConstraints());
}
@Test
public void functionGeneric_X_javaNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def <X> setX(param : X) : void { var xxx : X }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(1, action.getTypeParameters().size());
//
JvmTypeParameter parameter = action.getTypeParameters().get(0);
assertEquals("X", parameter.getName());
assertNullOrEmpty(parameter.getConstraints());
}
@Test
public void functionGeneric_XextendsNumber_sarlNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def setX(param : X) : void with X extends Number { var xxx : X }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(1, action.getTypeParameters().size());
//
JvmTypeParameter parameter = action.getTypeParameters().get(0);
assertEquals("X", parameter.getName());
assertEquals(1, parameter.getConstraints().size());
//
JvmTypeConstraint constraint = parameter.getConstraints().get(0);
assertEquals("java.lang.Number", constraint.getTypeReference().getIdentifier());
assertTrue(constraint.getIdentifier().startsWith("extends"));
}
@Test
public void functionGeneric_XextendsNumber_javaNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def <X extends Number> setX(param : X) : void { var xxx : X }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(1, action.getTypeParameters().size());
//
JvmTypeParameter parameter = action.getTypeParameters().get(0);
assertEquals("X", parameter.getName());
assertEquals(1, parameter.getConstraints().size());
//
JvmTypeConstraint constraint = parameter.getConstraints().get(0);
assertEquals("java.lang.Number", constraint.getTypeReference().getIdentifier());
assertTrue(constraint.getIdentifier().startsWith("extends"));
}
@Test
public void functionGeneric_XY_sarlNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def setX(param : X) : void with X, Y { var xxx : X; var yyy : Y }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(2, action.getTypeParameters().size());
//
JvmTypeParameter parameter1 = action.getTypeParameters().get(0);
assertEquals("X", parameter1.getName());
assertNullOrEmpty(parameter1.getConstraints());
//
JvmTypeParameter parameter2 = action.getTypeParameters().get(1);
assertEquals("Y", parameter2.getName());
assertNullOrEmpty(parameter2.getConstraints());
}
@Test
public void functionGeneric_XY_javaNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def <X, Y> setX(param : X) : void { var xxx : X; var yyy : Y }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(2, action.getTypeParameters().size());
//
JvmTypeParameter parameter1 = action.getTypeParameters().get(0);
assertEquals("X", parameter1.getName());
assertNullOrEmpty(parameter1.getConstraints());
//
JvmTypeParameter parameter2 = action.getTypeParameters().get(1);
assertEquals("Y", parameter2.getName());
assertNullOrEmpty(parameter2.getConstraints());
}
@Test
public void functionGeneric_XYextendsX_sarlNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def setX(param : X) : void with X, Y extends X { var xxx : X; var yyy : Y }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(2, action.getTypeParameters().size());
//
JvmTypeParameter parameter1 = action.getTypeParameters().get(0);
assertEquals("X", parameter1.getName());
assertNullOrEmpty(parameter1.getConstraints());
//
JvmTypeParameter parameter2 = action.getTypeParameters().get(1);
assertEquals("Y", parameter2.getName());
assertEquals(1, parameter2.getConstraints().size());
//
JvmTypeConstraint constraint = parameter2.getConstraints().get(0);
assertEquals("X", constraint.getTypeReference().getIdentifier());
assertTrue(constraint.getIdentifier().startsWith("extends"));
}
@Test
public void functionGeneric_XYextendsX_javaNotation() throws Exception {
SarlScript mas = file(multilineString(
"package io.sarl.lang.tests.test",
"behavior B1 {",
" def <X, Y extends X> setX(param : X) : void { var xxx : X; var yyy : Y }",
"}"), true);
assertEquals("io.sarl.lang.tests.test", mas.getPackage());
SarlBehavior beh = (SarlBehavior) mas.getXtendTypes().get(0);
assertNotNull(beh);
//
assertEquals("B1", beh.getName());
assertEquals(1, beh.getMembers().size());
//
SarlAction action = (SarlAction) beh.getMembers().get(0);
assertEquals("setX", action.getName());
assertEquals(2, action.getTypeParameters().size());
//
JvmTypeParameter parameter1 = action.getTypeParameters().get(0);
assertEquals("X", parameter1.getName());
assertNullOrEmpty(parameter1.getConstraints());
//
JvmTypeParameter parameter2 = action.getTypeParameters().get(1);
assertEquals("Y", parameter2.getName());
assertEquals(1, parameter2.getConstraints().size());
//
JvmTypeConstraint constraint = parameter2.getConstraints().get(0);
assertEquals("X", constraint.getTypeReference().getIdentifier());
assertTrue(constraint.getIdentifier().startsWith("extends"));
}
}
}