activeldap 0.10.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/CHANGES +6 -30
  2. data/README +4 -2
  3. data/Rakefile +7 -0
  4. data/data/locale/en/LC_MESSAGES/active-ldap.mo +0 -0
  5. data/data/locale/ja/LC_MESSAGES/active-ldap.mo +0 -0
  6. data/examples/al-admin/po/en/al-admin.po +3 -3
  7. data/examples/al-admin/po/ja/al-admin.po +3 -3
  8. data/examples/al-admin/po/nl/al-admin.po +3 -3
  9. data/lib/active_ldap/adapter/base.rb +0 -2
  10. data/lib/active_ldap/base.rb +4 -2
  11. data/lib/active_ldap/get_text_support.rb +3 -11
  12. data/lib/active_ldap/operations.rb +1 -0
  13. data/lib/active_ldap/schema/syntaxes.rb +5 -3
  14. data/lib/active_ldap/validations.rb +25 -15
  15. data/lib/active_ldap.rb +1 -1
  16. data/po/en/active-ldap.po +1 -1
  17. data/po/ja/active-ldap.po +1 -1
  18. data/rails/plugin/active_ldap/init.rb +1 -1
  19. data/test/run-test.rb +2 -0
  20. data/test/test_base.rb +63 -1
  21. data/test/test_syntax.rb +3 -2
  22. data/test-unit-ext/NEWS.en +28 -0
  23. data/test-unit-ext/NEWS.ja +28 -0
  24. data/test-unit-ext/README.en +247 -0
  25. data/test-unit-ext/README.ja +246 -0
  26. data/test-unit-ext/Rakefile +111 -0
  27. data/{test → test-unit-ext/lib}/test-unit-ext/always-show-result.rb +0 -0
  28. data/test-unit-ext/lib/test-unit-ext/assertions.rb +40 -0
  29. data/test-unit-ext/lib/test-unit-ext/attributes.rb +129 -0
  30. data/{test → test-unit-ext/lib}/test-unit-ext/backtrace-filter.rb +0 -0
  31. data/test-unit-ext/lib/test-unit-ext/color.rb +59 -0
  32. data/test-unit-ext/lib/test-unit-ext/colorized-runner.rb +111 -0
  33. data/test-unit-ext/lib/test-unit-ext/diff.rb +516 -0
  34. data/{test → test-unit-ext/lib}/test-unit-ext/long-display-for-emacs.rb +0 -0
  35. data/test-unit-ext/lib/test-unit-ext/notification.rb +79 -0
  36. data/test-unit-ext/lib/test-unit-ext/omission.rb +96 -0
  37. data/test-unit-ext/lib/test-unit-ext/pending.rb +97 -0
  38. data/{test → test-unit-ext/lib}/test-unit-ext/priority.rb +25 -53
  39. data/test-unit-ext/lib/test-unit-ext/version.rb +3 -0
  40. data/test-unit-ext/lib/test-unit-ext/xml-report.rb +224 -0
  41. data/test-unit-ext/lib/test-unit-ext.rb +16 -0
  42. data/test-unit-ext/misc/rd2html.rb +42 -0
  43. data/test-unit-ext/test/run-test.rb +14 -0
  44. data/test-unit-ext/test/test_attributes.rb +139 -0
  45. data/test-unit-ext/test/test_color.rb +39 -0
  46. data/test-unit-ext/test/test_diff.rb +475 -0
  47. data/test-unit-ext/test/test_notification.rb +32 -0
  48. data/test-unit-ext/test/test_omission.rb +64 -0
  49. data/test-unit-ext/test/test_pending.rb +64 -0
  50. data/test-unit-ext/test/test_priority.rb +88 -0
  51. data/test-unit-ext/test/test_xml_report.rb +161 -0
  52. metadata +34 -7
  53. data/test/test-unit-ext.rb +0 -4
