テストこーど

/*
 * 作成日: 2005/03/22
 *
 * FIXME この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package com.wikiroom.tpircs.checkstyle.check;

import junit.framework.TestCase;

import com.puppycrawl.tools.checkstyle.TreeWalker;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.FileContents;
import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
import com.puppycrawl.tools.checkstyle.api.LocalizedMessages;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
import com.puppycrawl.tools.checkstyle.api.Utils;

/**
 * メソッド部分だけでテストが書けなくて 寂しくもテスト対象はファイルです ふん、テストできてりゃいいんだよ。
 * 
 * @author tpircs
 */
public class TestMain extends TestCase {
    /** テスト対象ファイルディレクトリ */
    private String root = "D:/eclipse-workspace/MethodPointCheck/testFile/";

    /** テスト対象クラス */
    private MethodPointCheck methodPointCheck = new MethodPointCheck();

    /** メッセージ置き場 */
    private LocalizedMessages messages = new LocalizedMessages();

    /**
     * @see junit.framework.TestCase#setUp()
     */
    protected final void setUp() throws Exception {
        methodPointCheck.setMessages(messages);
    }

//    /**
//     * 簡単なファイルでテスト
//     */
//    public final void testSimpleFile() throws Exception {
//        FileContents contents = createFileContents(root + "Test.java");
//
//        methodPointCheck.setFileContents(contents);
//        methodPointCheck.visitToken(getMethod_DEF(contents));
//
//        assertEquals("メソッドが 24 ポイントです(最大 15 ポイントまで)。", getMessage(0));
//    }

//    /**
//     * IFのテスト
//     */
//    public final void testIFFile() throws Exception {
//        FileContents contents = createFileContents(root + "IF.java");
//
//        methodPointCheck.setFileContents(contents);
//        methodPointCheck.visitToken(getMethod_DEF(contents));
//
//        assertEquals("メソッドが 20 ポイントです(最大 15 ポイントまで)。", getMessage(0));
//    }

    /**
     * IFのテスト2
     */
    public final void testIF2File() throws Exception {
        FileContents contents = createFileContents(root + "IF2.java");

        methodPointCheck.setFileContents(contents);
        methodPointCheck.visitToken(getMethod_DEF(contents));

        assertEquals("メソッドが 22 ポイントです(最大 15 ポイントまで)。", getMessage(0));
    }

    /**
     * ためたメッセージを取得
     * @param i i番目のメッセージ
     * @return メッセージ
     */
    private String getMessage(final int i) {
        LocalizedMessage[] localizedMessages = messages.getMessages();
        return localizedMessages[i].getMessage();
    }

    /**
     * FileContentsを作成
     * @param fileName ファイル名
     * @return ファイルコンテンツ
     * @throws Exception むし
     */
    private FileContents createFileContents(final String fileName)
            throws Exception {
        final String[] lines = Utils.getLines(fileName, "Shift_JIS");
        return new FileContents(fileName, lines);
    }

    /** FileContentsからメソッド部分を取得 */
    private DetailAST getMethod_DEF(FileContents contents) throws Exception {
        final DetailAST rootAST = TreeWalker.parse(contents);
        return serchFirstMethod_def(rootAST);
    }

    /** 探す なんかこのロジックおかしい気が・・・ */
    private DetailAST serchFirstMethod_def(DetailAST aAST) {
        DetailAST target = aAST.findFirstToken(TokenTypes.METHOD_DEF);
        if (target != null) {
            return target;
        } else {
            final DetailAST child = (DetailAST) aAST.getFirstChild();
            if (child != null) {
                DetailAST temp = serchFirstMethod_def(child);
                if (temp != null) {
                    return temp;
                }
            }

            final DetailAST sibling = (DetailAST) aAST.getNextSibling();
            if (sibling != null) {
                DetailAST temp = serchFirstMethod_def(sibling);
                if (temp != null) {
                    return temp;
                }
            }
            return null;
        }
    }

    /** 痛々しい・・・ いいんだよ、これでチキショウ */
    private String 整形(String in) {
        int start = in.indexOf("メソッドが ") + "メソッドが ".length();
        int end = in.indexOf(" ポイントです");
        return in.substring(start, end);
    }
}