ProductOperation.ceylon

import ceylon.ast.core {
    ProductOperation,
    UnioningExpression,
    MultiplyingExpression
}
import ceylon.ast.redhat {
    RedHatTransformer,
    productOperationToCeylon,
    compileProductOperation
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JProductOp=ProductOp
    }
}

shared object productOperation satisfies ConcreteTest<ProductOperation,JProductOp> {
    
    String->ProductOperation construct(String->MultiplyingExpression left, String->UnioningExpression right)
            => "``left.key``*``right.key``"->ProductOperation(left.item, right.item);
    
    shared String->ProductOperation aTimesBExpression = construct(baseExpression.aExpression, baseExpression.bExpression);
    shared String->ProductOperation intTimesFloatExpression = construct(integerLiteral._1138IntegerLiteral, floatLiteral.oPointOFortyTwoKFloatLiteral);
    
    // not tested directly, but used in other tests
    shared String->ProductOperation rTimesCosExpression => construct(baseExpression.rExpression, invocation.cosPhiInvocation);
    shared String->ProductOperation rTimesSinExpression => construct(baseExpression.rExpression, invocation.sinPhiInvocation);
    
    compile = compileProductOperation;
    fromCeylon = RedHatTransformer.transformProductOperation;
    toCeylon = productOperationToCeylon;
    codes = [aTimesBExpression, intTimesFloatExpression];
}