DATE : 2006/11/04 (Sat)
(Brew Test Unit 1.0.4 対象)
想定した浮動小数点数が得られたかどうかを確認するマクロ関数に、ASSERT_EQUALS_DELTA というものがあります。(参照:テストケースの基本)
このマクロ関数では、想定値と実際の値、誤差を指定できます。
一見すると、実際の値と想定値との差が誤差の範囲内に収まっているか否かを判定するマクロ関数のように思えます。
しかし、Brew Test Unit 1.0.4 では、誤差に等しいか否かの判定になっています。
以下に示すのは、その判定部分(UnitAssert.cpp, 110~118、インデントはレイアウトにあわせて変更)のコードです。
「aExpected」は想定値、「aActual」が実際の値、「aDelta」が誤差を表します。
bool Assert::assertEquals(String aMessage, double aExpected, double aActual, double aDelta, String aFile, int aLine) { // Do comparison. if((aExpected <= aActual && aActual - aExpected == aDelta) || (aExpected > aActual && aExpected - aActual == aDelta)) { // Return True if equal. return true; }
誤差を判断している部分が、「==」となっています。そのため、この部分では、実際の値と想定値との差が誤差と等しいか否かを判断していると分かります。
参考として、JUnit で同じ機能を持つメソッド org.junit.Assert#assertEquals(String, double, double, double) のコードを挙げておきます。(Assert.java, 159~164、インデントはレイアウトに合わせて変更)
「expected」が想定値、「actual」が実際の値、「delta」が誤差を表します。
static public void assertEquals(String message, double expected, double actual, double delta) { if (Double.compare(expected, actual) == 0) return; if (!(Math.abs(expected - actual) <= delta)) failNotEquals(message, new Double(expected), new Double(actual)); }
こちらは、想定値と実際の値との差が誤差以内に収まるかどうかを判断していることが分かります。
なお、Brew Test Unit の ASSERT_EQUALS_DELTA も 誤差の範囲内に収まるような判断に変更する場合は、以下のようにコードを書き換えます。
if((aExpected <= aActual && aActual - aExpected <= aDelta) || (aExpected > aActual && aExpected - aActual <= aDelta)) { // Return True if equal. return true; }
気付くまで相当苦しめられました……orz