2014年2月18日火曜日

Xcode5で既存のプロジェクトにUnittestを追加する

今までUnitTestというものは使ったことがなかった、というかどうやって使うのかわからなかったのだけど、とあるところで使っている人のソースを見せてもらって、「こりゃ、うまく使えば便利かも」と思った。

が、Xcode5でProjectを新規に作るなら勝手にテスト用プロジェクトも入るのでいいのだが、既存のプロジェクトにそれを追加するとなると、方法がわからなかった。
検索してもXcode4の時のはあっても5のはなかったり、間違ってたりで使えなかった。

ということで、一念発起して探しだした結果を公開。

(1)プロジェクトを開く。プロジェクトを選択状態にすると、情報が表示されるけど、その一番左上に小さな再生ボタンみたいなのを押す。

(2)表示が展開されてPROJECTとTARGETSが表示されるので、TARGETSの下のAdd Targetsをクリックする。

(3)するとターゲット追加ダイアログが表示されるので、Cocoa Touch Unit Testing Bundleを選択し、Nextを押す。

(4)必要情報を記入する。基本的には入力されているので、Organization NameとCompany Identiferのみ入力すればいいはず。すべて入力しないとFinishは押せない。

(5)するとこのようにテスト用プロジェクトが追加されるので、あとは*Tests.mにテスト用コードを記述していくだけ。


で、利用する上での注意。

・UnitTestはシミュレーター上でしか走らない
・XCT*()はマクロで、内部でselfを使うため関数内では使えない
XCTAssertEqual()では型まで正確に比較されてしまうようである。

  したがって、intunsigned longの比較では、数値が同じでも不一致判定される。
・何故かプロジェクト内ファイルのリンクが通らないことがあるので、その時はテストの中に同じファイルをコピーする必要がある(プロジェクトの下に別のプロジェクトがいるような階層構造の時)。ファイル更新時にはコピーすることを忘れないこと。多分Xcode5のバグ。

2014年2月7日金曜日

printf()でdoubleを表示するにはどうするか

printf()でdouble値を表示する時の話。

表示指定はfloat/double共に"%f"である。
doubleはfloatの倍精度だから"%lf"・・・ではない。

でもこれには1つ落とし穴があって、doubleを%fで表示すると精度いっぱいの表示がなされない。%fはfloatの精度7桁までしか表示しないようになっているからだ。

なので、doubleの精度である15桁を表示させるには
    printf("%.15f",d)
のように、小数点以下の表示桁数を指定する必要がある。

ただし、15桁は少数以下だけでなく整数位も含めた全体なので注意。
要するにこの記述も必ずしも正しくはない。
また、これで表示させると累積演算誤差になる部分(小数部は2進数で表しきれないことによる問題)まで表示される。

全体で15桁という指定をするにうまい方法はないかは、X-BASIC for iOSのusingを実装するときに散々考えた。基本方法は以下のとおり。
(1)double値を整数部と小数部に分離する
 modf()関数を使う
(2)整数部をsprintf("%d")で文字列化して、その桁数を数える
    ただし、整数部が0の時は整数部桁数=0とする
(3)小数部の桁数を持つフォーマット文字列を作成する
  sprintf(format,"%%.%df",15-整数部桁数)
(4)それで表示する
 printf("%d",整数部)
 printf(format,小数部)

である。符号も考慮しておかなければならない。

しかし、素直にdoubleを桁数分表示する指定子があればいいと思うのだが、何故無いのだろう?誰も必要としないのだろうか?