/**
 * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. 
 * This file is licensed under the terms of the Modified BSD License.
 */
package org.abs_models.frontend.delta;

import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import org.abs_models.common.WrongProgramArgumentException;
import org.abs_models.frontend.ast.ClassDecl;
import org.abs_models.frontend.ast.Model;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class DeltaAttributesIntegerTest extends DeltaTest {
    protected String product;
    protected String expected;
    public DeltaAttributesIntegerTest(String p, String x) {
        this.product = p;
        this.expected = x;
    }
    
    @Parameters
    public static java.util.Collection<?> data() {
        final Object[][] data = new String[][] {
                {"P1", "IntLiteral(0)"},
                {"P2", "IntLiteral(99)"},
        };
        return Arrays.asList(data);
    }
    
    @Test
    public void passIntegerFeatureAttribute() throws DeltaModellingException, WrongProgramArgumentException {
        // TODO: test what happens if attribute is not passed
        // + "product P3(F);"
        Model model = assertParse("module M;"
            + "delta D(Int attr);"
            + "uses M;"
            + "    adds class C { Int myField = attr; }"
            + "productline PL;"
            + "    features F;"
            + "    delta D(F.a) when F;"
            + "product P1(F{a=0});"
            + "product P2(F{a=99});");
        
        model.evaluateAllProductDeclarations();
        model.flattenForProduct(product);
        ClassDecl cls = (ClassDecl) findDecl(model, "M", "C");
        assertTrue(cls.getField(0).getName().equals("myField"));
//        System.out.println("******** expected: " + expected + " *** found: " + cls.getField(0).getInitExp().toString());

        assertTrue(cls.getField(0).getInitExp().toString().equals(expected));
    }

    public void passIntegerConstant() throws DeltaModellingException, WrongProgramArgumentException {
        Model model = assertParse("module M;"
            + "delta D(Int attr);"
            + " uses M;"
            + "    adds class C { Int myField = attr; }"
            + "productline PL;"
            + "    features A,B;"
            + "    delta D(0) when A;"
            + "    delta D(99) when B;"
            + "product P1(A);"
            + "product P2(B);");
       
        model.flattenForProduct(product);
        model.evaluateAllProductDeclarations();
        ClassDecl cls = (ClassDecl) findDecl(model, "M", "C");
        assertTrue(cls.getField(0).getName().equals("myField"));

        assertTrue(cls.getField(0).getInitExp().toString().equals(expected));
    }

}

