test-unit 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,48 @@
1
+ === 2.2.0 / 2011-02-14
2
+
3
+ * 22 enhancements
4
+ * [#28808] accept String as delta for assert_in_delta.
5
+ [Daniel Berger]
6
+ * [test-unit-users-en:00035] make GC-able finished tests.
7
+ [Daniel Berger]
8
+ * use also COLUMNS environment variable to guess terminal width.
9
+ * make delta for assert_in_delta optiona.
10
+ [Nobuyoshi Nakada]
11
+ * add assert_not_respond_to.
12
+ [Nobuyoshi Nakada]
13
+ * add assert_not_match. assert_no_match is deprecated.
14
+ [Nobuyoshi Nakada]
15
+ * add assert_not_in_delta.
16
+ [Nobuyoshi Nakada]
17
+ * add assert_in_epsilon.
18
+ [Nobuyoshi Nakada]
19
+ * add assert_not_in_epsilon.
20
+ [Nobuyoshi Nakada]
21
+ * add assert_include.
22
+ [Nobuyoshi Nakada]
23
+ * add assert_not_include.
24
+ [Nobuyoshi Nakada]
25
+ * add assert_empty.
26
+ [Nobuyoshi Nakada]
27
+ * add assert_not_empty.
28
+ [Nobuyoshi Nakada]
29
+ * notify require failed paths.
30
+ * validate message value for assert.
31
+ * show throughputs at the last.
32
+ * support not ASCII compatible string diff.
33
+ * support colorized diff on encoding different string.
34
+ * normalize entry order of Hash for readable diff.
35
+ * add --ignore-name option.
36
+ * add --ignore-testcase option.
37
+ * add assert_not_send.
38
+
39
+ * Thanks
40
+ * Daniel Berger
41
+ * Nobuyoshi Nakada
42
+
1
43
  === 2.1.2 / 2010-11-25
2
44
 
3
- * 1 enhanchement
45
+ * 1 enhancement
4
46
  * support auto runner prepare hook.
5
47
 
6
48
  === 2.1.1 / 2010-07-29
@@ -84,6 +84,7 @@ test/collector/test-load.rb
84
84
  test/collector/test_dir.rb
85
85
  test/collector/test_objectspace.rb
86
86
  test/run-test.rb
87
+ test/test-assertions.rb
87
88
  test/test-attribute.rb
88
89
  test/test-color-scheme.rb
89
90
  test/test-color.rb
@@ -95,7 +96,6 @@ test/test-omission.rb
95
96
  test/test-pending.rb
96
97
  test/test-priority.rb
97
98
  test/test-testcase.rb
98
- test/test_assertions.rb
99
99
  test/test_error.rb
100
100
  test/test_failure.rb
101
101
  test/test_testresult.rb
@@ -78,7 +78,7 @@ require "test/unit"</pre>
78
78
  </p>
79
79
  <h3 id="test-unit-latest">test-unit: The latest release</h3>
80
80
  <p>
81
- 2.1.2 is the latest release. It had been released at 2010-11-25.
81
+ 2.2.0 is the latest release. It had been released at 2011-02-14.
82
82
  </p>
83
83
  <h3 id="test-unit-install">test-unit: Install</h3>
84
84
  <p>
@@ -92,7 +92,7 @@ require "test/unit"</pre>
92
92
  </p>
93
93
  <h3 id="test-unit-full-latest">test-unit-full: The latest release</h3>
94
94
  <p>
95
- 0.0.2 is the latest release. It had been released at 2010-07-17.
95
+ 0.0.3 is the latest release. It had been released at 2011-02-09.
96
96
  </p>
97
97
  <h3 id="test-unit-full-install">test-unit-full: Install</h3>
98
98
  <p>
@@ -106,13 +106,26 @@ require "test/unit"</pre>
106
106
 
107
107
  <h2 id="test-unit-notify">test-unit-notify</h2>
108
108
  <p>
109
- <img class="eye-catch" alt="screenshot"
110
- src="test-unit-notify/screenshot/notify-on-gnome.png" />
109
+ <div class="eye-catch">
110
+ <img alt="notification on GNOME"
111
+ src="test-unit-notify/screenshot/notify-on-gnome.png" />
112
+ <img alt="notification on Mac OS X"
113
+ src="test-unit-notify/screenshot/notify-on-mac-os-x.png" />
114
+ </div>
111
115
  This package provides a test notifier.
116
+
117
+ <dl class="feature-list">
118
+ <dt>X Window System based eivornment such ad GNOME, Xfce, KDE and so on</dt>
119
+ <dd>"notify-send" command is used for notifying test result.</dd>
120
+ <dt>Mac OS X</dt>
121
+ <dd>"growlnotify" command is used for notifying test result.</dd>
122
+ <dt>Windows</dt>
123
+ <dd>How? Growl for Windows? (not implemented)</dd>
124
+ </dl>
112
125
  </p>
113
126
  <h3 id="test-unit-notify-latest">test-unit-notify: The latest release</h3>
114
127
  <p>
115
- 0.0.1 is the latest release. It had been released at 2010-07-17.
128
+ 0.2.1 is the latest release. It had been released at 2011-02-10.
116
129
  </p>
117
130
  <h3 id="test-unit-notify-install">test-unit-notify: Install</h3>
118
131
  <p>
@@ -127,18 +140,36 @@ require "test/unit"</pre>
127
140
  You can use --notify option to notify test result by popup at the end.
128
141
  </p>
129
142
 
130
- <h2 id="test-unit-gtk2">test-unit-gtk2</h2>
143
+ <h2 id="test-unit-rr">test-unit-rr</h2>
144
+ <p>
145
+ This package provides a <a href="http://github.com/btakita/rr">RR</a>, a test dobule library, adapter for test-unit 2.
146
+ </p>
147
+ <h3 id="test-unit-rr-latest">test-unit-rr: The latest release</h3>
148
+ <p>
149
+ 1.0.1 is the latest release. It had been released at 2011-02-10.
150
+ </p>
151
+ <h3 id="test-unit-rr-install">test-unit-rr: Install</h3>
152
+ <p>
153
+ Install:
154
+ <pre class="command">% sudo gem install test-unit-rr</pre>
155
+ </p>
156
+ <p>
157
+ Usage:
158
+ <pre class="code">require "test/unit/rr"</pre>
159
+ </p>
160
+
161
+ <h2 id="test-unit-runner-gtk2">test-unit-runner-gtk2</h2>
131
162
  <p>
132
163
  This package provides a GTK+ based test runner.
133
164
  </p>
134
- <h3 id="test-unit-gtk2-latest">test-unit-gtk2: The latest release</h3>
165
+ <h3 id="test-unit-runner-gtk2-latest">test-unit-runner-gtk2: The latest release</h3>
135
166
  <p>
136
- 0.0.1 is the latest release. It had been released at 2008-06-17.
167
+ 0.0.2 is the latest release. It had been released at 2011-02-09.
137
168
  </p>
138
- <h3 id="test-unit-gtk2-install">test-unit-gtk2: Install</h3>
169
+ <h3 id="test-unit-runner-gtk2-install">test-unit-runner-gtk2: Install</h3>
139
170
  <p>
140
171
  Install:
141
- <pre class="command">% sudo gem install test-unit-gtk2</pre>
172
+ <pre class="command">% sudo gem install test-unit-runner-gtk2</pre>
142
173
  </p>
143
174
  <p>
144
175
  Usage:
@@ -148,18 +179,18 @@ require "test/unit"</pre>
148
179
  You can use --runner=gtk2 to run tests with GTK+ based test runner.
149
180
  </p>
150
181
 
151
- <h2 id="test-unit-tk">test-unit-tk</h2>
182
+ <h2 id="test-unit-runner-tk">test-unit-runner-tk</h2>
152
183
  <p>
153
184
  This package provides a Tk based test runner.
154
185
  </p>
155
- <h3 id="test-unit-tk-latest">test-unit-tk: The latest release</h3>
186
+ <h3 id="test-unit-runner-tk-latest">test-unit-runner-tk: The latest release</h3>
156
187
  <p>
157
188
  0.0.1 is the latest release. It had been released at 2008-06-17.
158
189
  </p>
159
- <h3 id="test-unit-tk-install">test-unit-tk: Install</h3>
190
+ <h3 id="test-unit-runner-tk-install">test-unit-runner-tk: Install</h3>
160
191
  <p>
161
192
  Install:
162
- <pre class="command">% sudo gem install test-unit-tk</pre>
193
+ <pre class="command">% sudo gem install test-unit-runner-tk</pre>
163
194
  </p>
164
195
  <p>
165
196
  Usage:
@@ -169,18 +200,18 @@ require "test/unit"</pre>
169
200
  You can use --runner=tk to run tests with Tk based test runner.
170
201
  </p>
171
202
 
172
- <h2 id="test-unit-fox">test-unit-fox</h2>
203
+ <h2 id="test-unit-runner-fox">test-unit-runner-fox</h2>
173
204
  <p>
174
205
  This package provides a FOX Toolkit based test runner.
175
206
  </p>
176
- <h3 id="test-unit-fox-latest">test-unit-fox: The latest release</h3>
207
+ <h3 id="test-unit-runner-fox-latest">test-unit-runner-fox: The latest release</h3>
177
208
  <p>
178
209
  0.0.1 is the latest release. It had been released at 2008-06-17.
179
210
  </p>
180
- <h3 id="test-unit-fox-install">test-unit-fox: Install</h3>
211
+ <h3 id="test-unit-runner-fox-install">test-unit-runner-fox: Install</h3>
181
212
  <p>
182
213
  Install:
183
- <pre class="command">% sudo gem install test-unit-fox</pre>
214
+ <pre class="command">% sudo gem install test-unit-runner-fox</pre>
184
215
  </p>
185
216
  <p>
186
217
  Usage:
@@ -206,12 +237,14 @@ require "test/unit"</pre>
206
237
  <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-full/trunk test-unit-full</pre></dd>
207
238
  <dt>test-unit-notify</dt>
208
239
  <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-notify/trunk test-unit-notify</pre></dd>
209
- <dt>test-unit-gtk2</dt>
210
- <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-gtk2/trunk test-unit-gtk2</pre></dd>
211
- <dt>test-unit-tk</dt>
212
- <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-tk/trunk test-unit-tk</pre></dd>
213
- <dt>test-unit-fox</dt>
214
- <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-fox/trunk test-unit-fox</pre></dd>
240
+ <dt>test-unit-rr</dt>
241
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-rr/trunk test-unit-rr</pre></dd>
242
+ <dt>test-unit-runner-gtk2</dt>
243
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-runner-gtk2/trunk test-unit-runner-gtk2</pre></dd>
244
+ <dt>test-unit-runner-tk</dt>
245
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-runner-tk/trunk test-unit-runner-tk</pre></dd>
246
+ <dt>test-unit-runner-fox</dt>
247
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-runner-fox/trunk test-unit-runner-fox</pre></dd>
215
248
  </dl>
216
249
  </div>
217
250
 
@@ -91,7 +91,7 @@ require "test/unit"</pre>
91
91
  </p>
92
92
  <h3 id="test-unit-latest">test-unit最新リリース</h3>
93
93
  <p>
94
- 2010-11-25にリリースされた2.1.2が最新リリースです。
94
+ 2011-02-14にリリースされた2.2.0が最新リリースです。
95
95
  </p>
96
96
  <h3 id="test-unit-install">test-unitのインストール</h3>
97
97
  <p>
@@ -105,7 +105,7 @@ require "test/unit"</pre>
105
105
  </p>
106
106
  <h3 id="test-unit-full-latest">test-unit-full最新リリース</h3>
107
107
  <p>
108
- 2010-07-17にリリースされた0.0.2が最新リリースです。
108
+ 2011-02-09にリリースされた0.0.3が最新リリースです。
109
109
  </p>
110
110
  <h3 id="test-unit-full-install">test-unit-fullのインストール</h3>
111
111
  <p>
@@ -119,21 +119,25 @@ require "test/unit"</pre>
119
119
 
120
120
  <h2 id="test-unit-notify">test-unit-notify</h2>
121
121
  <p>
122
- <img class="eye-catch" alt="スクリーンショット"
123
- src="test-unit-notify/screenshot/notify-on-gnome.png" />
122
+ <div class="eye-catch">
123
+ <img alt="GNOME上での通知"
124
+ src="test-unit-notify/screenshot/notify-on-gnome.png" />
125
+ <img alt="Mac OS X上での通知"
126
+ src="test-unit-notify/screenshot/notify-on-mac-os-x.png" />
127
+ </div>
124
128
  テストの実行結果をポップアップで通知します。通知方法は環境によって異なります。
125
129
  <dl class="feature-list">
126
130
  <dt>GNOMEやXfceやKDEなどのX Window Systemベースの環境</dt>
127
131
  <dd>notify-sendを使ってD-Bus経由でnotification-daemonにリクエストを送ることにより通知します。notify-sendコマンドが無かったり、notification-daemonが動いていない場合は利用できません。</dd>
128
132
  <dt>Mac OS X</dt>
129
- <dd>Growlを使って通知できるようになるといいですね!(未実装)</dd>
133
+ <dd>growlnotifyを使って通知します。growlnotifyコマンドが無かったり、Growlが動いていない場合は利用できません。</dd>
130
134
  <dt>Windows</dt>
131
135
  <dd>どうやるのがいいのでしょうか。Growl for Windows?(未実装)</dd>
132
136
  </dl>
133
137
  </p>
134
138
  <h3 id="test-unit-notify-latest">test-unit-notify最新リリース</h3>
135
139
  <p>
136
- 2010-07-17にリリースされた0.0.1が最新リリースです。
140
+ 2011-02-10にリリースされた0.2.1が最新リリースです。
137
141
  </p>
138
142
  <h3 id="test-unit-notify-install">test-unit-notifyのインストール</h3>
139
143
  <p>
@@ -148,18 +152,36 @@ require "test/unit"</pre>
148
152
  --notifyオプションが追加されます。--notifyオプションを指定するとテスト終了時にテスト結果をポップアップで通知します。
149
153
  </p>
150
154
 
151
- <h2 id="test-unit-gtk2">test-unit-gtk2</h2>
155
+ <h2 id="test-unit-rr">test-unit-rr</h2>
156
+ <p>
157
+ test-unit 2で<a href="http://capsctrl.que.jp/kdmsnr/wiki/bliki/?TestDouble">テストダブル(テスト代役)</a>ライブラリ<a href="http://github.com/btakita/rr">RR</a>を利用するためのパッケージです。
158
+ </p>
159
+ <h3 id="test-unit-rr-latest">test-unit-rr最新リリース</h3>
160
+ <p>
161
+ 2011-02-10にリリースされた1.0.1が最新リリースです。
162
+ </p>
163
+ <h3 id="test-unit-rr-install">test-unit-rrのインストール</h3>
164
+ <p>
165
+ インストール:
166
+ <pre class="command">% sudo gem install test-unit-rr</pre>
167
+ </p>
168
+ <p>
169
+ 使い方:
170
+ <pre class="code">require "test/unit/rr"</pre>
171
+ </p>
172
+
173
+ <h2 id="test-unit-runner-gtk2">test-unit-runner-gtk2</h2>
152
174
  <p>
153
175
  GTK+を用いて実装されたGUIのテスト実行機能です。
154
176
  </p>
155
- <h3 id="test-unit-gtk2-latest">test-unit-gtk2最新リリース</h3>
177
+ <h3 id="test-unit-runner-gtk2-latest">test-unit-runner-gtk2最新リリース</h3>
156
178
  <p>
157
- 2008-06-17にリリースされた0.0.1が最新リリースです。
179
+ 2011-02-09にリリースされた0.0.2が最新リリースです。
158
180
  </p>
159
- <h3 id="test-unit-gtk2-install">test-unit-gtk2のインストール</h3>
181
+ <h3 id="test-unit-runner-gtk2-install">test-unit-runner-gtk2のインストール</h3>
160
182
  <p>
161
183
  インストール:
162
- <pre class="command">% sudo gem install test-unit-gtk2</pre>
184
+ <pre class="command">% sudo gem install test-unit-runner-gtk2</pre>
163
185
  </p>
164
186
  <p>
165
187
  使い方:
@@ -170,18 +192,18 @@ require "test/unit"</pre>
170
192
  </p>
171
193
 
172
194
 
173
- <h2 id="test-unit-tk">test-unit-tk</h2>
195
+ <h2 id="test-unit-runner-tk">test-unit-runner-tk</h2>
174
196
  <p>
175
197
  Tkを用いて実装されたGUIのテスト実行機能です。
176
198
  </p>
177
- <h3 id="test-unit-tk-latest">test-unit-tk最新リリース</h3>
199
+ <h3 id="test-unit-runner-tk-latest">test-unit-runner-tk最新リリース</h3>
178
200
  <p>
179
201
  2008-06-17にリリースされた0.0.1が最新リリースです。
180
202
  </p>
181
- <h3 id="test-unit-tk-install">test-unit-tkのインストール</h3>
203
+ <h3 id="test-unit-runner-tk-install">test-unit-runner-tkのインストール</h3>
182
204
  <p>
183
205
  インストール:
184
- <pre class="command">% sudo gem install test-unit-tk</pre>
206
+ <pre class="command">% sudo gem install test-unit-runner-tk</pre>
185
207
  </p>
186
208
  <p>
187
209
  使い方:
@@ -191,18 +213,18 @@ require "test/unit"</pre>
191
213
  --runner=tkオプションが追加されます。--runner=tkオプションを指定するとTkベースのUIでテストを実行します。
192
214
  </p>
193
215
 
194
- <h2 id="test-unit-fox">test-unit-fox</h2>
216
+ <h2 id="test-unit-runner-fox">test-unit-runner-fox</h2>
195
217
  <p>
196
218
  FOX Toolkitを用いて実装されたGUIのテスト実行機能です。
197
219
  </p>
198
- <h3 id="test-unit-fox-latest">test-unit-fox最新リリース</h3>
220
+ <h3 id="test-unit-runner-fox-latest">test-unit-runner-fox最新リリース</h3>
199
221
  <p>
200
222
  2008-06-17にリリースされた0.0.1が最新リリースです。
201
223
  </p>
202
- <h3 id="test-unit-fox-install">test-unit-foxのインストール</h3>
224
+ <h3 id="test-unit-runner-fox-install">test-unit-runner-foxのインストール</h3>
203
225
  <p>
204
226
  インストール:
205
- <pre class="command">% sudo gem install test-unit-fox</pre>
227
+ <pre class="command">% sudo gem install test-unit-runner-fox</pre>
206
228
  </p>
207
229
  <p>
208
230
  使い方:
@@ -229,12 +251,14 @@ require "test/unit"</pre>
229
251
  <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-full/trunk test-unit-full</pre></dd>
230
252
  <dt>test-unit-notify</dt>
231
253
  <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-notify/trunk test-unit-notify</pre></dd>
232
- <dt>test-unit-gtk2</dt>
233
- <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-gtk2/trunk test-unit-gtk2</pre></dd>
234
- <dt>test-unit-tk</dt>
235
- <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-tk/trunk test-unit-tk</pre></dd>
236
- <dt>test-unit-fox</dt>
237
- <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-fox/trunk test-unit-fox</pre></dd>
254
+ <dt>test-unit-rr</dt>
255
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-rr/trunk test-unit-rr</pre></dd>
256
+ <dt>test-unit-runner-gtk2</dt>
257
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-runner-gtk2/trunk test-unit-runner-gtk2</pre></dd>
258
+ <dt>test-unit-runner-tk</dt>
259
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-runner-tk/trunk test-unit-runner-tk</pre></dd>
260
+ <dt>test-unit-runner-fox</dt>
261
+ <dd><pre class="command">% svn co http://test-unit.rubyforge.org/svn/extensions/test-unit-runner-fox/trunk test-unit-runner-fox</pre></dd>
238
262
  </dl>
239
263
  </div>
240
264
 
@@ -300,14 +300,14 @@ pre.code
300
300
  padding: 5px 10px;
301
301
  }
