/*
 * Copyright 2004-2015 the Seasar Foundation and the Others.
 *
 * 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.seasar.framework.unit;

import java.lang.reflect.Method;

import org.seasar.extension.dataset.ColumnType;
import org.seasar.extension.dataset.types.ColumnTypes;
import org.seasar.framework.aop.interceptors.MockInterceptor;
import org.seasar.framework.container.AspectDef;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.convention.NamingConvention;

/**
 * S2JUnit4の内部的なテストコンテキストです。
 * <p>
 * テストクラスから直接利用してはいけません。
 * </p>
 * 
 * @author taedium
 */
public interface InternalTestContext extends TestContext {

    /**
     * テストクラスを設定します。
     * 
     * @param testClass
     *            テストクラス
     */
    void setTestClass(Class<?> testClass);

    /**
     * テストメソッドを設定します。
     * 
     * @param testMethod
     *            テストメソッド
     */
    void setTestMethod(Method testMethod);

    /**
     * 命名規約を設定します。
     * 
     * @param namingConvention
     *            命名規約
     */
    void setNamingConvention(NamingConvention namingConvention);

    /**
     * S2コンテナを初期化します。
     * 
     */
    void initContainer();

    /**
     * S2コンテナを破棄します。
     * 
     */
    void destroyContainer();

    /**
     * 設定ファイルをインクルードします。
     * 
     */
    void include();

    /**
     * テスト用のデータを準備します。
     * 
     */
    void prepareTestData();

    /**
     * テストのコンテキストで利用するコンテナを返します。
     * 
     * @return コンテナ
     */
    S2Container getContainer();

    /**
     * モックインターセプターを登録します。
     * 
     * @param mockInterceptor
     *            モックインターセプター
     */
    void addMockInterceptor(MockInterceptor mockInterceptor);

    /**
     * コンテナから<code>componentKey</code>をキーにして取得できるコンポーネント定義に<code>aspectDef</code>で表されるアスペクト定義を追加します。
     * 
     * @param componentKey
     *            コンポーネントのキー
     * @param aspectDef
     *            アスペクト定義
     */
    void addAspecDef(Object componentKey, AspectDef aspectDef);

    /**
     * EJB3が使用可能の場合<code>true</code>を返します。
     * 
     * @return EJB3が使用可能の場合<code>true</code>、そうでない場合<code>false</code>
     */
    boolean isEjb3Enabled();

    /**
     * JTAが使用可能の場合<code>true</code>を返します。
     * 
     * @return JTAが使用可能の場合<code>true</code>、そうでない場合<code>false</code>
     */
    boolean isJtaEnabled();

    /**
     * {@link ColumnType カラムの型}を{@link ColumnTypes}に登録します。
     */
    void registerColumnTypes();

    /**
     * {@link #registerColumnTypes()}で登録した{@link ColumnType カラムの型}を元に戻します。
     */
    void revertColumnTypes();
}
