win32-api 1.10.0 → 1.10.1
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 +4 -4
- data/CHANGES +3 -0
- data/Gemfile.lock +5 -5
- data/ext/mkmf.log +3 -27
- data/ext/win32/api.c +16 -15
- data/lib/win32/ruby2_32/win32/api.so +0 -0
- data/pkg/win32-api-1.10.1-universal-mingw32.gem +0 -0
- data/test/test_win32_api.rb +1 -1
- data/vendor/bundle/ruby/3.0.0/bin/rake +27 -0
- data/vendor/bundle/ruby/3.0.0/bin/rake.bat +2 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/COPYING +57 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/Gemfile +9 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/LEGAL +4 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/README.md +96 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/Rakefile +59 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/bin/console +12 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/bin/setup +6 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert.rb +91 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/colorize.rb +7 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/configuration.rb +46 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/context.rb +233 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/enable_tracepoint_events.rb +58 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/inspector.rb +62 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/parser.rb +251 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/version.rb +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/power_assert.gemspec +31 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/CONTRIBUTING.rdoc +43 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/Gemfile +10 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/History.rdoc +2386 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/README.rdoc +155 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/Rakefile +41 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/bundle +105 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/console +7 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/rake +29 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/rdoc +29 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/rubocop +29 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/setup +6 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/command_line_usage.rdoc +158 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/rakefile.rdoc +622 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/exe/rake +27 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake.rb +71 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/application.rb +824 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/backtrace.rb +24 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/cpu_counter.rb +107 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/dsl_definition.rb +195 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_task.rb +54 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_utils.rb +134 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_utils_ext.rb +134 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/packagetask.rb +222 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task.rb +434 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task_arguments.rb +109 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task_manager.rb +331 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/testtask.rb +189 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/thread_pool.rb +163 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/win32.rb +51 -0
- data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/rake.gemspec +43 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/BSDL +24 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/COPYING +64 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/PSFL +271 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/README.md +97 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/Rakefile +66 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/doc/text/getting-started.md +246 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/doc/text/how-to.md +90 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/doc/text/news.md +1552 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test-unit.rb +19 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit.rb +521 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/assertion-failed-error.rb +25 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/assertions.rb +2256 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/attribute-matcher.rb +26 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/attribute.rb +227 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/auto-runner-loader.rb +17 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/autorunner.rb +569 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/code-snippet-fetcher.rb +58 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector.rb +73 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/descendant.rb +19 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/dir.rb +108 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/load.rb +197 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/objectspace.rb +34 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/xml.rb +249 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/color-scheme.rb +216 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/color.rb +134 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/data-sets.rb +116 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/data.rb +371 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/diff.rb +745 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/error.rb +158 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/exception-handler.rb +82 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/failure.rb +169 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/fault-location-detector.rb +100 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/fixture.rb +304 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/notification.rb +138 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/omission.rb +198 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/pending.rb +155 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/priority.rb +196 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/runner/console.rb +67 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/runner/emacs.rb +8 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/runner/xml.rb +15 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/test-suite-creator.rb +103 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/testcase.rb +899 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/testresult.rb +132 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/testsuite.rb +175 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/console/outputlevel.rb +15 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/console/testrunner.rb +733 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/emacs/testrunner.rb +49 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/testrunner.rb +53 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/testrunnermediator.rb +114 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/testrunnerutilities.rb +41 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/xml/testrunner.rb +224 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/backtracefilter.rb +59 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/method-owner-finder.rb +28 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/observable.rb +90 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/output.rb +32 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/procwrapper.rb +48 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/version.rb +5 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/warning.rb +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/adder.rb +13 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/subtracter.rb +12 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/test_adder.rb +20 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/test_subtracter.rb +20 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/test_user.rb +23 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test-descendant.rb +182 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test-load.rb +475 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test_dir.rb +407 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test_objectspace.rb +102 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header-label.csv +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header-label.tsv +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header.csv +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header.tsv +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/no-header.csv +2 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/no-header.tsv +2 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/plus.csv +3 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/run-test.rb +22 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-assertions.rb +2187 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-attribute-matcher.rb +38 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-attribute.rb +123 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-code-snippet.rb +79 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-color-scheme.rb +123 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-color.rb +47 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-data.rb +419 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-diff.rb +518 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-emacs-runner.rb +60 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-error.rb +26 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-failure.rb +33 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-fault-location-detector.rb +163 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-fixture.rb +713 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-notification.rb +33 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-omission.rb +81 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-pending.rb +70 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-priority.rb +184 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-case.rb +1284 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-result.rb +113 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-suite-creator.rb +97 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-suite.rb +151 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/testunit-test-util.rb +33 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/ui/test_testrunmediator.rb +20 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test-method-owner-finder.rb +38 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test-output.rb +11 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test_backtracefilter.rb +52 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test_observable.rb +102 -0
- data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test_procwrapper.rb +36 -0
- data/vendor/bundle/ruby/3.0.0/specifications/power_assert-2.0.0.gemspec +46 -0
- data/vendor/bundle/ruby/3.0.0/specifications/rake-13.0.3.gemspec +26 -0
- data/vendor/bundle/ruby/3.0.0/specifications/test-unit-3.4.1.gemspec +41 -0
- data/win32-api.gemspec +1 -1
- metadata +199 -8
- data/ext/Makefile +0 -269
- data/ext/api-x64-mingw32.def +0 -2
- data/ext/api.o +0 -0
- data/ext/api.so +0 -0
- data/ext/win32/api.so +0 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Nathaniel Talbott.
|
3
|
+
# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
|
4
|
+
# License:: Ruby license.
|
5
|
+
|
6
|
+
require 'test/unit/util/observable'
|
7
|
+
require 'test/unit/failure'
|
8
|
+
require 'test/unit/error'
|
9
|
+
require 'test/unit/omission'
|
10
|
+
require 'test/unit/pending'
|
11
|
+
require 'test/unit/notification'
|
12
|
+
|
13
|
+
module Test
|
14
|
+
module Unit
|
15
|
+
module NullResultContainerInitializer
|
16
|
+
private
|
17
|
+
def initialize_containers
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Collects Test::Unit::Failure and Test::Unit::Error so that
|
22
|
+
# they can be displayed to the user. To this end, observers
|
23
|
+
# can be added to it, allowing the dynamic updating of, say, a
|
24
|
+
# UI.
|
25
|
+
class TestResult
|
26
|
+
include Util::Observable
|
27
|
+
include NullResultContainerInitializer
|
28
|
+
include TestResultFailureSupport
|
29
|
+
include TestResultErrorSupport
|
30
|
+
include TestResultPendingSupport
|
31
|
+
include TestResultOmissionSupport
|
32
|
+
include TestResultNotificationSupport
|
33
|
+
|
34
|
+
FINISHED = name + "::FINISHED"
|
35
|
+
CHANGED = name + "::CHANGED"
|
36
|
+
PASS_ASSERTION = name + "::PASS_ASSERTION"
|
37
|
+
FAULT = name + "::FAULT"
|
38
|
+
|
39
|
+
attr_reader :run_count, :pass_count, :assertion_count, :faults
|
40
|
+
|
41
|
+
attr_accessor :stop_tag
|
42
|
+
|
43
|
+
# Constructs a new, empty TestResult.
|
44
|
+
def initialize
|
45
|
+
@run_count, @pass_count, @assertion_count = 0, 0, 0
|
46
|
+
@summary_generators = []
|
47
|
+
@problem_checkers = []
|
48
|
+
@faults = []
|
49
|
+
@stop_tag = nil
|
50
|
+
initialize_containers
|
51
|
+
end
|
52
|
+
|
53
|
+
# Records a test run.
|
54
|
+
def add_run
|
55
|
+
@run_count += 1
|
56
|
+
notify_listeners(FINISHED, self)
|
57
|
+
notify_changed
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_pass
|
61
|
+
@pass_count += 1
|
62
|
+
end
|
63
|
+
|
64
|
+
# Records an individual assertion.
|
65
|
+
def add_assertion
|
66
|
+
@assertion_count += 1
|
67
|
+
notify_listeners(PASS_ASSERTION, self)
|
68
|
+
notify_changed
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns a string contain the recorded runs, assertions,
|
72
|
+
# failures and errors in this TestResult.
|
73
|
+
def summary
|
74
|
+
["#{run_count} tests",
|
75
|
+
"#{assertion_count} assertions",
|
76
|
+
*@summary_generators.collect {|generator| __send__(generator)}].join(", ")
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returnes a string that shows result status.
|
80
|
+
def status
|
81
|
+
if passed?
|
82
|
+
if pending_count > 0
|
83
|
+
"pending"
|
84
|
+
elsif omission_count > 0
|
85
|
+
"omission"
|
86
|
+
elsif notification_count > 0
|
87
|
+
"notification"
|
88
|
+
else
|
89
|
+
"pass"
|
90
|
+
end
|
91
|
+
elsif error_count > 0
|
92
|
+
"error"
|
93
|
+
elsif failure_count > 0
|
94
|
+
"failure"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def stop
|
99
|
+
throw @stop_tag
|
100
|
+
end
|
101
|
+
|
102
|
+
def to_s
|
103
|
+
summary
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns whether or not this TestResult represents
|
107
|
+
# successful completion.
|
108
|
+
def passed?
|
109
|
+
@problem_checkers.all? {|checker| not __send__(checker)}
|
110
|
+
end
|
111
|
+
|
112
|
+
def pass_percentage
|
113
|
+
n_tests = @run_count - omission_count
|
114
|
+
if n_tests.zero?
|
115
|
+
0
|
116
|
+
else
|
117
|
+
100.0 * (@pass_count / n_tests.to_f)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
def notify_changed
|
123
|
+
notify_listeners(CHANGED, self)
|
124
|
+
end
|
125
|
+
|
126
|
+
def notify_fault(fault)
|
127
|
+
@faults << fault
|
128
|
+
notify_listeners(FAULT, fault)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Author:: Nathaniel Talbott.
|
4
|
+
# Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
|
5
|
+
# Copyright:: Copyright (c) 2008-2011 Kouhei Sutou. All rights reserved.
|
6
|
+
# License:: Ruby license.
|
7
|
+
|
8
|
+
require 'test/unit/error'
|
9
|
+
|
10
|
+
module Test
|
11
|
+
module Unit
|
12
|
+
|
13
|
+
# A collection of tests which can be #run.
|
14
|
+
#
|
15
|
+
# Note: It is easy to confuse a TestSuite instance with
|
16
|
+
# something that has a static suite method; I know because _I_
|
17
|
+
# have trouble keeping them straight. Think of something that
|
18
|
+
# has a suite method as simply providing a way to get a
|
19
|
+
# meaningful TestSuite instance.
|
20
|
+
class TestSuite
|
21
|
+
attr_reader :name, :tests, :test_case, :start_time, :elapsed_time
|
22
|
+
|
23
|
+
# Test suite that has higher priority is ran prior to
|
24
|
+
# test suites that have lower priority.
|
25
|
+
attr_accessor :priority
|
26
|
+
|
27
|
+
STARTED = name + "::STARTED"
|
28
|
+
STARTED_OBJECT = name + "::STARTED::OBJECT"
|
29
|
+
FINISHED = name + "::FINISHED"
|
30
|
+
FINISHED_OBJECT = name + "::FINISHED::OBJECT"
|
31
|
+
|
32
|
+
# Creates a new TestSuite with the given name.
|
33
|
+
def initialize(name="Unnamed TestSuite", test_case=nil)
|
34
|
+
@name = name
|
35
|
+
@tests = []
|
36
|
+
@test_case = test_case
|
37
|
+
@n_tests = 0
|
38
|
+
@priority = 0
|
39
|
+
@start_time = nil
|
40
|
+
@elapsed_time = nil
|
41
|
+
@passed = true
|
42
|
+
end
|
43
|
+
|
44
|
+
# Runs the tests and/or suites contained in this
|
45
|
+
# TestSuite.
|
46
|
+
def run(result, &progress_block)
|
47
|
+
@start_time = Time.now
|
48
|
+
yield(STARTED, name)
|
49
|
+
yield(STARTED_OBJECT, self)
|
50
|
+
run_startup(result)
|
51
|
+
while test = @tests.shift
|
52
|
+
@n_tests += test.size
|
53
|
+
run_test(test, result, &progress_block)
|
54
|
+
@passed = false unless test.passed?
|
55
|
+
end
|
56
|
+
ensure
|
57
|
+
begin
|
58
|
+
run_shutdown(result)
|
59
|
+
ensure
|
60
|
+
@elapsed_time = Time.now - @start_time
|
61
|
+
yield(FINISHED, name)
|
62
|
+
yield(FINISHED_OBJECT, self)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Adds the test to the suite.
|
67
|
+
def <<(test)
|
68
|
+
@tests << test
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
72
|
+
def delete(test)
|
73
|
+
@tests.delete(test)
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete_tests(tests)
|
77
|
+
@tests -= tests
|
78
|
+
end
|
79
|
+
|
80
|
+
# Retuns the rolled up number of tests in this suite;
|
81
|
+
# i.e. if the suite contains other suites, it counts the
|
82
|
+
# tests within those suites, not the suites themselves.
|
83
|
+
def size
|
84
|
+
total_size = @n_tests
|
85
|
+
@tests.each { |test| total_size += test.size }
|
86
|
+
total_size
|
87
|
+
end
|
88
|
+
|
89
|
+
def empty?
|
90
|
+
size.zero?
|
91
|
+
end
|
92
|
+
|
93
|
+
# Overridden to return the name given the suite at
|
94
|
+
# creation.
|
95
|
+
def to_s
|
96
|
+
@name
|
97
|
+
end
|
98
|
+
|
99
|
+
# It's handy to be able to compare TestSuite instances.
|
100
|
+
def ==(other)
|
101
|
+
return false unless(other.kind_of?(self.class))
|
102
|
+
return false unless(@name == other.name)
|
103
|
+
@tests == other.tests
|
104
|
+
end
|
105
|
+
|
106
|
+
def passed?
|
107
|
+
@passed
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
def run_startup(result)
|
112
|
+
return if @test_case.nil? or !@test_case.respond_to?(:startup)
|
113
|
+
begin
|
114
|
+
@test_case.startup
|
115
|
+
rescue Exception
|
116
|
+
raise unless handle_exception($!, result)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def run_test(test, result)
|
121
|
+
finished_is_yielded = false
|
122
|
+
finished_object_is_yielded = false
|
123
|
+
previous_event_name = nil
|
124
|
+
test.run(result) do |event_name, *args|
|
125
|
+
case previous_event_name
|
126
|
+
when Test::Unit::TestCase::STARTED
|
127
|
+
if event_name != Test::Unit::TestCase::STARTED_OBJECT
|
128
|
+
yield(Test::Unit::TestCase::STARTED_OBJECT, test)
|
129
|
+
end
|
130
|
+
when Test::Unit::TestCase::FINISHED
|
131
|
+
if event_name != Test::Unit::TestCase::FINISHED_OBJECT
|
132
|
+
yield(Test::Unit::TestCase::FINISHED_OBJECT, test)
|
133
|
+
end
|
134
|
+
finished_object_is_yielded = true
|
135
|
+
end
|
136
|
+
|
137
|
+
case event_name
|
138
|
+
when Test::Unit::TestCase::STARTED
|
139
|
+
finished_is_yielded = false
|
140
|
+
finished_object_is_yielded = false
|
141
|
+
when Test::Unit::TestCase::FINISHED
|
142
|
+
finished_is_yielded = true
|
143
|
+
end
|
144
|
+
|
145
|
+
previous_event_name = event_name
|
146
|
+
yield(event_name, *args)
|
147
|
+
end
|
148
|
+
|
149
|
+
if finished_is_yielded and not finished_object_is_yielded
|
150
|
+
yield(Test::Unit::TestCase::FINISHED_OBJECT, test)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def run_shutdown(result)
|
155
|
+
return if @test_case.nil? or !@test_case.respond_to?(:shutdown)
|
156
|
+
begin
|
157
|
+
@test_case.shutdown
|
158
|
+
rescue Exception
|
159
|
+
raise unless handle_exception($!, result)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def handle_exception(exception, result)
|
164
|
+
case exception
|
165
|
+
when *ErrorHandler::PASS_THROUGH_EXCEPTIONS
|
166
|
+
false
|
167
|
+
else
|
168
|
+
result.add_error(Error.new(@test_case.name, exception))
|
169
|
+
@passed = false
|
170
|
+
true
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,733 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Author:: Nathaniel Talbott.
|
4
|
+
# Copyright::
|
5
|
+
# * Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
|
6
|
+
# * Copyright (c) 2008-2017 Kouhei Sutou <kou@clear-code.com>
|
7
|
+
# License:: Ruby license.
|
8
|
+
|
9
|
+
begin
|
10
|
+
require 'io/console'
|
11
|
+
rescue LoadError
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'test/unit/color-scheme'
|
15
|
+
require 'test/unit/code-snippet-fetcher'
|
16
|
+
require 'test/unit/fault-location-detector'
|
17
|
+
require 'test/unit/diff'
|
18
|
+
require 'test/unit/ui/testrunner'
|
19
|
+
require 'test/unit/ui/testrunnermediator'
|
20
|
+
require 'test/unit/ui/console/outputlevel'
|
21
|
+
|
22
|
+
module Test
|
23
|
+
module Unit
|
24
|
+
module UI
|
25
|
+
module Console
|
26
|
+
|
27
|
+
# Runs a Test::Unit::TestSuite on the console.
|
28
|
+
class TestRunner < UI::TestRunner
|
29
|
+
include OutputLevel
|
30
|
+
|
31
|
+
# Creates a new TestRunner for running the passed
|
32
|
+
# suite. If quiet_mode is true, the output while
|
33
|
+
# running is limited to progress dots, errors and
|
34
|
+
# failures, and the final result. io specifies
|
35
|
+
# where runner output should go to; defaults to
|
36
|
+
# STDOUT.
|
37
|
+
def initialize(suite, options={})
|
38
|
+
super
|
39
|
+
@output_level = @options[:output_level] || NORMAL
|
40
|
+
@output = @options[:output] || STDOUT
|
41
|
+
@use_color = @options[:use_color]
|
42
|
+
@use_color = guess_color_availability if @use_color.nil?
|
43
|
+
@color_scheme = @options[:color_scheme] || ColorScheme.default
|
44
|
+
@reset_color = Color.new("reset")
|
45
|
+
@progress_row = 0
|
46
|
+
@progress_row_max = @options[:progress_row_max]
|
47
|
+
@progress_row_max ||= guess_progress_row_max
|
48
|
+
@show_detail_immediately = @options[:show_detail_immediately]
|
49
|
+
@show_detail_immediately = true if @show_detail_immediately.nil?
|
50
|
+
@already_outputted = false
|
51
|
+
@indent = 0
|
52
|
+
@top_level = true
|
53
|
+
@current_output_level = NORMAL
|
54
|
+
@faults = []
|
55
|
+
@code_snippet_fetcher = CodeSnippetFetcher.new
|
56
|
+
@test_suites = []
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def change_output_level(level)
|
61
|
+
old_output_level = @current_output_level
|
62
|
+
@current_output_level = level
|
63
|
+
yield
|
64
|
+
@current_output_level = old_output_level
|
65
|
+
end
|
66
|
+
|
67
|
+
def setup_mediator
|
68
|
+
super
|
69
|
+
output_setup_end
|
70
|
+
end
|
71
|
+
|
72
|
+
def output_setup_end
|
73
|
+
suite_name = @suite.to_s
|
74
|
+
suite_name = @suite.name if @suite.kind_of?(Module)
|
75
|
+
output("Loaded suite #{suite_name}")
|
76
|
+
end
|
77
|
+
|
78
|
+
def attach_to_mediator
|
79
|
+
@mediator.add_listener(TestResult::FAULT,
|
80
|
+
&method(:add_fault))
|
81
|
+
@mediator.add_listener(TestRunnerMediator::STARTED,
|
82
|
+
&method(:started))
|
83
|
+
@mediator.add_listener(TestRunnerMediator::FINISHED,
|
84
|
+
&method(:finished))
|
85
|
+
@mediator.add_listener(TestCase::STARTED_OBJECT,
|
86
|
+
&method(:test_started))
|
87
|
+
@mediator.add_listener(TestCase::FINISHED_OBJECT,
|
88
|
+
&method(:test_finished))
|
89
|
+
@mediator.add_listener(TestSuite::STARTED_OBJECT,
|
90
|
+
&method(:test_suite_started))
|
91
|
+
@mediator.add_listener(TestSuite::FINISHED_OBJECT,
|
92
|
+
&method(:test_suite_finished))
|
93
|
+
end
|
94
|
+
|
95
|
+
def add_fault(fault)
|
96
|
+
@faults << fault
|
97
|
+
output_progress(fault.single_character_display,
|
98
|
+
fault_marker_color(fault))
|
99
|
+
output_progress_in_detail(fault) if @show_detail_immediately
|
100
|
+
@already_outputted = true if fault.critical?
|
101
|
+
end
|
102
|
+
|
103
|
+
def started(result)
|
104
|
+
@result = result
|
105
|
+
output_started
|
106
|
+
end
|
107
|
+
|
108
|
+
def output_started
|
109
|
+
output("Started")
|
110
|
+
end
|
111
|
+
|
112
|
+
def finished(elapsed_time)
|
113
|
+
unless @show_detail_immediately
|
114
|
+
nl if output?(NORMAL) and !output?(VERBOSE)
|
115
|
+
output_faults
|
116
|
+
end
|
117
|
+
nl(PROGRESS_ONLY)
|
118
|
+
change_output_level(IMPORTANT_FAULTS_ONLY) do
|
119
|
+
output_statistics(elapsed_time)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def output_faults
|
124
|
+
categorized_faults = categorize_faults
|
125
|
+
change_output_level(IMPORTANT_FAULTS_ONLY) do
|
126
|
+
output_faults_in_detail(categorized_faults[:need_detail_faults])
|
127
|
+
end
|
128
|
+
output_faults_in_short("Omissions", Omission,
|
129
|
+
categorized_faults[:omissions])
|
130
|
+
output_faults_in_short("Notifications", Notification,
|
131
|
+
categorized_faults[:notifications])
|
132
|
+
end
|
133
|
+
|
134
|
+
def max_digit(max_number)
|
135
|
+
(Math.log10(max_number) + 1).truncate
|
136
|
+
end
|
137
|
+
|
138
|
+
def output_faults_in_detail(faults)
|
139
|
+
return if faults.nil?
|
140
|
+
digit = max_digit(faults.size)
|
141
|
+
faults.each_with_index do |fault, index|
|
142
|
+
nl
|
143
|
+
output_single("%#{digit}d) " % (index + 1))
|
144
|
+
output_fault_in_detail(fault)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def output_faults_in_short(label, fault_class, faults)
|
149
|
+
return if faults.nil?
|
150
|
+
digit = max_digit(faults.size)
|
151
|
+
nl
|
152
|
+
output_single(label, fault_class_color(fault_class))
|
153
|
+
output(":")
|
154
|
+
faults.each_with_index do |fault, index|
|
155
|
+
output_single("%#{digit}d) " % (index + 1))
|
156
|
+
output_fault_in_short(fault)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def categorize_faults
|
161
|
+
faults = {}
|
162
|
+
@faults.each do |fault|
|
163
|
+
category = categorize_fault(fault)
|
164
|
+
faults[category] ||= []
|
165
|
+
faults[category] << fault
|
166
|
+
end
|
167
|
+
faults
|
168
|
+
end
|
169
|
+
|
170
|
+
def categorize_fault(fault)
|
171
|
+
case fault
|
172
|
+
when Omission
|
173
|
+
:omissions
|
174
|
+
when Notification
|
175
|
+
:notifications
|
176
|
+
else
|
177
|
+
:need_detail_faults
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def output_fault_in_detail(fault)
|
182
|
+
if fault.is_a?(Failure) and
|
183
|
+
fault.inspected_expected and
|
184
|
+
fault.inspected_actual
|
185
|
+
output_single("#{fault.label}: ")
|
186
|
+
output(fault.test_name, fault_color(fault))
|
187
|
+
output_fault_backtrace(fault)
|
188
|
+
output_failure_message(fault)
|
189
|
+
else
|
190
|
+
output_single("#{fault.label}: ")
|
191
|
+
output_single(fault.test_name, fault_color(fault))
|
192
|
+
output_fault_message(fault)
|
193
|
+
output_fault_backtrace(fault)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def output_fault_message(fault)
|
198
|
+
message = fault.message
|
199
|
+
return if message.nil?
|
200
|
+
|
201
|
+
if message.include?("\n")
|
202
|
+
output(":")
|
203
|
+
message.each_line do |line|
|
204
|
+
output(" #{line.chomp}")
|
205
|
+
end
|
206
|
+
else
|
207
|
+
output(": #{message}")
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def output_fault_backtrace(fault)
|
212
|
+
detector = FaultLocationDetector.new(fault, @code_snippet_fetcher)
|
213
|
+
backtrace = fault.location
|
214
|
+
# workaround for test-spec. :<
|
215
|
+
# see also GitHub:#22
|
216
|
+
backtrace ||= []
|
217
|
+
|
218
|
+
code_snippet_backtrace_index = nil
|
219
|
+
code_snippet_lines = nil
|
220
|
+
backtrace.each_with_index do |entry, i|
|
221
|
+
next unless detector.target?(entry)
|
222
|
+
file, line_number, = detector.split_backtrace_entry(entry)
|
223
|
+
lines = fetch_code_snippet(file, line_number)
|
224
|
+
unless lines.empty?
|
225
|
+
code_snippet_backtrace_index = i
|
226
|
+
code_snippet_lines = lines
|
227
|
+
break
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
backtrace.each_with_index do |entry, i|
|
232
|
+
output(entry)
|
233
|
+
if i == code_snippet_backtrace_index
|
234
|
+
output_code_snippet(code_snippet_lines, fault_color(fault))
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def fetch_code_snippet(file, line_number)
|
240
|
+
@code_snippet_fetcher.fetch(file, line_number)
|
241
|
+
end
|
242
|
+
|
243
|
+
def output_code_snippet(lines, target_line_color=nil)
|
244
|
+
max_n = lines.collect {|n, line, attributes| n}.max
|
245
|
+
digits = (Math.log10(max_n) + 1).truncate
|
246
|
+
lines.each do |n, line, attributes|
|
247
|
+
if attributes[:target_line?]
|
248
|
+
line_color = target_line_color
|
249
|
+
current_line_mark = "=>"
|
250
|
+
else
|
251
|
+
line_color = nil
|
252
|
+
current_line_mark = ""
|
253
|
+
end
|
254
|
+
output(" %2s %*d: %s" % [current_line_mark, digits, n, line],
|
255
|
+
line_color)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
def output_failure_message(failure)
|
260
|
+
if failure.expected.respond_to?(:encoding) and
|
261
|
+
failure.actual.respond_to?(:encoding) and
|
262
|
+
failure.expected.encoding != failure.actual.encoding
|
263
|
+
need_encoding = true
|
264
|
+
else
|
265
|
+
need_encoding = false
|
266
|
+
end
|
267
|
+
output(failure.user_message) if failure.user_message
|
268
|
+
output_single("<")
|
269
|
+
output_single(failure.inspected_expected, color("pass"))
|
270
|
+
output_single(">")
|
271
|
+
if need_encoding
|
272
|
+
output_single("(")
|
273
|
+
output_single(failure.expected.encoding.name, color("pass"))
|
274
|
+
output_single(")")
|
275
|
+
end
|
276
|
+
output(" expected but was")
|
277
|
+
output_single("<")
|
278
|
+
output_single(failure.inspected_actual, color("failure"))
|
279
|
+
output_single(">")
|
280
|
+
if need_encoding
|
281
|
+
output_single("(")
|
282
|
+
output_single(failure.actual.encoding.name, color("failure"))
|
283
|
+
output_single(")")
|
284
|
+
end
|
285
|
+
output("")
|
286
|
+
from, to = prepare_for_diff(failure.expected, failure.actual)
|
287
|
+
if from and to
|
288
|
+
if need_encoding
|
289
|
+
unless from.valid_encoding?
|
290
|
+
from = from.dup.force_encoding("ASCII-8BIT")
|
291
|
+
end
|
292
|
+
unless to.valid_encoding?
|
293
|
+
to = to.dup.force_encoding("ASCII-8BIT")
|
294
|
+
end
|
295
|
+
end
|
296
|
+
from_lines = from.split(/\r?\n/)
|
297
|
+
to_lines = to.split(/\r?\n/)
|
298
|
+
if need_encoding
|
299
|
+
from_lines << ""
|
300
|
+
to_lines << ""
|
301
|
+
from_lines << "Encoding: #{failure.expected.encoding.name}"
|
302
|
+
to_lines << "Encoding: #{failure.actual.encoding.name}"
|
303
|
+
end
|
304
|
+
differ = ColorizedReadableDiffer.new(from_lines, to_lines, self)
|
305
|
+
if differ.need_diff?
|
306
|
+
output("")
|
307
|
+
output("diff:")
|
308
|
+
differ.diff
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
def output_fault_in_short(fault)
|
314
|
+
output_single("#{fault.label}: ")
|
315
|
+
output_single(fault.message, fault_color(fault))
|
316
|
+
output(" [#{fault.test_name}]")
|
317
|
+
output(fault.location.first)
|
318
|
+
end
|
319
|
+
|
320
|
+
def format_fault(fault)
|
321
|
+
fault.long_display
|
322
|
+
end
|
323
|
+
|
324
|
+
def output_statistics(elapsed_time)
|
325
|
+
output("Finished in #{elapsed_time} seconds.")
|
326
|
+
output_summary_marker
|
327
|
+
output(@result)
|
328
|
+
output("%g%% passed" % @result.pass_percentage)
|
329
|
+
unless elapsed_time.zero?
|
330
|
+
output_summary_marker
|
331
|
+
test_throughput = @result.run_count / elapsed_time
|
332
|
+
assertion_throughput = @result.assertion_count / elapsed_time
|
333
|
+
throughput = [
|
334
|
+
"%.2f tests/s" % test_throughput,
|
335
|
+
"%.2f assertions/s" % assertion_throughput,
|
336
|
+
]
|
337
|
+
output(throughput.join(", "))
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def output_summary_marker
|
342
|
+
if @progress_row_max > 0
|
343
|
+
output("-" * @progress_row_max, summary_marker_color)
|
344
|
+
else
|
345
|
+
nl
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
def test_started(test)
|
350
|
+
return unless output?(VERBOSE)
|
351
|
+
|
352
|
+
tab_width = 8
|
353
|
+
name = test.local_name
|
354
|
+
separator = ":"
|
355
|
+
left_used = indent.size + name.size + separator.size
|
356
|
+
right_space = tab_width * 2
|
357
|
+
left_space = @progress_row_max - right_space
|
358
|
+
if (left_used % tab_width).zero?
|
359
|
+
left_space -= left_used
|
360
|
+
n_tabs = 0
|
361
|
+
else
|
362
|
+
left_space -= ((left_used / tab_width) + 1) * tab_width
|
363
|
+
n_tabs = 1
|
364
|
+
end
|
365
|
+
n_tabs += [left_space, 0].max / tab_width
|
366
|
+
tab_stop = "\t" * n_tabs
|
367
|
+
output_single("#{indent}#{name}#{separator}#{tab_stop}",
|
368
|
+
nil,
|
369
|
+
VERBOSE)
|
370
|
+
@test_start = Time.now
|
371
|
+
end
|
372
|
+
|
373
|
+
def test_finished(test)
|
374
|
+
unless @already_outputted
|
375
|
+
output_progress(".", color("pass-marker"))
|
376
|
+
end
|
377
|
+
@already_outputted = false
|
378
|
+
|
379
|
+
return unless output?(VERBOSE)
|
380
|
+
|
381
|
+
output(": (%f)" % (Time.now - @test_start), nil, VERBOSE)
|
382
|
+
end
|
383
|
+
|
384
|
+
def suite_name(prefix, suite)
|
385
|
+
name = suite.name
|
386
|
+
if name.nil?
|
387
|
+
"(anonymous)"
|
388
|
+
else
|
389
|
+
name.sub(/\A#{Regexp.escape(prefix)}/, "")
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
def test_suite_started(suite)
|
394
|
+
last_test_suite = @test_suites.last
|
395
|
+
@test_suites << suite
|
396
|
+
if @top_level
|
397
|
+
@top_level = false
|
398
|
+
return
|
399
|
+
end
|
400
|
+
|
401
|
+
output_single(indent, nil, VERBOSE)
|
402
|
+
if suite.test_case.nil?
|
403
|
+
_color = color("suite")
|
404
|
+
else
|
405
|
+
_color = color("case")
|
406
|
+
end
|
407
|
+
prefix = "#{last_test_suite.name}::"
|
408
|
+
output_single(suite_name(prefix, suite), _color, VERBOSE)
|
409
|
+
output(": ", nil, VERBOSE)
|
410
|
+
@indent += 2
|
411
|
+
end
|
412
|
+
|
413
|
+
def test_suite_finished(suite)
|
414
|
+
@indent -= 2
|
415
|
+
@test_suites.pop
|
416
|
+
end
|
417
|
+
|
418
|
+
def indent
|
419
|
+
if output?(VERBOSE)
|
420
|
+
" " * @indent
|
421
|
+
else
|
422
|
+
""
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
def nl(level=nil)
|
427
|
+
output("", nil, level)
|
428
|
+
end
|
429
|
+
|
430
|
+
def output(something, color=nil, level=nil)
|
431
|
+
return unless output?(level)
|
432
|
+
output_single(something, color, level)
|
433
|
+
@output.puts
|
434
|
+
end
|
435
|
+
|
436
|
+
def output_single(something, color=nil, level=nil)
|
437
|
+
return false unless output?(level)
|
438
|
+
if @use_color and color
|
439
|
+
something = "%s%s%s" % [color.escape_sequence,
|
440
|
+
something,
|
441
|
+
@reset_color.escape_sequence]
|
442
|
+
end
|
443
|
+
@output.write(something)
|
444
|
+
@output.flush
|
445
|
+
true
|
446
|
+
end
|
447
|
+
|
448
|
+
def output_progress(mark, color=nil)
|
449
|
+
if output_single(mark, color, PROGRESS_ONLY)
|
450
|
+
return unless @progress_row_max > 0
|
451
|
+
@progress_row += mark.size
|
452
|
+
if @progress_row >= @progress_row_max
|
453
|
+
nl unless @output_level == VERBOSE
|
454
|
+
@progress_row = 0
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
def output_progress_in_detail_marker(fault)
|
460
|
+
if @progress_row_max > 0
|
461
|
+
output("=" * @progress_row_max)
|
462
|
+
else
|
463
|
+
nl
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
def output_progress_in_detail(fault)
|
468
|
+
return if @output_level == SILENT
|
469
|
+
nl
|
470
|
+
output_progress_in_detail_marker(fault)
|
471
|
+
if categorize_fault(fault) == :need_detail_faults
|
472
|
+
output_fault_in_detail(fault)
|
473
|
+
else
|
474
|
+
output_fault_in_short(fault)
|
475
|
+
end
|
476
|
+
output_progress_in_detail_marker(fault)
|
477
|
+
@progress_row = 0
|
478
|
+
end
|
479
|
+
|
480
|
+
def output?(level)
|
481
|
+
(level || @current_output_level) <= @output_level
|
482
|
+
end
|
483
|
+
|
484
|
+
def color(name)
|
485
|
+
_color = @color_scheme[name]
|
486
|
+
_color ||= @color_scheme["success"] if name == "pass"
|
487
|
+
_color ||= ColorScheme.default[name]
|
488
|
+
_color
|
489
|
+
end
|
490
|
+
|
491
|
+
def fault_class_color_name(fault_class)
|
492
|
+
fault_class.name.split(/::/).last.downcase
|
493
|
+
end
|
494
|
+
|
495
|
+
def fault_class_color(fault_class)
|
496
|
+
color(fault_class_color_name(fault_class))
|
497
|
+
end
|
498
|
+
|
499
|
+
def fault_color(fault)
|
500
|
+
fault_class_color(fault.class)
|
501
|
+
end
|
502
|
+
|
503
|
+
def fault_marker_color(fault)
|
504
|
+
color("#{fault_class_color_name(fault.class)}-marker")
|
505
|
+
end
|
506
|
+
|
507
|
+
def summary_marker_color
|
508
|
+
color("#{@result.status}-marker")
|
509
|
+
end
|
510
|
+
|
511
|
+
TERM_COLOR_SUPPORT = /
|
512
|
+
color| # explicitly claims color support in the name
|
513
|
+
direct| # explicitly claims "direct color" (24 bit) support
|
514
|
+
#{ColorScheme::TERM_256}|
|
515
|
+
\Acygwin|
|
516
|
+
\Alinux|
|
517
|
+
\Ansterm-bce|
|
518
|
+
\Ansterm-c-|
|
519
|
+
\Aputty|
|
520
|
+
\Arxvt|
|
521
|
+
\Ascreen|
|
522
|
+
\Atmux|
|
523
|
+
\Axterm
|
524
|
+
/x
|
525
|
+
|
526
|
+
def guess_color_availability
|
527
|
+
return false unless @output.tty?
|
528
|
+
return true if windows? and ruby_2_0_or_later?
|
529
|
+
case ENV["TERM"]
|
530
|
+
when /(?:term|screen)(?:-(?:256)?color)?\z/
|
531
|
+
true
|
532
|
+
when TERM_COLOR_SUPPORT
|
533
|
+
true
|
534
|
+
else
|
535
|
+
return true if ENV["EMACS"] == "t"
|
536
|
+
false
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
def windows?
|
541
|
+
/mswin|mingw/ === RUBY_PLATFORM
|
542
|
+
end
|
543
|
+
|
544
|
+
def ruby_2_0_or_later?
|
545
|
+
RUBY_VERSION >= "2.0.0"
|
546
|
+
end
|
547
|
+
|
548
|
+
def guess_progress_row_max
|
549
|
+
term_width = guess_term_width
|
550
|
+
if term_width.zero?
|
551
|
+
if ENV["EMACS"] == "t"
|
552
|
+
-1
|
553
|
+
else
|
554
|
+
79
|
555
|
+
end
|
556
|
+
else
|
557
|
+
term_width
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
def guess_term_width
|
562
|
+
guess_term_width_from_io || guess_term_width_from_env || 0
|
563
|
+
end
|
564
|
+
|
565
|
+
def guess_term_width_from_io
|
566
|
+
if @output.respond_to?(:winsize)
|
567
|
+
begin
|
568
|
+
@output.winsize[1]
|
569
|
+
rescue SystemCallError
|
570
|
+
nil
|
571
|
+
end
|
572
|
+
else
|
573
|
+
nil
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
def guess_term_width_from_env
|
578
|
+
env = ENV["COLUMNS"] || ENV["TERM_WIDTH"]
|
579
|
+
return nil if env.nil?
|
580
|
+
|
581
|
+
begin
|
582
|
+
Integer(env)
|
583
|
+
rescue ArgumentError
|
584
|
+
nil
|
585
|
+
end
|
586
|
+
end
|
587
|
+
end
|
588
|
+
|
589
|
+
class ColorizedReadableDiffer < Diff::ReadableDiffer
|
590
|
+
def initialize(from, to, runner)
|
591
|
+
@runner = runner
|
592
|
+
super(from, to)
|
593
|
+
end
|
594
|
+
|
595
|
+
def need_diff?(options={})
|
596
|
+
return false if one_line_all_change?
|
597
|
+
operations.each do |tag,|
|
598
|
+
return true if [:replace, :equal].include?(tag)
|
599
|
+
end
|
600
|
+
false
|
601
|
+
end
|
602
|
+
|
603
|
+
private
|
604
|
+
def one_line_all_change?
|
605
|
+
return false if operations.size != 1
|
606
|
+
|
607
|
+
tag, from_start, from_end, to_start, to_end = operations.first
|
608
|
+
return false if tag != :replace
|
609
|
+
return false if [from_start, from_end] != [0, 1]
|
610
|
+
return false if [from_start, from_end] != [to_start, to_end]
|
611
|
+
|
612
|
+
_, _, _line_operations = line_operations(@from.first, @to.first)
|
613
|
+
_line_operations.size == 1
|
614
|
+
end
|
615
|
+
|
616
|
+
def output_single(something, color=nil)
|
617
|
+
@runner.__send__(:output_single, something, color)
|
618
|
+
end
|
619
|
+
|
620
|
+
def output(something, color=nil)
|
621
|
+
@runner.__send__(:output, something, color)
|
622
|
+
end
|
623
|
+
|
624
|
+
def color(name)
|
625
|
+
@runner.__send__(:color, name)
|
626
|
+
end
|
627
|
+
|
628
|
+
def cut_off_ratio
|
629
|
+
0
|
630
|
+
end
|
631
|
+
|
632
|
+
def default_ratio
|
633
|
+
0
|
634
|
+
end
|
635
|
+
|
636
|
+
def tag(mark, color_name, contents)
|
637
|
+
_color = color(color_name)
|
638
|
+
contents.each do |content|
|
639
|
+
output_single(mark, _color)
|
640
|
+
output_single(" ")
|
641
|
+
output(content)
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
645
|
+
def tag_deleted(contents)
|
646
|
+
tag("-", "diff-deleted-tag", contents)
|
647
|
+
end
|
648
|
+
|
649
|
+
def tag_inserted(contents)
|
650
|
+
tag("+", "diff-inserted-tag", contents)
|
651
|
+
end
|
652
|
+
|
653
|
+
def tag_equal(contents)
|
654
|
+
tag(" ", "normal", contents)
|
655
|
+
end
|
656
|
+
|
657
|
+
def tag_difference(contents)
|
658
|
+
tag("?", "diff-difference-tag", contents)
|
659
|
+
end
|
660
|
+
|
661
|
+
def diff_line(from_line, to_line)
|
662
|
+
to_operations = []
|
663
|
+
from_line, to_line, _operations = line_operations(from_line, to_line)
|
664
|
+
|
665
|
+
no_replace = true
|
666
|
+
_operations.each do |tag,|
|
667
|
+
if tag == :replace
|
668
|
+
no_replace = false
|
669
|
+
break
|
670
|
+
end
|
671
|
+
end
|
672
|
+
|
673
|
+
output_single("?", color("diff-difference-tag"))
|
674
|
+
output_single(" ")
|
675
|
+
_operations.each do |tag, from_start, from_end, to_start, to_end|
|
676
|
+
from_width = compute_width(from_line, from_start, from_end)
|
677
|
+
to_width = compute_width(to_line, to_start, to_end)
|
678
|
+
case tag
|
679
|
+
when :replace
|
680
|
+
output_single(from_line[from_start...from_end],
|
681
|
+
color("diff-deleted"))
|
682
|
+
if (from_width < to_width)
|
683
|
+
output_single(" " * (to_width - from_width))
|
684
|
+
end
|
685
|
+
to_operations << Proc.new do
|
686
|
+
output_single(to_line[to_start...to_end],
|
687
|
+
color("diff-inserted"))
|
688
|
+
if (to_width < from_width)
|
689
|
+
output_single(" " * (from_width - to_width))
|
690
|
+
end
|
691
|
+
end
|
692
|
+
when :delete
|
693
|
+
output_single(from_line[from_start...from_end],
|
694
|
+
color("diff-deleted"))
|
695
|
+
unless no_replace
|
696
|
+
to_operations << Proc.new {output_single(" " * from_width)}
|
697
|
+
end
|
698
|
+
when :insert
|
699
|
+
if no_replace
|
700
|
+
output_single(to_line[to_start...to_end],
|
701
|
+
color("diff-inserted"))
|
702
|
+
else
|
703
|
+
output_single(" " * to_width)
|
704
|
+
to_operations << Proc.new do
|
705
|
+
output_single(to_line[to_start...to_end],
|
706
|
+
color("diff-inserted"))
|
707
|
+
end
|
708
|
+
end
|
709
|
+
when :equal
|
710
|
+
output_single(from_line[from_start...from_end])
|
711
|
+
unless no_replace
|
712
|
+
to_operations << Proc.new {output_single(" " * to_width)}
|
713
|
+
end
|
714
|
+
else
|
715
|
+
raise "unknown tag: #{tag}"
|
716
|
+
end
|
717
|
+
end
|
718
|
+
output("")
|
719
|
+
|
720
|
+
unless to_operations.empty?
|
721
|
+
output_single("?", color("diff-difference-tag"))
|
722
|
+
output_single(" ")
|
723
|
+
to_operations.each do |operation|
|
724
|
+
operation.call
|
725
|
+
end
|
726
|
+
output("")
|
727
|
+
end
|
728
|
+
end
|
729
|
+
end
|
730
|
+
end
|
731
|
+
end
|
732
|
+
end
|
733
|
+
end
|