302
302
 
303
- img.eye-catch
303
+ div.eye-catch
304
304
  {
305
305
  float: right;
306
306
  }
307
307
 
308
- dl.feature-list
308
+ div.eye-catch img
309
309
  {
310
- clear: both;
310
+ display: block;
311
311
  }
312
312
 
313
313
  dl.feature-list dd
@@ -45,7 +45,7 @@ module Test
45
45
  # end
46
46
 
47
47
  public
48
- def assert_block(message="assert_block failed.") # :yields:
48
+ def assert_block(message="assert_block failed.") # :yields:
49
49
  _wrap_assertion do
50
50
  if (! yield)
51
51
  raise AssertionFailedError.new(message.to_s)
@@ -62,8 +62,19 @@ module Test
62
62
  public
63
63
  def assert(boolean, message=nil)
64
64
  _wrap_assertion do
65
- assert_block("assert should not be called with a block.") { !block_given? }
66
- assert_block(build_message(message, "<?> is not true.", boolean)) { boolean }
65
+ case message
66
+ when nil, String, Proc
67
+ else
68
+ error_message = "assertion message must be String or Proc: "
69
+ error_message << "<#{message.inspect}>(<#{message.class}>)"
70
+ raise ArgumentError, error_message, filter_backtrace(caller)
71
+ end
72
+ assert_block("assert should not be called with a block.") do
73
+ !block_given?
74
+ end
75
+ assert_block(build_message(message, "<?> is not true.", boolean)) do
76
+ boolean
77
+ end
67
78
  end
