/*******************************************************************************
* Copyright (c) 2008,2010 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.emf.mwe2.language.tests.validation;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.mwe2.language.tests.TestSetup;
import org.eclipse.emf.mwe2.language.tests.factory.ComponentA;
import org.eclipse.emf.mwe2.language.tests.factory.ComponentAFactory;
import org.eclipse.emf.mwe2.language.tests.factory.SubTypeOfComponentA;
import org.eclipse.emf.mwe2.language.validation.Mwe2JavaValidator;
import org.eclipse.xtext.diagnostics.Severity;
import org.eclipse.xtext.junit4.AbstractXtextTests;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.util.CancelIndicator;
import org.eclipse.xtext.util.StringInputStream;
import org.eclipse.xtext.validation.CheckMode;
import org.eclipse.xtext.validation.Issue;
import org.junit.Test;
public class Mwe2ValidatorTest extends AbstractXtextTests {
@Override
public void setUp() throws Exception {
super.setUp();
with(new TestSetup());
}
@Test public void testAssignability() throws Exception {
String textModel = "module foo "+ComponentA.class.getName()+" { y = true }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),1,list.size());
assertEquals(Mwe2JavaValidator.INCOMPATIBLE_ASSIGNMENT, list.get(0).getCode());
}
@Test public void testAssignability_2() throws Exception {
String textModel = "module foo "+ComponentA.class.getName()+" { y = 'foo' x = 'bar' }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(1,list.size());
assertEquals(Mwe2JavaValidator.INCOMPATIBLE_ASSIGNMENT, list.get(0).getCode());
}
@Test public void testAssignability_3() throws Exception {
String textModel = "module foo "+ComponentA.class.getName()+" { x = "+SubTypeOfComponentA.class.getName()+"{} }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(0,list.size());
}
@Test public void testAssignability_4() throws Exception {
String textModel = "module foo "+SubTypeOfComponentA.class.getName()+" { sub = "+ComponentA.class.getName()+"{} }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(1,list.size());
assertEquals(Mwe2JavaValidator.INCOMPATIBLE_ASSIGNMENT, list.get(0).getCode());
}
@Test public void testAssignability_withFactory() throws Exception {
String textModel = "module foo "+ComponentA.class.getName()+" { x = "+ComponentAFactory.class.getName()+"{} }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(0,list.size());
}
@Test public void testVarAssignability_withFactory() throws Exception {
String textModel = "module foo var "+ComponentA.class.getName()+" x = "+ComponentAFactory.class.getName()+"{} String {}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),1,list.size()); // unused WARNING
}
@Test public void testVarAssignability_1() throws Exception {
String textModel = "module foo var "+String.class.getName()+" x = 'x' String {}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),1,list.size()); // unused WARNING
}
@Test public void testVarAssignability_2() throws Exception {
String textModel = "module foo var "+String.class.getName()+" x = true String {}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),2,list.size()); // unused WARNING
}
@Test public void testVarAssignability_3() throws Exception {
String textModel = "module foo var "+Boolean.class.getName()+" x = true String {}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),1,list.size()); // unused WARNING
}
@Test public void testVarAssignability_4() throws Exception {
String textModel = "module foo var "+Boolean.class.getName()+" x = 'foo' String {}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),2,list.size()); // unused WARNING
}
@Test public void testUnusedLocalVariable() throws Exception {
String textModel = "module foo var foo = 'holla' "+ComponentA.class.getName()+" : ups{ x = ups y = foo }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(0,list.size());
}
@Test public void testUnusedLocalVariable_1() throws Exception {
String textModel = "module foo var foo = 'holla' "+ComponentA.class.getName()+" : ups{ x = ups }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(1,list.size());
assertEquals(Mwe2JavaValidator.UNUSED_LOCAL, list.get(0).getCode());
assertEquals(Severity.WARNING, list.get(0).getSeverity());
}
@Test public void testUnusedLocalVariable_2() throws Exception {
String textModel = "module foo var foo = 'holla' "+ComponentA.class.getName()+" : ups { y = foo }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(1,list.size());
assertEquals(Mwe2JavaValidator.UNUSED_LOCAL, list.get(0).getCode());
assertEquals(Severity.WARNING, list.get(0).getSeverity());
}
@Test public void testUnusedLocalVariable_3() throws Exception {
String textModel = "module foo var foo = 'holla' var bar = '${foo}!' "+ComponentA.class.getName()+"{ y = bar}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),0,list.size());
}
@Test public void testUnusedLocalVariable_4() throws Exception {
String textModel = "module foo var y = 'holla' "+ComponentA.class.getName()+" auto-inject { }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),0,list.size());
}
@Test public void testUnusedLocalVariable_5() throws Exception {
String textModel = "module foo var y = 'holla' "+ComponentA.class.getName()+" auto-inject { y = 'zonk' }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(1,list.size());
assertEquals(Mwe2JavaValidator.UNUSED_LOCAL, list.get(0).getCode());
assertEquals(Severity.WARNING, list.get(0).getSeverity());
}
@Test public void testUnusedLocalVariable_6() throws Exception {
String textModel = "module foo var y = 'holla' "+ComponentA.class.getName()+" auto-inject { y = y }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),0,list.size());
}
@Test public void testUnusedLocalVariable_7() throws Exception {
String textModel = "module foo var y = 'holla' "+ComponentA.class.getName()+" auto-inject { y = '${y}' }";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),0,list.size());
}
@Test public void testUnusedLocalVariable_8() throws Exception {
String textModel_1 = "module foo var foo.bar = 'holla' @bar auto-inject {}";
String textModel_2 = "module bar var foo.bar = '' "+ComponentA.class.getName()+" { y = foo.bar }";
EObject model_2 = getModel(textModel_2);
Resource resource_1 = model_2.eResource().getResourceSet().createResource(URI.createURI("does_not_matter.mwe2"));
resource_1.load(new StringInputStream(textModel_1), null);
List<Issue> list = validate(resource_1.getContents().get(0));
assertEquals(list.toString(),0,list.size());
}
@Test public void testDuplicateLocalVariable_1() throws Exception {
String textModel = "module foo var foo = 'holla' var foo = '${foo}!' "+ComponentA.class.getName()+"{ y = foo}";
EObject model = getModel(textModel);
List<Issue> list = validate(model);
assertEquals(list.toString(),2,list.size());
assertEquals(Mwe2JavaValidator.DUPLICATE_LOCAL, list.get(1).getCode());
assertEquals(Severity.ERROR, list.get(1).getSeverity());
}
@Test public void testMandatoryProperty_1() throws Exception {
String textModel_1 = "module foo @bar { foo = 'zonk' }";
String textModel_2 = "module bar var foo.bar var foo "+ComponentA.class.getName()+" { y = foo.bar }";
EObject model_2 = getModel(textModel_2);
Resource resource_1 = model_2.eResource().getResourceSet().createResource(URI.createURI("does_not_matter.mwe2"));
resource_1.load(new StringInputStream(textModel_1), null);
List<Issue> list = validate(resource_1.getContents().get(0));
assertEquals(list.toString(), 1, list.size());
assertEquals(Mwe2JavaValidator.MISSING_MANDATORY_FEATURE, list.get(0).getCode());
assertEquals(Severity.ERROR, list.get(0).getSeverity());
assertTrue(list.get(0).getMessage(), list.get(0).getMessage().contains("foo.bar"));
}
private List<Issue> validate(EObject model) {
XtextResource res = ((XtextResource)model.eResource());
List<Issue> list = res.getResourceServiceProvider().getResourceValidator().validate(res, CheckMode.ALL, CancelIndicator.NullImpl);
return list;
}
}