Help us understand the problem. What is going on with this article?

第9回、Rubyでassert_equal

Mac OS-11.0.1 ruby-2.6.6p146

assert_equal

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。

とりあえず

思いつく範囲でとりあえず書いてみる。

def assert_equal(expected, result)
  return expected == result
end

p assert_equal(1, 1)

これを実行する。

$ ruby assert_equal.rb
true

よし。

色、つけてみる?

$ gem install colorize

してから、

require 'colorize'

def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end
assert_equal(1, 1)
assert_equal(1, 2)

みたいなプログラムを実行!

$ ruby assert_equal.rb
true
false

truefalse になった!

出力を豪華にしてみる?

require 'colorize'

def assert_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected == result
    puts 'succeeded in assert_equal.'.green
  else
    puts 'failed in assert_equal.'.red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)

実行!

$ ruby assert_equal_richer_output.rb
expected :: 1
result   :: 1
succeeded in assert_equal.
expected :: 1
result   :: 2
failed in assert_equal.

qiitaでは色変わらないけど、ターミナル上では変わってます。

まぁNot Equal もやるか〜

require 'colorize'

def assert_not_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected != result
    puts 'succeeded in assert_not_equal.'.green
  else
    puts 'failed in assert_not_equal.'.red
  end
end

assert_not_equal(1, 1)
assert_not_equal(1, 2)

簡単。

$ ruby assert_not_equal_richer_output.rb
expected :: 1
result   :: 1
failed in assert_not_equal.
expected :: 1
result   :: 2
succeeded in assert_not_equal.

ファイルをまとめて汎用化

上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理

require 'colorize'

def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  print  expected = result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 2)
assert_not_equal(1, 1)

これを外部ファイルからも呼び出したい。

require './assert_equal'

assert_equal(2, 1*2)
assert_not_equal('bob', 'bob2')

みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。

これはもう覚えるしかない。

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

これは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが A.rb に記述されていて、 B.rb から呼び出されても実行されない。最終はこうなった。

require 'colorize'

def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  print  expected = result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

いい感じ!!今後の講義でもこのメソッドは活用するらしい。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away