/**
* 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 abs.frontend.analyser.SemanticConditionList;
import abs.frontend.ast.Model;
import abs.frontend.ast.ProductLine;
public class DeltaTrieTest extends DeltaTest {
@Test
public void trieStructure1() {
Model model = assertParseOk(
"module Test;"
+ "delta D1;"
+ "delta D2;"
+ "productline PL;"
+ "features A,B;"
+ "delta D1 after D2 when A;"
+ "delta D2 when B;"
+ "root FM {"
+ " group [0..*] { A, B }"
+ "}"
);
ProductLine pl = model.getProductLine();
DeltaTrie pfgt = ProductLineTypeAnalysisHelper.buildPFGT(pl, new SemanticConditionList());
//System.out.println(pfgt.toString());
assertTrue(pfgt.getRoot().isValidProduct());
assertEquals(2, pfgt.getRoot().getChildren().size());
assertTrue(pfgt.getRoot().getChildren().get("D1").isValidProduct());
assertTrue(pfgt.getRoot().getChildren().get("D2").isValidProduct());
assertEquals(0, pfgt.getRoot().getChildren().get("D1").getChildren().size());
assertEquals(1, pfgt.getRoot().getChildren().get("D2").getChildren().size());
assertTrue(pfgt.getRoot().getChildren().get("D2").getChildren().get("D1").isValidProduct());
}
@Test
public void trieStructure2() {
Model model = assertParseOk(
"module Test;"
+ "delta D1;"
+ "delta D2;"
+ "delta D3;"
+ "productline PL;"
+ "features A,B,C;"
+ "delta D1 when A;"
+ "delta D2 after D1 when B;"
+ "delta D3 after D2 when C;"
+ "root FM {"
+ " group [0..*] { A, B, C }"
+ "}"
);
ProductLine pl = model.getProductLine();
DeltaTrie pfgt = ProductLineTypeAnalysisHelper.buildPFGT(pl, new SemanticConditionList());
assertTrue(pfgt.getRoot().isValidProduct());
assertEquals(3, pfgt.getRoot().getChildren().size());
assertTrue(pfgt.getRoot().getChildren().get("D1").isValidProduct());
assertTrue(pfgt.getRoot().getChildren().get("D2").isValidProduct());
assertTrue(pfgt.getRoot().getChildren().get("D3").isValidProduct());
assertEquals(2, pfgt.getRoot().getChildren().get("D1").getChildren().size());
assertEquals(1, pfgt.getRoot().getChildren().get("D2").getChildren().size());
assertEquals(0, pfgt.getRoot().getChildren().get("D3").getChildren().size());
assertTrue(pfgt.getRoot().getChildren().get("D1").getChildren().get("D2").isValidProduct());
assertTrue(pfgt.getRoot().getChildren().get("D1").getChildren().get("D3").isValidProduct());
assertTrue(pfgt.getRoot().getChildren().get("D2").getChildren().get("D3").isValidProduct());
}
@Test
public void trieContent() {
// TODO
Model model = assertParseOk(
"module Test;"
+ "class Ccore{}"
+ "delta D1; uses Test; adds class C1 {Int f1 = 0; Unit m1() {}}"
+ "delta D2; uses Test; adds class C2 {Int f2 = 0; Unit m2() {}}"
+ "delta D3;"
// + " modifies class Test.C1 { removes Int f1; removes Unit m1(); }"
// + " modifies class Test.C2 { adds Int f2a = 1; modifies Unit m2() {} adds Unit m2a() {} }"
+ ""
+ ""
+ ""
+ ""
+ "productline PL;"
+ "features A,B;"
+ "delta D1 when A;"
+ "delta D2 after D1 when B;"
+ "delta D3 after D1,D2 when A && B;"
+ "root FM {"
+ " group [1..*] { A, B }"
+ "}"
);
ProductLine pl = model.getProductLine();
DeltaTrie pfgt = ProductLineTypeAnalysisHelper.buildPFGT(pl, new SemanticConditionList());
// TODO: tests
}
}