/*
* 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.general;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import com.google.common.base.Strings;
import org.eclipse.xtend.core.validation.IssueCodes;
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.SarlCapacity;
import io.sarl.lang.sarl.SarlConstructor;
import io.sarl.lang.sarl.SarlEvent;
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({
VarArgsParsingTest.AgentTest.class,
VarArgsParsingTest.BehaviorTest.class,
VarArgsParsingTest.SkillTest.class,
VarArgsParsingTest.CapacityTest.class,
VarArgsParsingTest.EventTest.class,
})
@SuppressWarnings("all")
public class VarArgsParsingTest {
public static class AgentTest extends AbstractSarlTest {
@Test
public void action_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
" def myaction(arg : int*) {",
" System.out.println(arg)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlAgent agent = (SarlAgent) mas.getXtendTypes().get(0);
assertEquals("A1", agent.getName());
assertNull(agent.getExtends());
assertEquals(1, agent.getMembers().size());
//
SarlAction action = (SarlAction) agent.getMembers().get(0);
assertEquals("myaction", action.getName());
assertTypeReferenceIdentifiers(action.getFiredEvents());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters(), "arg");
assertParameterTypes(action.getParameters(), "int");
assertParameterDefaultValues(action.getParameters(), (Object) null);
}
@Test
public void inAgentAction() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
" def myaction(arg1 : char, arg2 : boolean, arg3 : int*) {",
" System.out.println(arg3)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlAgent agent = (SarlAgent) mas.getXtendTypes().get(0);
assertEquals("A1", agent.getName());
assertNull(agent.getExtends());
assertEquals(1, agent.getMembers().size());
//
SarlAction action = (SarlAction) agent.getMembers().get(0);
assertEquals("myaction", action.getName());
assertTypeReferenceIdentifiers(action.getFiredEvents());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(action.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(action.getParameters(), null, null, null);
assertParameterVarArg(action.getParameters());
}
@Test
public void action_invalid() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
" def myaction(arg1 : char, arg2 : boolean*, arg3 : int) {",
" System.out.println(arg3)",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
}
public static class BehaviorTest extends AbstractSarlTest {
@Test
public void action_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(arg : int*) {",
" System.out.println(arg)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(1, behavior.getMembers().size());
//
SarlAction action = (SarlAction) behavior.getMembers().get(0);
assertEquals("myaction", action.getName());
assertTypeReferenceIdentifiers(action.getFiredEvents());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters(), "arg");
assertParameterTypes(action.getParameters(), "int");
assertParameterDefaultValues(action.getParameters(), (Object) null);
assertParameterVarArg(action.getParameters());
}
@Test
public void action() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(arg1 : char, arg2 : boolean, arg3 : int*) {",
" System.out.println(arg3)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(1, behavior.getMembers().size());
//
SarlAction action = (SarlAction) behavior.getMembers().get(0);
assertEquals("myaction", action.getName());
assertTypeReferenceIdentifiers(action.getFiredEvents());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(action.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(action.getParameters(), null, null, null);
assertParameterVarArg(action.getParameters());
}
@Test
public void action_invalid() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(arg1 : char, arg2 : boolean*, arg3 : int) {",
" System.out.println(arg3)",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
@Test
public void constructor_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" new(arg : int*) {",
" super(null) // must be never null during runtime",
" System.out.println(arg)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(1, behavior.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) behavior.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "arg");
assertParameterTypes(constructor.getParameters(), "int");
assertParameterDefaultValues(constructor.getParameters(), (Object) null);
assertParameterVarArg(constructor.getParameters());
}
@Test
public void constructor() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" new (arg1 : char, arg2 : boolean, arg3 : int*) {",
" super(null) // must be never null during runtime",
" System.out.println(arg3)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(1, behavior.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) behavior.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(constructor.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(constructor.getParameters(), null, null, null);
assertParameterVarArg(constructor.getParameters());
}
@Test
public void constructor_invalid() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" new (arg1 : char, arg2 : boolean*, arg3 : int) {",
" super(null) // must be never null during runtime",
" System.out.println(arg3)",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
@Test
public void multipleActionDefinitionsInBehavior_0() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(arg0 : int, arg1 : int*) {",
" System.out.println(\"invalid\")",
" }",
" def myaction {",
" System.out.println(\"invalid\")",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(2, behavior.getMembers().size());
//
SarlAction action1 = (SarlAction) behavior.getMembers().get(0);
assertEquals("myaction", action1.getName());
assertTypeReferenceIdentifiers(action1.getFiredEvents());
assertTypeReferenceIdentifier(action1.getReturnType(), "void");
assertParameterNames(action1.getParameters(), "arg0", "arg1");
assertParameterTypes(action1.getParameters(), "int", "int");
assertParameterDefaultValues(action1.getParameters(), null, null);
assertParameterVarArg(action1.getParameters());
//
SarlAction action2 = (SarlAction) behavior.getMembers().get(1);
assertEquals("myaction", action2.getName());
assertTypeReferenceIdentifiers(action2.getFiredEvents());
assertTypeReferenceIdentifier(action2.getReturnType(), "void");
assertParameterNames(action2.getParameters());
}
@Test
public void multipleActionDefinitionsInBehavior_1() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(arg0 : int, arg1 : int*) {",
" System.out.println(\"invalid\")",
" }",
" def myaction(arg0 : int) {",
" System.out.println(\"invalid\")",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlBehavior behavior = (SarlBehavior) mas.getXtendTypes().get(0);
assertEquals("B1", behavior.getName());
assertNull(behavior.getExtends());
assertEquals(2, behavior.getMembers().size());
//
SarlAction action1 = (SarlAction) behavior.getMembers().get(0);
assertEquals("myaction", action1.getName());
assertTypeReferenceIdentifiers(action1.getFiredEvents());
assertTypeReferenceIdentifier(action1.getReturnType(), "void");
assertParameterNames(action1.getParameters(), "arg0", "arg1");
assertParameterTypes(action1.getParameters(), "int", "int");
assertParameterDefaultValues(action1.getParameters(), null, null);
assertParameterVarArg(action1.getParameters());
//
SarlAction action2 = (SarlAction) behavior.getMembers().get(1);
assertEquals("myaction", action2.getName());
assertTypeReferenceIdentifiers(action2.getFiredEvents());
assertTypeReferenceIdentifier(action2.getReturnType(), "void");
assertParameterNames(action2.getParameters(), "arg0");
assertParameterTypes(action2.getParameters(), "int");
assertParameterDefaultValues(action2.getParameters(), (Object) null);
}
@Test
public void multipleActionDefinitionsInBehavior_2() throws Exception {
SarlScript mas = file(multilineString(
"behavior B1 {",
" def myaction(arg0 : int, arg1 : int*) {",
" System.out.println(\"invalid\")",
" }",
" def myaction(arg0 : int, arg1 : int*) {",
" System.out.println(\"invalid\")",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlAction(),
IssueCodes.DUPLICATE_METHOD,
"Duplicate method myaction(int, int[]) in type B1");
}
}
public static class SkillTest extends AbstractSarlTest {
@Test
public void action_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"skill S1 implements C1 {",
" def myaction(arg : int*) {",
" System.out.println(arg)",
" }",
"}"
), 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(1, skill.getMembers().size());
//
SarlAction action1 = (SarlAction) skill.getMembers().get(0);
assertEquals("myaction", action1.getName());
assertTypeReferenceIdentifiers(action1.getFiredEvents());
assertTypeReferenceIdentifier(action1.getReturnType(), "void");
assertParameterNames(action1.getParameters(), "arg");
assertParameterTypes(action1.getParameters(), "int");
assertParameterDefaultValues(action1.getParameters(), (Object) null);
assertParameterVarArg(action1.getParameters());
}
@Test
public void action() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"skill S1 implements C1 {",
" def myaction(arg1 : char, arg2 : boolean, arg3 : int*) {",
" System.out.println(arg3)",
" }",
"}"
), 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(1, skill.getMembers().size());
//
SarlAction action1 = (SarlAction) skill.getMembers().get(0);
assertEquals("myaction", action1.getName());
assertTypeReferenceIdentifiers(action1.getFiredEvents());
assertTypeReferenceIdentifier(action1.getReturnType(), "void");
assertParameterNames(action1.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(action1.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(action1.getParameters(), null, null, null);
assertParameterVarArg(action1.getParameters());
}
@Test
public void action_invalid() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"skill S1 implements C1 {",
" def myaction(arg1 : char, arg2 : boolean*, arg3 : int) {",
" System.out.println(arg3)",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
@Test
public void constructor_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"skill S1 implements C1 {",
" new(arg : int*) {",
" System.out.println(arg)",
" }",
"}"
), 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(1, skill.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) skill.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "arg");
assertParameterTypes(constructor.getParameters(), "int");
assertParameterDefaultValues(constructor.getParameters(), (Object) null);
assertParameterVarArg(constructor.getParameters());
}
@Test
public void constructor() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"skill S1 implements C1 {",
" new (arg1 : char, arg2 : boolean, arg3 : int*) {",
" System.out.println(arg3)",
" }",
"}"
), 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(1, skill.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) skill.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(constructor.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(constructor.getParameters(), null, null, null);
assertParameterVarArg(constructor.getParameters());
}
@Test
public void constructor_invalid() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {}",
"skill S1 implements C1 {",
" new (arg1 : char, arg2 : boolean*, arg3 : int) {",
" System.out.println(arg3)",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
}
public static class CapacityTest extends AbstractSarlTest {
@Test
public void action_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {",
" def myaction(arg : int*)",
"}"
), true);
assertEquals(1, 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(), "void");
assertParameterNames(action1.getParameters(), "arg");
assertParameterTypes(action1.getParameters(), "int");
assertParameterDefaultValues(action1.getParameters(), (Object) null);
assertParameterVarArg(action1.getParameters());
}
@Test
public void action() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {",
" def myaction(arg1 : char, arg2 : boolean, arg3 : int*)",
"}"
), true);
assertEquals(1, 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(), "void");
assertParameterNames(action1.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(action1.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(action1.getParameters(), null, null, null);
assertParameterVarArg(action1.getParameters());
}
@Test
public void action_invalid() throws Exception {
SarlScript mas = file(multilineString(
"capacity C1 {",
" def myaction(arg1 : char, arg2 : boolean*, arg3 : int)",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
}
public static class EventTest extends AbstractSarlTest {
@Test
public void constructor_singleParam() throws Exception {
SarlScript mas = file(multilineString(
"event E1 {",
" new(arg : int*) {",
" System.out.println(arg)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlEvent event = (SarlEvent) mas.getXtendTypes().get(0);
assertEquals("E1", event.getName());
assertNull(event.getExtends());
assertEquals(1, event.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) event.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "arg");
assertParameterTypes(constructor.getParameters(), "int");
assertParameterDefaultValues(constructor.getParameters(), (Object) null);
assertParameterVarArg(constructor.getParameters());
}
@Test
public void constructor() throws Exception {
SarlScript mas = file(multilineString(
"event E1 {",
" new (arg1 : char, arg2 : boolean, arg3 : int*) {",
" System.out.println(arg3)",
" }",
"}"
), true);
assertEquals(1, mas.getXtendTypes().size());
//
assertTrue(Strings.isNullOrEmpty(mas.getPackage()));
//
SarlEvent event = (SarlEvent) mas.getXtendTypes().get(0);
assertEquals("E1", event.getName());
assertNull(event.getExtends());
assertEquals(1, event.getMembers().size());
//
SarlConstructor constructor = (SarlConstructor) event.getMembers().get(0);
assertParameterNames(constructor.getParameters(), "arg1", "arg2", "arg3");
assertParameterTypes(constructor.getParameters(), "char", "boolean", "int");
assertParameterDefaultValues(constructor.getParameters(), null, null, null);
assertParameterVarArg(constructor.getParameters());
}
@Test
public void constructor_invalid() throws Exception {
SarlScript mas = file(multilineString(
"event E1 {",
" new (arg1 : char, arg2 : boolean*, arg3 : int) {",
" System.out.println(arg3)",
" }",
"}"
));
validate(mas).assertError(
SarlPackage.eINSTANCE.getSarlFormalParameter(),
IssueCodes.INVALID_USE_OF_VAR_ARG,
"A vararg must be the last parameter");
}
}
}