/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.common; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import abs.backend.BackendTestDriver; @RunWith(Parameterized.class) public class ObjectTests extends SemanticTests { public ObjectTests(BackendTestDriver d) { super(d); } @Test public void nullCompare() { assertEvalTrue("interface I {} { Bool testresult = False; I i = null; if (i == null) testresult = True; }"); } @Test public void refEq() { assertEvalTrue("interface I {} class C implements I {} { I i1 = new local C(); Bool testresult = i1 == i1; }"); } @Test public void refEq2() { assertEvalTrue("interface I {} class C implements I {} { I i1 = new local C(); I i2 = new local C(); Bool testresult = !(i1 == i2); }"); } @Test public void refGt() { assertEvalTrue("interface I {} class C implements I {} { I i1 = new local C(); I i2 = new local C(); Bool testresult = i1 > i2 || i2 > i1; }"); } @Test public void refLt() { assertEvalTrue("interface I {} class C implements I {} { I i1 = new local C(); I i2 = new local C(); Bool testresult = i1 < i2 || i2 < i1; }"); } @Test public void refGtEq() { assertEvalTrue("interface I {} class C implements I {} { I i1 = new local C(); I i2 = new local C(); Bool testresult = i1 >= i2 || i1 < i2; }"); } @Test public void refLtEq() { assertEvalTrue("interface I {} class C implements I {} { I i1 = new local C(); I i2 = new local C(); Bool testresult = i1 <= i2 || i1 > i2; }"); } @Test public void futLt() { assertEvalTrue("interface I {Int m(Int i); Unit doit();}" + "class C implements I {Bool flag = False; Int m (Int i) {await flag; return i;} Unit doit() {flag = True;}}" + "{I i1 = new C(); I i2 = new C(); Bool reforder = i1 < i2; Int inti1 = if reforder then 1 else 2; Int inti2 = if reforder then 2 else 1; Fut<Int> fi1 = i1!m(inti1); Fut<Int> fi2 = i2!m(inti2); Bool futorder = fi1 < fi2; i1!doit(); i2!doit(); fi1.get; fi2.get; Bool testresult = if futorder then fi1 < fi2 else fi2 < fi1;}"); } @Test public void refLtDiffClass() { assertEvalTrue("interface I {}" + "class C1 implements I {}" + "class C2 implements I {}" + "{ I i1 = new C1(); I i2 = new C2(); Bool testresult = i1 < i2 || i2 < i1; }"); } @Test public void classDecl() { assertEvalTrue("class C { } { Bool testresult = True; }"); } private static String EMPTY_CLASS_C = "interface I { } class C implements I { }"; @Test public void intfClassDecl() { assertEvalTrue(EMPTY_CLASS_C + "{ Bool testresult = True; I i; }"); } @Test public void newExp() { assertEvalTrue(EMPTY_CLASS_C + " { Bool testresult = True; I i = new local C();}"); } private static String CLASS_WITH_METHOD = "interface I { Bool m(); } class C implements I { Bool m() { return True; } }"; @Test public void methodCall() { assertEvalTrue(CLASS_WITH_METHOD + " { Bool testresult = True; I i = new local C(); testresult = i.m();}"); } private static String INTERFACE_I = "interface I { Bool m(); }"; private static String CLASS_WITH_FIELD = INTERFACE_I + " class C(Bool f) implements I { Bool m() { return this.f; } }"; private static String CALL_M = " { Bool testresult = True; I i = new local C(True); testresult = i.m();}"; @Test public void fieldAccess() { assertEvalTrue(CLASS_WITH_FIELD + CALL_M); } private static String CLASS_WITH_ASSIGN = INTERFACE_I + "class C(Bool f) implements I { Bool x = False; Bool m() { this.x = this.f; return this.x; } }"; @Test public void fieldAssign() { assertEvalTrue(CLASS_WITH_ASSIGN + CALL_M); } private static String CLASS_WITH_INITBLOCK = INTERFACE_I + "class C(Bool f) implements I { Bool x = False; { x = True; } Bool m() { return this.x; } }"; @Test public void initBlock() { assertEvalTrue(CLASS_WITH_INITBLOCK + CALL_M); } @Test public void classParamReadInFieldAssign() { assertEvalTrue(INTERFACE_I + " class C(Bool f) implements I { Bool x = f; Bool m() { return this.x; } }" + CALL_M); } @Test public void classMethodShadowsField1() { assertEvalTrue("interface I { Bool m(Bool f); } class C(Bool f) implements I { Bool m(Bool f) { return f; } }" + "{ Bool testresult = False; I i = new local C(False); testresult = i.m(True);}"); } @Test public void classMethodShadowsField2() { assertEvalTrue("interface I { Bool m(Bool f); } class C(Bool f) implements I { Bool m(Bool f) { return this.f; } }" + "{ Bool testresult = False; I i = new local C(True); testresult = i.m(False);}"); } @Test public void fieldPatternMatch() { assertEvalTrue(INTERFACE_I + "class C(Bool f) implements I { Int a=2; Int b=4; Bool m() { return case 2 {a => True;}; } }" + CALL_M); } @Test public void fieldPatternMatch2() { assertEvalTrue(INTERFACE_I + "class C(Bool f) implements I { Int a=2; Int b=4; Bool m() { return case 2 {a => True;} && case 4{b=> True;}; } }" + CALL_M); } @Test public void fieldPatternMatchNestedCaseStmt() { assertEvalTrue(INTERFACE_I + "class C(Bool f) implements I { Int a=2; Int b=4; Bool m() { Bool result= False; case 2 {a => {Int u=7; case 2 { a=> result=True;}} b => {Int u=3; result=False;}} return result; } }" + CALL_M); } @Test public void fieldPatternMatchNestedCaseExpr() { assertEvalTrue(INTERFACE_I + "class C(Bool f) implements I { Int a=2; Int b=4; Bool m() { return case 2 {a => case 2 { a=> True;} ; b => False ;}; } }" + CALL_M); } @Test public void testFutST1() { assertEvalTrue("interface A {} interface B extends A {} interface I { A mA(); B mB(); } { case False { True => { I o = null; Fut<A> f = o!mB();} False => {skip;}} Bool testresult = True; }"); } }