Index: [Article Count Order] [Thread]

Date:  Fri, 15 Sep 2000 12:44:52 +0900
From:  firo@....jp
Subject:  [XP-jp:00884] Re: VXP タスク3 	--Config
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <39C19F5D.F8F7A626@....jp>
References:  <00Sep13.194931jst.115202@....jp> <00Sep14.200111jst.115202@....jp>
Posted:  Fri, 15 Sep 2000 13:02:44 +0900
X-Mail-Count: 00884

矢崎です。続きです。

(太郎さん)
testConstructor3を通さなきゃならないけれど、
これは、つまりConfigファイルに「X-ML-Name」
で始まる行がなかったってことだよな。だらか、
インスタンス変数nameがnullなら、IllegalArgumentException
を投げるってことでいいか。Configクラスを書き換えて、
コンパイル、テスト実行してみよう。書き直すのはgetName
メソッドだけだから、、、

・・・
/*
 * @(#)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() {
        if (name == null) throw new IllegalArgumentException();
        return name;
    }

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

    String name;
    List xList;
}

・・・
(太郎さん)
よし、コンパイルとテストはOK。ところで、「X-ML-Name:」
だけの行、つまり識別子はあるんだけれど、名前が定義
されていない行(まあ、設定ミスってやつ)の場合もException
が発生するということでいいかな。それでいいとして、これも
実際そうなるかどうか、テストを追加して実行しなきゃ。
これについては、本当にX-ML-Name:のコロンのところで
ピタっと終わっているやつと、その後に空白文字が何桁か
続いているやつの2とおりをテストしよう。それと、testConstructor3
も含めて、これって、getNameのテストだから、名前を
testGetName1、2、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 testGetName1(){
        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);
        }

    }

    public void testGetName2(){
        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("X-ML-Name:");
        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);
        }

    }

    public void testGetName3(){
        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("X-ML-Name:                              ");
        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);
        }

    }

・・・
(太郎さん)
コンパイル、テスト、実行っと。

testGetName2と3は通らなかったので、Configクラスを変更
しなきゃ。getNameを直せばいいよね。

・・・
/*
 * @(#)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() {
        if (name == null) throw new IllegalArgumentException();
        if (name.length() == 0) throw new IllegalArgumentException();
        return name;
    }

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

    String name;
    List xList;
}

・・・
(太郎さん)
はい、コンパイル、テスト実行、よし通った。

で、Configクラスについては、後は何かあるかな、、、
CRCセッションメモ(これは太郎さんの個人メモ[XP-jp00850]
が、それとします)を確認しよう。

メンバリストのファイル名を返すというリスポンシビリティ
が必要ですね。これもConfigファイルに定義されてあるん
だよな。でもこれはX-タイプの、つまり、ヘッダに表示する
情報ではないから、識別子として「X-」とは別のものを考え
なきゃいけないね。うーん、「$-」にしよう。これについては、
明日のスタンドアップ・ミーティングで再確認するけど。

・・・
明日のスタンドアップで確認すること
Configファイルに$-の識別子のある行を設けてよいか?
例:メンバファイルの名前
・・・
(太郎さん)
それと、今ふと気づいたんだけど、カウンタ、つまり「X-Mail-Count」
で始まる行の数字って、新しいメールの処理をするたびに、
1ずつカウントアップしていかないとだめだよね。って、ことは、
Configクラスには、カウンタをカウントアップするリスポンシビリティ
と、それをConfigファイルに更新をかけるリスポンシビリティが
いるってことか、、これは、別のタスクにしよう。一応新しい
タスクカードを書いておきます。

・・・
タスクカード
新しいメールを処理するたびに、Configファイルにあるカウンタ情報
を1ずつインクリメントする
・・・
(太郎さん)
では、メンバリストファイルの名前の件に戻って、まず
テストを書きます。
最初はtestConstructor1をこんな感じに修正かな?

・・・
/*
 * @(#)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("$-MemberList: memberlist");
        pw.println("$$-MemberList: memberrrlist");
        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());

        assertEquals("test7", "memberlist", aConfig.getMemberListFileName());
    }

    public void testConstructor2(){

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

    }

    public void testGetName1(){
        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);
        }

    }

    public void testGetName2(){
        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("X-ML-Name:");
        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);
        }

    }

    public void testGetName3(){
        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("X-ML-Name:                              ");
        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クラスにgetMemberListFileNameメソッドを
追加します。

・・・
/*
 * @(#)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() {
        if (name == null) throw new IllegalArgumentException();
        if (name.length() == 0) throw new IllegalArgumentException();
        return name;
    }

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

    public String getMemberListFileName(){
        return null;
    }

    String name;
    List xList;
}

・・・
(太郎さん)
はい、コンパイルは両方とも通りました。
だからテスト実行。。。はい、見事とおりません。OK。

えーと、次はConfigクラスを修正しなきゃ。コンストラクタ
の変更とgetMemberListFileNameか、、コンストラクタは
リファクタリングしてからのほうがいいかな?
あれ電話だ。

はいはい、あ、今月の経費精算、あ、今すぐやります。
え、たまってます。すみません。1時間くらいですみます。



経費精算ためこんでて、おしかりの電話がはいってしまっ
た。そっち先にやんなきゃ、、、
花子さんにメモ書いておこう。

花子さんへ、経費精算がたまっているので1時間ほど
席あけます。終わったら戻ってきます。もしよろしければ
次郎くんに声かけて続きのペアしておいてください。


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