assert_equal



# 目標

assert equalとはequalかどうかを確かめる(assert)関数を使い,それらをテスト駆動開発で実装していく．


# 解説


## TDDに基づいて

まずは1==1から始めていきます.

```ruby
p 1==1
```

として見ましょう．

    > ruby assert_equal.rb
    true

次はこれをメソッドに直していきます.

```ruby
p assert_equal(1, 1)
```

これを動かしてみると

    > ruby assert_equal.rb
    assert_equal.rb:1:in `<main>': undefined method `assert_equal' for main:Object (NoMethodError)

assert\_equalの関数が定義されていないのでエラーが出ます.

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

    > ruby assert_equal.rb
    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)
```

colorizeには他にも使える色があります.実際に見てみましょう.

```ruby
> 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)
  if expected == result
    puts "expected #{expected}"
    puts "result #{result}"
    puts "succeeded in #{__method__}".green
  else
    puts "expected #{expected}"
    puts "result #{result}"
    puts "failed in #{__method__}".red
  end
end

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

```

    expected 1
    result 1
    succeeded in assert_equal
    expected 1
    result 2
    failed in assert_equal

\#{method}と表記することでコードの中で定義した名前が出力されました.


# assert\_not\_equal

今度は逆にexpectedとresultがnot\_equalかどうか判定するassert\_not\_equal.rbを考えます.

```ruby

require 'colorize'

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

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

```

    expected 1
    result 1
    failed in assert_not_equal
    expected 1
    result 2
    succeeded in assert_not_equal


# 重複箇所の整理

重複している箇所を最後に整理してあげます.そして,今までのものをまとめてみます.

```ruby
require 'colorize'
def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
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
def assert_equal(expected, result)
  puts_vals(expected, result)
  print  case expected == result
	 when true  ; "succeeded in #{__method__}.\n".green
	 when false ; "failed in #{__method__}.\n".red
	 end
end
if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end
```


# 参考にしたサイト

　この記事を書くために以下のサイトを参考にしました.[チャート式ruby-IV(assert\_equal)](https://qiita.com/daddygongon/items/f6cea87314ee26e130ea)



------
 - **source** ~/grad_members_20f/members/Takahiro-Nishikawa/ruby_assert_equal.org