NUnitでテスト

Booではカスタム属性をサポートしているので、他の言語同様にNUnitを使えます。例えば、次のようなクラスがあったとします。
ファイル:calc.boo

namespace Calc

import System
import System.Collections

enum MemOpe:
  None
  Add
  Subtract

class Calc:
  mem = 0
  mop = MemOpe.None

  private def Mem(x as int) as int:
    if mop == MemOpe.Add:
      mem += x
    elif mop == MemOpe.Subtract:
      mem -= x
    mop = MemOpe.None
    return x

  def CM():
    mem = 0
  
  def RM() as int:
    return mem

  def MP():
    mop = MemOpe.Add

  def MM():
    mop = MemOpe.Subtract

  def Add(x as int, y as int) as int:
    return Mem(x + y)

  def Subtract(x as int, y as int) as int:
    return Mem(x - y)

  def Multiply(x as int, y as int) as int:
    return Mem(x * y)

  def Divide(x as int, y as int) as int:
    raise DivideByZeroException() if y == 0
    return Mem(x / y)

これに対するテストケースを書いてみます。

ファイル:test.boo

import System
import NUnit.Framework
import Calc

[TestFixture]
class CalcTestCase:
  _calc as Calc

  [SetUp]
  def SetUp():
    _calc = Calc()

  [Test]
  def Add():
    ret = _calc.Add(68, 17)
    Assert.AreEqual(ret, 85)

  [Test]
  def Subtract():
    ret = _calc.Subtract(91, 23)
    Assert.AreEqual(ret, 68)

  [Test]
  def Multiply():
    ret = _calc.Multiply(25, 5)
    Assert.AreEqual(ret, 125)

  [Test]
  def Divide():
    ret = _calc.Divide(84, 3)
    Assert.AreEqual(ret, 28)

  [Test]
  [ExpectedException(typeof(DivideByZeroException))]
  def DivideByZero():
    _calc.Divide(1, 0)

  [Test]
  def MP():
    _calc.CM()
    _calc.MP()
    _calc.Add(5, 3)
    ret = _calc.RM()
    Assert.AreEqual(ret, 8)

  [Test]
  def MM():
    _calc.CM()
    _calc.MM()
    _calc.Subtract(5, 3)
    ret = _calc.RM()
    Assert.AreEqual(ret, -2)

  [Test]
  def CM():
    _calc.MP()
    _calc.Add(1, 2)
    _calc.CM()
    ret = _calc.RM()
    Assert.AreEqual(ret, 0)

C#と同じですね。.NET対応言語の場合、新しい言語でも.NETライブラリがそのまま使えるのが嬉しいですよね。