/* * 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.oop; 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 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.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.SarlBehavior; import io.sarl.lang.sarl.SarlClass; import io.sarl.lang.sarl.SarlPackage; import io.sarl.lang.sarl.SarlScript; import io.sarl.lang.sarl.SarlSkill; import io.sarl.tests.api.AbstractSarlTest; /** * @author $Author: sgalland$ * @version $Name$ $Revision$ $Date$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ @RunWith(Suite.class) @SuiteClasses({ ClassParsingTest.TopClassTest.class, ClassParsingTest.InsideClassTest.class, ClassParsingTest.InsideAgentTest.class, ClassParsingTest.InsideBehaviorTest.class, ClassParsingTest.InsideSkillTest.class, ClassParsingTest.GenericTest.class, }) @SuppressWarnings("all") public class ClassParsingTest { public static class TopClassTest extends AbstractSarlTest { protected SarlClass getClazz(SarlScript script) { return (SarlClass) script.getXtendTypes().get(0); } @Test public void classmodifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class C1 { }"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertFalse(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1 { }"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertFalse(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "private class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "protected class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "package class C1 { }"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.DEFAULT, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertFalse(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "abstract class C1 { }"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertTrue(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertFalse(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_static() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "static class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_dispatch() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "dispatch class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "final class C1 { }"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertTrue(clazz.isFinal()); assertFalse(clazz.isLocal()); assertFalse(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_strictfp() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "strictfp class C1 { }"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertFalse(clazz.isStatic()); assertTrue(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_native() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "native class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_volatile() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "volatile class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_synchronized() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "synchronized class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_transient() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "transient class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, final, abstract & strictfp are permitted"); } @Test public void classmodifier_abstract_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "abstract final class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can either be abstract or final, not both"); } @Test public void classmodifier_abstract_action() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1 { abstract def name() }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT, "The abstract method name in type C1 can only be defined by an abstract class"); } @Test public void classmodifier_public_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public private class C1 { }"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can only set one of public / package / protected / private"); } } public static class InsideClassTest extends AbstractSarlTest { protected SarlClass getClazz(SarlScript script) { SarlClass enclosing = (SarlClass) script.getXtendTypes().get(0); return (SarlClass) enclosing.getMembers().get(0); } @Test public void classmodifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " public static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_STATIC_MODIFIER, "Nested classes must be static"); } @Test public void classmodifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " private static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PRIVATE, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " protected static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " package static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.DEFAULT, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " abstract static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertTrue(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_static() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_dispatch() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " dispatch static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " final static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertTrue(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_strictfp() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " strictfp static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertTrue(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_native() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " native class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_volatile() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " volatile static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_synchronized() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " synchronized static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_transient() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " transient static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_abstract_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " abstract final static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can either be abstract or final, not both"); } @Test public void classmodifier_abstract_action() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " static class C1 { abstract def name() }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT, "The abstract method name in type C1 can only be defined by an abstract class"); } @Test public void classmodifier_public_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public class EnclosingClass {", " public private static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can only set one of public / package / protected / private"); } } public static class InsideAgentTest extends AbstractSarlTest { protected SarlClass getClazz(SarlScript script) { SarlAgent enclosing = (SarlAgent) script.getXtendTypes().get(0); return (SarlClass) enclosing.getMembers().get(0); } @Test public void classmodifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " public static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_STATIC_MODIFIER); } @Test public void classmodifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " private static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PRIVATE, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " protected static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " package static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.DEFAULT, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " abstract static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertTrue(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_static() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_dispatch() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " dispatch static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " final static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertTrue(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_strictfp() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " strictfp static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_native() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " native class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_volatile() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " volatile static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_synchronized() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " synchronized static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_transient() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " transient static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER); } @Test public void classmodifier_abstract_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " abstract final static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "can either be abstract or final, not both"); } @Test public void classmodifier_abstract_action() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " static class C1 { abstract def name() }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT); } @Test public void classmodifier_public_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public agent EnclosingAgent {", " public private static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "public / package / protected / private"); } } public static class InsideBehaviorTest extends AbstractSarlTest { protected SarlClass getClazz(SarlScript script) { SarlBehavior enclosing = (SarlBehavior) script.getXtendTypes().get(0); return (SarlClass) enclosing.getMembers().get(0); } @Test public void classmodifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " public static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_STATIC_MODIFIER); } @Test public void classmodifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " private static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PRIVATE, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " protected static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " package static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.DEFAULT, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " abstract static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertTrue(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_static() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_dispatch() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " dispatch static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " final static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertTrue(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_strictfp() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " strictfp static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertTrue(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_native() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " native class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_volatile() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " volatile static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_synchronized() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " synchronized static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_transient() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " transient static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_abstract_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " abstract final static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can either be abstract or final, not both"); } @Test public void classmodifier_abstract_action() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " static class C1 { abstract def name() }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT); } @Test public void classmodifier_public_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public behavior EnclosingBehavior {", " public private static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can only set one of public / package / protected / private"); } } public static class InsideSkillTest extends AbstractSarlTest { protected SarlClass getClazz(SarlScript script) { SarlSkill enclosing = (SarlSkill) script.getXtendTypes().get(1); return (SarlClass) enclosing.getMembers().get(0); } @Test public void classmodifier_public() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " public static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_none() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_STATIC_MODIFIER); } @Test public void classmodifier_private() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " private static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PRIVATE, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_protected() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " protected static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PROTECTED, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " package static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.DEFAULT, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_abstract() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " abstract static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertTrue(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_static() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " static class C1 { }", "}"), false); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_dispatch() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " dispatch static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " final static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertTrue(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertFalse(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_strictfp() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " strictfp static class C1 { }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = getClazz(mas); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertNull(clazz.getExtends()); assertEquals(JvmVisibility.PUBLIC, clazz.getVisibility()); assertEquals(0, clazz.getMembers().size()); assertFalse(clazz.isAbstract()); assertFalse(clazz.isAnonymous()); assertFalse(clazz.isFinal()); assertFalse(clazz.isLocal()); assertTrue(clazz.isStatic()); assertTrue(clazz.isStrictFloatingPoint()); } @Test public void classmodifier_native() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " native class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_volatile() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " volatile static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_synchronized() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " synchronized static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_transient() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " transient static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "Illegal modifier for the class C1; only public, package, protected, private, static, final, abstract & strictfp are permitted"); } @Test public void classmodifier_abstract_final() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " abstract final static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can either be abstract or final, not both"); } @Test public void classmodifier_abstract_action() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " static class C1 { abstract def name() }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlAction(), org.eclipse.xtend.core.validation.IssueCodes.MISSING_ABSTRACT); } @Test public void classmodifier_public_package() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "public capacity C1 { }", "public skill EnclosingSkill implements C1 {", " public private static class C1 { }", "}"), false); validate(mas).assertError( SarlPackage.eINSTANCE.getSarlClass(), org.eclipse.xtend.core.validation.IssueCodes.INVALID_MODIFIER, "The class C1 can only set one of public / package / protected / private"); } } public static class GenericTest extends AbstractSarlTest { @Test public void classGeneric_X() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1<X> {", " var x : X", " def setX(param : X) { this.x = param }", " def getX : X { this.x }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); // assertEquals(1, clazz.getTypeParameters().size()); // JvmTypeParameter parameter = clazz.getTypeParameters().get(0); assertEquals("X", parameter.getName()); assertNullOrEmpty(parameter.getConstraints()); } @Test public void classGeneric_XextendsNumber() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1<X extends Number> {", " var x : X", " def setX(param : X) { this.x = param }", " def getX : X { this.x }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); // assertEquals(1, clazz.getTypeParameters().size()); // JvmTypeParameter parameter = clazz.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 classGeneric_XY() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1<X,Y> {", " var x : X", " def getY : Y { null }", " def setX(param : X) { this.x = param }", " def getX : X { this.x }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); // assertEquals(2, clazz.getTypeParameters().size()); // JvmTypeParameter parameter1 = clazz.getTypeParameters().get(0); assertEquals("X", parameter1.getName()); assertNullOrEmpty(parameter1.getConstraints()); // JvmTypeParameter parameter2 = clazz.getTypeParameters().get(1); assertEquals("Y", parameter2.getName()); assertNullOrEmpty(parameter2.getConstraints()); } @Test public void classGeneric_XYextendsX() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1<X,Y extends X> {", " var x : X", " def getY : Y { null }", " def setX(param : X) { this.x = param }", " def getX : X { this.x }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); // assertEquals(2, clazz.getTypeParameters().size()); // JvmTypeParameter parameter1 = clazz.getTypeParameters().get(0); assertEquals("X", parameter1.getName()); assertNullOrEmpty(parameter1.getConstraints()); // JvmTypeParameter parameter2 = clazz.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 classGeneric_XextendsYY() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1<X extends Y,Y> {", " var x : X", " def getY : Y { null }", " def setX(param : X) { this.x = param }", " def getX : X { this.x }", "}"), false); validate(mas).assertError( TypesPackage.eINSTANCE.getJvmParameterizedTypeReference(), org.eclipse.xtext.xbase.validation.IssueCodes.TYPE_PARAMETER_FORWARD_REFERENCE, "Illegal forward reference to type parameter Y"); } @Test public void functionGeneric_X_sarlNotation() throws Exception { SarlScript mas = file(multilineString( "package io.sarl.lang.tests.test", "class C1 {", " def setX(param : X) : void with X { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class C1 {", " def <X> setX(param : X) : void { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class C1 {", " def setX(param : X) : void with X extends Number { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class C1 {", " def <X extends Number> setX(param : X) : void { var xxx : X }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class C1 {", " def setX(param : X) : void with X, Y { var xxx : X; var yyy : Y }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class C1 {", " def <X, Y> setX(param : X) : void { var xxx : X; var yyy : Y }", "}"), true); assertEquals("io.sarl.lang.tests.test", mas.getPackage()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class 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()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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", "class 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()); SarlClass clazz = (SarlClass) mas.getXtendTypes().get(0); assertNotNull(clazz); // assertEquals("C1", clazz.getName()); assertEquals(1, clazz.getMembers().size()); // SarlAction action = (SarlAction) clazz.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")); } } }