ソースコード (judging_machine.rb)
class JudgingMachine
# 文字列が数字だけで構成されていれば true を返す
def number?(str)
# 文字列の先頭(\A)から末尾(\z)までが「0」から「9」の文字か
nil != (str =~ /\A[0-9]+\z/)
end
end
テストコード (judging_machine_test.rb)
require 'test/unit'
require './judging_machine'
class JudgingMachineTest < Test::Unit::TestCase
def test_number?
m = JudgingMachine.new
assert_true(m.number?('1'))
assert_true(m.number?('12'))
assert_true(m.number?('012'))
assert_false(m.number?(''))
assert_false(m.number?('+1'))
assert_false(m.number?('-1'))
assert_false(m.number?('abc'))
assert_false(m.number?('123abc'))
assert_false(m.number?('abc123'))
assert_false(m.number?("123\n"))
assert_false(m.number?("123\n123"))
assert_false(m.number?("123\nabc"))
assert_false(m.number?("\n123"))
assert_false(m.number?('123')) # 全角
assert_false(m.number?('一二三')) # 漢数字
assert_false(m.number?('ⅠⅡⅢ')) # ローマ数字
assert_false(m.number?(nil)) # nil
assert_false(m.number?(Object.new)) # 文字列じゃない
assert_false(m.number?(Array.new)) # 文字列じゃない
end
end
テストの実行結果
19個のアサーションチェックが通った。
$ ruby judging_machine_test.rb
Loaded suite judging_machine_test
Started
.
Finished in 0.001435 seconds.
----------------------------------------------------------------------------------------------------
1 tests, 19 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
----------------------------------------------------------------------------------------------------
696.86 tests/s, 13240.42 assertions/s
「=~」メソッドの挙動
文字列クラス String は正規表現で判定する。
instance method String#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/String/i/=3d=7e.html
正規表現 other とのマッチを行います。 マッチが成功すればマッチした位置のインデックスを、そうでなければ nil を返します。
other が正規表現でも文字列でもない場合は other =~ self を行います。
ほぼすべての親クラスである Object クラスにも「=~」メソッドが定義されている。
instance method Object#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/Object/i/=3d=7e.html
右辺に正規表現オブジェクトを置いた正規表現マッチ obj =~ /RE/ をサポートするためのメソッドです。 常に nil を返します。
この定義により、=~ が再定義されたオブジェクトでは正常にマッチを行い、 それ以外のものは nil を返すようになります。
Ruby に標準搭載されているユニットテストのライブラリ
ちょっとした動作確認には標準で同梱されている test/unit ライブラリが便利。
library test/unit (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/library/test=2funit.html
ユニットテストを行うためのライブラリです。
このライブラリは 2.2.0 からbundled gem(gemファイルのみを同梱)になりました。
assert_true などのメソッドはこのあたりのリファレンスマニュアルに載っている。
Module: Test::Unit::Assertions — test-unit - test-unit
http://test-unit.github.io/test-unit/en/Test/Unit/Assertions.html
参考資料
- instance method String#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/String/i/=3d=7e.html
- 正規表現 (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html
- test-unit - a Unit Testing Framework for Ruby http://test-unit.github.io/