package org.example.expressions.tests; import com.google.inject.Inject; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.junit4.util.ParseHelper; import org.eclipse.xtext.junit4.validation.ValidationTestHelper; import org.eclipse.xtext.validation.Issue; import org.eclipse.xtext.xbase.lib.Exceptions; import org.eclipse.xtext.xbase.lib.Extension; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xbase.lib.ObjectExtensions; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; import org.example.expressions.ExpressionsInjectorProvider; import org.example.expressions.expressions.AbstractElement; import org.example.expressions.expressions.ExpressionsModel; import org.example.expressions.expressions.ExpressionsPackage; import org.example.expressions.typing.ExpressionsType; import org.example.expressions.typing.ExpressionsTypeProvider; import org.example.expressions.validation.ExpressionsValidator; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(XtextRunner.class) @InjectWith(ExpressionsInjectorProvider.class) @SuppressWarnings("all") public class ExpressionsValidatorTest { @Inject @Extension private ParseHelper<ExpressionsModel> _parseHelper; @Inject @Extension private ValidationTestHelper _validationTestHelper; @Test public void testForwardReference() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("i = j j = 10"); ExpressionsModel _parse = this._parseHelper.parse(_builder); EClass _variableRef = ExpressionsPackage.eINSTANCE.getVariableRef(); this._validationTestHelper.assertError(_parse, _variableRef, ExpressionsValidator.FORWARD_REFERENCE, "variable forward reference not allowed: \'j\'"); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test public void testForwardReferenceInExpression() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("i = 1 j+i j = 10"); ExpressionsModel _parse = this._parseHelper.parse(_builder); final Procedure1<ExpressionsModel> _function = new Procedure1<ExpressionsModel>() { @Override public void apply(final ExpressionsModel it) { EClass _variableRef = ExpressionsPackage.eINSTANCE.getVariableRef(); ExpressionsValidatorTest.this._validationTestHelper.assertError(it, _variableRef, ExpressionsValidator.FORWARD_REFERENCE, "variable forward reference not allowed: \'j\'"); EClass _expression = ExpressionsPackage.eINSTANCE.getExpression(); ExpressionsValidatorTest.this._validationTestHelper.assertError(it, _expression, ExpressionsValidator.WRONG_TYPE, "null type"); List<Issue> _validate = ExpressionsValidatorTest.this._validationTestHelper.validate(it); int _size = _validate.size(); Assert.assertEquals(2, _size); } }; ObjectExtensions.<ExpressionsModel>operator_doubleArrow(_parse, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test public void testWrongNotType() { this.assertType("!10", ExpressionsTypeProvider.intType, ExpressionsTypeProvider.boolType); } @Test public void testWrongMulOrDivType() { this.assertType("10 * true", ExpressionsTypeProvider.boolType, ExpressionsTypeProvider.intType); this.assertType("\'10\' / 10", ExpressionsTypeProvider.stringType, ExpressionsTypeProvider.intType); } @Test public void testWrongMinusType() { this.assertType("10 - true", ExpressionsTypeProvider.boolType, ExpressionsTypeProvider.intType); this.assertType("\'10\' - 10", ExpressionsTypeProvider.stringType, ExpressionsTypeProvider.intType); } @Test public void testWrongAndType() { this.assertType("10 && true", ExpressionsTypeProvider.intType, ExpressionsTypeProvider.boolType); this.assertType("false && \'10\'", ExpressionsTypeProvider.stringType, ExpressionsTypeProvider.boolType); } @Test public void testWrongOrType() { this.assertType("10 || true", ExpressionsTypeProvider.intType, ExpressionsTypeProvider.boolType); this.assertType("false || \'10\'", ExpressionsTypeProvider.stringType, ExpressionsTypeProvider.boolType); } @Test public void testWrongEqualityType() { this.assertSameType("10 == true", ExpressionsTypeProvider.intType, ExpressionsTypeProvider.boolType); this.assertSameType("false != \'10\'", ExpressionsTypeProvider.boolType, ExpressionsTypeProvider.stringType); } @Test public void testWrongComparisonType() { this.assertSameType("10 < \'1\'", ExpressionsTypeProvider.intType, ExpressionsTypeProvider.stringType); this.assertSameType("\'10\' > 10", ExpressionsTypeProvider.stringType, ExpressionsTypeProvider.intType); } @Test public void testWrongBooleanComparison() { this.assertNotBooleanType("10 < true"); this.assertNotBooleanType("false > 0"); this.assertNotBooleanType("false > true"); } @Test public void testWrongBooleanPlus() { this.assertNotBooleanType("10 + true"); this.assertNotBooleanType("false + 0"); this.assertNotBooleanType("false + true"); } public void assertType(final CharSequence input, final ExpressionsType expectedWrongType, final ExpressionsType expectedActualType) { try { ExpressionsModel _parse = this._parseHelper.parse(input); EList<AbstractElement> _elements = _parse.getElements(); AbstractElement _last = IterableExtensions.<AbstractElement>last(_elements); final Procedure1<AbstractElement> _function = new Procedure1<AbstractElement>() { @Override public void apply(final AbstractElement it) { EClass _expression = ExpressionsPackage.eINSTANCE.getExpression(); ExpressionsValidatorTest.this._validationTestHelper.assertError(it, _expression, ExpressionsValidator.WRONG_TYPE, ((("expected " + expectedActualType) + " type, but was ") + expectedWrongType)); } }; ObjectExtensions.<AbstractElement>operator_doubleArrow(_last, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } public void assertSameType(final CharSequence input, final ExpressionsType expectedLeft, final ExpressionsType expectedRight) { try { ExpressionsModel _parse = this._parseHelper.parse(input); EList<AbstractElement> _elements = _parse.getElements(); AbstractElement _last = IterableExtensions.<AbstractElement>last(_elements); final Procedure1<AbstractElement> _function = new Procedure1<AbstractElement>() { @Override public void apply(final AbstractElement it) { EClass _expression = ExpressionsPackage.eINSTANCE.getExpression(); ExpressionsValidatorTest.this._validationTestHelper.assertError(it, _expression, ExpressionsValidator.WRONG_TYPE, ((("expected the same type, but was " + expectedLeft) + ", ") + expectedRight)); } }; ObjectExtensions.<AbstractElement>operator_doubleArrow(_last, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } public void assertNotBooleanType(final CharSequence input) { try { ExpressionsModel _parse = this._parseHelper.parse(input); EList<AbstractElement> _elements = _parse.getElements(); AbstractElement _last = IterableExtensions.<AbstractElement>last(_elements); final Procedure1<AbstractElement> _function = new Procedure1<AbstractElement>() { @Override public void apply(final AbstractElement it) { EClass _expression = ExpressionsPackage.eINSTANCE.getExpression(); ExpressionsValidatorTest.this._validationTestHelper.assertError(it, _expression, ExpressionsValidator.WRONG_TYPE, "cannot be boolean"); } }; ObjectExtensions.<AbstractElement>operator_doubleArrow(_last, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } }