/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.frontend.delta;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import org.junit.Test;
import abs.frontend.ast.*;
import abs.frontend.typechecker.KindedName;
import abs.frontend.typechecker.KindedName.Kind;
import abs.frontend.typechecker.UnknownType;
public class VarResolutionTest extends DeltaTest {
@Test
public void fromAddFieldModifierToCoreTest() {
Model model = assertParseOk(
"module M;"
+ "class C {"
+ "Int x = 0;"
+ "}"
+ "delta D; uses M;"
+ "modifies class C {"
+ "adds Int y = x;"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(0);
AddFieldModifier mod = (AddFieldModifier) mmod.getModifier(0);
// until a delta is applied, we may not be able to tell vars from fields:
assertThat(mod.getFieldDecl().getInitExp() , instanceOf(VarUse.class));
assertEquals(UnknownType.INSTANCE,mod.getFieldDecl().getInitExp().getType());
}
@Test
public void fromAddFieldModifierToCoreTest2() {
Model model = assertParseOk(
"module M;"
+ "class C {"
+ "Int x = 0;"
+ "}"
+ "delta D;uses M;"
+ "modifies class C {"
+ "adds Int y = x;"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(0);
mmod.apply();
ModuleDecl m = model.lookupModule("M");
ClassDecl c = (ClassDecl) m.lookup(new KindedName(Kind.CLASS, "C"));
FieldDecl fy = (FieldDecl) c.locallookupVarOrFieldName("y", true);
assertThat(fy.getInitExp() , instanceOf(FieldUse.class));
}
@Test
public void fromAddMethodModifierToCoreTest() {
Model model = assertParseOk(
"module M;"
+ "class C {"
+ "Int x = 0;"
+ "}"
+ "delta D;uses M;"
+ "modifies class C {"
+ "adds Int getX() { return x; }"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(0);
DeltaTraitModifier mod = (DeltaTraitModifier) mmod.getModifier(0);
AddMethodModifier opr = (AddMethodModifier)mod.getMethodModifier();
TraitSetExpr expr = (TraitSetExpr)opr.getTraitExpr();
ReturnStmt stmt = (ReturnStmt) expr.getMethodImpl(0).getBlock().getStmt(0);
assertThat(stmt.getRetExp(), instanceOf(FieldUse.class));
}
@Test
public void fromModifyMethodModifierToCoreTest() {
Model model = assertParseOk(
"module M;"
+ "class C {"
+ "Int x = 0;"
+ "Int getX() { }"
+ "}"
+ "delta D;uses M;"
+ "modifies class C {"
+ "modifies Int getX() { return x; }"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(0);
DeltaTraitModifier mod = (DeltaTraitModifier) mmod.getModifier(0);
ModifyMethodModifier opr = (ModifyMethodModifier)mod.getMethodModifier();
TraitSetExpr expr = (TraitSetExpr)opr.getTraitExpr();
ReturnStmt stmt = (ReturnStmt) expr.getMethodImpl(0).getBlock().getStmt(0);
assertThat(stmt.getRetExp(), instanceOf(FieldUse.class));
}
@Test
public void fromModifierToSameClassModifierTest() {
Model model = assertParseOk(
"module M;"
+ "class C { }"
+ "delta D;uses M;"
+ "modifies class C {"
+ "adds Int x = 0;"
+ "adds Int getX() { return x; }"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(0);
DeltaTraitModifier mod = (DeltaTraitModifier) mmod.getModifier(1);
AddMethodModifier opr = (AddMethodModifier)mod.getMethodModifier();
TraitSetExpr expr = (TraitSetExpr)opr.getTraitExpr();
ReturnStmt stmt = (ReturnStmt) expr.getMethodImpl(0).getBlock().getStmt(0);
assertThat(stmt.getRetExp(), instanceOf(FieldUse.class));
}
@Test
public void fromModifierToOtherModifyClassModifierTest() {
Model model = assertParseOk(
"module M;"
+ "class C { }"
+ "delta D;"
+ "uses M;"
+ "modifies class C {"
+ "adds Int x = 0;"
+ "}"
+ " modifies class C {"
+ "adds Int getX() { return x; }"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(1);
DeltaTraitModifier mod = (DeltaTraitModifier) mmod.getModifier(0);
AddMethodModifier opr = (AddMethodModifier)mod.getMethodModifier();
TraitSetExpr expr = (TraitSetExpr)opr.getTraitExpr();
ReturnStmt stmt = (ReturnStmt) expr.getMethodImpl(0).getBlock().getStmt(0);
assertThat(stmt.getRetExp(), instanceOf(FieldUse.class));
}
@Test
public void fromModifierToOtherAddClassModifierTest() {
Model model = assertParseOk(
"module M;"
+ "delta D;"
+ "uses M;"
+ "adds class C {"
+ "Int x = 0;"
+ "}"
+ "modifies class C {"
+ "adds Int getX() { return x; }"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(1);
DeltaTraitModifier mod = (DeltaTraitModifier) mmod.getModifier(0);
AddMethodModifier opr = (AddMethodModifier)mod.getMethodModifier();
TraitSetExpr expr = (TraitSetExpr)opr.getTraitExpr();
ReturnStmt stmt = (ReturnStmt) expr.getMethodImpl(0).getBlock().getStmt(0);
assertThat(stmt.getRetExp(), instanceOf(FieldUse.class));
}
@Test
public void nonFieldTest() {
Model model = assertParseOk(
"module M;"
+ "class C {"
+ "Int x = 0;"
+ "}"
+ "delta D;"
+ "uses M;"
+ "modifies class C {"
+ "adds Int getX() { Int x = 17; return x; }"
+ "}"
);
DeltaDecl delta = findDelta(model, "D");
ModifyClassModifier mmod = (ModifyClassModifier) delta.getModuleModifier(0);
DeltaTraitModifier mod = (DeltaTraitModifier) mmod.getModifier(0);
AddMethodModifier opr = (AddMethodModifier)mod.getMethodModifier();
TraitSetExpr expr = (TraitSetExpr)opr.getTraitExpr();
ReturnStmt stmt = (ReturnStmt) expr.getMethodImpl(0).getBlock().getStmt(1);
assertThat(stmt.getRetExp(), instanceOf(VarUse.class));
}
@Test
public void defUseMultipleFiles() throws Exception {
Model m = this.assertParseFilesOk(new HashSet<String>() {{ add("tests/abssamples/deltas/defuse/def.abs"); add("tests/abssamples/deltas/defuse/use.abs");}}, true);
m.collapseTraitModifiers();
m.evaluateAllProductDeclarations();
m.flushCache();
m.flattenForProduct("Prod");
m.flushCache();
assertTrue(!m.typeCheck().containsErrors());
}
}