68
79
  end
69
80
 
@@ -297,6 +308,31 @@ EOT
297
308
  end
298
309
  end
299
310
 
311
+ ##
312
+ # Passes if +object+ does not .respond_to? +method+.
313
+ #
314
+ # Example:
315
+ # assert_not_respond_to('bugbear', :nonexistence) # -> pass
316
+ # assert_not_respond_to('bugbear', :size) # -> fail
317
+
318
+ public
319
+ def assert_not_respond_to(object, method, message="")
320
+ _wrap_assertion do
321
+ full_message = build_message(message,
322
+ "<?>.kind_of\\?(Symbol) or\n" +
323
+ "<?>.respond_to\\?(:to_str) expected",
324
+ method, method)
325
+ assert_block(full_message) do
326
+ method.kind_of?(Symbol) or method.respond_to?(:to_str)
327
+ end
328
+ full_message = build_message(message,
329
+ "!<?>.respond_to\\?(?) expected\n" +
330
+ "(Class: <?>)",
331
+ object, method, object.class)
332
+ assert_block(full_message) {!object.respond_to?(method)}
333
+ end
334
+ end
335
+
300
336
  ##
301
337
  # Passes if +string+ =~ +pattern+.
302
338
  #
@@ -444,25 +480,49 @@ EOT
444
480
  end
