SumOperation.ceylon

import ceylon.ast.core {
    ScalingExpression,
    AddingExpression,
    SumOperation
}
import ceylon.ast.redhat {
    RedHatTransformer,
    sumOperationToCeylon,
    compileSumOperation
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JSumOp=SumOp
    }
}

shared object sumOperation satisfies ConcreteTest<SumOperation,JSumOp> {
    
    String->SumOperation construct(String->AddingExpression left, String->ScalingExpression right) => "``left.key``+``right.key``"->SumOperation(left.item, right.item);
    
    shared String->SumOperation onePlusOneExpression = construct(integerLiteral.oneIntegerLiteral, integerLiteral.oneIntegerLiteral);
    shared String->SumOperation aTimesBPlusCExpression = construct(productOperation.aTimesBExpression, baseExpression.cExpression);
    
    // not tested directly, but used by other tests
    shared String->SumOperation helloPlusNameElseWorldExpression = construct(stringLiteral.helloStringLiteral, groupedExpression.nameElseWorldStringLiteralGroupedExpression);
    """`"Hello, " + (name else "World") + "!"`"""
    shared String->SumOperation helloPlusNameElseWorldPlusBangExpression = construct(helloPlusNameElseWorldExpression, stringLiteral.bangStringLiteral);
    shared String->SumOperation onePlusInterestRateExpression = construct(integerLiteral.oneIntegerLiteral, baseExpression.interestRateExpression);
    shared String->SumOperation xySquaredSumExpression = construct(exponentiationOperation.xSquaredOperation, exponentiationOperation.ySquaredOperation);
    
    compile = compileSumOperation;
    fromCeylon = RedHatTransformer.transformSumOperation;
    toCeylon = sumOperationToCeylon;
    codes = [onePlusOneExpression, aTimesBPlusCExpression];
}