Block.ceylon

import ceylon.ast.core {
    Block,
    Declaration,
    Statement
}
import ceylon.ast.redhat {
    RedHatTransformer,
    blockToCeylon,
    compileBlock
}
import com.redhat.ceylon.compiler.typechecker.tree {
    Tree {
        JBlock=Block
    }
}

shared object block satisfies ConcreteTest<Block,JBlock> {
    
    String->Block construct(<String->Declaration|Statement>* content)
            => "{``"".join(content*.key)``}"->Block(content*.item);
    
    shared String->Block emptyBlock = construct();
    shared String->Block printHelloWorldBlock = construct(invocationStatement.printHelloWorldStatement);
    shared String->Block printPersonNameBlock = construct(invocationStatement.printPersonNameStatement);
    
    // not tested directly, but used by other tests
    shared String->Block cartesianConstructorBlock = construct(
        valueDeclaration.floatXDeclaration,
        valueDeclaration.floatYDeclaration,
        valueSpecification.thisXSpecifyX,
        valueSpecification.thisYSpecifyY,
        valueSpecification.thisRSpecifySqrt,
        valueSpecification.thisPhiSpecifyAtan2
    );
    shared String->Block polarConstructorBlock = construct(
        valueDeclaration.floatRDeclaration,
        valueDeclaration.floatPhiDeclaration,
        valueSpecification.thisXSpecifyProduct,
        valueSpecification.thisYSpecifyProduct,
        valueSpecification.thisRSpecifyR,
        valueSpecification.thisPhiSpecifyPhi
    );
    shared String->Block originValueConstructorBlock = construct(
        valueSpecification.xSpecify0,
        valueSpecification.ySpecify0,
        valueSpecification.rSpecify0,
        valueSpecification.phiSpecify0
    );
    
    compile = compileBlock;
    fromCeylon = RedHatTransformer.transformBlock;
    toCeylon = blockToCeylon;
    codes = [emptyBlock, printHelloWorldBlock, printPersonNameBlock];
}