445
481
 
446
482
  ##
447
- # Passes if +regexp+ !~ +string+
483
+ # Passes if +regexp+ !~ +string+
448
484
  #
449
485
  # Example:
450
- # assert_no_match(/two/, 'one 2 three')
486
+ # assert_not_match(/two/, 'one 2 three') # -> pass
487
+ # assert_not_match(/three/, 'one 2 three') # -> fail
451
488
 
452
489
  public
453
- def assert_no_match(regexp, string, message="")
490
+ def assert_not_match(regexp, string, message="")
454
491
  _wrap_assertion do
455
- assert_instance_of(Regexp, regexp, "The first argument to assert_no_match should be a Regexp.")
456
- full_message = build_message(message, "<?> expected to not match\n<?>.", regexp, string)
492
+ assert_instance_of(Regexp, regexp,
493
+ "<REGEXP> in assert_not_match(<REGEXP>, ...) " +
494
+ "should be a Regexp.")
495
+ full_message = build_message(message,
496
+ "<?> expected to not match\n<?>.",
497
+ regexp, string)
457
498
  assert_block(full_message) { regexp !~ string }
458
499
  end
459
500
  end
460
501
 
502
+ ##
503
+ # Deprecated. Use #assert_not_match instead.
504
+ #
505
+ # Passes if +regexp+ !~ +string+
506
+ #
507
+ # Example:
508
+ # assert_no_match(/two/, 'one 2 three') # -> pass
509
+ # assert_no_match(/three/, 'one 2 three') # -> fail
510
+
511
+ public
512
+ def assert_no_match(regexp, string, message="")
513
+ _wrap_assertion do
514
+ assert_instance_of(Regexp, regexp,
515
+ "The first argument to assert_no_match " +
516
+ "should be a Regexp.")
517
+ assert_not_match(regexp, string, message)
518
+ end
519
+ end
520
+
461
521
  UncaughtThrow = {
462
- NameError => /^uncaught throw \`(.+)\'$/,
522
+ NameError => /^uncaught throw \`(.+)\'$/, #`
463
523
  ArgumentError => /^uncaught throw (.+)$/,
464
- ThreadError => /^uncaught throw \`(.+)\' in thread /
465
- } #`
524
+ ThreadError => /^uncaught throw \`(.+)\' in thread / #`
525
+ }
466
526
 