@@ -0,0 +1,247 @@
1
+ # -*- rd -*-
2
+
3
+ = README
4
+
5
+ == Name
6
+
7
+ TestUnitExt
8
+
9
+ == What's this?
10
+
11
+ TestUnitExt extends the standard Test::Unit.
12
+
13
+ TestUnitExt provides some useful features:
14
+
15
+ * Emacs friendly backtrace format.
16
+ * runs tests depending on priority.
17
+ * supports attributes for each test.
18
+ * always shows tests result even if tests are interrupted.
19
+ * colorized output.
20
+ * outputs diff between expected and actual value.
21
+ * reports test result as XML format.
22
+ * adds pending/omission/notification methods.
23
+
24
+ == Author
25
+
26
+ Kouhei Sutou <kou@cozmixng.org>
27
+
28
+ == Licence
29
+
30
+ Ruby's.
31
+
32
+ # == Mailing list
33
+ #
34
+ # None. needed?
35
+
36
+ == Reference manual
37
+
38
+ ((<URL:http://test-unit-ext.rubyforge.org/doc/>))
39
+
40
+ == Dependency libraries
41
+
42
+ None
43
+
44
+ == Usage
45
+
46
+ require 'test-unit-ext'
47
+
48
+ == Reference
49
+
50
+ === Attributes
51
+
52
+ You can add attributes to your test to get more useful
53
+ information on failure. For example, you can add Bug ID like
54
+ the following
55
+
56
+ class MyTest < Test::Unit::TestCase
57
+ bug 123
58
+ def test_invalid_input
59
+ assert_equal("OK", input)
60
+ end
61
+ end
62
+
63
+ In the above example, test_invalid_input test has an
64
+ attribute that the test is for Bug #123.
65
+
66
+ You can also write like the following:
67
+
68
+ class MyTest < Test::Unit::TestCase
69
+ attribute :bug, 123
70
+ def test_invalid_input
71
+ assert_equal("OK", input)
72
+ end
73
+ end
74
+
75
+ That is, bug method is a convenience method. You can add any
76
+ attributes to your test if you use attribute method.
77
+
78
+ === Priority
79
+
80
+ It will be difficult that you drop into test and develop
81
+ cycle when you have many tests and the tests take much
82
+ time. To reduce the problem, you can select some tests from
83
+ all tests and reduce elapsed time each test. It's a problem
84
+ that which tests are selected in each test.
85
+
86
+ In TestUnitExt, each test has its priority and runs tests
87
+ are selected by probabilistic method. --priority command
88
+ line option enables this feature.
89
+
90
+ A test that has higher priority will be ran in higher
91
+ ratio. Each test doesn't run all tests but tests that are
92
+ ran each test are changed in each test. All tests will be
93
+ ran after some test and develop cycles.
94
+
95
+ Tests that aren't succeeded in the previous test are ran in
96
+ the current test in spite of its priority. This means that
97
+ important tests are ran without you do something. You will
98
+ keep your lightweight test and develop cycles without
99
+ additional works.
100
+
101
+ Here are a sample priority specification. Priority
102
+ specification effects followed tests like public and
103
+ private.
104
+
105
+ class MyTest < Test::Unit::TestCase
106
+ priority :must
107
+ def test_must
108
+ # will be always ran
109
+ end
110
+
111
+ def test_must2
112
+ # will be always ran too
113
+ end
114
+
115
+ priority :import
116
+ def test_import
117
+ # will be almost ran
118
+ end
119
+
120
+ priority :high
121
+ def test_high
122
+ # will be ran in high probability
123
+ end
124
+
125
+ priority :normal
126
+ def test_normal
127
+ # will be ran in fifty-fifty probability
128
+ # tests without priority specification has normal priority
129
+ end
130
+
131
+ priority :low
132
+ def test_low
133
+ # will be sometimes ran
134
+ end
135
+
136
+ priority :never
137
+ def test_never
138
+ # never be ran
139
+ end
140
+ end
141
+
142
+ === Pending
143
+
144
+ You may write a test for a function that is not
145
+ implemented. In the case, the test will be failed. It's
146
+ correct that the test is failed but the test means 'the
147
+ function is not implemented'. To state your intent, pend
148
+ method is provided.
149
+
150
+ Please state your intent by your test code by using the
151
+ method.
152
+
153
+ class MyTest < Test::Unit::TestCase
154
+ def test_minor_function
155
+ pend("Should implement")
156
+ assert_equal("Good!", MyModule.minor_function)
157
+ end
158
+ end
159
+
160
+ === Omission
161
+
162
+ You may write a test only for a special environment. In the
163
+ case, the test will not work on a standard environment and you
164
+ know that before you run the test. You will omit the test on
165
+ a standard environment. To state your intent, omit method is
166
+ provided.
167
+
168
+ Please state your intent by your test code by using the method.
169
+
170
+ class MyTest < Test::Unit::TestCase
171
+ def test_special_function
172
+ omit("Only for special environment") unless MyModule.special_environment?
173
+ assert_equal("Good!", MyModule.special_function)
174
+ end
175
+ end
176
+
177
+
178
+ === Notification
179
+
180
+ You may put some messages in test. For example, "this test
181
+ is omitted because XXX module is not found on the
182
+ environment."
183
+
184
+ Those messages can be displayed by puts but it causes test
185
+ result output. To prevent this, notify method is
186
+ provided. notify method doesn't display those messages in
187
+ the place but display those messages in test result summary
188
+ like "failure", "error" and so on. You can leave those
189
+ messages without breaking test result output by using notify
190
+ method.
191
+
192
+ class MyTest < Test::Unit::TestCase
193
+ def test_with_other_module
194
+ unless MyModule.have_XXX?
195
+ notify("XXX module isn't found. skip this test.")
196
+ return
197
+ end
198
+ assert_equal("XXX Module!!!", MyModule.use_XXX)
199
+ end
200
+ end
201
+
202
+ === XML report
203
+
204
+ Test result can be reported as XML format if --xml-report
205
+ option is specified. A reported XML has the following
206
+ structure:
207
+
208
+ <report>
209
+ <result>
210
+ <test-case>
211
+ <name>TEST CASE NAME</name>
212
+ <description>DESCRIPTION OF TEST CASE (if exists)</description>
213
+ </test-case>
214
+ <test>
215
+ <name>TEST NAME</name>
216
+ <description>DESCRIPTION OF TEST CASE (if exists)</description>
217
+ <option><!-- ATTRIBUTE INFORMATION (if exists) -->
218
+ <name>ATTRIBUTE NAME (e.g.: bug)</name>
219
+ <value>ATTRIBUTE VALUE (e.g.: 1234)</value>
220
+ </option>
221
+ <option>
222
+ ...
223
+ </option>
224
+ </test>
225
+ <status>TEST RESULT ([success|failure|error|pending|notification])</status>
226
+ <detail>DETAIL OF TEST RESULT (if exists)</detail>
227
+ <backtrace><!-- BACKTRACE (if exists) -->
228
+ <entry>
229
+ <file>FILE NAME</file>
230
+ <line>LINE</line>
231
+ <info>ADDITIONAL INFORMATION</info>
232
+ </entry>
233
+ <entry>
234
+ ...
235
+ </entry>
236
+ </backtrace>
237
+ <elapsed>ELAPSED TIME (e.g.: 0.000010)</elapsed>
238
+ </result>
239
+ <result>
240
+ ...
241
+ </result>
242
+ ...
243
+ </report>
244
+
245
+ == Thanks
246
+
247
+ * ...
@@ -0,0 +1,246 @@
1
+ # -*- rd -*-
2
+
3
+ = README.ja
4
+
5
+ == 名前
6
+
7
+ TestUnitExt
8
+
9
+ == なにこれ?
10
+
11
+ TestUnitExtはRuby標準のTest::Unitを拡張します。
12
+
13
+ TestUnitExtはいくつかの有用な機能を提供します。
14
+
15
+ * Emacsにやさしいバックトレースフォーマット
16
+ * 優先度に応じたテストの実行
17
+ * 各テストへの属性の付加
18
+ * テストを途中終了(Ctrl+C)しても結果を表示
19
+ * 色付き出力
20
+ * テスト結果のdiff出力
21
+ * テスト結果のXMLでの出力
22
+ * 保留(pending)・省略(omission)・通知(notification)用メソッドの追加
23
+
24
+ == 作者
25
+
26
+ Kouhei Sutou <kou@cozmixng.org>
27
+
28
+ == ライセンス
29
+
30
+ Ruby's.
31
+
32
+ # == メーリングリスト
33
+ #
34
+ # なし。必要?
35
+
36
+ == リファレンスマニュアル
37
+
38
+ ((<URL:http://test-unit-ext.rubyforge.org/doc/>))
39
+
40
+ == 依存ライブラリ
41
+
42
+ なし
43
+
44
+ == 使用法
45
+
46
+ require 'test-unit-ext'
47
+
48
+ == リファレンス
49
+
50
+ === 属性
51
+
52
+ テストに属性を加えて、テスト失敗時により有益な情報を利用する
53
+ ことができます。例えば、以下のようにテストにBug IDの情報を付
54
+ 加することができます。
55
+
56
+ class MyTest < Test::Unit::TestCase
57
+ bug 123
58
+ def test_invalid_input
59
+ assert_equal("OK", input)
60
+ end
61
+ end
62
+
63
+ この例では、test_invalid_inputテストがBug #123のテストである
64
+ という情報を付加しています。
65
+
66
+ これは以下のように書くこともできます。
67
+
68
+ class MyTest < Test::Unit::TestCase
69
+ attribute :bug, 123
70
+ def test_invalid_input
71
+ assert_equal("OK", input)
72
+ end
73
+ end
74
+
75
+ つまり、bugメソッドは便利のために用意されたメソッドです。
76
+ attributeメソッドを使うことで任意の属性を付加することができ
77
+ ます。
78
+
79
+ === 優先度
80
+
81
+ テストが多くなるとテスト時間が長くなり、テストと開発をリズム
82
+ 良く繰り返すことが難しくなります。それを軽減するために、開発
83
+ 時のテストでは毎回全てのテストを実行するのではなく、一部のテ
84
+ ストのみ実行して1回のテスト時間を短くすることができます。問題
85
+ は各テストでどのテストを実行するかです。
86
+
87
+ TestUnitExtでは属性としてテストに優先度を付け、それに従って毎
88
+ 回実行するテストを確率的に選択します。コマンドラインオプショ
89
+ ンで--priorityを指定するとこの機能が有効になります。
90
+
91
+ 優先度が高いテスト程高い確率で実行され、そうではないテストは
92
+ 低い頻度で実行されます。各テストでは全てのテストは実行しない
93
+ が、各テストで実行するテストがその都度変わるため、何度も走ら
94
+ せることにより結果的にテスト全体を実行することになります。
95
+
96
+ また、前回成功しなかったテストは確実に実行するため、明示的に
97
+ 優先度を上げなくても失敗している(現在注目すべき重要な)テス
98
+ トは毎回必ず実行します。これにより、プログラマの負荷をあげる
99
+ ことなくテストのメリットを受けたまま、テストと開発のリズムを
100
+ 保つことができます。
101
+
102
+ 優先度は以下のように指定します。優先度指定はpublicやprivateの
103
+ ように、以降のメソッド定義に影響します。
104
+
105
+ class MyTest < Test::Unit::TestCase
106
+ priority :must
107
+ def test_must
108
+ # 必ず実行
109
+ end
110
+
111
+ def test_must2
112
+ # これも必ず実行
113
+ end
114
+
115
+ priority :import
116
+ def test_import
117
+ # 高い確率で実行
118
+ end
119
+
120
+ priority :high
121
+ def test_high
122
+ # やや高い確率で実行
123
+ end
124
+
125
+ priority :normal
126
+ def test_normal
127
+ # 半々の確率で実行
128
+ # 優先度を指定していないときはnormal
129
+ end
130
+
131
+ priority :low
132
+ def test_low
133
+ # たまに実行
134
+ end
135
+
136
+ priority :never
137
+ def test_never
138
+ # 実行しない
139
+ end
140
+ end
141
+
142
+ === 保留
143
+
144
+ 現在はまだ実装していない機能をテストとして書く場合もあります。
145
+ その場合、まだ実装していない機能のテストは失敗します。たしか
146
+ にテストは失敗なのですが、そのテストは「実装が間違っている」
147
+ ではなく、「まだ実装していない」を意図しています。これを明示
148
+ 的に表現するために新しくpendというメソッドを用意しています。
149
+
150
+ 「現在はまだ実装していない」という場合はこのメソッドを使って、
151
+ その意図をコードで表現してください。
152
+
153
+ class MyTest < Test::Unit::TestCase
154
+ def test_minor_function
155
+ pend("Should implement")
156
+ assert_equal("Good!", MyModule.minor_function)
157
+ end
158
+ end
159
+
160
+ === 省略
161
+
162
+ 特定の環境でしか動作しないテストを書く場合もあります。その場
163
+ 合、特定の環境以外ではそのテストは失敗します。この場合はその
164
+ テストは特定の環境以外では失敗することがわかっています。その
165
+ ため、特定の環境以外ではそのテストは省略します。これを明示的
166
+ に表現するために新しくomitというメソッドを用意しています。
167
+
168
+ 「このテストは省略する」という場合はこのメソッドを使って、そ
169
+ の意図をコードで表現してください。
170
+
171
+ class MyTest < Test::Unit::TestCase
172
+ def test_special_function
173
+ omit("Only for special environment") unless MyModule.special_environment?
174
+ assert_equal("Good!", MyModule.special_function)
175
+ end
176
+ end
177
+
178
+ === 通知
179
+
180
+ テスト中で何らかのメッセージを残したいことがあります。例えば、
181
+ 「この環境では○○モジュールがないからこのテストは省略しま
182
+ す」、という場合です。
183
+
184
+ それらのメッセージをputsで表示することもできますが、テスト結
185
+ 果の表示が乱れてしまいます。これを防ぐために、新しくnotifyメ
186
+ ソッドを用意しています。notifyを使うとメッセージはその場では
187
+ 表示されず、テスト終了後に他の「失敗」や「エラー」などと同じ
188
+ ように表示されます。これにより、テスト結果の表示を乱さずにメッ
189
+ セージを残すことができます。
190
+
191
+ class MyTest < Test::Unit::TestCase
192
+ def test_with_other_module
193
+ unless MyModule.have_XXX?
194
+ notify("XXX module isn't found. skip this test.")
195
+ return
196
+ end
197
+ assert_equal("XXX Module!!!", MyModule.use_XXX)
198
+ end
199
+ end
200
+
201
+ === XML出力
202
+
203
+ --xml-reportオプションを指定することでテスト結果をXML形式で出
204
+ 力することができます。出力されるXMLは以下のような構造になって
205
+ います。
206
+
207
+ <report>
208
+ <result>
209
+ <test-case>
210
+ <name>テストケース名</name>
211
+ <description>テストケースの説明(もしあれば)</description>
212
+ </test-case>
213
+ <test>
214
+ <name>テスト名</name>
215
+ <description>テストの説明(もしあれば)</description>
216
+ <option><!-- 属性情報(もしあれば) -->
217
+ <name>属性名(例: bug)</name>
218
+ <value>属性値(例: 1234)</value>
219
+ </option>
220
+ <option>
221
+ ...
222
+ </option>
223
+ </test>
224
+ <status>テスト結果([success|failure|error|pending|notification])</status>
225
+ <detail>テスト結果の詳細(もしあれば)</detail>
226
+ <backtrace><!-- バックトレース(もしあれば) -->
227
+ <entry>
228
+ <file>ファイル名</file>
229
+ <line>行</line>
230
+ <info>付加情報</info>
231
+ </entry>
232
+ <entry>
233
+ ...
234
+ </entry>
235
+ </backtrace>
236
+ <elapsed>実行時間(例: 0.000010)</elapsed>
237
+ </result>
238
+ <result>
239
+ ...
240
+ </result>
241
+ ...
242
+ </report>
243
+
244
+ == 感謝
245
+
246
+ * ...
@@ -0,0 +1,111 @@
1
+ # -*- mode: ruby; coding: utf-8 -*-
2
+
3
+ require 'English'
4
+
5
+ require 'find'
6
+ require 'fileutils'
7
+ require 'rubygems'
8
+ require 'hoe'
9
+
10
+ base_dir = File.join(File.dirname(__FILE__))
11
+ truncate_base_dir = Proc.new do |x|
12
+ x.gsub(/^#{Regexp.escape(base_dir + File::SEPARATOR)}/, '')
13
+ end
14
+
15
+ lib_dir = File.join(base_dir, 'lib')
16
+ $LOAD_PATH.unshift(lib_dir)
17
+
18
+ require 'test-unit-ext'
19
+
20
+ Test::Unit.run = true
21
+
22
+ manifest = File.join(base_dir, "Manifest.txt")
23
+ manifest_contents = []
24
+ base_dir_included_components = %w(NEWS.en NEWS.ja README.en README.ja Rakefile)
25
+ excluded_components = %w(.svn .test-result pkg)
26
+ excluded_suffixes = %w(.png .ps .pdf .o .so .txt)
27
+ Find.find(base_dir) do |target|
28
+ target = truncate_base_dir[target]
29
+ components = target.split(File::SEPARATOR)
30
+ if components.size == 1 and !File.directory?(target)
31
+ next unless base_dir_included_components.include?(components[0])
32
+ end
33
+ Find.prune if (excluded_components - components) != excluded_components
34
+ next if excluded_suffixes.include?(File.extname(target))
35
+ manifest_contents << target if File.file?(target)
36
+ end
37
+
38
+ dummy_files = %w(History.txt README.txt)
39
+ FileUtils.touch("History.txt")
40
+ FileUtils.cp("README.en", "README.txt")
41
+
42
+ File.open(manifest, "w") do |f|
43
+ f.puts manifest_contents.sort.join("\n")
44
+ end
45
+ at_exit do
46
+ FileUtils.rm_f(manifest)
47
+ FileUtils.rm_f(dummy_files)
48
+ end
49
+
50
+ def cleanup_white_space(entry)
51
+ entry.gsub(/(\A\n+|\n+\z)/, '') + "\n"
52
+ end
53
+
54
+ version = TestUnitExt::VERSION
55
+ ENV["VERSION"] = version
56
+ project = Hoe.new('test-unit-ext', version) do |project|
57
+ project.rubyforge_name = 'test-unit-ext'
58
+ project.remote_rdoc_dir = "doc"
59
+ project.author = ["Kouhei Sutou"]
60
+ project.email = ['kou@cozmixng.org']
61
+ project.summary = 'Ruby bindings for cairo'
62
+ project.url = 'http://test-unit-ext.rubyforge.org/'
63
+
64
+ news_of_current_release = File.read("NEWS.en").split(/^==\s.*$/)[1]
65
+ project.changes = cleanup_white_space(news_of_current_release)
66
+
67
+ entries = File.read("README.en").split(/^==\s(.*)$/)
68
+ whats_this = cleanup_white_space(entries[entries.index("What\'s this?") + 1])
69
+ project.summary, project.description, = whats_this.split(/\n\n+/, 3)
70
+ end
71
+
72
+ spec = project.spec
73
+ spec.rdoc_options = spec.rdoc_options.collect do |option|
74
+ option == "README.txt" ? "README.en" : option
75
+ end
76
+ spec.extra_rdoc_files += spec.files.grep(/(:?README|NEWS)\.(:?ja|en)\z/)
77
+ spec.dependencies.delete_if {|dependency| dependency.name == "hoe"}
78
+
79
+ rdoc_task = nil
80
+ if ObjectSpace.each_object(Rake::RDocTask) {|rdoc_task|} != 1
81
+ puts "hoe may be changed"
82
+ end
83
+ rdoc_task.main = "README.en"
84
+ rdoc_task.options.delete("-d")
85
+ rdoc_task.options << "--charset=UTF-8"
86
+ rdoc_task.template = "kilmer"
87
+ rdoc_task.rdoc_files += ["README.en", "NEWS.en"]
88
+
89
+ desc 'Tag the repository for release.'
90
+ task :tag do
91
+ message = "Released TestUnitExt #{version}!"
92
+ base = "svn+ssh://#{ENV['USER']}@rubyforge.org/var/svn/test-unit-ext/"
93
+ sh 'svn', 'copy', '-m', message, "#{base}trunk", "#{base}tags/#{version}"
94
+ end
95
+
96
+ desc "Publish static HTML files"
97
+ task :publish_html do
98
+ ruby "misc/rd2html.rb"
99
+ Dir.glob("html/*.html.en") do |html_en|
100
+ FileUtils.cp(html_en, html_en.sub(/\.en$/, ''))
101
+ end
102
+ config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
103
+ host = "#{config["username"]}@rubyforge.org"
104
+ remote_dir = "/var/www/gforge-projects/#{project.rubyforge_name}"
105
+ local_dir = "html"
106
+ sh "rsync #{project.rsync_args} #{local_dir}/*.html* #{host}:#{remote_dir}"
107
+ end
108
+ task :publish_docs => :publish_html
109
+
110
+ desc "Distribute new release."
111
+ task :dist => [:publish_docs, :release, :tag, :announce]
@@ -0,0 +1,40 @@
1
+ require "test/unit/testcase"
2
+
3
+ module Test
4
+ module Unit
5
+ module AssertionsWithDiff
6
+ def assert_equal(expected, actual, message=nil)
7
+ super
8
+ rescue AssertionFailedError
9
+ expected = PP.pp(expected, "") unless expected.is_a?(String)
10
+ actual = PP.pp(actual, "") unless actual.is_a?(String)
11
+ diff = Diff.readable(expected, actual)
12
+ if /^[\?\-\+].{79}/ =~ diff
13
+ folded_diff = Diff.readable(fold(expected), fold(actual))
14
+ diff = "#{diff}\n\nfolded diff:\n#{folded_diff}"
15
+ end
16
+ raise $!, "#{$!.message}\n\ndiff:\n#{diff}", $@
17
+ end
18
+
19
+ def fold(string)
20
+ string.split(/\n/).collect do |line|
21
+ line.gsub(/(.{78})/, "\\1\n")
22
+ end.join("\n")
23
+ end
24
+ end
25
+
26
+ module AdditionalAssertions
27
+ def assert_boolean(expected)
28
+ assert([true, false].include?(expected),
29
+ build_message(nil,
30
+ "<true or false> expected but was\n<?>",
31
+ expected))
32
+ end
33
+ end
34
+
35
+ class TestCase
36
+ include AssertionsWithDiff
37
+ include AdditionalAssertions
38
+ end
39
+ end
40
+ end