package spoon.test.query_function; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.function.Consumer; import org.junit.Test; /** * The main purpose of this test is to be transfomed by Spoon into Spoon model, * which is then used by {@link VariableReferencesTest} * * The values of the fields must be a sequence starting from 1 */ public class VariableReferencesModelTest { int field = 15; @Test public void localVarsInNestedBlocks() { assertTrue(this.field == 15); { { int field = 1; assertTrue(field == 1); } int f1,f2,f3,field = 2,f4; assertTrue(field == 2); } int field = 3; assertTrue(field == 3); { assertTrue(field == 3); } assertTrue(this.field == 15); } @Test public void localVarsInTryCatch() { try { int field = 4; assertTrue(field == 4); throw new IllegalArgumentException(); } catch(IllegalArgumentException e) { assertTrue(field == 15); { int field = 5; assertTrue(field == 5); } int field = 6; assertTrue(field == 6); } catch(Exception /*7*/field) { //7 field.getMessage(); } } @Test public void localVarsInWhile() { while(true) { int field = 8; assertTrue(field == 8); break; } int field = 9; assertTrue(field == 9); } @Test public void localVarsInFor() { for(int field=10;field == 10;) { assertTrue(field == 10); break; } int field = 11; assertTrue(field == 11); } @Test public void localVarsInSwitch() { switch(7) { case 7: int field=12; assertTrue(field == 12); break; } int field = 13; assertTrue(field == 13); } @Test public void localVarsInTryWithResource() throws IOException { try(/*14*/Reader field=new StringReader("")) { //14 field.toString(); } } @Test public void checkParameter() { parameter(16); } private void parameter(int field) { assertTrue(field == 16); { assertTrue(field == 16); } while(true) { assertTrue(field == 16); break; } } @Test public void parameterInLambdaWithBody() { Consumer<Integer> fnc = (field)->{ assertTrue(field == 17); }; fnc.accept(17); } @Test public void parameterInLambdaWithExpression() { Consumer<Integer> fnc = (field)->assertTrue(field == 18); fnc.accept(18); } @Test public void localVarInLambda() { Runnable fnc = ()->{ int field = 19; assertTrue(field == 19); }; fnc.run(); int field = 20; Runnable fnc2 = ()->{ assertTrue(field == 20); }; fnc2.run(); } static { int field = 21; assertTrue(field == 21); } { int field = 22; assertTrue(field == 22); } /* * check localVariable shadowed in Local class method by another LocalVariable declaration */ @Test public void localVarInNestedClass() { int field = 23; assertTrue(field == 23); Runnable fnc = new Runnable(){ @Override public void run() { { int field = 24; assertTrue(field == 24); } assertTrue(field == 23); int field = 25; assertTrue(field == 25); } }; fnc.run(); assertTrue(field == 23); } /* * check localVariable shadowed in Local class method by CtField 27 */ @Test public void localVarInNestedClass2() { int field = 26; assertTrue(field == 26); Runnable fnc = new Runnable(){ int field = 27; @Override public void run() { { int field = 36; assertTrue(field == 36); } assertTrue(field == 27); int field = 28; assertTrue(field == 28); assertTrue(this.field == 27); } }; fnc.run(); assertTrue(field == 26); } class A { int field = 29; } abstract class B extends A { abstract void run(); } /* * check localVariable shadowed in Local class method by inherited CtField 29 */ @Test public void localVarInNestedClass4() { int field = 30; assertTrue(field == 30); B fnc = new B(){ @Override public void run() { { int field = 31; assertTrue(field == 31); } assertTrue(field == 29); int field = 32; assertTrue(field == 32); assertTrue(this.field == 29); } }; fnc.run(); assertTrue(field == 30); } /* * check localVariable shadowed in Local class anonymous executable by inherited CtField 29 */ @Test public void localVarInNestedClass5() { int field = 33; assertTrue(field == 33); class Local { { { int field = 34; assertTrue(field == 34); } assertTrue(field == 33); int field = 35; assertTrue(field == 35); } } new Local(); assertTrue(field == 33); } /* * check localVariable shadowed in Local class method by method parameter 39 */ @Test public void localVarInNestedClass6() { int field = 37; assertTrue(field == 37); class Local { int field = 38; void method(int field) { assertTrue(field == 39); assertTrue(this.field == 38); } } new Local().method(39); assertTrue(field == 37); } /* * The value of maxValue must be equal to maximum value of all variable values assigned above. * It is here mainly to keep this model consistent. * If you write new test method, then always update this maxValue */ private static final int maxValue = 39; }