467
527
  ##
468
528
  # Passes if the block throws +expected_object+
@@ -550,7 +610,7 @@ EOT
550
610
  # assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
551
611
 
552
612
  public
553
- def assert_in_delta(expected_float, actual_float, delta, message="")
613
+ def assert_in_delta(expected_float, actual_float, delta=0.001, message="")
554
614
  _wrap_assertion do
555
615
  _assert_in_delta_validate_arguments(expected_float,
556
616
  actual_float,
@@ -565,6 +625,31 @@ EOT
565
625
  end
566
626
  end
567
627
 
628
+ ##
629
+ # Passes if +expected_float+ and +actual_float+ are
630
+ # not equal within +delta+ tolerance.
631
+ #
632
+ # Example:
633
+ # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00002) # -> pass
634
+ # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00001) # -> fail
635
+
636
+ public
637
+ def assert_not_in_delta(expected_float, actual_float, delta=0.001, message="")
638
+ _wrap_assertion do
639
+ _assert_in_delta_validate_arguments(expected_float,
640
+ actual_float,
641
+ delta)
642
+ full_message = _assert_in_delta_message(expected_float,
643
+ actual_float,
644
+ delta,
645
+ message,
646
+ :negative_assertion => true)
647
+ assert_block(full_message) do
648
+ (expected_float.to_f - actual_float.to_f).abs > delta.to_f
649
+ end
650
+ end
651
+ end
652
+
568
653
  # :stopdoc:
569
654
  private
570
655
  def _assert_in_delta_validate_arguments(expected_float,
@@ -579,30 +664,49 @@ EOT
579
664
  "The arguments must respond to to_f; " +
580
665
  "the #{name} did not")
581
666
  end
667
+ delta = delta.to_f
582
668
  assert_operator(delta, :>=, 0.0, "The delta should not be negative")
583
669
  end
584
670
 
585
671
  def _assert_in_delta_message(expected_float, actual_float, delta,
586
- message)
587
- format = <<-EOT
588
- <?> expected but was
589
- <?> (tolerance <?>).
672
+ message, options={})
673
+ if options[:negative_assertion]
674
+ format = <<-EOT
675
+ <?> -/+ <?> expected to not include
676
+ <?>.
677
+ EOT
678
+ else
679
+ format = <<-EOT
680
+ <?> -/+ <?> expected to include
681
+ <?>.
590
682
  EOT
591
- arguments = [expected_float, actual_float, delta]
683
+ end
684
+ arguments = [expected_float, delta, actual_float]
592
685
  normalized_expected = expected_float.to_f
593
686
  normalized_actual = actual_float.to_f
594
687
  normalized_delta = delta.to_f
595
688
  relation_format = nil
596
689
  relation_arguments = nil
597
690
  if normalized_actual < normalized_expected - normalized_delta
598
- relation_format = "<<?> < <?>-<?>(?) <= <?>+<?>(?)>"
691
+ relation_format = "<<?> < <?>-<?>[?] <= <?>+<?>[?]>"
599
692
  relation_arguments = [actual_float,
600
- expected_float, delta, expected_float - delta,
601
- expected_float, delta, expected_float + delta]
602
- elsif normalized_expected - normalized_delta < normalized_actual
603
- relation_format = "<<?>-<?>(?) <= <?>+<?>(?) < <?>>"
604
- relation_arguments = [expected_float, delta, expected_float - delta,
605
- expected_float, delta, expected_float + delta,
693
+ expected_float, delta,
694
+ normalized_expected - normalized_delta,
695
+ expected_float, delta,
696
+ normalized_expected + normalized_delta]
697
+ elsif normalized_actual <= normalized_expected + normalized_delta
698
+ relation_format = "<<?>-<?>[?] <= <?> <= <?>+<?>[?]>"
699
+ relation_arguments = [expected_float, delta,
700
+ normalized_expected - normalized_delta,
701
+ actual_float,
702
+ expected_float, delta,
703
+ normalized_expected + normalized_delta]
704
+ else
705
+ relation_format = "<<?>-<?>[?] <= <?>+<?>[?] < <?>>"
706
+ relation_arguments = [expected_float, delta,
707
+ normalized_expected - normalized_delta,
708
+ expected_float, delta,
709
+ normalized_expected + normalized_delta,
606
710
  actual_float]
