oktest 1.2.0 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 829638b6c9703b023e61adfdef426e7ddb206f2ba93775143b8ae39c86b0f381
4
- data.tar.gz: f4d70f1272398f74b0abaad9bd0ea027ca557a8860c44d6f11f056a60d89fc4c
3
+ metadata.gz: 65c65e47a706541792e7ba1e9705dc03af1c2fe46c87141472659fb811463e76
4
+ data.tar.gz: c405d466c9b63eb3897754716d220f884af655cceba5cc7c644e742caf22b465
5
5
  SHA512:
6
- metadata.gz: 5669eea2d32e6d0ecdfdd263a50e9a740fd6e2da081bbc0e35d433796d242507341bccc53c2c6ca7cd5a26d0b55a7c8222da5fb15eca27945a1207222c4ee32d
7
- data.tar.gz: 8cdce5238153c774972ac26bf6b389786b920a41c8d4d2069df03d17e80ebdd299be83a63d44f7840088482b3e05e35019fdf0804a57c1273e93cde14a9a547e
6
+ metadata.gz: 496909751ed5b3035d07091c0dc362af3586e85e144177603f15035e178fa5f1d9e31c70bd1da7c60059efd8c3275c781e5876af45ac144f4d56fccf444fea20
7
+ data.tar.gz: e7d440c6dcdbccefe33e99be638dc0f70aae187ee49f0fc091ea631f55e93da822b22804bfa57d570bf9190440c248783564724fa7998df4b0e9b0a6eb0f7ed3
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011-2021 kuwata-lab.com all rights reserved
1
+ Copyright (c) 2011-2024 kuwata-lab.com all rights reserved
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -95,8 +95,8 @@ Oktest.rb requires Ruby 2.0 or later.
95
95
  * <a href="#testing-rack-application">Testing Rack Application</a>
96
96
  * <a href="#environment-variale-oktest_rb">Environment Variale <code>$OKTEST_RB</code></a>
97
97
  * <a href="#traverser-class">Traverser Class</a>
98
- * <a href="#benchmarks">Benchmarks</a>
99
98
  * <a href="#--faster-option"><code>--faster</code> Option</a>
99
+ * <a href="#benchmarks">Benchmarks</a>
100
100
  * <a href="#change-log">Change Log</a>
101
101
  * <a href="#license-and-copyright">License and Copyright</a>
102
102
 
@@ -817,10 +817,15 @@ ok {pr}.raise?(NoMethodError) {|exc|
817
817
  ok {exc.class} == NoMethodError
818
818
  ok {exc.message} == "undefined method `len' for \"abc\":String"
819
819
  }
820
+ ## or (Oktest.rb >= 1.3)
821
+ exc = ok {pr}.raise?(NoMethodError)
822
+ ok {exc.class} == NoMethodError
823
+ ok {exc.message} == "undefined method `len' for \"abc\":String"
820
824
 
821
825
  ## assert that procedure does NOT raise any exception
822
- ok {pr}.NOT.raise? # no exception class nor error message
823
- not_ok {pr}.raise? # same as above
826
+ ok {pr}.raise_nothing? # (>= Oktest 1.3)
827
+ ok {pr}.NOT.raise? # no exception class nor error message
828
+ not_ok {pr}.raise? # same as above
824
829
 
825
830
  ## assert that procedure throws symbol.
826
831
  pr2 = proc do
@@ -829,8 +834,8 @@ end
829
834
  ok {pr2}.throw?(:quit) # pass if :quit thrown, fail if other or nothing thrown
830
835
  ```
831
836
 
832
- If procedure contains `raise "errmsg"` instead of `raise ErrorClass, "errmsg"`,
833
- you can omit exception class such as `ok {pr}.raise?("errmsg")`.
837
+ If a procedure contains `raise "errmsg"` instead of `raise ErrorClass, "errmsg"`,
838
+ you can omit exception class like `ok {pr}.raise?("errmsg")`.
834
839
 
835
840
  <!--
836
841
  test/example14b_test.rb:
@@ -939,7 +944,7 @@ require 'oktest'
939
944
 
940
945
  Oktest::AssertionObject.class_eval do
941
946
  def readable? # custom assertion: file readable?
942
- _done()
947
+ __done()
943
948
  result = File.readable?(@actual)
944
949
  __assert(result == @bool) {
945
950
  "File.readable?($<actual>) == #{@bool}: failed.\n" +
@@ -1010,15 +1015,15 @@ end
1010
1015
  Result:
1011
1016
 
1012
1017
  ```terminal
