/**
* 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.analyser;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import abs.frontend.FrontendTest;
import abs.frontend.ast.*;
import abs.frontend.typechecker.KindedName;
import abs.frontend.typechecker.KindedName.Kind;
public class VarResolutionTest extends FrontendTest {
@Test
public void testLocalVar() {
Exp e = getSecondExp("interface I { } { I i = null; i = i; }");
VarUse u = (VarUse) e;
VarDecl decl = (VarDecl) u.getDecl();
assertEquals("i", decl.getName());
}
@Test
public void testPatternVar() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = case b { True => False; x => !x; };");
NegExp ne = (NegExp) getSecondCaseExpr(m);
VarUse v = (VarUse) ne.getOperand();
PatternVarDecl decl = (PatternVarDecl) v.getDecl();
assertEquals("x", decl.getName());
}
@Test
public void testNestedPatternVar() {
Model m = assertParseOkStdLib("data Foo = Bar(Bool); def Bool m(Foo f) = case f { Bar(y) => y; };");
assertThat(getFirstCaseExpr(m),instanceOf(VarUse.class));
ConstructorPattern p = (ConstructorPattern) getFirstCasePattern(m);
PatternVarDecl decl = ((PatternVar) p.getParam(0)).getVar();
assertEquals("y", decl.getName());
}
@Test
public void testFunctionParam() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = b;");
VarUse u = (VarUse) getFirstFunctionExpr(m);
ParamDecl d = (ParamDecl) u.getDecl();
assertEquals("b", d.getName());
}
@Test
public void testLetExp() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = let (Bool x) = b in x;");
LetExp e = (LetExp) getFirstFunctionExpr(m);
VarOrFieldDecl decl = e.getVar();
VarUse u = (VarUse) e.getExp();
assertEquals(decl, u.getDecl());
}
@Test
public void testNestedLetExp() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = let (Bool x) = let (Bool y) = b in y in x;");
LetExp e = (LetExp) getFirstFunctionExpr(m);
VarOrFieldDecl decl = e.getVar();
VarUse u = (VarUse) e.getExp();
assertEquals(decl, u.getDecl());
}
@Test
public void testNestedLetExp2() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = let (Bool x) = let (Bool x) = b in x in x;");
LetExp e = (LetExp) getFirstFunctionExpr(m);
VarOrFieldDecl decl = e.getVar();
VarUse u = (VarUse) e.getExp();
assertEquals(decl, u.getDecl());
}
@Test
public void testNestedLetExp3() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = let (Bool x) = b in let (Bool y) = b in x;");
LetExp e = (LetExp) getFirstFunctionExpr(m);
LetExp e2 = (LetExp) e.getExp();
VarOrFieldDecl decl = e.getVar();
VarUse u = (VarUse) e2.getExp();
assertEquals(decl, u.getDecl());
}
@Test
public void testNestedLetExp4() {
Model m = assertParseOkStdLib(" def Bool f(Bool b) = let (Bool x) = b in let (Bool x) = b in x;");
LetExp e = (LetExp) getFirstFunctionExpr(m);
LetExp e2 = (LetExp) e.getExp();
VarOrFieldDecl decl = e2.getVar();
VarUse u = (VarUse) e2.getExp();
assertEquals(decl, u.getDecl());
}
@Test
public void testNestedLetExp5() {
Model m = assertParseOkStdLib("def Bool f(Bool b) = let (Bool x) = b in let (Bool x) = x in x;");
LetExp e = (LetExp) getFirstFunctionExpr(m);
LetExp e2 = (LetExp) e.getExp();
VarOrFieldDecl decl = e.getVar();
VarUse u = (VarUse) e2.getVal();
assertEquals(decl, u.getDecl());
}
@Test
public void testFieldUse() {
Model m = assertParseOkStdLib(" class C { Bool f; Bool m() { return this.f; } }");
ClassDecl d = (ClassDecl) getTestModule(m).lookup(new KindedName(Kind.CLASS, "UnitTest.C"));
FieldDecl f = d.getField(0);
ReturnStmt s = (ReturnStmt) d.getMethod(0).getBlock().getStmt(0);
assertEquals(f, ((FieldUse) s.getRetExp()).getDecl());
}
static private ModuleDecl getTestModule(Model m) {
ModuleDecl md = m.lookupModule("UnitTest");
assertNotNull("Module UnitTest not found", md);
return md;
}
}