607
711
  end
608
712
 
@@ -617,6 +721,142 @@ EOT
617
721
 
618
722
  build_message(message, format, *arguments)
619
723
  end
724
+
725
+ public
726
+ # :startdoc:
727
+
728
+ ##
729
+ # Passes if +expected_float+ and +actual_float+ are equal
730
+ # within +epsilon+ relative error of +expected_float+.
731
+ #
732
+ # Example:
733
+ # assert_in_epsilon(10000.0, 9900.0, 0.1) # -> pass
734
+ # assert_in_epsilon(10000.0, 9899.0, 0.1) # -> fail
735
+
736
+ public
737
+ def assert_in_epsilon(expected_float, actual_float, epsilon=0.001,
738
+ message="")
739
+ _wrap_assertion do
740
+ _assert_in_epsilon_validate_arguments(expected_float,
741
+ actual_float,
742
+ epsilon)
743
+ full_message = _assert_in_epsilon_message(expected_float,
744
+ actual_float,
745
+ epsilon,
746
+ message)
747
+ assert_block(full_message) do
748
+ normalized_expected_float = expected_float.to_f
749
+ delta = normalized_expected_float * epsilon.to_f
750
+ (normalized_expected_float - actual_float.to_f).abs <= delta
751
+ end
752
+ end
753
+ end
754
+
755
+ ##
756
+ # Passes if +expected_float+ and +actual_float+ are
757
+ # not equal within +epsilon+ relative error of
758
+ # +expected_float+.
759
+ #
760
+ # Example:
761
+ # assert_not_in_epsilon(10000.0, 9900.0, 0.1) # -> fail
762
+ # assert_not_in_epsilon(10000.0, 9899.0, 0.1) # -> pass
763
+
764
+ public
765
+ def assert_not_in_epsilon(expected_float, actual_float, epsilon=0.001,
766
+ message="")
767
+ _wrap_assertion do
768
+ _assert_in_epsilon_validate_arguments(expected_float,
769
+ actual_float,
770
+ epsilon)
771
+ full_message = _assert_in_epsilon_message(expected_float,
772
+ actual_float,
773
+ epsilon,
774
+ message,
775
+ :negative_assertion => true)
776
+ assert_block(full_message) do
777
+ normalized_expected_float = expected_float.to_f
778
+ delta = normalized_expected_float * epsilon.to_f
779
+ (normalized_expected_float - actual_float.to_f).abs > delta
780
+ end
781
+ end
782
+ end
783
+
784
+ # :stopdoc:
785
+ private
786
+ def _assert_in_epsilon_validate_arguments(expected_float,
787
+ actual_float,
788
+ epsilon)
789
+ {
790
+ expected_float => "first float",
791
+ actual_float => "second float",
792
+ epsilon => "epsilon"
793
+ }.each do |float, name|
794
+ assert_respond_to(float, :to_f,
795
+ "The arguments must respond to to_f; " +
796
+ "the #{name} did not")
797
+ end
798
+ epsilon = epsilon.to_f
799
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
800
+ end
801
+
802
+ def _assert_in_epsilon_message(expected_float, actual_float, epsilon,
803
+ message, options={})
804
+ normalized_expected = expected_float.to_f
805
+ normalized_actual = actual_float.to_f
806
+ normalized_epsilon = epsilon.to_f
807
+ delta = normalized_expected * normalized_epsilon
808
+
809
+ if options[:negative_assertion]
810
+ format = <<-EOT
811
+ <?> -/+ (<?> * <?>)[?] expected to not include
812
+ <?>.
813
+ EOT
814
+ else
815
+ format = <<-EOT
816
+ <?> -/+ (<?> * <?>)[?] expected to include
817
+ <?>.
818
+ EOT
819
+ end
820
+ arguments = [expected_float, expected_float, epsilon, delta,
821
+ actual_float]
822
+
823
+ relation_format = nil
824
+ relation_arguments = nil
825
+ if normalized_actual < normalized_expected - delta
826
+ relation_format = "<<?> < <?>-(<?>*<?>)[?] <= <?>+(<?>*<?>)[?]>"
827
+ relation_arguments = [actual_float,
828
+ expected_float, expected_float, epsilon,
829
+ normalized_expected - delta,
830
+ expected_float, expected_float, epsilon,
831
+ normalized_expected + delta]
832
+ elsif normalized_actual <= normalized_expected + delta
833
+ relation_format = "<<?>-(<?>*<?>)[?] <= <?> <= <?>+(<?>*<?>)[?]>"
834
+ relation_arguments = [expected_float, expected_float, epsilon,
835
+ normalized_expected - delta,
836
+ actual_float,
837
+ expected_float, expected_float, epsilon,
838
+ normalized_expected + delta]
839
+ else
840
+ relation_format = "<<?>-(<?>*<?>)[?] <= <?>+(<?>*<?>)[?] < <?>>"
841
+ relation_arguments = [expected_float, expected_float, epsilon,
842
+ normalized_expected - delta,
843
+ expected_float, expected_float, epsilon,
844
+ normalized_expected + delta,
845
+ actual_float]
846
+ end
847
+
848
+ if relation_format
849
+ format << <<-EOT
850
+
851
+ Relation:
852
+ #{relation_format}
853
+ EOT
854
+ arguments.concat(relation_arguments)
855
+ end
856
+
857
+ build_message(message, format, *arguments)
858
+ end
859
+
620
860
  public
