/**
* 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 org.junit.Test;
import org.hamcrest.core.IsInstanceOf;
import abs.common.WrongProgramArgumentException;
import abs.frontend.analyser.ErrorMessage;
import abs.frontend.ast.*;
import abs.frontend.parser.SyntaxError;
public class DeltaAttributesMixedTest extends DeltaTest {
@Test
public void passFeaturesAsBooleans() throws DeltaModellingException, WrongProgramArgumentException {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool a, Bool b, Bool c, Int c_a1);"
+ "uses M;"
+ " adds class C { "
+ " Bool fA = a; "
+ " Bool fB = b; "
+ " Bool fC = c; "
+ " Int fC_a1 = c_a1; "
+ " }"
+ "productline PL;"
+ " features A,B,C;"
+ " delta D(A, B, C, C.a1) when C;"
+ "product P1( C{a1=99} );"
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
ClassDecl cls = (ClassDecl) findDecl(model, "M", "C");
assertEquals("fA", cls.getField(0).getName());
assertEquals("False()", cls.getField(0).getInitExp().value.toString());
assertEquals("fB", cls.getField(1).getName());
assertEquals("False()", cls.getField(1).getInitExp().value.toString());
assertEquals("fC", cls.getField(2).getName());
assertEquals("True()", cls.getField(2).getInitExp().value.toString());
assertEquals("fC_a1", cls.getField(3).getName());
assertEquals("IntLiteral(99)", cls.getField(3).getInitExp().value.toString());
}
@Test
public void passBooleanFeatureAttributes1() throws DeltaModellingException, WrongProgramArgumentException {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool a1, Bool a2);"
+ "uses M;"
+ " adds class C { Bool first = a1; Bool second = a2; }"
+ "productline PL;"
+ " features F;"
+ " delta D(F.a, F.b) when F;"
+ "product P1( F{a=True, b=False} );"
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
ClassDecl cls = (ClassDecl) findDecl(model, "M", "C");
assertEquals("first", cls.getField(0).getName());
assertEquals("True()", cls.getField(0).getInitExp().value.toString());
assertEquals("second", cls.getField(1).getName());
assertEquals("False()", cls.getField(1).getInitExp().value.toString());
}
@Test
public void passBooleanFeatureAttributes1b() throws DeltaModellingException, WrongProgramArgumentException {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool a1, Int a2);"
+ "uses M;"
+ " adds class C { Bool first = a1; Int second = a2; }"
+ "productline PL;"
+ " features F;"
+ " delta D(F.a, F.b) when F;"
+ "product P1( F{a=True, b=3} );"
, Config.WITH_STD_LIB, Config.TYPE_CHECK
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
ClassDecl cls = (ClassDecl) findDecl(model, "M", "C");
assertEquals("first", cls.getField(0).getName());
assertEquals("True()", cls.getField(0).getInitExp().value.toString());
assertEquals("second", cls.getField(1).getName());
assertEquals("IntLiteral(3)", cls.getField(1).getInitExp().value.toString());
}
@Test
public void passBooleanFeatureAttributes2() throws DeltaModellingException, WrongProgramArgumentException {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(F.a) when F;"
+ "product P1( F{a=True} );"
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
ClassDecl cls = (ClassDecl) findDecl(model, "M", "C");
assertEquals("attr", cls.getField(0).getName());
assertEquals("True()", cls.getField(0).getInitExp().value.toString());
//TODO test the value of x
}
@Test(expected=DeltaModellingException.class)
public void passBooleanFeatureAttributes2b() throws Exception {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(F.b) when F;"
+ "product P1( F{a=True} );"
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
}
@Test
public void passBooleanFeatureAttributes3() throws DeltaModellingException, WrongProgramArgumentException {
Model m = assertParse(
"module M;"
+ "delta D(Bool a1, Bool a2, Bool a3);"
+ "uses M;"
+ " adds class C { Bool a1 = a1; Bool a2 = a2; Bool a3 = a3; }"
+ "productline PL;"
+ " features A; delta D(A, B) when A;"
+ "product P1(A);",
Config.TYPE_CHECK, Config.EXPECT_TYPE_ERROR);
// There should be a type error if the Config defines only two delta params, but the delta itself expects 3
assertEquals(ErrorMessage.WRONG_NUMBER_OF_ARGS, m.getTypeErrors().getFirstError().msg);
}
@Test
public void passBooleanFeatureAttributes4() throws Exception {
Model model = assertParse(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(F.a) when F;"
+ "product P1( F{a=3} );"
, Config.WITH_STD_LIB, Config.TYPE_CHECK, Config.EXPECT_TYPE_ERROR
);
assertEquals(ErrorMessage.CANNOT_ASSIGN,model.getTypeErrors().getFirstError().msg);
}
@Test
public void passBooleanFeatureAttributes4b() throws Exception {
Model model = assertParse(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(3) when F;"
+ "product P1( F );"
, Config.WITH_STD_LIB, Config.TYPE_CHECK, Config.EXPECT_TYPE_ERROR
);
assertEquals(ErrorMessage.CANNOT_ASSIGN,model.getTypeErrors().getFirstError().msg);
}
@Test
public void passBooleanFeatureAttributes4Flat() throws Exception {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(F.a) when F;"
+ "product P1( F{a=3} );"
, Config.WITH_STD_LIB
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
assertTrue(model.hasTypeErrors());
assertEquals(ErrorMessage.CANNOT_ASSIGN,model.getTypeErrors().getFirstError().msg);
}
@Test
public void deltaParserNPE1() throws Exception {
assertParseError(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(F.a) when F;"
+ "product P1( F{a=} );"
);
}
@Test
public void deltaParserIlltyped() throws Exception {
Model model = assertParseOk(
"module M;"
+ "delta D(Bool attr);"
+ "uses M;"
+ " adds class C { Bool attr = attr; Unit m() {Bool x = attr;} }"
+ "productline PL;"
+ " features F; delta D(F.a) when F;"
+ "product P1( F{a=Blue} );"
);
model.evaluateAllProductDeclarations();
model.flattenForProduct("P1");
assertTrue(model.hasTypeErrors());
}
}