Index: [Article Count Order] [Thread]

Date:  Thu, 14 Sep 2000 20:00:15 +0900
From:  firo <firo@....jp>
Subject:  [XP-jp:00883] Re: VXP タスク3 --Config
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <00Sep14.200111jst.115202@....jp>
References:  <00Sep13.194931jst.115202@....jp>
Posted:  Thu, 14 Sep 2000 20:01:08 +0900
X-Mail-Count: 00883

矢崎です。続きです。

(太郎さん)
今コーヒー飲みながら次郎君から聞いたんだけれど、
Configファイルにある頭が「X-」で始まるものは、RFC
で決まっていないものということで、まあ、設定者が
好きに決めれるみたい。だから、これは自由設定OKと
いうことで、それ専用のアクセサを作らないで、Config
に書いてある順番で取り出せるようにしよう(あくまでも
頭が「X-」で始まるものだけ)。でも、MLの名前だけは、
これは仮の宛先に使われるんだよね。きっと。だから
こいつは特別扱いする必要あり。ということで、getName
はそのままっと。

えーとtestConstructor1と3を書きなおせばいいかな?
あ、それと、Configファイルの中身もテストメソッド自身に
書かせちゃおう。testConstructor1と3に必要だから、
こんな感じ?

・・・・
/*
 * @(#)ConfigTest.java
 */
package XP.jp.co.esm.wiki.extremedomo;

import junit.framework.*;
import java.io.*;
import java.util.*;

public class ConfigTest extends TestCase {

    public ConfigTest(String name) {
        super(name);
    }

    public static void main(String[] args) {
        junit.textui.TestRunner.run(ConfigTest.class);
    }

    public void testConstructor1(){
        FileOutputStream fo;
        try{
            fo = new FileOutputStream("config");
        }catch(FileNotFoundException e){
            throw new RuntimeException("unable to open config file");
        }
        PrintWriter pw = new PrintWriter(fo);
        pw.println("X-ML-Name: extremeprogramming-jp");
        pw.println("Y-ML-Name: extremeprogramming-false");
        pw.println("X-Mail-Count: 00796");
        pw.println("Y-Mail-Count: 00888");
        pw.println("X-MLServer: fml [fml 2.1_GAMMA#185](distribute only
mode)");
        pw.println("Y-MLServer: fml [fml 2.1_GAMMA#185](not distribute
only mode)");
        pw.println("X-ML-Info: If you have a question, contact with me");
        pw.println("Y-ML-Info: If you have a question, do not contact with
me");
        pw.close();
        try{
            fo.close();
        }catch(IOException e){
            throw new RuntimeException("error on closing  config file");
        }

        Config aConfig = new Config("config");
        assertEquals("test1", "extremeprogramming-jp", aConfig.getName());

        Iterator iterator = aConfig.getXInfo();
        assertEquals("test2", "X-ML-Name: extremeprogramming-jp",
iterator.next( ));
        assertEquals("test3", "X-Mail-Count: 00796", iterator.next( ));
        assertEquals("test4", "X-MLServer: fml [fml
2.1_GAMMA#185](distribute only mode)", iterator.next());
        assertEquals("test5", "X-ML-Info: If you have a question, contact
with me", iterator.next());
        assert("test6", ! iterator.hasNext());

    }

    public void testConstructor2(){

        try{
            Config aConfig = new Config("nonconfig");
            fail("Should raise an IllegalArgumentException");
        }catch(IllegalArgumentException e){
            assert(true);
        }

    }

    public void testConstructor3(){
        FileOutputStream fo;
        try{
            fo = new FileOutputStream("badconfig");
        }catch(FileNotFoundException e){
            throw new RuntimeException("unable to open badconfig file");
        }
        PrintWriter pw = new PrintWriter(fo);
        pw.println("Y-ML-Name: extremeprogramming-false");
        pw.println("X-Mail-Count: 00796");
        pw.println("Y-Mail-Count: 00888");
        pw.println("X-MLServer: fml [fml 2.1_GAMMA#185](distribute only
mode)");
        pw.println("Y-MLServer: fml [fml 2.1_GAMMA#185](not distribute
only mode)");
        pw.println("X-ML-Info: If you have a question, contact with me");
        pw.println("Y-ML-Info: If you have a question, do not contact with
me");
        pw.close();
        try{
            fo.close();
        }catch(IOException e){
            throw new RuntimeException("error on closing badconfig file");

        }

        Config aConfig = new Config("badconfig");

        try{
            aConfig.getName();
            fail("Should raise an IllegalArgumentException1");
        }catch(IllegalArgumentException e){
            assert(true);
        }

    }

    protected void setUp() {
    }

    protected void tearDown(){
    }

}

・・・・

(太郎さん)
コンパイルしてっと、、、ConfigにgetXInfoってのを追加すること
にしたからコンパイルは当然今は通りません。

では、次はConfigの修正。
getName以外は全ていらなくなったから削除。それとgetXInfoを
追加っと。

・・・・
/*
 * @(#)Config.java
 */
package XP.jp.co.esm.wiki.extremedomo;

import java.util.*;

public class Config {
    public Config(String nameOfConfigFile) {
    }

    public String getName() {
        return null;
    }

    public Iterator getXInfo() {
        return null;
    }
}

・・・・
(太郎さん)
これでConfigとConfigTestをコンパイル。

コンパイルはOK.。じゃ、次はテスト

Runが3でFailuresも3、よしと。

では、Configの中身を埋めていこう。

・・・・
/*
 * @(#)Config.java
 */
package XP.jp.co.esm.wiki.extremedomo;

import java.util.*;
import java.io.*;

public class Config {

    public Config(String nameOfConfigFile) {

        FileReader fileIn;
        BufferedReader bufIn;
        String fileLine;

        try{
            fileIn = new FileReader(nameOfConfigFile);
            bufIn = new BufferedReader(fileIn);
        }catch(FileNotFoundException e){
            throw new IllegalArgumentException();
        }

        xList = new ArrayList();

        while(true){
            try{
                fileLine = bufIn.readLine();
            }catch(IOException e){
                break;
            }
            if (fileLine == null) break;
            if (fileLine.startsWith("X-ML-Name:"))
                name = fileLine.substring("X-ML-Name:".length()).trim();
            if (fileLine.startsWith("X-")) xList.add(fileLine.trim());
        }

        try{
            bufIn.close();
            fileIn.close();
        }catch(IOException e){
        }

    }

    public String getName() {
        return name;
    }

    public Iterator getXInfo() {
        return xList.iterator();
    }

    String name;
    List xList;
}

・・・・
(太郎さん)
コンパイルはOK。でもコンストラクタがだらだらっと
なっちゃってるな。smellだよね。後でリファクタリング
しなくちゃ。花子さん、やってくんないかな?
それとExceptionのところも、見なおししなきゃ。これも
後から、、、

じゃ、とりあえずテストをしよう。。

 testConstructor1と2は通ったけど、3が通んなかった。
ちょっと、休憩。花子さん、どこで油売ってんのかな?

--
矢崎博英  firo@....jp