バグ直した。

バグ修正の依頼があったのでコネコネとさばく。

 

今日のバグはこんなの。

「文字列をnバイトで切断する処理にて全角文字の真ん中をぶったぎってしまう」

"ABCDEあい"を8バイトで切る処理にて"ABCDEあ"ここまでで7バイト。"い"をつけると9バイトになるのでやめて半角スペース補充で終了させておくのが本来の要求だが、”い"の文字コードの前半部分がまでくっつけてくれているというバグ。

 

データベースの都合で文字列をバイト単位で切断する必要があるのですが、弊現場では極めてまれな扱いのために当初の開発担当者は慣れておらずにバグを出してしまったもよう。5年ほどバレなかったためにバグ出した当人は逃げおおせたが後任のおいらが対応することになりました。

 

こういうしょうもないバグは修正が楽しい。修正するメソッドについて以下のユニットテストを書く。

切断対象文字列がちょうどnバイト("ABCDEFGH")

切断対象文字列がnバイト未満("ABCDEFG")

・切断対象文字列が空文字("")

・切断対象文字列がnバイト超かつ切断箇所が全角文字の真ん中ではない("ABCDEFGHI")

・切断対象文字列がnバイト超かつ切断箇所が全角文字の真ん中("ABCDEFGHあ")

で、ユニットテストを実行して最後のだけ×になることを確認してメソッドをいじくりまわしつつユニットテストを実行。全部〇になればOK。すばらしい。ユニットテスト万歳。

 

追記 元のコードこんな感じ。

private static string NewMethod1(string org,int n)
{
  var enc = System.Text.Encoding.GetEncoding("Shift_JIS");
  var a = enc.GetBytes(org).Take(n).ToArray();
  return enc.GetString(a);
}

 

あ、サロゲートペアとか言いっこなしで。