package org.example.expressions.tests;
import com.google.inject.Inject;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtext.junit4.InjectWith;
import org.eclipse.xtext.junit4.XtextRunner;
import org.eclipse.xtext.junit4.util.ParseHelper;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.example.expressions.ExpressionsInjectorProvider;
import org.example.expressions.expressions.AbstractElement;
import org.example.expressions.expressions.ExpressionsModel;
import org.example.expressions.typing.ExpressionsType;
import org.example.expressions.typing.ExpressionsTypeProvider;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(XtextRunner.class)
@InjectWith(ExpressionsInjectorProvider.class)
@SuppressWarnings("all")
public class ExpressionsTypeProviderTest {
@Inject
@Extension
private ParseHelper<ExpressionsModel> _parseHelper;
@Inject
@Extension
private ExpressionsTypeProvider _expressionsTypeProvider;
@Test
public void intConstant() {
this.assertIntType("10");
}
@Test
public void stringConstant() {
this.assertStringType("\'foo\'");
}
@Test
public void boolConstant() {
this.assertBoolType("true");
}
@Test
public void varWithoutExpression() {
this.assertUnknownType("i = ");
}
@Test
public void varWithExpression() {
this.assertIntType("i = 0");
}
@Test
public void varRef() {
this.assertIntType("i = 0 j = \'s\' i");
}
@Test
public void varRefToVarDefinedAfter() {
this.assertUnknownType("i = j j = i i");
}
@Test
public void notExp() {
this.assertBoolType("!true");
}
@Test
public void multiExp() {
this.assertIntType("1 * 2");
}
@Test
public void divExp() {
this.assertIntType("1 / 2");
}
@Test
public void minusExp() {
this.assertIntType("1 - 2");
}
@Test
public void numericPlus() {
this.assertIntType("1 + 2");
}
@Test
public void stringPlus() {
this.assertStringType("\'a\' + \'b\'");
}
@Test
public void numAndStringPlus() {
this.assertStringType("\'a\' + 2");
}
@Test
public void numAndStringPlus2() {
this.assertStringType("2 + \'a\'");
}
@Test
public void boolAndStringPlus() {
this.assertStringType("\'a\' + true");
}
@Test
public void boolAndStringPlus2() {
this.assertStringType("false + \'a\'");
}
@Test
public void comparisonExp() {
this.assertBoolType("1 < 2");
}
@Test
public void equalityExp() {
this.assertBoolType("1 == 2");
}
@Test
public void andExp() {
this.assertBoolType("true && false");
}
@Test
public void orExp() {
this.assertBoolType("true || false");
}
@Test
public void testIsInt() {
boolean _isInt = this._expressionsTypeProvider.isInt(ExpressionsTypeProvider.intType);
Assert.assertTrue(_isInt);
}
@Test
public void testIsString() {
boolean _isString = this._expressionsTypeProvider.isString(ExpressionsTypeProvider.stringType);
Assert.assertTrue(_isString);
}
@Test
public void testIsBool() {
boolean _isBoolean = this._expressionsTypeProvider.isBoolean(ExpressionsTypeProvider.boolType);
Assert.assertTrue(_isBoolean);
}
public void assertStringType(final CharSequence input) {
this.assertType(input, ExpressionsTypeProvider.stringType);
}
public void assertIntType(final CharSequence input) {
this.assertType(input, ExpressionsTypeProvider.intType);
}
public void assertBoolType(final CharSequence input) {
this.assertType(input, ExpressionsTypeProvider.boolType);
}
public void assertUnknownType(final CharSequence input) {
this.assertType(input, null);
}
public void assertType(final CharSequence input, final ExpressionsType expectedType) {
try {
ExpressionsModel _parse = this._parseHelper.parse(input);
EList<AbstractElement> _elements = _parse.getElements();
AbstractElement _last = IterableExtensions.<AbstractElement>last(_elements);
ExpressionsType _typeFor = this._expressionsTypeProvider.typeFor(_last);
Assert.assertSame(expectedType, _typeFor);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
}