"アンパン"→"あ行"みたいな変換をするクラスとそのテストコード

## 要件

- 入力値は「カタカナ」で
- 半濁音も対応してね
- 英数字で始まるものは「英数字」と返してね

## 変換クラス

```csharp

public class GroupConvert
{
    static public string doit(string target)
    {
        Dictionary<string, string> dict = new Dictionary<string, string>(){
            {@"^[ア-オ]", "あ行"},
            {@"^[カ-コガ-ゴ]", "か行"},
            {@"^[サ-ソザ-ゾ]", "さ行"},
            {@"^[タ-トダ-ド]", "た行"},
            {@"^[ナ-ノ]", "な行"},
            {@"^[ハ-ホバ-ボパ-ポ]", "は行"},
            {@"^[マ-モ]", "ま行"},
            {@"^[ヤ-ヨ]", "や行"},
            {@"^[ラ-ロ]", "ら行"},
            {@"^[ワ-ン]", "わ行"},
            {@"^\b[A-Z0-9０-９Ａ-Ｚ]", "英数字"},
        };

        foreach (var d in dict)
        {
            if (new Regex(d.Key, RegexOptions.IgnoreCase).Match(target).Success)
            {
                return d.Value;
            }
        }
        return "";
    }
}
```

## そのテスト

```csharp
[TestMethod]
public void Test()
{
    Assert.AreEqual("あ行", GroupConvert.doit("アンパンマン"));

    Assert.AreEqual("か行", GroupConvert.doit("ガリアジ"));
    Assert.AreEqual("か行", GroupConvert.doit("ゴータマ・ブッダ"));
    Assert.AreEqual("か行", GroupConvert.doit("クラエ"));

    Assert.AreEqual("さ行", GroupConvert.doit("サンバ"));
    Assert.AreEqual("さ行", GroupConvert.doit("ゾウリムシ"));

    Assert.AreEqual("た行", GroupConvert.doit("ドングリ"));
    Assert.AreEqual("た行", GroupConvert.doit("チョイナ"));

    Assert.AreEqual("な行", GroupConvert.doit("ニーズヘッグ"));
    Assert.AreEqual("な行", GroupConvert.doit("ノマダン"));

    Assert.AreEqual("は行", GroupConvert.doit("パルルカン"));
    Assert.AreEqual("は行", GroupConvert.doit("ボーヨミ"));
    Assert.AreEqual("は行", GroupConvert.doit("ヒクソン"));

    Assert.AreEqual("ま行", GroupConvert.doit("ムリポ"));
    Assert.AreEqual("ま行", GroupConvert.doit("モリタケ"));

    Assert.AreEqual("や行", GroupConvert.doit("ユーグレナ"));
    Assert.AreEqual("や行", GroupConvert.doit("ヨンパチ"));

    Assert.AreEqual("ら行", GroupConvert.doit("ロマン"));
    Assert.AreEqual("ら行", GroupConvert.doit("ラック"));

    Assert.AreEqual("わ行", GroupConvert.doit("ワーカーホリック"));
    Assert.AreEqual("わ行", GroupConvert.doit("ンドゥール"));

    Assert.AreEqual("英数字", GroupConvert.doit("Aガタカンエン"));
    Assert.AreEqual("英数字", GroupConvert.doit("Ｂガタカタカタ"));
    Assert.AreEqual("英数字", GroupConvert.doit("１ガタニンゲン"));

    Assert.AreEqual("", GroupConvert.doit("@empty"));
    Assert.AreEqual("", GroupConvert.doit("-----"));
    Assert.AreEqual("", GroupConvert.doit("あぎょう"));
    Assert.AreEqual("あ行", GroupConvert.doit("ェ"));
    Assert.AreEqual("わ行", GroupConvert.doit("ヰ"));
}
```

もっとスマートにできるよ！ってあればどんどんつっこんでください！


## 2015/01/20 追記（Chaining Assertion ライブラリ導入した後のテストコード）

コメントで教えていただいたC#ユニットテスト用ライブラリ **Chaining Assertion** を適用したあとのテストコードを追加しておきます。便利でテストが気持ちよく書けます！

```csharp
[TestMethod]
[TestCaseSource("toaruTestData")]
public void TestTestCaseSource()
{
    TestContext.Run((string result, string expected) =>
    {
        // Assert.AreEqual(...) が無くなり、スッキリ！
        GroupConvert.doit(expected).Is(result);
    });
}

// テストデータをまとめて TestCaseSource 属性に渡せる！
public static object[] toaruTestData = new []
{
    new object[] {"あ行", "アンパンマン"},
    new object[] {"か行", "ガリアジ"},
    new object[] {"か行", "ゴータマ・ブッダ"},
    new object[] {"か行", "クラエ"},
    new object[] {"さ行", "サンバ"},
    new object[] {"さ行", "ゾウリムシ"},
    new object[] {"た行", "ドングリ"},
    new object[] {"た行", "チョイナ"},
    new object[] {"な行", "ニーズヘッグ"},
    new object[] {"な行", "ノマダン"},
    new object[] {"は行", "パルルカン"},
    new object[] {"は行", "ボーヨミ"},
    new object[] {"は行", "ヒクソン"},
    new object[] {"ま行", "ムリポ"},
    new object[] {"ま行", "モリタケ"},
    new object[] {"や行", "ユーグレナ"},
    new object[] {"や行", "ヨンパチ"},
    new object[] {"ら行", "ロマン"},
    new object[] {"ら行", "ラック"},
    new object[] {"わ行", "ワーカーホリック"},
    new object[] {"わ行", "ンドゥール"},
    new object[] {"英数字", "Aガタカンエン"},
    new object[] {"英数字", "Ｂガタカタカタ"},
    new object[] {"英数字", "１ガタニンゲン"},
    new object[] {"", "@empty"},
    new object[] {"", "-----"},
    new object[] {"", "あぎょう"},
    new object[] {"あ行", "ェ"},
    new object[] {"わ行", "ヰ"}
};
```

こんな便利なライブラリがあったとは！激推し。

## 参考

- <a href="http://neue.cc/2011/02/24_306.html" target="_blank">neue cc - メソッドチェーン形式のテスト記述ライブラリ</a>
- <a href="http://chainingassertion.codeplex.com/" target="_blank">Chaining Assertion - Home</a>
- VisualStudioからであれば、テストプロジェクトにNuGet経由でインストールできます