1013
- $ oktest -s plain test/example21_test.rb
1018
+ $ oktest -s quiet test/example21a_test.rb
1014
1019
  *** before_all() ***
1015
1020
  === before() ===
1016
1021
  ---- example spec #1 ----
1017
1022
  === after() ===
1018
- .=== before() ===
1023
+ === before() ===
1019
1024
  ---- example spec #2 ----
1020
1025
  === after() ===
1021
- .*** after_all() ***
1026
+ *** after_all() ***
1022
1027
 
1023
1028
  ## total:2 (pass:2, fail:0, error:0, skip:0, todo:0) in 0.000s
1024
1029
  ```
@@ -1729,7 +1734,7 @@ END
1729
1734
  If you want to change embed mark, specify 4th argument, like this:
1730
1735
 
1731
1736
  ```ruby
1732
- partial_regexp <<-'END', '\A', '\z', '%%(.*?)%%' # !!!!!
1737
+ partial_regexp <<-'END', '\A', '\z', '%% %%' # !!!!!
1733
1738
  * [config.date] %% \d\d\d\d-\d\d-\d\d %%
1734
1739
  * [config.secret] %% [0-9a-f]+ %%
1735
1740
  END
@@ -2160,6 +2165,24 @@ $ ruby test/example54_test.rb
2160
2165
  ```
2161
2166
 
2162
2167
 
2168
+ ### `--faster` Option
2169
+
2170
+ ~~If you are working in very larget project and you want to run test scripts as fast as possible, try `--faster` option of `oktest` command.~~
2171
+
2172
+ ```terminal
2173
+ $ oktest -s quiet --faster test/ ## only for very large project
2174
+ ```
2175
+
2176
+ ~~Or set `Oktest::Config.ok_location = false` in your test script.~~
2177
+
2178
+ ```ruby
2179
+ require 'oktest'
2180
+ Oktest::Config.ok_location = false ## only for very large project
2181
+ ```
2182
+
2183
+ `--faster` option is still available but no longer recommended, because performance of `ok{}` is improved significantly since Oktest.rb 1.2.0.
2184
+
2185
+
2163
2186
  ### Benchmarks
2164
2187
 
2165
2188
  Oktest.rb gem file contains benchmark script.
@@ -2180,42 +2203,52 @@ ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin18]
2180
2203
  $ rake benchmark:all
2181
2204
  ```
2182
2205
 
2206
+ Summary of example result:
2207
+
2208
+ ```
2209
+ Oktest: 6.815 real 6.511 user 0.257 sys
2210
+ Oktest (--faster): 6.401 real 6.123 user 0.240 sys
2211
+ RSpec: 32.062 real 27.778 user 4.383 sys
2212
+ MiniTest: 9.140 real 8.657 user 0.705 sys
2213
+ Test::Unit: 19.580 real 19.020 user 0.885 sys
2214
+ ```
2215
+
2183
2216
  Example result:
2184
2217
 
