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

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

`true``false` になった!

## 出力を豪華にしてみる？

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

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