/*
* 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.assertNull;
import static org.junit.Assert.assertTrue;
import com.google.common.base.Strings;
import org.eclipse.xtext.common.types.TypesPackage;
import org.eclipse.xtext.diagnostics.Diagnostic;
import org.eclipse.xtext.xbase.XNullLiteral;
import org.eclipse.xtext.xbase.XNumberLiteral;
import org.eclipse.xtext.xbase.XbasePackage;
import org.junit.Test;
import io.sarl.lang.sarl.SarlAction;
import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlField;
import io.sarl.lang.sarl.SarlPackage;
import io.sarl.lang.sarl.SarlScript;
import io.sarl.tests.api.AbstractSarlTest;
/**
* @author $Author: sgalland$
* @version $Name$ $Revision$ $Date$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
@SuppressWarnings("all")
public class VarDeclarationParsingTest extends AbstractSarlTest {
@Test
public void variableDeclaration_SarlFieldScope_xtend() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"var List<Integer> list",
"var i = 45",
"var double j = 45",
"}"
));
validate(mas)
.assertError(
SarlPackage.eINSTANCE.getSarlAgent(),
Diagnostic.SYNTAX_DIAGNOSTIC,
"mismatched input '<' expecting '}");
}
@Test
public void variableDeclaration_localScope_xtend() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"var int i",
"var j = 45",
"var double k = 45",
"System.out.println(i)",
"System.out.println(j)",
"System.out.println(k)",
"}",
"}"
));
Validator validator = validate(mas);
validator.assertError(
XbasePackage.eINSTANCE.getXFeatureCall(),
Diagnostic.LINKING_DIAGNOSTIC,
"The method or field i is undefined");
validator.assertError(
XbasePackage.eINSTANCE.getXFeatureCall(),
Diagnostic.LINKING_DIAGNOSTIC,
"The method or field k is undefined");
}
@Test
public void variableDeclaration_SarlFieldScope() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"var list : List<Integer>",
"var i = 45",
"var j : double = 45",
"}"
), 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(3, agent.getMembers().size());
//
SarlField attr1 = (SarlField) agent.getMembers().get(0);
assertEquals("list", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "java.util.List<java.lang.Integer>");
assertNull(attr1.getInitialValue());
//
SarlField attr2 = (SarlField) agent.getMembers().get(1);
assertEquals("i", attr2.getName());
assertNull(attr2.getType());
assertXExpression(attr2.getInitialValue(), XNumberLiteral.class, "45");
//
SarlField attr3 = (SarlField) agent.getMembers().get(2);
assertEquals("j", attr3.getName());
assertTypeReferenceIdentifier(attr3.getType(), "double");
assertXExpression(attr3.getInitialValue(), XNumberLiteral.class, "45");
}
@Test
public void variableDeclaration_localScope() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"def myaction {",
"var i : List<Integer>",
"var j = 45",
"var k : double = 45",
"System.out.println(i)",
"System.out.println(j)",
"System.out.println(k)",
"}",
"}"
), 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());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters());
}
@Test
public void valueDeclaration_SarlFieldScope_xtend() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"val List<Integer> list",
"val i = 45",
"val double j = 45",
"}"
));
validate(mas)
.assertError(
SarlPackage.eINSTANCE.getSarlAgent(),
Diagnostic.SYNTAX_DIAGNOSTIC,
"mismatched input '<' expecting '}");
}
@Test
public void valueDeclaration_localScope_xtend() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"val int i",
"val j = 45",
"val double k = 45",
"System.out.println(i)",
"System.out.println(j)",
"System.out.println(k)",
"}",
"}"
));
Validator validator = validate(mas);
validator.assertError(
XbasePackage.eINSTANCE.getXFeatureCall(),
Diagnostic.LINKING_DIAGNOSTIC,
"The method or field i is undefined");
validator.assertError(
XbasePackage.eINSTANCE.getXFeatureCall(),
Diagnostic.LINKING_DIAGNOSTIC,
"The method or field k is undefined");
}
@Test
public void valueDeclaration_SarlFieldScope() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"val list : List<Integer> = null",
"val i = 45",
"val j : double = 45",
"}"
), 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(3, agent.getMembers().size());
//
SarlField attr1 = (SarlField) agent.getMembers().get(0);
assertEquals("list", attr1.getName());
assertTypeReferenceIdentifier(attr1.getType(), "java.util.List<java.lang.Integer>");
assertXExpression(attr1.getInitialValue(), XNullLiteral.class, null);
//
SarlField attr2 = (SarlField) agent.getMembers().get(1);
assertEquals("i", attr2.getName());
assertNull(attr2.getType());
assertXExpression(attr2.getInitialValue(), XNumberLiteral.class, "45");
//
SarlField attr3 = (SarlField) agent.getMembers().get(2);
assertEquals("j", attr3.getName());
assertTypeReferenceIdentifier(attr3.getType(), "double");
assertXExpression(attr3.getInitialValue(), XNumberLiteral.class, "45");
}
@Test
public void valueDeclaration_localScope() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"val j = 45",
"val k : double = 45",
"System.out.println(j)",
"System.out.println(k)",
"}",
"}"
), 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());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters());
}
@Test
public void forLoop_xtend() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"var list : List<Integer>",
"def myaction {",
"for( Number i : list) {",
"System.out.println(i)",
"}",
"}",
"}"
));
validate(mas).assertError(
XbasePackage.eINSTANCE.getXFeatureCall(),
Diagnostic.SYNTAX_DIAGNOSTIC,
"missing ';' at 'i'");
}
@Test
public void forLoop_inferredType() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"var list : List<Integer>",
"def myaction {",
"for( i : list) {",
"System.out.println(i)",
"}",
"}",
"}"
), 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(2, agent.getMembers().size());
//
SarlField attr = (SarlField) agent.getMembers().get(0);
assertEquals("list", attr.getName());
assertTypeReferenceIdentifier(attr.getType(), "java.util.List<java.lang.Integer>");
assertNull(attr.getInitialValue());
//
SarlAction action = (SarlAction) agent.getMembers().get(1);
assertEquals("myaction", action.getName());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters());
}
@Test
public void forLoop_explicitType() throws Exception {
SarlScript mas = file(multilineString(
"import java.util.List",
"agent A1 {",
"var list : List<Integer>",
"def myaction {",
"for( i as Number : list) {",
"System.out.println(i)",
"}",
"}",
"}"
), 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(2, agent.getMembers().size());
//
SarlField attr = (SarlField) agent.getMembers().get(0);
assertEquals("list", attr.getName());
assertTypeReferenceIdentifier(attr.getType(), "java.util.List<java.lang.Integer>");
assertNull(attr.getInitialValue());
//
SarlAction action = (SarlAction) agent.getMembers().get(1);
assertEquals("myaction", action.getName());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters());
}
@Test
public void catch_xtend() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"try {",
"System.out.println(\"G\")",
"}",
"catch(Throwable e) {",
"System.out.println(e)",
"}",
"}",
"}"
));
validate(mas).assertError(
TypesPackage.eINSTANCE.getJvmParameterizedTypeReference(),
Diagnostic.SYNTAX_DIAGNOSTIC,
"missing ':' at 'e'");
}
@Test
public void catch_oneType() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"try {",
"System.out.println(\"G\")",
"}",
"catch(e : Throwable) {",
"System.out.println(e)",
"}",
"}",
"}"
), 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());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters());
}
@Test
public void multicatch_xtend() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"try {",
"System.out.println(\"G\")",
"}",
"catch(Exception e) {",
"System.out.println(e)",
"}",
"catch(Throwable e) {",
"System.out.println(e)",
"}",
"}",
"}"
));
validate(mas).assertError(
TypesPackage.eINSTANCE.getJvmParameterizedTypeReference(),
Diagnostic.SYNTAX_DIAGNOSTIC,
"missing ':' at 'e'");
}
@Test
public void multicatch_oneType() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def myaction {",
"try {",
"System.out.println(\"G\")",
"}",
"catch(e : Exception) {",
"System.out.println(e)",
"}",
"catch(e : Throwable) {",
"System.out.println(e)",
"}",
"}",
"}"
), 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());
assertTypeReferenceIdentifier(action.getReturnType(), "void");
assertParameterNames(action.getParameters());
}
@Test
public void closure_xtend() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def mycall(a : int, f : (Number,Number) => int) {",
"return a + f.apply",
"}",
"def myaction {",
"mycall(4) [ Float a, Integer b |",
" 2 * a.floatValue + b.intValue",
"]",
"}",
"}"
));
validate(mas).assertError(
XbasePackage.eINSTANCE.getXClosure(),
Diagnostic.SYNTAX_DIAGNOSTIC,
"mismatched input ',' expecting ']'");
}
@Test
public void closure_twoParams() throws Exception {
SarlScript mas = file(multilineString(
"agent A1 {",
"def mycall(a : int, f : (Float,Integer) => float) : float {",
"return a + f.apply(5.45f, 6)",
"}",
"def myaction : void {",
"mycall(4) [ a : Float, b : Integer |",
" 2f * a.floatValue + b.intValue",
"]",
"}",
"}"
), 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(2, agent.getMembers().size());
//
SarlAction action1 = (SarlAction) agent.getMembers().get(0);
assertEquals("mycall", action1.getName());
assertTypeReferenceIdentifier(action1.getReturnType(), "float");
assertParameterNames(action1.getParameters(), "a", "f");
assertParameterTypes(action1.getParameters(), "int", "(java.lang.Float, java.lang.Integer)=>float");
assertParameterDefaultValues(action1.getParameters(), null, null);
//
SarlAction action2 = (SarlAction) agent.getMembers().get(1);
assertEquals("myaction", action2.getName());
assertTypeReferenceIdentifier(action2.getReturnType(), "void");
assertParameterNames(action2.getParameters());
}
}