2185
2218
  ```
2186
- ==================== {{*oktest*}} ====================
2219
+ ==================== oktest ====================
2187
2220
  oktest -sq run_all.rb
2188
2221
 
2189
2222
  ## total:100000 (pass:100000, fail:0, error:0, skip:0, todo:0) in 2.36s
2190
2223
 
2191
- {{*6.815 real*}} 6.511 user 0.257 sys
2224
+ 6.815 real 6.511 user 0.257 sys
2192
2225
 
2193
- ==================== {{*oktest:faster*}} ====================
2226
+ ==================== oktest:faster ====================
2194
2227
  oktest -sq --faster run_all.rb
2195
2228
 
2196
2229
  ## total:100000 (pass:100000, fail:0, error:0, skip:0, todo:0) in 2.01s
2197
2230
 
2198
- {{*6.401 real*}} 6.123 user 0.240 sys
2231
+ 6.401 real 6.123 user 0.240 sys
2199
2232
 
2200
- ==================== {{*rspec*}} ====================
2233
+ ==================== rspec ====================
2201
2234
  rspec run_all.rb | tail -4
2202
2235
 
2203
2236
  Finished in 15.27 seconds (files took 16.08 seconds to load)
2204
2237
  100000 examples, 0 failures
2205
2238
 
2206
2239
 
2207
- {{*32.062 real*}} 27.778 user 4.383 sys
2240
+ 32.062 real 27.778 user 4.383 sys
2208
2241
 
2209
- ==================== {{*minitest*}} ====================
2242
+ ==================== minitest ====================
2210
2243
  ruby run_all.rb | tail -4
2211
2244
 
2212
2245
  Finished in 5.281425s, 18934.2838 runs/s, 37868.5677 assertions/s.
2213
2246
 
2214
2247
  100000 runs, 200000 assertions, 0 failures, 0 errors, 0 skips
2215
2248
 
2216
- {{*9.140 real*}} 8.657 user 0.705 sys
2249
+ 9.140 real 8.657 user 0.705 sys
2217
2250
 
2218
- ==================== {{*testunit*}} ====================
2251
+ ==================== testunit ====================
2219
2252
  ruby run_all.rb | tail -5
2220
2253
  -------------------------------------------------------------------------------
2221
2254
  100000 tests, 200000 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
@@ -2223,34 +2256,7 @@ ruby run_all.rb | tail -5
2223
2256
  -------------------------------------------------------------------------------
2224
2257
  7775.59 tests/s, 15551.18 assertions/s
2225
2258
 
2226
- {{*19.580 real*}} 19.020 user 0.885 sys
2227
- ```
2228
-
2229
- Summary:
2230
-
2231
- ```
2232
- Oktest: 6.815 real 6.511 user 0.257 sys
2233
- Oktest (--fast): 6.401 real 6.123 user 0.240 sys
2234
- RSpec: 32.062 real 27.778 user 4.383 sys
2235
- MiniTest: 9.140 real 8.657 user 0.705 sys
2236
- Test::Unit: 19.580 real 19.020 user 0.885 sys
2237
- ```
2238
-
2239
-
2240
- ### `--faster` Option
2241
-
2242
- If you are working in very larget project and you want to run test scripts
2243
- as fast as possible, try `--faster` option of `oktest` command.
2244
-
2245
- ```terminal
2246
- $ oktest -s quiet --faster test/ ## only for very large project
2247
- ```
2248
-
2249
- Or set `Oktest::Config.ok_location = false` in your test script.
2250
-
2251
- ```ruby
2252
- require 'oktest'
2253
- Oktest::Config.ok_location = false ## only for very large project
2259
+ 19.580 real 19.020 user 0.885 sys
2254
2260
  ```
2255
2261
 
2256
2262
 
