/** * 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 java.util.List; import java.util.Set; import org.junit.Test; import abs.common.WrongProgramArgumentException; import abs.frontend.ast.Model; import abs.frontend.ast.ProductDecl; import abs.frontend.ast.ProductLine; public class DeltaOrderingTest extends DeltaTest { @Test(expected=DeltaModellingException.class) public void circularOrder1() throws DeltaModellingException, WrongProgramArgumentException { Model model = assertParseOk( "module M;" + "delta D1;" + "delta D2;" + "productline PL;" + "features A;" + "delta D1 after D2 when A;" + "delta D2 after D1 when A;" + "product P(A);" ); model.flattenForProduct("P"); } @Test(expected=DeltaModellingException.class) public void circularOrder2() throws DeltaModellingException, WrongProgramArgumentException { Model model = assertParseOk( "module M;" + "delta D1;" + "delta D2;" + "delta D3;" + "delta D4;" + "productline PL;" + "features A;" + "delta D1 after D2 when A;" + "delta D2 after D1 when A;" + "delta D3 after D1 when A;" + "delta D1 after D4 when A;" + "product P(A);" ); model.flattenForProduct("P"); } @Test public void properSorting1() throws DeltaModellingException, WrongProgramArgumentException { Model model = assertParseOk( "module Test;" + "delta D1;" + "delta D2;" + "productline PL;" + "features A,B;" + "delta D1 when A;" + "delta D2 after D1 when B;" + "product P1(A);" + "product P2(A, B);" ); model.evaluateAllProductDeclarations(); ProductDecl prod = model.findProduct("P1"); ProductLine pl = model.getProductLine(); Set<String> deltaids = pl.findApplicableDeltas(prod.getProduct()); List<String> sorted_deltaids = pl.sortDeltas(deltaids); assertArrayEquals(new String[]{ "D1" }, sorted_deltaids.toArray()); prod = model.findProduct("P2"); deltaids = pl.findApplicableDeltas(prod.getProduct()); sorted_deltaids = pl.sortDeltas(deltaids); assertArrayEquals(new String[]{ "D1", "D2" }, sorted_deltaids.toArray()); } @Test public void properSorting9() throws DeltaModellingException, WrongProgramArgumentException { Model model = assertParseOk( "module Test;" + "delta D1;" + "delta D2;" + "delta D3;" + "delta D4;" + "delta D5;" + "delta D6;" + "delta D7;" + "delta D8;" + "delta D9;" + "productline PL;" + "features A,B,C,D,E,F,G,H,I;" + "delta D1 after D2 when A;" + "delta D2 after D3 when B;" + "delta D3 after D4 when C;" + "delta D4 after D5 when D;" + "delta D5 after D6 when E;" + "delta D6 after D7 when F;" + "delta D7 after D8 when G;" + "delta D8 after D9 when H;" + "delta D9 when I;" + "product P1(A,B,C,D,E,F,G,H,I);" + "product P2(A,C,E,G,I);" ); model.evaluateAllProductDeclarations(); ProductDecl prod = model.findProduct("P1"); ProductLine pl = model.getProductLine(); Set<String> deltaids = pl.findApplicableDeltas(prod.getProduct()); List<String> sorted_deltaids = pl.sortDeltas(deltaids); assertArrayEquals(new String[]{"D9", "D8", "D7", "D6", "D5", "D4", "D3", "D2", "D1" }, sorted_deltaids.toArray()); prod = model.findProduct("P2"); deltaids = pl.findApplicableDeltas(prod.getProduct()); sorted_deltaids = pl.sortDeltas(deltaids); assertArrayEquals(new String[]{ "D9", "D7", "D5", "D3", "D1" }, sorted_deltaids.toArray()); } }