/* * 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 static org.junit.Assert.fail; import java.util.Iterator; import java.util.List; import com.google.common.base.Objects; import com.google.common.base.Strings; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; 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.common.types.TypesPackage; import org.eclipse.xtext.diagnostics.Severity; import org.eclipse.xtext.validation.Issue; 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.SarlAgent; import io.sarl.lang.sarl.SarlCapacity; import io.sarl.lang.sarl.SarlCapacityUses; import io.sarl.lang.sarl.SarlField; import io.sarl.lang.sarl.SarlPackage; import io.sarl.lang.sarl.SarlScript; import io.sarl.lang.sarl.SarlSkill; import io.sarl.lang.validation.IssueCodes; import io.sarl.tests.api.AbstractSarlTest; /** * @author $Author: srodriguez$ * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ @RunWith(Suite.class) @SuiteClasses({ SkillParsingTest.TopElementTest.class, SkillParsingTest.ActionTest.class, SkillParsingTest.FieldTest.class, SkillParsingTest.CapacityUsesTest.class, SkillParsingTest.GenericTest.class, }) @SuppressWarnings("all") public class SkillParsingTest { /** * FIXME: Issue #260. Move to Xbase. */ public static StringBuilder getIssuesAsString(EObject model, Iterable<Issue> issues, StringBuilder result) { for(Issue issue : issues) { URI uri = issue.getUriToProblem(); result.append(issue.getSeverity()); result.append(" ("); result.append(issue.getCode()); result.append(") '"); result.append(issue.getMessage()); result.append("'"); if (uri != null) { EObject eObject = model.eResource().getResourceSet().getEObject(uri, true); result.append(" on "); result.append(eObject.eClass().getName()); } result.append("\n"); } return result; } /** * FIXME: Issue #260. Move to Xbase. */ public static boolean isIssueMessage(Issue issue, String... messageParts) { for (String messagePart : messageParts) { if (!issue.getMessage().toLowerCase().contains(messagePart.toLowerCase())) { return false; } } return true; } /** * FIXME: Issue #260. Move to Xbase. */ public static void assertIssue(List<Issue> issues, Severity severity, EObject model, EClass objectType, String code, String... messageParts) { Iterator<Issue> iterator = issues.iterator(); while (iterator.hasNext()) { Issue issue = iterator.next(); if (Objects.equal(issue.getCode(), code) && issue.getSeverity() == severity) { EObject object = model.eResource().getResourceSet().getEObject(issue.getUriToProblem(), true); if (objectType.isInstance(object)) { if (isIssueMessage(issue, messageParts)) { iterator.remove(); return; } } } } StringBuilder message = new StringBuilder("Expected "); message.append(severity); message.append(" '"); message.append(code); message.append("' on "); message.append(objectType.getName()); message.append(" but got\n"); getIssuesAsString(model, issues, message); fail(message.toString()); } /** * FIXME: Issue #260. Move to Xbase. */ public static void assertWarning(List<Issue> issues, EObject model, EClass objectType, String code, String... messageParts) { assertIssue(issues, Severity.WARNING, model, objectType, code, messageParts); } /** * FIXME: Issue #260. Move to Xbase. */ public static void assertNoMoreIssues(List<Issue> issues, EObject model) { if (!issues.isEmpty()) { StringBuilder message = new StringBuilder("Expecting no issue but got\n"); getIssuesAsString(model, issues, message); fail(message.toString()); } } public static class TopElementTest extends AbstractSarlTest { @Test public void capacityDirectImplementation() throws Exception { SarlScript mas = file(multilineString( "import io.sarl.lang.core.Capacity", "skill S1 implements Capacity {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.INVALID_IMPLEMENTED_TYPE, "Invalid implemented type: 'io.sarl.lang.core.Capacity'. Only subtypes of 'io.sarl.lang.core.Capacity' are allowed for 'S1'"); } @Test public void redundantCapacity_fromSuperType() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {}", "capacity C2 {}", "skill S1 implements C1 { }", "skill S2 extends S1 implements C2, C1 { }" )); validate(mas).assertWarning( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.REDUNDANT_INTERFACE_IMPLEMENTATION, "The feature 'C1' is already implemented by the super-type 'S1'."); } @Test public void redundantCapacity_duplicate() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {}", "capacity C2 {}", "capacity C3 {}", "skill S1 implements C1 { }", "skill S2 extends S1 implements C2, C3, C2 { }" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.REDUNDANT_INTERFACE_IMPLEMENTATION, "Duplicate implemented feature 'C2'"); } @Test public void redundantCapacity_fromPreviousCapacity() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {}", "capacity C2 {}", "capacity C3 extends C2 {}", "skill S1 implements C1 { }", "skill S2 extends S1 implements C3, C2 { }" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.REDUNDANT_INTERFACE_IMPLEMENTATION, "Duplicate implemented feature 'C2'"); } @Test public void invalidSkillExtend_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", "}", "agent A1 {", "}", "skill S1 extends A1 implements C1 {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.INVALID_EXTENDED_TYPE, "Supertype must be of type 'io.sarl.lang.core.Skill'"); } @Test public void invalidSkillExtend_1() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", "}", "capacity C2 {", "}", "skill S1 extends C1 implements C2 {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.CLASS_EXPECTED, "Invalid supertype. Expecting a class"); } @Test public void invalidSkillImplement_0() throws Exception { SarlScript mas = file(multilineString( "behavior B1 {", "}", "skill S1 implements B1 {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.INVALID_IMPLEMENTED_TYPE, "Invalid implemented type: 'B1'. Only subtypes of 'io.sarl.lang.core.Capacity' are allowed for 'S1'"); } @Test public void invalidSkillImplement_1() throws Exception { SarlScript mas = file(multilineString( "behavior B1 {", "}", "capacity C1 {", "}", "capacity C2 {", "}", "skill S1 implements B1, C1, C2 {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.INVALID_IMPLEMENTED_TYPE, "Invalid implemented type: 'B1'. Only subtypes of 'io.sarl.lang.core.Capacity' are allowed for 'S1'"); } @Test public void invalidSkillImplement_2() throws Exception { SarlScript mas = file(multilineString( "behavior B1 {", "}", "capacity C1 {", "}", "capacity C2 {", "}", "skill S1 implements C1, B1, C2 {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.INVALID_IMPLEMENTED_TYPE, "Invalid implemented type: 'B1'. Only subtypes of 'io.sarl.lang.core.Capacity' are allowed for 'S1'"); } @Test public void invalidSkillImplement_3() throws Exception { SarlScript mas = file(multilineString( "behavior B1 {", "}", "capacity C1 {", "}", "capacity C2 {", "}", "skill S1 implements C1, C2, B1 {", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), IssueCodes.INVALID_IMPLEMENTED_TYPE, "Invalid implemented type: 'B1'. Only subtypes of 'io.sarl.lang.core.Capacity' are allowed for 'S1'"); } @Test public void skillImplementCapacity() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction", "}", "skill S1 implements C1 {", " def myaction { }", "}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity.getName()); assertTypeReferenceIdentifiers(capacity.getExtends()); assertEquals(1, capacity.getMembers().size()); // SarlAction signature = (SarlAction) capacity.getMembers().get(0); assertEquals("myaction", signature.getName()); assertTypeReferenceIdentifiers(signature.getFiredEvents()); assertTypeReferenceIdentifier(signature.getReturnType(), "void"); assertParameterNames(signature.getParameters()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertTypeReferenceIdentifiers(skill.getImplements(), "C1"); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.getMembers().get(0); assertEquals("myaction", action.getName()); assertTypeReferenceIdentifiers(action.getFiredEvents()); assertTypeReferenceIdentifier(action.getReturnType(), "void"); assertParameterNames(action.getParameters()); } @Test public void skillExtendSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction", "}", "skill S1 implements C1 {", " def myaction { }", "}", "skill S2 extends S1 {", " def myaction { }", "}" ), true); assertEquals(3, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity.getName()); assertTrue(capacity.getExtends().isEmpty()); assertEquals(1, capacity.getMembers().size()); // SarlAction signature = (SarlAction) capacity.getMembers().get(0); assertEquals("myaction", signature.getName()); assertTrue(signature.getFiredEvents().isEmpty()); assertTypeReferenceIdentifier(signature.getReturnType(), "void"); assertParameterNames(signature.getParameters()); // SarlSkill skill1 = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill1.getName()); assertTrue(capacity.getExtends().isEmpty()); assertTypeReferenceIdentifiers(skill1.getImplements(), "C1"); assertEquals(1, skill1.getMembers().size()); // SarlAction action1 = (SarlAction) skill1.getMembers().get(0); assertEquals("myaction", action1.getName()); assertTrue(signature.getFiredEvents().isEmpty()); assertTypeReferenceIdentifier(action1.getReturnType(), "void"); assertParameterNames(action1.getParameters()); // SarlSkill skill2 = (SarlSkill) mas.getXtendTypes().get(2); assertEquals("S2", skill2.getName()); assertTypeReferenceIdentifier(skill2.getExtends(), "S1"); assertTrue(skill2.getImplements().isEmpty()); assertEquals(1, skill2.getMembers().size()); // SarlAction action2 = (SarlAction) skill2.getMembers().get(0); assertEquals("myaction", action2.getName()); assertTrue(signature.getFiredEvents().isEmpty()); assertTypeReferenceIdentifier(action2.getReturnType(), "void"); assertParameterNames(action2.getParameters()); } @Test public void skillExtendSkillImplementCapacity() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction", "}", "capacity C2 {", " def myaction2", "}", "skill S1 implements C1 {", " def myaction { }", "}", "skill S2 extends S1 implements C2 {", " def myaction { }", " def myaction2 { }", "}" ), true); assertEquals(4, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity1 = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity1.getName()); assertTrue(capacity1.getExtends().isEmpty()); assertEquals(1, capacity1.getMembers().size()); // SarlAction signature1 = (SarlAction) capacity1.getMembers().get(0); assertEquals("myaction", signature1.getName()); assertTrue(signature1.getFiredEvents().isEmpty()); assertTypeReferenceIdentifier(signature1.getReturnType(), "void"); assertParameterNames(signature1.getParameters()); // SarlCapacity capacity2 = (SarlCapacity) mas.getXtendTypes().get(1); assertEquals("C2", capacity2.getName()); assertTypeReferenceIdentifiers(capacity2.getExtends()); assertEquals(1, capacity2.getMembers().size()); // SarlAction signature2 = (SarlAction) capacity2.getMembers().get(0); assertEquals("myaction2", signature2.getName()); assertTypeReferenceIdentifiers(signature2.getFiredEvents()); assertTypeReferenceIdentifier(signature2.getReturnType(), "void"); assertParameterNames(signature2.getParameters()); // SarlSkill skill1 = (SarlSkill) mas.getXtendTypes().get(2); assertEquals("S1", skill1.getName()); assertNull(skill1.getExtends()); assertTypeReferenceIdentifiers(skill1.getImplements(), "C1"); assertEquals(1, skill1.getMembers().size()); // SarlAction action1 = (SarlAction) skill1.getMembers().get(0); assertEquals("myaction", action1.getName()); assertTypeReferenceIdentifiers(action1.getFiredEvents()); assertTypeReferenceIdentifier(action1.getReturnType(), "void"); assertParameterNames(action1.getParameters()); // SarlSkill skill2 = (SarlSkill) mas.getXtendTypes().get(3); assertEquals("S2", skill2.getName()); assertTypeReferenceIdentifier(skill2.getExtends(), "S1"); assertTypeReferenceIdentifiers(skill2.getImplements(), "C2"); assertEquals(2, skill2.getMembers().size()); // SarlAction action2 = (SarlAction) skill2.getMembers().get(0); assertEquals("myaction", action2.getName()); assertTypeReferenceIdentifiers(action2.getFiredEvents()); assertTypeReferenceIdentifier(action2.getReturnType(), "void"); assertParameterNames(action2.getParameters()); // SarlAction action3 = (SarlAction) skill2.getMembers().get(1); assertEquals("myaction2", action3.getName()); assertTypeReferenceIdentifiers(action3.getFiredEvents()); assertTypeReferenceIdentifier(action3.getReturnType(), "void"); assertParameterNames(action3.getParameters()); } @Test public void skillNoExtendSkillNoImplementCapacity() throws Exception { SarlScript mas = file(multilineString( "skill S1 {", " def myaction { }", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtext.xbase.validation.IssueCodes.MISSING_TYPE, "Missing implemented type 'io.sarl.lang.core.Capacity' for 'S1'"); } @Test public void skillmodifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "public skill S1 implements C1 {}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(JvmVisibility.PUBLIC, skill.getVisibility()); assertEquals(0, skill.getMembers().size()); assertFalse(skill.isAbstract()); assertFalse(skill.isFinal()); assertFalse(skill.isStatic()); assertFalse(skill.isStrictFloatingPoint()); } @Test public void skillmodifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "skill S1 implements C1 {}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(JvmVisibility.PUBLIC, skill.getVisibility()); assertEquals(0, skill.getMembers().size()); assertFalse(skill.isAbstract()); assertFalse(skill.isFinal()); assertFalse(skill.isStatic()); assertFalse(skill.isStrictFloatingPoint()); } @Test public void skillmodifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "private skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "protected skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "package skill S1 implements C1 {}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(JvmVisibility.DEFAULT, skill.getVisibility()); assertEquals(0, skill.getMembers().size()); assertFalse(skill.isAbstract()); assertFalse(skill.isFinal()); assertFalse(skill.isStatic()); assertFalse(skill.isStrictFloatingPoint()); } @Test public void skillmodifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "abstract skill S1 implements C1 { }" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(JvmVisibility.PUBLIC, skill.getVisibility()); assertEquals(0, skill.getMembers().size()); assertTrue(skill.isAbstract()); assertFalse(skill.isFinal()); assertFalse(skill.isStatic()); assertFalse(skill.isStrictFloatingPoint()); } @Test public void skillmodifier_static() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "static skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_dispatch() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "dispatch skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "final skill S1 implements C1 {}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(JvmVisibility.PUBLIC, skill.getVisibility()); assertEquals(0, skill.getMembers().size()); assertFalse(skill.isAbstract()); assertTrue(skill.isFinal()); assertFalse(skill.isStatic()); assertFalse(skill.isStrictFloatingPoint()); } @Test public void skillmodifier_strictfp() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "strictfp skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_native() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "native skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_volatile() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "volatile skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_synchronized() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "synchronized skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_transient() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "transient skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void skillmodifier_public_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 {}", "public package skill S1 implements C1 {}" ), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "public / package / protected / private"); } @Test public void abstractSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def fct(a : int = 4)", "}", "skill S1 implements C1 { }")); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.CLASS_MUST_BE_ABSTRACT, "class S1 must be defined abstract"); } } public static class ActionTest extends AbstractSarlTest { @Test public void modifier_override_possible_but_no_warning() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { def fakefct() }", "abstract skill S1 implements C1 {", " override fakefct() { }", " abstract def name", "}", "skill S2 extends S1 {", " 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", "capacity C1 { def fakefct() }", "skill S1 implements C1 {", " override fakefct() { }", "}", "skill S2 extends S1 {", " override name { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.OBSOLETE_OVERRIDE, "The method name() of type S2 must override a superclass method"); } @Test public void modifier_override_valid() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { def fakefct() }", "abstract skill S1 implements C1 {", " override fakefct() { }", " abstract def name()", "}", "skill S2 extends S1 {", " override fakefct() { }", " override name() { }", "}"), false); validate(mas).assertNoIssues(); } @Test public void modifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " public def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " private def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " protected def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " package def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "abstract skill S1 implements C1 {", " abstract def name", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "abstract skill S1 implements C1 {", " def name", "}"), true); validate(mas).assertWarning( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT); // assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " dispatch def name { }", "}"), false); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " final def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " synchronized def name { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " protected private def name { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void modifier_dispatch_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " dispatch final def name(a : Integer) { }", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlAction act1 = (SarlAction) skill.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()); } @Test public void multipleActionDefinitionInCapacity() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " 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 C1"); } @Test public void multipleActionDefinitionInSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", " 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 S1"); } @Test public void invalidActionNameInCapacity() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction", " def $handle_myaction", " def myaction2", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MEMBER_NAME, "Invalid action name '$handle_myaction'."); } @Test public void invalidActionNameInSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", " 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 missedActionImplementation_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction1(a : int)", "}", "capacity C2 {", " def myaction2(b : float, c : boolean)", "}", "skill S1 implements C1, C2 {", " def myaction1(x : int) { }", " def myaction2(y : float, z : boolean) { }", "}" ), true); assertEquals(3, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity1 = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity1.getName()); assertTypeReferenceIdentifiers(capacity1.getExtends()); assertEquals(1, capacity1.getMembers().size()); // SarlAction signature1 = (SarlAction) capacity1.getMembers().get(0); assertEquals("myaction1", signature1.getName()); assertTypeReferenceIdentifiers(signature1.getFiredEvents()); assertTypeReferenceIdentifier(signature1.getReturnType(), "void"); assertParameterNames(signature1.getParameters(), "a"); assertParameterTypes(signature1.getParameters(), "int"); assertParameterDefaultValues(signature1.getParameters(), (Object) null); // SarlCapacity capacity2 = (SarlCapacity) mas.getXtendTypes().get(1); assertEquals("C2", capacity2.getName()); assertTypeReferenceIdentifiers(capacity2.getExtends()); assertEquals(1, capacity2.getMembers().size()); // SarlAction signature2 = (SarlAction) capacity2.getMembers().get(0); assertEquals("myaction2", signature2.getName()); assertTypeReferenceIdentifiers(signature2.getFiredEvents()); assertTypeReferenceIdentifier(signature2.getReturnType(), "void"); assertParameterNames(signature2.getParameters(), "b", "c"); assertParameterTypes(signature2.getParameters(), "float", "boolean"); assertParameterDefaultValues(signature2.getParameters(), null, null); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(2); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertTypeReferenceIdentifiers(skill.getImplements(), "C1", "C2"); assertEquals(2, skill.getMembers().size()); // SarlAction action1 = (SarlAction) skill.getMembers().get(0); assertEquals("myaction1", action1.getName()); assertTypeReferenceIdentifiers(action1.getFiredEvents()); assertTypeReferenceIdentifier(action1.getReturnType(), "void"); assertParameterNames(action1.getParameters(), "x"); assertParameterTypes(action1.getParameters(), "int"); assertParameterDefaultValues(action1.getParameters(), (Object) null); // SarlAction action2 = (SarlAction) skill.getMembers().get(1); assertEquals("myaction2", action2.getName()); assertTypeReferenceIdentifiers(action2.getFiredEvents()); assertTypeReferenceIdentifier(action2.getReturnType(), "void"); assertParameterNames(action2.getParameters(), "y", "z"); assertParameterTypes(action2.getParameters(), "float", "boolean"); assertParameterDefaultValues(action2.getParameters(), null, null); } @Test public void missedActionImplementation_1() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction1(a : int)", "}", "capacity C2 {", " def myaction2(b : float, c : boolean)", "}", "skill S1 implements C1, C2 {", " def myaction2(b : float, c : boolean) { }", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.CLASS_MUST_BE_ABSTRACT, "The class S1 must be defined abstract because it does not implement myaction1(int)"); } @Test public void missedActionImplementation_2() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction1(a : int)", "}", "capacity C2 {", " def myaction2(b : float, c : boolean)", "}", "skill S1 implements C1, C2 {", " def myaction1(x : float) { }", " def myaction2(y : float, z : boolean) { }", "}" )); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlSkill(), org.eclipse.xtend.core.validation.IssueCodes.CLASS_MUST_BE_ABSTRACT, "The class S1 must be defined abstract because it does not implement myaction1(int)"); } @Test public void incompatibleReturnType_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) : int {", " return 0", " }", "}", "skill S2 extends S1 implements C2 {", " 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( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) {", " // void", " }", "}", "skill S2 extends S1 implements C2 {", " 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( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) : int {", " return 0", " }", "}", "skill S2 extends S1 implements C2 {", " 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( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) : int {", " return 0", " }", "}", "skill S2 extends S1 implements C2 {", " def myaction(a : int) {", " // int 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 incompatibleReturnType_4() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : int", "}", "skill S2 implements C1 {", " 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_5() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) // void", "}", "skill S2 implements C1 {", " 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_6() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : int", "}", "skill S2 implements C1 {", " 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_7() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : int", "}", "skill S2 implements C1 {", " def myaction(a : int) {", " // int 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 expectingReturnType_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) : int {", " return 0", " }", "}", "skill S2 extends S1 implements C2 {", " def myaction(a : int) {", " 1", " }", "}" )); validate(mas).assertWarning( SarlPackage.eINSTANCE.getSarlAction(), IssueCodes.RETURN_TYPE_SPECIFICATION_IS_RECOMMENDED, "int"); } @Test public void compatibleReturnType_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) : Number {", " return 0.0", " }", "}", "skill S2 extends S1 implements C2 {", " def myaction(a : int) : Double {", " return 0.0", " }", "}" ), true); assertEquals(4, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity1 = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity1.getName()); assertTypeReferenceIdentifiers(capacity1.getExtends()); assertEquals(0, capacity1.getMembers().size()); // SarlCapacity capacity2 = (SarlCapacity) mas.getXtendTypes().get(1); assertEquals("C2", capacity2.getName()); assertTypeReferenceIdentifiers(capacity2.getExtends()); assertEquals(0, capacity2.getMembers().size()); // SarlSkill skill1 = (SarlSkill) mas.getXtendTypes().get(2); assertEquals("S1", skill1.getName()); assertNull(skill1.getExtends()); assertTypeReferenceIdentifiers(skill1.getImplements(), "C1"); assertEquals(1, skill1.getMembers().size()); // SarlAction action1 = (SarlAction) skill1.getMembers().get(0); assertEquals("myaction", action1.getName()); assertTypeReferenceIdentifiers(action1.getFiredEvents()); assertTypeReferenceIdentifier(action1.getReturnType(), "java.lang.Number"); assertParameterNames(action1.getParameters(), "a"); assertParameterTypes(action1.getParameters(), "int"); assertParameterDefaultValues(action1.getParameters(), (Object) null); // SarlSkill skill2 = (SarlSkill) mas.getXtendTypes().get(3); assertEquals("S2", skill2.getName()); assertTypeReferenceIdentifier(skill2.getExtends(), "S1"); assertTypeReferenceIdentifiers(skill2.getImplements(), "C2"); assertEquals(1, skill2.getMembers().size()); // SarlAction action2 = (SarlAction) skill2.getMembers().get(0); assertEquals("myaction", action2.getName()); assertTypeReferenceIdentifiers(action2.getFiredEvents()); 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( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " def myaction(a : int) : float {", " return 0f", " }", "}", "skill S2 extends S1 implements C2 {", " def myaction(a : int) : float {", " return 0f", " }", "}" ), true); assertEquals(4, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity1 = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity1.getName()); assertTypeReferenceIdentifiers(capacity1.getExtends()); assertEquals(0, capacity1.getMembers().size()); // SarlCapacity capacity2 = (SarlCapacity) mas.getXtendTypes().get(1); assertEquals("C2", capacity2.getName()); assertTypeReferenceIdentifiers(capacity2.getExtends()); assertEquals(0, capacity2.getMembers().size()); // SarlSkill skill1 = (SarlSkill) mas.getXtendTypes().get(2); assertEquals("S1", skill1.getName()); assertNull(skill1.getExtends()); assertTypeReferenceIdentifiers(skill1.getImplements(), "C1"); assertEquals(1, skill1.getMembers().size()); // SarlAction action1 = (SarlAction) skill1.getMembers().get(0); assertEquals("myaction", action1.getName()); assertTypeReferenceIdentifiers(action1.getFiredEvents()); assertTypeReferenceIdentifier(action1.getReturnType(), "float"); assertParameterNames(action1.getParameters(), "a"); assertParameterTypes(action1.getParameters(), "int"); assertParameterDefaultValues(action1.getParameters(), (Object) null); // SarlSkill skill2 = (SarlSkill) mas.getXtendTypes().get(3); assertEquals("S2", skill2.getName()); assertTypeReferenceIdentifier(skill2.getExtends(), "S1"); assertTypeReferenceIdentifiers(skill2.getImplements(), "C2"); assertEquals(1, skill2.getMembers().size()); // SarlAction action2 = (SarlAction) skill2.getMembers().get(0); assertEquals("myaction", action2.getName()); assertTypeReferenceIdentifiers(action2.getFiredEvents()); assertTypeReferenceIdentifier(action2.getReturnType(), "float"); assertParameterNames(action2.getParameters(), "a"); assertParameterTypes(action2.getParameters(), "int"); assertParameterDefaultValues(action2.getParameters(), (Object) null); } @Test public void compatibleReturnType_2() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : Number", "}", "skill S2 implements C1 {", " def myaction(a : int) : Double {", " return 0.0", " }", "}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity.getName()); assertTypeReferenceIdentifiers(capacity.getExtends()); assertEquals(1, capacity.getMembers().size()); // SarlAction action1 = (SarlAction) capacity.getMembers().get(0); assertEquals("myaction", action1.getName()); assertTypeReferenceIdentifiers(action1.getFiredEvents()); assertTypeReferenceIdentifier(action1.getReturnType(), "java.lang.Number"); assertParameterNames(action1.getParameters(), "a"); assertParameterTypes(action1.getParameters(), "int"); assertParameterDefaultValues(action1.getParameters(), (Object) null); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S2", skill.getName()); assertNull(skill.getExtends()); assertTypeReferenceIdentifiers(skill.getImplements(), "C1"); assertEquals(1, skill.getMembers().size()); // SarlAction action2 = (SarlAction) skill.getMembers().get(0); assertEquals("myaction", action2.getName()); assertTypeReferenceIdentifiers(action2.getFiredEvents()); assertTypeReferenceIdentifier(action2.getReturnType(), "java.lang.Double"); assertParameterNames(action2.getParameters(), "a"); assertParameterTypes(action2.getParameters(), "int"); assertParameterDefaultValues(action2.getParameters(), (Object) null); } @Test public void compatibleReturnType_3() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : float", "}", "skill S2 implements C1 {", " def myaction(a : int) : float {", " return 0f", " }", "}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity.getName()); assertTypeReferenceIdentifiers(capacity.getExtends()); assertEquals(1, capacity.getMembers().size()); // SarlAction action1 = (SarlAction) capacity.getMembers().get(0); assertEquals("myaction", action1.getName()); assertTypeReferenceIdentifiers(action1.getFiredEvents()); assertTypeReferenceIdentifier(action1.getReturnType(), "float"); assertParameterNames(action1.getParameters(), "a"); assertParameterTypes(action1.getParameters(), "int"); assertParameterDefaultValues(action1.getParameters(), (Object) null); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S2", skill.getName()); assertNull(skill.getExtends()); assertTypeReferenceIdentifiers(skill.getImplements(), "C1"); assertEquals(1, skill.getMembers().size()); // SarlAction action2 = (SarlAction) skill.getMembers().get(0); assertEquals("myaction", action2.getName()); assertTypeReferenceIdentifiers(action2.getFiredEvents()); assertTypeReferenceIdentifier(action2.getReturnType(), "float"); assertParameterNames(action2.getParameters(), "a"); assertParameterTypes(action2.getParameters(), "int"); assertParameterDefaultValues(action2.getParameters(), (Object) null); } } public static class FieldTest extends AbstractSarlTest { @Test public void modifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " public var field : int", "}"), false); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals("field", attr1.getName()); assertTypeReferenceIdentifier(attr1.getType(), "int"); assertNull(attr1.getInitialValue()); assertEquals(JvmVisibility.PUBLIC, attr1.getVisibility()); assertFalse(attr1.isFinal()); assertFalse(attr1.isStatic()); assertFalse(attr1.isTransient()); assertFalse(attr1.isVolatile()); assertFalse(attr1.isExtension()); } @Test public void modifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " private var field : int", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals("field", attr1.getName()); assertTypeReferenceIdentifier(attr1.getType(), "int"); assertNull(attr1.getInitialValue()); assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility()); assertFalse(attr1.isFinal()); assertFalse(attr1.isStatic()); assertFalse(attr1.isTransient()); assertFalse(attr1.isVolatile()); assertFalse(attr1.isExtension()); } @Test public void modifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " protected var field : int", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals("field", attr1.getName()); assertTypeReferenceIdentifier(attr1.getType(), "int"); assertNull(attr1.getInitialValue()); assertEquals(JvmVisibility.PROTECTED, attr1.getVisibility()); assertFalse(attr1.isFinal()); assertFalse(attr1.isStatic()); assertFalse(attr1.isTransient()); assertFalse(attr1.isVolatile()); assertFalse(attr1.isExtension()); } @Test public void modifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " package var field : int", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals("field", attr1.getName()); assertTypeReferenceIdentifier(attr1.getType(), "int"); assertNull(attr1.getInitialValue()); assertEquals(JvmVisibility.DEFAULT, attr1.getVisibility()); assertFalse(attr1.isFinal()); assertFalse(attr1.isStatic()); assertFalse(attr1.isTransient()); assertFalse(attr1.isVolatile()); assertFalse(attr1.isExtension()); } @Test public void modifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " var field : int", "}"), true); assertEquals(2, mas.getXtendTypes().size()); // assertEquals("io.sarl.lang.tests.test", mas.getPackage()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertEquals(1, skill.getMembers().size()); // SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals("field", attr1.getName()); assertTypeReferenceIdentifier(attr1.getType(), "int"); assertNull(attr1.getInitialValue()); assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility()); assertFalse(attr1.isFinal()); assertFalse(attr1.isStatic()); assertFalse(attr1.isTransient()); assertFalse(attr1.isVolatile()); assertFalse(attr1.isExtension()); } @Test public void modifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " final var field : int = 5", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlField(), 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " protected private var field : int", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlField(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "public / package / protected / private"); } @Test public void multipleVariableDefinitionInSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", " 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 multipleValueDefinitionInSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", " 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 missedFinalFieldInitialization() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", " 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( "capacity C1 { }", "skill S1 implements C1 {", " val field1 : int = 5", " val field2 : String = \"\"", "}" ), true); assertEquals(2, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity.getName()); assertTypeReferenceIdentifiers(capacity.getExtends()); assertEquals(0, capacity.getMembers().size()); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertEquals("S1", skill.getName()); assertNull(skill.getExtends()); assertTypeReferenceIdentifiers(skill.getImplements(), "C1"); assertEquals(2, skill.getMembers().size()); // SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals("field1", attr1.getName()); assertTypeReferenceIdentifier(attr1.getType(), "int"); assertXExpression(attr1.getInitialValue(), XNumberLiteral.class, "5"); // SarlField attr2 = (SarlField) skill.getMembers().get(1); assertEquals("field2", attr2.getName()); assertTypeReferenceIdentifier(attr2.getType(), "java.lang.String"); assertXExpression(attr2.getInitialValue(), XStringLiteral.class, ""); } @Test public void fieldNameShadowingInSkill() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "capacity C2 { }", "skill S1 implements C1 {", " protected val field1 : int = 5", " def myaction(a : int) { }", "}", "skill S2 extends S1 implements C2 {", " 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 'S2' is hidding the inherited field 'S1.field1'."); } @Test public void variableModifier_public() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "public var name : String = \"Hello\"", "}" ), false); // validate(mas).assertNoErrors(); } @Test public void variableModifier_protected() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "protected var name : String = \"Hello\"", "}" ), true); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals(JvmVisibility.PROTECTED, attr1.getVisibility()); } @Test public void variableModifier_package() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "package var name : String = \"Hello\"", "}" ), false); // validate(mas).assertNoErrors(); } @Test public void variableModifier_private() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "private var name : String = \"Hello\"", "}" ), true); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility()); } @Test public void variableModifier_default() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "var name : String = \"Hello\"", "}" ), true); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility()); } @Test public void valueModifier_public() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "public val name : String = \"Hello\"", "}" ), false); // validate(mas).assertNoErrors(); } @Test public void valueModifier_protected() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "protected val name : String = \"Hello\"", "}" ), true); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals(JvmVisibility.PROTECTED, attr1.getVisibility()); } @Test public void valueModifier_package() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "package val name : String = \"Hello\"", "}" ), false); // validate(mas).assertNoErrors(); } @Test public void valueModifier_private() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "private val name : String = \"Hello\"", "}" ), true); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility()); } @Test public void valueModifier_default() throws Exception { SarlScript mas = file(multilineString( "capacity C1 { }", "skill S1 implements C1 {", "val name : String = \"Hello\"", "}" ), true); // SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); SarlField attr1 = (SarlField) skill.getMembers().get(0); assertEquals(JvmVisibility.PRIVATE, attr1.getVisibility()); } } public static class CapacityUsesTest extends AbstractSarlTest { @Test public void invalidCapacityTypeForUses() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : float", "}", "event E1 {", " var abc : int", "}", "behavior B1 {", " uses C1, E1", "}" )); validate(mas).assertError( TypesPackage.eINSTANCE.getJvmParameterizedTypeReference(), IssueCodes.INVALID_CAPACITY_TYPE, "Invalid type: 'E1'. Only capacities can be used after the keyword 'uses'"); } @Test public void invalidCapacityTypeForRequires() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myaction(a : int) : float", "}", "event E1 {", " var abc : int", "}", "behavior B1 {", " requires C1, E1", "}" )); validate(mas).assertError( TypesPackage.eINSTANCE.getJvmParameterizedTypeReference(), IssueCodes.INVALID_CAPACITY_TYPE, "Invalid type: 'E1'. Only capacities can be used after the keyword 'requires'"); } @Test public void agentUnsuedCapacity_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myfct", "}", "capacity C2 {", " def myfct2", "}", "agent A1 {", " uses C2, C1", " def myaction {", " myfct2", " }", "}" )); List<Issue> issues = issues(mas); assertWarning( issues, mas, SarlPackage.eINSTANCE.getSarlCapacityUses(), IssueCodes.UNUSED_AGENT_CAPACITY, "The capacity 'C1' is not used"); assertNoMoreIssues(issues, mas); } @Test public void agentUnsuedCapacity_1() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myfct", "}", "capacity C2 {", " def myfct2", "}", "agent A1 {", " uses C2, C1", " def myaction {", " }", "}" )); List<Issue> issues = issues(mas); assertWarning( issues, mas, SarlPackage.eINSTANCE.getSarlCapacityUses(), IssueCodes.UNUSED_AGENT_CAPACITY, "The capacity 'C1' is not used"); assertWarning( issues, mas, SarlPackage.eINSTANCE.getSarlCapacityUses(), IssueCodes.UNUSED_AGENT_CAPACITY, "The capacity 'C2' is not used"); assertNoMoreIssues(issues, mas); } @Test public void agentUnsuedCapacity_2() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {", " def myfct", "}", "capacity C2 {", " def myfct2", "}", "agent A1 {", " uses C2, C1", " def myaction {", " myfct", " myfct2", " }", "}" ), true); assertEquals(3, mas.getXtendTypes().size()); // assertTrue(Strings.isNullOrEmpty(mas.getPackage())); // SarlCapacity capacity1 = (SarlCapacity) mas.getXtendTypes().get(0); assertEquals("C1", capacity1.getName()); assertTypeReferenceIdentifiers(capacity1.getExtends()); assertEquals(1, capacity1.getMembers().size()); // SarlAction signature1 = (SarlAction) capacity1.getMembers().get(0); assertEquals("myfct", signature1.getName()); assertTypeReferenceIdentifiers(signature1.getFiredEvents()); assertTypeReferenceIdentifier(signature1.getReturnType(), "void"); assertParameterNames(signature1.getParameters()); // SarlCapacity capacity2 = (SarlCapacity) mas.getXtendTypes().get(1); assertEquals("C2", capacity2.getName()); assertTypeReferenceIdentifiers(capacity2.getExtends()); assertEquals(1, capacity2.getMembers().size()); // SarlAction signature2 = (SarlAction) capacity2.getMembers().get(0); assertEquals("myfct2", signature2.getName()); assertTypeReferenceIdentifiers(signature2.getFiredEvents()); assertTypeReferenceIdentifier(signature2.getReturnType(), "void"); assertParameterNames(signature2.getParameters()); // SarlAgent agent = (SarlAgent) mas.getXtendTypes().get(2); assertEquals("A1", agent.getName()); assertNull(agent.getExtends()); assertEquals(2, agent.getMembers().size()); // SarlCapacityUses uses = (SarlCapacityUses) agent.getMembers().get(0); assertTypeReferenceIdentifiers(uses.getCapacities(), "C2", "C1"); // SarlAction action = (SarlAction) agent.getMembers().get(1); assertEquals("myaction", action.getName()); assertTypeReferenceIdentifiers(action.getFiredEvents()); assertTypeReferenceIdentifier(action.getReturnType(), "void"); assertParameterNames(action.getParameters()); } @Test public void multipleCapacityUses_0() throws Exception { SarlScript mas = file(multilineString( "capacity C1 {}", "capacity C2 {}", "capacity C3 { def testFct }", "skill S1 implements C3 {", " 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 {}", "capacity C3 { def testFct }", "skill S1 implements C3 {", " 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", "capacity C1 { }", "skill S1 implements C1 {", " def setX(param : X) : void with X { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def <X> setX(param : X) : void { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def setX(param : X) : void with X extends Number { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def <X extends Number> setX(param : X) : void { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def setX(param : X) : void with X, Y { var xxx : X; var yyy : Y }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def <X, Y> setX(param : X) : void { var xxx : X; var yyy : Y }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " 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()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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", "capacity C1 { }", "skill S1 implements C1 {", " def <X, Y extends X> setX(param : X) : void { var xxx : X; var yyy : Y }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlSkill skill = (SarlSkill) mas.getXtendTypes().get(1); assertNotNull(skill); // assertEquals("S1", skill.getName()); assertEquals(1, skill.getMembers().size()); // SarlAction action = (SarlAction) skill.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")); } } }