/******************************************************************************* * Copyright (c) 2012 BMW Car IT 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.jnario.validation; import static org.eclipse.xtend.core.xtend.XtendPackage.Literals.XTEND_TYPE_DECLARATION__NAME; import static org.jnario.jvmmodel.DoubleArrowSupport.isDoubleArrow; import java.util.List; import org.eclipse.emf.ecore.EPackage; import org.eclipse.xtend.core.xtend.XtendClass; import org.eclipse.xtext.common.types.JvmTypeReference; import org.eclipse.xtext.common.types.util.TypeReferences; import org.eclipse.xtext.validation.AbstractDeclarativeValidator; import org.eclipse.xtext.validation.Check; import org.eclipse.xtext.xbase.XBinaryOperation; import org.eclipse.xtext.xbase.XExpression; import org.eclipse.xtext.xbase.typesystem.IBatchTypeResolver; import org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference; import org.eclipse.xtext.xbase.util.XExpressionHelper; import org.jnario.Assertion; import org.jnario.ExampleCell; import org.jnario.ExampleRow; import org.jnario.ExampleTable; import org.jnario.JnarioPackage; import org.jnario.MockLiteral; import org.jnario.ShouldThrow; import org.jnario.compiler.JnarioExpressionHelper; import org.jnario.jvmmodel.TestRuntimeProvider; import org.jnario.runner.Named; import org.jnario.util.MockingSupport; import com.google.common.collect.Lists; import com.google.inject.Inject; /** * @author Sebastian Benz - Initial contribution and API */ public class JnarioJavaValidator extends AbstractDeclarativeValidator { private static final String ILLEGAL_ASSERTION_EXPRESSION = "invalid type: expecting boolean"; @Inject private JnarioExpressionHelper expressionHelper; @Inject private TypeReferences typeReferences; @Inject private TestRuntimeProvider runtimeProvider; @Inject private IBatchTypeResolver typeResolver; @Check public void checkShouldThrow(ShouldThrow shouldThrow){ if(expressionHelper.isLiteral(shouldThrow.getExpression())){ error("Literals cannot throw exceptions", null); } } @Check public void checkClassPath(MockLiteral clazz) { if (typeReferences.findDeclaredType(MockingSupport.CLASS_NAME, clazz) == null) { error("If you want to use mocking, you need the mandatory library bundle 'org.mockito' 0.1.0 or higher on the classpath.", clazz, null, JnarioIssueCodes.JNARIO_LIB_NOT_ON_CLASSPATH); } } @Check public void checkClassPath(XtendClass clazz) { if (typeReferences.findDeclaredType(Named.class, clazz) == null) { error("Mandatory library bundle 'org.jnario.lib' 0.1.0 or higher not found on the classpath.", clazz, XTEND_TYPE_DECLARATION__NAME, JnarioIssueCodes.JNARIO_LIB_NOT_ON_CLASSPATH); } try { runtimeProvider.get(clazz); } catch (Exception e) { error(e.getMessage(), clazz, XTEND_TYPE_DECLARATION__NAME, JnarioIssueCodes.JUNIT_NOT_ON_CLASSPATH); } } @Check public void checkTypesForShould(XBinaryOperation should){ if(!isDoubleArrow(should)){ return; } } @Override protected List<EPackage> getEPackages() { return Lists.<EPackage>newArrayList(JnarioPackage.eINSTANCE); } @Check public void checkExpressionsInTableDoNotReturnVoid(ExampleRow row){ for (ExampleCell cell : row.getCells()) { LightweightTypeReference actualType = typeResolver.resolveTypes(cell).getActualType(cell.getExpression()); if(actualType.isPrimitiveVoid()){ error("Expression must not be void", cell, null, 0); } } } @Check public void checkExampleHeaderAndRowsHaveSameColumnNumber(ExampleTable exampleTable){ if(!exampleTable.isValid()){ error("Examples rows have to have the same number of columns", JnarioPackage.Literals.EXAMPLE_TABLE__NAME); } } }