@@ -2264,4 +2270,4 @@ See [CHANGES.md](https://github.com/kwatch/oktest/blob/ruby/ruby/CHANGES.md).
2264
2270
  ## License and Copyright
2265
2271
 
2266
2272
  * $License: MIT License $
2267
- * $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
2273
+ * $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
data/Rakefile.rb CHANGED
@@ -1,17 +1,17 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
9
9
  PROJECT = "oktest"
10
10
  RELEASE = ENV['RELEASE'] || "0.0.0"
11
- COPYRIGHT = "copyright(c) 2011-2021 kuwata-lab.com all rights reserved"
11
+ COPYRIGHT = "copyright(c) 2011-2024 kuwata-lab.com all rights reserved"
12
12
  LICENSE = "MIT License"
13
13
 
14
- $ruby_versions ||= %w[2.4 2.5 2.6 2.7 3.0]
14
+ $ruby_versions ||= %w[2.4 2.5 2.6 2.7 3.0 3.1 3.2 3.3]
15
15
 
16
16
  desc "show release guide"
17
17
  task :guide do
data/lib/oktest.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -12,7 +12,7 @@ require 'set'
12
12
  module Oktest
13
13
 
14
14
 
15
- VERSION = '$Release: 1.2.0 $'.split()[1]
15
+ VERSION = '$Release: 1.3.0 $'.split()[1]
16
16
 
17
17
 
18
18
  class OktestError < StandardError
@@ -236,14 +236,29 @@ module Oktest
236
236
  self
237
237
  end
238
238
 
239
- def method_missing(method_name, *args)
239
+ if RUBY_VERSION >= "2.7"
240
+ def method_missing(method_name, *args, **kwargs, &b)
241
+ #; [!ttow6] raises NoMethodError when not a boolean method.
242
+ return super unless method_name.to_s =~ /\?\z/
243
+ #; [!gd3vg] supports keyword arguments on Ruby >= 2.7.
244
+ __method_missing(method_name, args, kwargs) {
245
+ @actual.__send__(method_name, *args, **kwargs, &b)
246
+ }
247
+ end
248
+ else
249
+ def method_missing(method_name, *args, &b)
250
+ return super unless method_name.to_s =~ /\?\z/
251
+ __method_missing(method_name, args, nil) {
252
+ @actual.__send__(method_name, *args, &b)
253
+ }
254
+ end
255
+ end
256
+
257
+ def __method_missing(method_name, args, kwargs)
240
258
  __done()
241
259
  #; [!yjnxb] enables to handle boolean methods.
242
- #; [!ttow6] raises NoMethodError when not a boolean method.
243
- method_name.to_s =~ /\?\z/ or
244
- super
245
260
  begin
246
- ret = @actual.__send__(method_name, *args)
261
+ ret = yield
247
262
  rescue NoMethodError, TypeError => exc
248
263
  #; [!f0ekh] skip top of backtrace when NoMethodError raised.
249
264
  while !exc.backtrace.empty? && exc.backtrace[0].start_with?(__FILE__)
@@ -254,10 +269,11 @@ module Oktest
254
269
  #; [!cun59] fails when boolean method failed returned false.
255
270
  #; [!4objh] is available with NOT.
256
271
  if ret == true || ret == false
272
+ #; [!5y9iu] reports args and kwargs in error message.
273
+ s = __inspect_args_and_kwargs(args, kwargs)
257
274
  __assert(@bool == ret) {
258
- args = args.empty? ? '' : "(#{args.collect {|x| x.inspect }.join(', ')})"
259
275
  eq = @bool ? '' : ' == false'
260
- "$<actual>.#{method_name}#{args}#{eq}: failed.\n"\
276
+ "$<actual>.#{method_name}#{s}#{eq}: failed.\n"\
261
277
  " $<actual>: #{@actual.inspect}"
262
278
  }
263
279
  #; [!sljta] raises TypeError when boolean method returned non-boolean value.
@@ -267,6 +283,17 @@ module Oktest
267
283
  #; [!7bbrv] returns self when passed.
268
284
  self
269
285
  end
286
+ private :__method_missing
287
+
288
+ def __inspect_args_and_kwargs(args, kwargs)
289
+ kwargs ||= {}
290
+ arr = [
291
+ (args.empty? ? nil : args.collect {|x| x.inspect}),
292
+ (kwargs.empty? ? nil : kwargs.collect {|k, v| "#{k}: #{v.inspect}" }),
293
+ ].compact.flatten
294
+ return arr.empty? ? "" : "(#{arr.join(', ')})"
295
+ end
296
+ private :__inspect_args_and_kwargs
270
297
 
271
298
  def raise!(errcls=nil, errmsg=nil, &b)
272
299
  #; [!8k6ee] compares error class by '.is_a?' instead of '=='.
@@ -349,8 +376,8 @@ module Oktest
349
376
  #; [!vnc6b] sets exception object into '#exc' attribute.
350
377
  (class << proc_obj; self; end).class_eval { attr_accessor :exc }
351
378
  proc_obj.exc = exc
352
- #; [!y1b28] returns self when passed.
353
- self
379
+ #; [!y1b28] returns exception object.
380
+ return exc
354
381
  end
355
382
 
356
383
  def throw?(expected)
@@ -1077,7 +1104,7 @@ END
1077
1104
  end
1078
1105
 
1079
1106
  attr_reader :target
1080
- attr_accessor :_prefix
1107
+ attr_writer :_prefix
1081
1108
 
1082
1109
  def _prefix
1083
1110
  @_prefix || '*'
@@ -1229,7 +1256,7 @@ END
1229
1256
  raise SkipException, reason if condition
1230
1257
  end
1231
1258
 
1232
- def fixture(name, *args)
1259
+ def fixture(name, *args, **kwargs)
1233
1260
  #; [!zgfg9] finds fixture block in current or parent node.
1234
1261
  node = self.class.__node
1235
1262
  while node && (tuple = node.get_fixture_block(name)) == nil
@@ -1244,7 +1271,7 @@ END
1244
1271
  #; [!m4ava] calls fixture block and returns result of it.
1245
1272
  #; [!l2mcx] accepts block arguments.
1246
1273
  block, _, _ = tuple
1247
- return block.call(*args)
1274
+ return block.call(*args, **kwargs)
1248
1275
  end
1249
1276
 
1250
1277
  def TODO()
@@ -1913,6 +1940,12 @@ END
1913
1940
  puts "## #{scope.filename}"
1914
1941
  end
1915
1942
 
1943
+ def exit_scope(scope)
1944
+ #; [!ibdu7] reports errors even when no topics.
1945
+ super
1946
+ print_exceptions()
1947
+ end
1948
+
1916
1949
  def enter_topic(topic, depth)
1917
1950
  super
1918
1951
  puts "#{' ' * (depth - 1)}#{topic._prefix} #{Color.topic(topic.target)}"
@@ -2304,7 +2337,7 @@ END
2304
2337
  @os_windows = RUBY_PLATFORM =~ /mswin|mingw/i
2305
2338
  @auto_run = true
2306
2339
  @ok_location = true # false will make 'ok()' faster
2307
- @color_available = ! @os_windows || ENV['COLORTERM'] =~ /color|24bit/i
2340
+ @color_available = ! @os_windows || ENV['WT_SESSION'] || ENV['COLORTERM'] =~ /color|24bit/i
2308
2341
  @color_enabled = @color_available && $stdout.tty?
2309
2342
  @diff_command = @os_windows ? "diff.exe -u" : "diff -u"
2310
2343
 
data/oktest.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
4
+ ### $Release: 1.3.0 $
5
5
  ### $License: MIT License $
6
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
6
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
7
7
  ###
8
8
 
9
9
  require 'rubygems'
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.name = "oktest"
14
14
  s.author = "kwatch"
15
15
  s.email = "kwatch@gmail.com"
16
- s.version = "$Release: 1.2.0 $".split()[1]
16
+ s.version = "$Release: 1.3.0 $".split()[1]
17
17
  s.license = "MIT"
18
18
  s.platform = Gem::Platform::RUBY
19
19
  s.homepage = "https://github.com/kwatch/oktest/tree/ruby"
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -351,7 +351,7 @@ END
351
351
  end
352
352
  end
353
353
 
354
- describe '#method_missing()' do
354
+ describe '#method_missing()' do
355
355
  it "[!7bbrv] returns self when passed." do
356
356
  should_return_self { ok {"file.png"}.end_with?(".png") }
357
357
  end
@@ -365,6 +365,27 @@ describe '#method_missing()' do
365
365
  ok {"a"}.start_with
366
366
  end
367
367
  end
368
+ it "[!gd3vg] supports keyword arguments on Ruby >= 2.7." do
369
+ #if RUBY_VERSION >= "2.7"
370
+ if true
371
+ eval <<-END
372
+ class Dummy392
373
+ def foo?(a, b, c: nil, d: nil)
374
+ return true
375
+ end
376
+ end
377
+ END
378
+ PASS! { ok {Dummy392.new}.foo?(123, 'abc', c: 45, d: true) }
379
+ if RUBY_VERSION >= "2.7"
380
+ errmsg = "unknown keywords: :x, :y"
381
+ else
382
+ errmsg = "unknown keywords: x, y"
383
+ end
384
+ ERROR!(ArgumentError, errmsg) do
385
+ ok {Dummy392.new}.foo?(123, 'abc', x: 45, y: true)
386
+ end
387
+ end
388
+ end
368
389
  it "[!f0ekh] skip top of backtrace when NoMethodError raised." do
369
390
  exc = ERROR!(NoMethodError) do
370
391
  ok {[1]}.start_with?(1)
@@ -399,12 +420,45 @@ describe '#method_missing()' do
399
420
  ok {s}.sos?
400
421
  end
401
422
  end
423
+ it "[!5y9iu] reports args and kwargs in error message." do
424
+ if RUBY_VERSION >= "2.7"
425
+ str = '123, "abc", x: "45", y: true'
426
+ else
427
+ str = '123, "abc", {:x=>"45", :y=>true}'
428
+ end
429
+ errmsg = "$<actual>.bla?(#{str}): failed.\n"\
430
+ " $<actual>: \"Blabla\""
431
+ FAIL!(errmsg) do
432
+ s = "Blabla"
433
+ def s.bla?(*a, **k); return false; end
434
+ ok {s}.bla?(123, "abc", x: "45", y: true)
435
+ end
436
+ #
437
+ obj = Oktest::AssertionObject.new(nil, true, nil)
438
+ expected = '(123, "abc", c: "45", d: true)'
439
+ actual = obj.instance_eval {
440
+ __inspect_args_and_kwargs([123, "abc"], c: "45", d: true)
441
+ }
442
+ assert_eq actual, expected
443
+ end
402
444
  end
403
445
 
404
446
  describe '#raise?' do
405
- it "[!y1b28] returns self when passed." do
447
+ it "[!y1b28] returns exception object." do
406
448
  pr = proc { "SOS".sos }
407
- should_return_self { ok {pr}.raise?(NoMethodError, "undefined method `sos' for \"SOS\":String") }
449
+ if RUBY_VERSION >= "3.3"
450
+ expected = "undefined method `sos' for an instance of String"
451
+ elsif RUBY_VERSION =~ /^3\.1\./
452
+ expected = "undefined method `sos' for \"SOS\":String\n"\
453
+ "\n"\
454
+ " pr = proc { \"SOS\".sos }\n"\
455
+ " ^^^^"
456
+ else
457
+ expected = "undefined method `sos' for \"SOS\":String"
458
+ end
459
+ ret = ok {pr}.raise?(NoMethodError, expected)
460
+ assert_eq ret.class, NoMethodError
461
+ assert_eq ret.message, expected
408
462
  end
409
463
  it "[!2rnni] 1st argument can be error message string or rexp." do
410
464
  pr = proc { raise "something wrong" }
@@ -440,14 +494,36 @@ describe '#method_missing()' do
440
494
  end
441
495
  it "[!4n3ed] reraises if exception is not matched to specified error class." do
442
496
  pr = proc { "SOS".sos }
443
- errmsg = "undefined method `sos' for \"SOS\":String"
497
+ if RUBY_VERSION >= "3.3"
498
+ errmsg = "undefined method `sos' for an instance of String"
499
+ elsif RUBY_VERSION =~ /^3\.1\./
500
+ errmsg = "undefined method `sos' for \"SOS\":String\n"\
501
+ "\n"\
502
+ " pr = proc { \"SOS\".sos }\n"\
503
+ " ^^^^"
504
+ else
505
+ errmsg = "undefined method `sos' for \"SOS\":String"
506
+ end
444
507
  ERROR!(NoMethodError, errmsg) { ok {pr}.raise?(ArgumentError) }
445
508
  end
446
509
  it "[!tpxlv] accepts string or regexp as error message." do
510
+ if RUBY_VERSION >= "3.1"
511
+ expected = "undefined method `sos' for \"SOS\":String\n"\
512
+ "\n"\
513
+ " pr = proc { \"SOS\".sos }\n"\
514
+ " ^^^^"
515
+ else
516
+ expected = "undefined method `sos' for \"SOS\":String"
517
+ end
447
518
  pr = proc { "SOS".sos }
448
- PASS! { ok {pr}.raise?(NoMethodError, "undefined method `sos' for \"SOS\":String") }
519
+ PASS! { ok {pr}.raise?(NoMethodError, ) }
449
520
  pr = proc { "SOS".sos }
450
- PASS! { ok {pr}.raise?(NoMethodError, /^undefined method `sos' for "SOS":String$/) }
521
+ if RUBY_VERSION >= "3.3"
522
+ expected = /^undefined method `sos' for an instance of String$/
523
+ else
524
+ expected = /^undefined method `sos' for "SOS":String$/
525
+ end
526
+ PASS! { ok {pr}.raise?(NoMethodError, expected) }
451
527
  end
452
528
  it "[!4c6x3] not check exception class when nil specified as errcls." do
453
529
  pr = proc { foobar() }
@@ -483,7 +559,16 @@ describe '#method_missing()' do
483
559
  end
484
560
  it "[!61vtv] assertion fails when specified exception raised." do
485
561
  pr = proc { "SOS".foobar }
486
- errmsg = "NoMethodError should not be raised but got #<NoMethodError: undefined method `foobar' for \"SOS\":String>."
562
+ if RUBY_VERSION >= "3.3"
563
+ errmsg = "NoMethodError should not be raised but got #<NoMethodError: undefined method `foobar' for an instance of String>."
564
+ elsif RUBY_VERSION =~ /^3\.1\./
565
+ errmsg = "NoMethodError should not be raised but got #<NoMethodError: undefined method `foobar' for \"SOS\":String\n"\
566
+ "\n"\
567
+ " pr = proc { \"SOS\".foobar }\n"\
568
+ " ^^^^^^^>."
569
+ else
570
+ errmsg = "NoMethodError should not be raised but got #<NoMethodError: undefined method `foobar' for \"SOS\":String>."
571
+ end
487
572
  FAIL!(errmsg) { ok {pr}.NOT.raise?(NoMethodError) }
488
573
  end
489
574
  it "[!smprc] compares error class with '==' operator, not '.is_a?'." do
@@ -516,7 +601,17 @@ describe '#method_missing()' do
516
601
  PASS! { ok {pr}.raise?(NoMethodError) }
517
602
  assert pr.respond_to?(:exc)
518
603
  assert pr.exc.is_a?(NoMethodError)
519
- assert_eq pr.exc.message, "undefined method `foobar' for \"SOS\":String"
604
+ if RUBY_VERSION >= "3.3"
605
+ errmsg = "undefined method `foobar' for an instance of String"
606
+ elsif RUBY_VERSION =~ /^3\.1\./
607
+ errmsg = "undefined method `foobar' for \"SOS\":String\n"\
608
+ "\n"\
609
+ " pr = proc { \"SOS\".foobar }\n"\
610
+ " ^^^^^^^"
611
+ else
612
+ errmsg = "undefined method `foobar' for \"SOS\":String"
613
+ end
614
+ assert_eq pr.exc.message, errmsg
520
615
  #
521
616
  pr = proc { nil }
522
617
  assert !pr.respond_to?(:exc)
data/test/filter_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
data/test/fixture_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Release: 1.2.0 $
3
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
2
+ ### $Release: 1.3.0 $
3
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
4
4
  ### $License: MIT License $
5
5
  ###
6
6
 
data/test/helper_test.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Release: 1.2.0 $
3
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
2
+ ### $Release: 1.3.0 $
3
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
4
4
  ### $License: MIT License $
5
5
  ###
6
6
 
@@ -129,17 +129,17 @@ class SpecHelper_TC < TC
129
129
  it "[!l2mcx] accepts block arguments." do
130
130
  val = nil
131
131
  Oktest.scope() do
132
- fixture :foo do |x, y|
133
- {x: x, y: y}
132
+ fixture :foo do |x, y, z: 0|
133
+ {x: x, y: y, z: z}
134
134
  end
135
135
  topic 'Example' do
136
136
  spec 'sample' do
137
- val = fixture(:foo, 10, 20)
137
+ val = fixture(:foo, 10, 20, z: 30)
138
138
  end
139
139
  end
140
140
  end
141
141
  capture { Oktest.run() }
142
- assert_eq val, {x: 10, y: 20}
142
+ assert_eq val, {x: 10, y: 20, z: 30}
143
143
  end
144
144
  it "[!wxcsp] raises error when fixture not found." do
145
145
  exc = nil
data/test/initialize.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
data/test/mainapp_test.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Release: 1.2.0 $
3
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
2
+ ### $Release: 1.3.0 $
3
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
4
4
  ### $License: MIT License $
5
5
  ###
6
6
 
@@ -257,7 +257,7 @@ END
257
257
  end
258
258
 
259
259
  it "[!qqizl] '--version' option prints version number." do
260
- expected = '$Release: 1.2.0 $'.split()[1] + "\n"
260
+ expected = '$Release: 1.3.0 $'.split()[1] + "\n"
261
261
  #
262
262
  ret, sout, serr = run("--version")
263
263
  assert_eq ret, 0
data/test/matcher_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
data/test/misc_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
data/test/node_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -527,6 +527,37 @@ class VerboseReporter_TC < Reporter_TC
527
527
  assert_eq serr, ""
528
528
  end
529
529
 
530
+ it "[!ibdu7] reports errors even when no topics." do
531
+ input = <<'END'
532
+ require 'oktest'
533
+ Oktest.scope do
534
+ spec "example" do
535
+ ok {1-1} == 2
536
+ end
537
+ end
538
+ END
539
+ File.write(@filename, input)
540
+ #
541
+ expected = <<'END'
542
+ ## _test.tmp
543
+ - [<R>Fail</R>] example
544
+ ----------------------------------------------------------------------
545
+ [<R>Fail</R>] <b>example</b>
546
+ _test.tmp:4:in `block (2 levels) in <top (required)>'
547
+ ok {1-1} == 2
548
+ %%%
549
+ <R>$<actual> == $<expected>: failed.</R>
550
+ $<actual>: 0
551
+ $<expected>: 2
552
+ ----------------------------------------------------------------------
553
+ ## total:1 (pass:0, <R>fail:1</R>, error:0, skip:0, todo:0) in 0.000s
554
+ END
555
+ #
556
+ sout, serr = run("-sv", @filename)
557
+ assert_eq edit_actual(sout), edit_expected(expected)
558
+ assert_eq serr, ""
559
+ end
560
+
530
561
  end
531
562
 
532
563
 
data/test/runner_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -118,7 +118,24 @@ topic: "Parent"
118
118
  $<actual>: 2
119
119
  $<expected>: 1>
120
120
  spec: "spec#3"
121
+ END
122
+ if RUBY_VERSION >= "3.3"
123
+ expected += <<'END'
124
+ /spec: status=:ERROR, error=#<NoMethodError: undefined method `null?' for an instance of String>
125
+ END
126
+ elsif RUBY_VERSION =~ /^3\.1\./
127
+ expected += <<'END'
128
+ /spec: status=:ERROR, error=#<NoMethodError: undefined method `null?' for "":String
129
+
130
+ spec("spec#3") { "".null? } # error
131
+ ^^^^^^>
132
+ END
133
+ else
134
+ expected += <<'END'
121
135
  /spec: status=:ERROR, error=#<NoMethodError: undefined method `null?' for "":String>
136
+ END
137
+ end
138
+ expected += <<'END'
122
139
  spec: "spec#4"
123
140
  /spec: status=:SKIP, error=#<Oktest::SkipException: REASON>
124
141
  spec: "spec#5"
@@ -285,7 +302,24 @@ topic: "topic#A"
285
302
  /spec: status=:PASS
286
303
  spec: "spec#2"
287
304
  - at_end A2
305
+ END
306
+ if RUBY_VERSION >= "3.3"
307
+ expected += <<'END'
308
+ /spec: status=:ERROR, error=#<NoMethodError: undefined method `null?' for an instance of String>
309
+ END
310
+ elsif RUBY_VERSION =~ /^3\.1\./
311
+ expected += <<'END'
312
+ /spec: status=:ERROR, error=#<NoMethodError: undefined method `null?' for "":String
313
+
314
+ spec("spec#2") { at_end { puts " - at_end A2" }; "".null? } # raises NoMethodError
315
+ ^^^^^^>
316
+ END
317
+ else
318
+ expected += <<'END'
288
319
  /spec: status=:ERROR, error=#<NoMethodError: undefined method `null?' for "":String>
320
+ END
321
+ end
322
+ expected += <<'END'
289
323
  /topic
290
324
  /file
291
325
  END
data/test/tc.rb CHANGED
@@ -34,9 +34,9 @@ class TC
34
34
  obj.instance_eval(&b)
35
35
  rescue => exc
36
36
  if exc.is_a?(AssertionFailed)
37
- COUNTS[:fail] += 1; puts "FAILED!" unless ENV['TC_QUIET']
37
+ COUNTS[:fail] += 1; puts "\e[31mFAILED!\e[0m" unless ENV['TC_QUIET']
38
38
  else
39
- COUNTS[:error] += 1; puts "ERROR!" unless ENV['TC_QUIET']
39
+ COUNTS[:error] += 1; puts "\e[31mERROR!\e[0m" unless ENV['TC_QUIET']
40
40
  end
41
41
  puts " #{exc.class.name}: #{exc.message}"
42
42
  exc.backtrace.each do |bt|
data/test/util_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
data/test/visitor_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  ###
4
- ### $Release: 1.2.0 $
5
- ### $Copyright: copyright(c) 2011-2021 kuwata-lab.com all rights reserved $
4
+ ### $Release: 1.3.0 $
5
+ ### $Copyright: copyright(c) 2011-2024 kuwata-lab.com all rights reserved $
6
6
  ### $License: MIT License $
7
7
  ###
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oktest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kwatch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-17 00:00:00.000000000 Z
11
+ date: 2024-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  - !ruby/object:Gem::Version
100
100
  version: '0'
101
101
  requirements: []
102
- rubygems_version: 3.2.22
102
+ rubygems_version: 3.5.11
103
103
  signing_key:
104
104
  specification_version: 4
105
105
  summary: new style testing library