package org.example.smalljava.tests; import com.google.inject.Inject; import org.eclipse.emf.common.util.EList; 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.xbase.lib.Conversions; 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.smalljava.SmallJavaInjectorProvider; import org.example.smalljava.smallJava.SJClass; import org.example.smalljava.smallJava.SJMember; import org.example.smalljava.smallJava.SJMemberSelection; import org.example.smalljava.smallJava.SJMethod; import org.example.smalljava.smallJava.SJMethodBody; import org.example.smalljava.smallJava.SJProgram; import org.example.smalljava.smallJava.SJStatement; import org.example.smalljava.util.SmallJavaModelUtil; import org.example.smalljava.validation.SmallJavaAccessibility; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(XtextRunner.class) @InjectWith(SmallJavaInjectorProvider.class) @SuppressWarnings("all") public class SmallJavaAccessibilityTest { @Inject @Extension private ParseHelper<SJProgram> _parseHelper; @Inject @Extension private SmallJavaAccessibility _smallJavaAccessibility; @Test public void testFieldAccessibility() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("class A {"); _builder.newLine(); _builder.append("\t"); _builder.append("private D priv;"); _builder.newLine(); _builder.append("\t"); _builder.append("protected D prot;"); _builder.newLine(); _builder.append("\t"); _builder.append("public D pub;"); _builder.newLine(); _builder.append("\t"); _builder.append("D m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.priv; // private field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.prot; // protected field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.pub; // public field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class B extends A {"); _builder.newLine(); _builder.append("\t"); _builder.append("D m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.priv; // private field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.prot; // protected field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.pub; // public field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class C {"); _builder.newLine(); _builder.append("\t"); _builder.append("D m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("(new A()).priv; // private field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("(new A()).prot; // protected field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("(new A()).pub; // public field"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class D {}"); _builder.newLine(); SJProgram _parse = this._parseHelper.parse(_builder); EList<SJClass> _classes = _parse.getClasses(); final Procedure1<EList<SJClass>> _function = new Procedure1<EList<SJClass>>() { @Override public void apply(final EList<SJClass> it) { SJClass _get = it.get(0); Iterable<SJMethod> _methods = SmallJavaModelUtil.methods(_get); SJMethod _get_1 = ((SJMethod[])Conversions.unwrapArray(_methods, SJMethod.class))[0]; SJMethodBody _body = _get_1.getBody(); EList<SJStatement> _statements = _body.getStatements(); final Procedure1<EList<SJStatement>> _function = new Procedure1<EList<SJStatement>>() { @Override public void apply(final EList<SJStatement> it) { SJStatement _get = it.get(0); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get, true); SJStatement _get_1 = it.get(1); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_1, true); SJStatement _get_2 = it.get(2); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_2, true); } }; ObjectExtensions.<EList<SJStatement>>operator_doubleArrow(_statements, _function); SJClass _get_2 = it.get(1); Iterable<SJMethod> _methods_1 = SmallJavaModelUtil.methods(_get_2); SJMethod _get_3 = ((SJMethod[])Conversions.unwrapArray(_methods_1, SJMethod.class))[0]; SJMethodBody _body_1 = _get_3.getBody(); EList<SJStatement> _statements_1 = _body_1.getStatements(); final Procedure1<EList<SJStatement>> _function_1 = new Procedure1<EList<SJStatement>>() { @Override public void apply(final EList<SJStatement> it) { SJStatement _get = it.get(0); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get, false); SJStatement _get_1 = it.get(1); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_1, true); SJStatement _get_2 = it.get(2); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_2, true); } }; ObjectExtensions.<EList<SJStatement>>operator_doubleArrow(_statements_1, _function_1); SJClass _get_4 = it.get(2); Iterable<SJMethod> _methods_2 = SmallJavaModelUtil.methods(_get_4); SJMethod _get_5 = ((SJMethod[])Conversions.unwrapArray(_methods_2, SJMethod.class))[0]; SJMethodBody _body_2 = _get_5.getBody(); EList<SJStatement> _statements_2 = _body_2.getStatements(); final Procedure1<EList<SJStatement>> _function_2 = new Procedure1<EList<SJStatement>>() { @Override public void apply(final EList<SJStatement> it) { SJStatement _get = it.get(0); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get, false); SJStatement _get_1 = it.get(1); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_1, false); SJStatement _get_2 = it.get(2); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_2, true); } }; ObjectExtensions.<EList<SJStatement>>operator_doubleArrow(_statements_2, _function_2); } }; ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test public void testMethodAccessibility() { try { StringConcatenation _builder = new StringConcatenation(); _builder.append("class A {"); _builder.newLine(); _builder.append("\t"); _builder.append("private D priv() { return null; }"); _builder.newLine(); _builder.append("\t"); _builder.append("protected D prot() { return null; }"); _builder.newLine(); _builder.append("\t"); _builder.append("public D pub() { return null; }"); _builder.newLine(); _builder.append("\t"); _builder.append("D m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.priv(); // private method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.prot(); // protected method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.pub(); // public method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class B extends A {"); _builder.newLine(); _builder.append("\t"); _builder.append("D m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.priv(); // private method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.prot(); // protected method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("this.pub(); // public method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class C {"); _builder.newLine(); _builder.append("\t"); _builder.append("D m() {"); _builder.newLine(); _builder.append("\t\t"); _builder.append("(new A()).priv(); // private method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("(new A()).prot(); // protected method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("(new A()).pub(); // public method"); _builder.newLine(); _builder.append("\t\t"); _builder.append("return null;"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class D {}"); _builder.newLine(); SJProgram _parse = this._parseHelper.parse(_builder); EList<SJClass> _classes = _parse.getClasses(); final Procedure1<EList<SJClass>> _function = new Procedure1<EList<SJClass>>() { @Override public void apply(final EList<SJClass> it) { SJClass _get = it.get(0); Iterable<SJMethod> _methods = SmallJavaModelUtil.methods(_get); SJMethod _last = IterableExtensions.<SJMethod>last(_methods); SJMethodBody _body = _last.getBody(); EList<SJStatement> _statements = _body.getStatements(); final Procedure1<EList<SJStatement>> _function = new Procedure1<EList<SJStatement>>() { @Override public void apply(final EList<SJStatement> it) { SJStatement _get = it.get(0); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get, true); SJStatement _get_1 = it.get(1); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_1, true); SJStatement _get_2 = it.get(2); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_2, true); } }; ObjectExtensions.<EList<SJStatement>>operator_doubleArrow(_statements, _function); SJClass _get_1 = it.get(1); Iterable<SJMethod> _methods_1 = SmallJavaModelUtil.methods(_get_1); SJMethod _last_1 = IterableExtensions.<SJMethod>last(_methods_1); SJMethodBody _body_1 = _last_1.getBody(); EList<SJStatement> _statements_1 = _body_1.getStatements(); final Procedure1<EList<SJStatement>> _function_1 = new Procedure1<EList<SJStatement>>() { @Override public void apply(final EList<SJStatement> it) { SJStatement _get = it.get(0); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get, false); SJStatement _get_1 = it.get(1); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_1, true); SJStatement _get_2 = it.get(2); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_2, true); } }; ObjectExtensions.<EList<SJStatement>>operator_doubleArrow(_statements_1, _function_1); SJClass _get_2 = it.get(2); Iterable<SJMethod> _methods_2 = SmallJavaModelUtil.methods(_get_2); SJMethod _last_2 = IterableExtensions.<SJMethod>last(_methods_2); SJMethodBody _body_2 = _last_2.getBody(); EList<SJStatement> _statements_2 = _body_2.getStatements(); final Procedure1<EList<SJStatement>> _function_2 = new Procedure1<EList<SJStatement>>() { @Override public void apply(final EList<SJStatement> it) { SJStatement _get = it.get(0); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get, false); SJStatement _get_1 = it.get(1); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_1, false); SJStatement _get_2 = it.get(2); SmallJavaAccessibilityTest.this.assertMemberAccessible(_get_2, true); } }; ObjectExtensions.<EList<SJStatement>>operator_doubleArrow(_statements_2, _function_2); } }; ObjectExtensions.<EList<SJClass>>operator_doubleArrow(_classes, _function); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } private void assertMemberAccessible(final SJStatement s, final boolean expected) { final SJMemberSelection sel = ((SJMemberSelection) s); SJMember _member = sel.getMember(); boolean _isAccessibleFrom = this._smallJavaAccessibility.isAccessibleFrom(_member, sel); Assert.assertEquals(Boolean.valueOf(expected), Boolean.valueOf(_isAccessibleFrom)); } }