621
861
  # :startdoc:
622
862
 
@@ -629,18 +869,76 @@ EOT
629
869
  # * Arguments to the method
630
870
  #
631
871
  # Example:
632
- # assert_send [[1, 2], :include?, 4]
872
+ # assert_send([[1, 2], :member?, 1]) # -> pass
873
+ # assert_send([[1, 2], :member?, 4]) # -> fail
633
874
 
634
875
  public
635
- def assert_send(send_array, message="")
876
+ def assert_send(send_array, message=nil)
877
+ _wrap_assertion do
878
+ assert_instance_of(Array, send_array,
879
+ "assert_send requires an array " +
880
+ "of send information")
881
+ assert_operator(send_array.size, :>=, 2,
882
+ "assert_send requires at least a receiver " +
883
+ "and a message name")
884
+ format = <<EOT
885
+ <?> expected to respond to
886
+ <?(*?)> with a true value but was
887
+ <?>.
888
+ EOT
889
+ receiver, message_name, *arguments = send_array
890
+ result = nil
891
+ full_message =
892
+ build_message(message,
893
+ format,
894
+ receiver,
895
+ AssertionMessage.literal(message_name.to_s),
896
+ arguments,
897
+ AssertionMessage.delayed_literal {result})
898
+ assert_block(full_message) do
899
+ result = receiver.__send__(message_name, *arguments)
900
+ result
901
+ end
902
+ end
903
+ end
904
+
905
+ ##
906
+ # Passes if the method send doesn't return a true value.
907
+ #
908
+ # +send_array+ is composed of:
909
+ # * A receiver
910
+ # * A method
911
+ # * Arguments to the method
912
+ #
913
+ # Example:
914
+ # assert_not_send([[1, 2], :member?, 1]) # -> fail
915
+ # assert_not_send([[1, 2], :member?, 4]) # -> pass
916
+ def assert_not_send(send_array, message=nil)
636
917
  _wrap_assertion do
637
- assert_instance_of(Array, send_array, "assert_send requires an array of send information")
638
- assert(send_array.size >= 2, "assert_send requires at least a receiver and a message name")
639
- full_message = build_message(message, <<EOT, send_array[0], AssertionMessage.literal(send_array[1].to_s), send_array[2..-1])
918
+ assert_instance_of(Array, send_array,
919
+ "assert_not_send requires an array " +
920
+ "of send information")
921
+ assert_operator(send_array.size, :>=, 2,
922
+ "assert_not_send requires at least a receiver " +
923
+ "and a message name")
924
+ format = <<EOT
640
925
  <?> expected to respond to
641
- <?(?)> with a true value.
926
+ <?(*?)> with not a true value but was
927
+ <?>.
642
928
  EOT
643
- assert_block(full_message) { send_array[0].__send__(send_array[1], *send_array[2..-1]) }
929
+ receiver, message_name, *arguments = send_array
930
+ result = nil
931
+ full_message =
932
+ build_message(message,
933
+ format,
934
+ receiver,
935
+ AssertionMessage.literal(message_name.to_s),
936
+ arguments,
937
+ AssertionMessage.delayed_literal {result})
938
+ assert_block(full_message) do
939
+ result = receiver.__send__(message_name, *arguments)
940
+ not result
941
+ end
644
942
  end
645
943
  end
646
944
 
@@ -823,7 +1121,7 @@ EOT
823
1121
  end
824
1122
 
825
1123
  ##
826
- # Passes if +object+.+predicate+
1124
+ # Passes if +object+.+predicate+ is _true_.
827
1125
  #
828
1126
  # Example:
829
1127
  # assert_predicate([], :empty?) # -> pass
@@ -845,7 +1143,7 @@ EOT
845
1143
  end
846
1144
 
847
1145
  ##
848
- # Passes if +object+.+predicate+
1146
+ # Passes if +object+.+predicate+ is not _true_.
849
1147
  #
850
1148
  # Example:
851
1149
  # assert_not_predicate([1], :empty?) # -> pass
@@ -950,6 +1248,96 @@ EOT
950
1248
  end
951
1249
  end
952
1250
 
