/*
 * Copyright 2010 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.drools.reteoo.test.parser;

import java.util.List;

import org.antlr.runtime.tree.CommonTree;
import org.drools.reteoo.test.dsl.DslStep;
import org.drools.reteoo.test.dsl.NodeTestDef;
import org.drools.reteoo.test.dsl.NodeTestCase;

/**
 * A factory used by the DSL parser
 */
public class NodeTestDSLFactory {
    
    public static enum Context {
        SETUP, TEARDOWN, TEST;
    }

    private NodeTestCase testCase;
    private NodeTestDef test;
    private DslStep step;
    private Context current;
    
    public NodeTestCase createTestCase( String name ) {
        testCase = new NodeTestCase( cleanString( name ) );
        return testCase;
    }
    
    public void createSetup() {
        current = Context.SETUP;
    }
    
    public void createTearDown() {
        current = Context.TEARDOWN;
    }

    public void createTest( CommonTree testToken, CommonTree name ) {
        current = Context.TEST;
        test = new NodeTestDef( cleanString( name.getText() ), testToken.getLine() );
        testCase.addTest( test );
    }
    
    @SuppressWarnings("unchecked")
    public void createStep( CommonTree ctx, List<CommonTree> params ) {
        step = new DslStep( ctx.getLine(), ctx.getText() );
        for( CommonTree param : params ) {
            String[] cmds = new String[param.getChildCount()];
            int i = 0;
            for( CommonTree child : (List<CommonTree>) param.getChildren() ) {
                cmds[ i++ ] = child.getText();
            }
            step.addCommand( cmds );
        }
        switch( current ) {
            case SETUP : 
                testCase.addSetupStep( step );
                break;
            case TEARDOWN :
                testCase.addTearDownStep( step );
                break;
            case TEST :
                test.addStep( step );
                break;
        }
    }
    
    private String cleanString( String text ) {
        return ( text != null && text.length() > 2 ) ? text.substring( 1, text.length()-1 ) : "";
    }
    
}
