第9回 :: assert_equal

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83$](<https://img.shields.io/badge/ruby-2.c7.1p83-brightgreen>)


# お題：assert\_equal

assert equalとはequalかどうかを確かめる(assert)関数


# 解法

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

p assert_equal(1, 1)
```

上記のコードを実行すると

    > ruby assert_equal.rb
    true

ちゃんとtrueが返ってくる


# 解説:colorize

出力の文字に色を付ける

初めにcolorizeっていうのをインストールする必要があるらしい以下のコマンドでインストール

    > gem install colorize

無事にインストールできたら

```ruby
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

trueは緑色，falseは赤色で出力された．

ちなみに

    > irb
    irb(main):001:0> require 'colorize'
    => true
    irb(main):002:0> String.colors
    => [:black, :light_black, :red, :light_red, :green, :light_green, :yellow, :light_yellow, :blue, :light_blue, :magenta, :light_magenta, :cyan, :light_cyan, :white, :light_white, :default]

いろんな色が使えるらしい．聞いたことのない色も多い


# 改良:richer output

もう少し出力をきれいにする．

-   引数でとってきた，expected, resultの値をそのまま出力
-   どうなったかを記述
    -   **true:** print "succeeded in assert\_equal.\n".green
    -   **false:** print "failed in assert\_equal.\n".red

```ruby
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.

ちゃんと色が変わってる


# 拡張:assert\_not\_equal

```ruby
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.

ちゃんと出力されてる


# 整理:重複箇所の整理

重複している箇所を整理する．

```ruby
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)
```


# 補足:重複実行の予防

このcodeは今後繰り返し使う．そのためには，requireで呼び出す必要がある．

例えば，

```ruby
require './assert_equal'

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

というように使う．

でも，このままだとassert\_equal.rbに書いたテストがそのまま実行されてしまう．

解決策として

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

意味は，codeが書いてあるファイル名(FILE)が，動いているファイル名($PROGRAM\_NAME)と一致したら中身を実行する．最終的には

```ruby
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** ~/grad_members_20f/members/okamoto0910/article/c9.org