1251
+ ##
1252
+ # Passes if +collection+ includes +object+.
1253
+ #
1254
+ # Example:
1255
+ # assert_include([1, 10], 1) # -> pass
1256
+ # assert_include(1..10, 5) # -> pass
1257
+ # assert_include([1, 10], 5) # -> fail
1258
+ # assert_include(1..10, 20) # -> fail
1259
+ def assert_include(collection, object, message=nil)
1260
+ _wrap_assertion do
1261
+ assert_respond_to(collection, :include?,
1262
+ "The collection must respond to :include?.")
1263
+ full_message = build_message(message,
1264
+ "<?> expected to include\n<?>.",
1265
+ collection,
1266
+ object)
1267
+ assert_block(full_message) do
1268
+ collection.include?(object)
1269
+ end
1270
+ end
1271
+ end
1272
+
1273
+ ##
1274
+ # Passes if +collection+ doesn't include +object+.
1275
+ #
1276
+ # Example:
1277
+ # assert_not_include([1, 10], 5) # -> pass
1278
+ # assert_not_include(1..10, 20) # -> pass
1279
+ # assert_not_include([1, 10], 1) # -> fail
1280
+ # assert_not_include(1..10, 5) # -> fail
1281
+ def assert_not_include(collection, object, message=nil)
1282
+ _wrap_assertion do
1283
+ assert_respond_to(collection, :include?,
1284
+ "The collection must respond to :include?.")
1285
+ full_message = build_message(message,
1286
+ "<?> expected to not include\n<?>.",
1287
+ collection,
1288
+ object)
1289
+ assert_block(full_message) do
1290
+ not collection.include?(object)
1291
+ end
1292
+ end
1293
+ end
1294
+
1295
+ ##
1296
+ # Passes if +object+ is empty.
1297
+ #
1298
+ # Example:
1299
+ # assert_empty("") # -> pass
1300
+ # assert_empty([]) # -> pass
1301
+ # assert_empty({}) # -> pass
1302
+ # assert_empty(" ") # -> fail
1303
+ # assert_empty([nil]) # -> fail
1304
+ # assert_empty({1 => 2}) # -> fail
1305
+ def assert_empty(object, message=nil)
1306
+ _wrap_assertion do
1307
+ assert_respond_to(object, :empty?,
1308
+ "The object must respond to :empty?.")
1309
+ full_message = build_message(message,
1310
+ "<?> expected to be empty.",
1311
+ object)
1312
+ assert_block(full_message) do
1313
+ object.empty?
1314
+ end
1315
+ end
1316
+ end
1317
+
1318
+ ##
1319
+ # Passes if +object+ is not empty.
1320
+ #
1321
+ # Example:
1322
+ # assert_not_empty(" ") # -> pass
1323
+ # assert_not_empty([nil]) # -> pass
1324
+ # assert_not_empty({1 => 2}) # -> pass
1325
+ # assert_not_empty("") # -> fail
1326
+ # assert_not_empty([]) # -> fail
1327
+ # assert_not_empty({}) # -> fail
1328
+ def assert_not_empty(object, message=nil)
1329
+ _wrap_assertion do
1330
+ assert_respond_to(object, :empty?,
1331
+ "The object must respond to :empty?.")
1332
+ full_message = build_message(message,
1333
+ "<?> expected to not be empty.",
1334
+ object)
1335
+ assert_block(full_message) do
1336
+ not object.empty?
1337
+ end
1338
+ end
1339
+ end
1340
+
953
1341
  ##
954
1342
  # Builds a failure message. +head+ is added before the +template+ and
955
1343
  # +arguments+ replaces the '?'s positionally in the template.
@@ -961,21 +1349,21 @@ EOT
961
1349
  end
962
1350
 
963
1351
  private
964
- def _wrap_assertion
1352
+ def _wrap_assertion(&block)
965
1353
  @_assertion_wrapped ||= false
966
- unless (@_assertion_wrapped)
1354
+ if @_assertion_wrapped
1355
+ block.call
1356
+ else
967
1357
  @_assertion_wrapped = true
968
1358
  begin
969
1359
  add_assertion
970
- return yield
1360
+ block.call
971
1361
  ensure
972
1362
  @_assertion_wrapped = false
973
1363
  end
974
- else
975
- return yield
976
1364
  end
977
1365
  end
978
-
1366
+
979
1367
  ##
980
1368
  # Called whenever an assertion is made. Define this in classes that
981
1369
  # include Test::Unit::Assertions to record assertion counts.
@@ -1062,6 +1450,14 @@ EOT
1062
1450
  end
1063
1451
  end
1064
1452
 
1453
+ def ensure_diffable_string(string)
1454
+ if string.respond_to?(:encoding) and
1455
+ !string.encoding.ascii_compatible?
1456
+ string = string.dup.force_encoding("ASCII-8BIT")
1457
+ end
1458
+ string
1459
+ end
1460
+
1065
1461
  def prepare_for_diff(from, to)
1066
1462
  if !from.is_a?(String) or !to.is_a?(String)
1067
1463
  from = convert(from)
@@ -1069,6 +1465,8 @@ EOT
1069
1465
  end
1070
1466
 
1071
1467
  if diff_target_string?(from) and diff_target_string?(to)
1468
+ from = ensure_diffable_string(from)
1469
+ to = ensure_diffable_string(to)
1072
1470
  [from, to]
1073
1471
  else
1074
1472
  [nil, nil]
@@ -1112,8 +1510,13 @@ EOM
1112
1510
  if use_pp
1113
1511
  begin
1114
1512
  require 'pp' unless defined?(PP)
1513
+ if HashInspector.target?(object)
1514
+ pp_target = HashInspector.new(object)
1515
+ else
1516
+ pp_target = object
1517
+ end
1115
1518
  begin
1116
- return PP.pp(object, '').chomp
1519
+ return PP.pp(pp_target, '').chomp
1117
1520
  rescue NameError
1118
1521
  end
1119
1522
  rescue LoadError
@@ -1125,6 +1528,56 @@ EOM
1125
1528
  end
1126
1529
  end
1127
1530
 
1531
+ class HashInspector
1532
+ class << self
1533
+ def target?(object)
1534
+ object.is_a?(Hash) or object == ENV
1535
+ end
1536
+
1537
+ def normalize(object)
1538
+ if target?(object)
1539
+ new(object)
1540
+ else
1541
+ object
1542
+ end
1543
+ end
1544
+ end
1545
+
1546
+ def initialize(hash)
1547
+ @hash = hash
1548
+ end
1549
+
1550
+ def inspect
1551
+ @hash.inspect
1552
+ end
1553
+
1554
+ def pretty_print(q)
1555
+ q.group(1, '{', '}') do
1556
+ q.seplist(self, nil, :each_pair) do |k, v|
1557
+ q.group do
1558
+ q.pp(k)
1559
+ q.text('=>')
1560
+ q.group(1) do
1561
+ q.breakable('')
1562
+ q.pp(v)
1563
+ end
1564
+ end
1565
+ end
1566
+ end
1567
+ end
1568
+
1569
+ def pretty_print_cycle(q)
1570
+ q.text(@hash.empty? ? '{}' : '{...}')
1571
+ end
1572
+
1573
+ def each_pair
1574
+ @hash.keys.sort.each do |key|
1575
+ yield(self.class.normalize(key),
1576
+ self.class.normalize(@hash[key]))
1577
+ end
1578
+ end
1579
+ end
1580
+
1128
1581
  class Literal
1129
1582
  def initialize(value)
1130
1583
  @value = value