opal-rspec 0.4.0.beta3 → 0.4.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.gitmodules +15 -0
  4. data/.travis.yml +12 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +3 -1
  7. data/Gemfile +6 -7
  8. data/README.md +2 -0
  9. data/Rakefile +12 -50
  10. data/lib/opal/rspec/version.rb +1 -1
  11. data/lib/opal/rspec.rb +14 -0
  12. data/opal/opal/rspec/async.rb +146 -11
  13. data/opal/opal/rspec/fixes.rb +18 -8
  14. data/opal/opal/rspec/requires.rb +45 -0
  15. data/opal/opal/rspec.rb +1 -24
  16. data/opal-rspec.gemspec +1 -1
  17. data/spec/async_spec.rb +4 -5
  18. data/spec/matchers_spec.rb +20 -0
  19. data/spec/named_subject_spec.rb +11 -0
  20. data/spec/should_syntax_spec.rb +17 -0
  21. data/vendor_lib/rspec/autorun.rb +2 -0
  22. data/vendor_lib/rspec/core/backport_random.rb +302 -0
  23. data/vendor_lib/rspec/core/backtrace_formatter.rb +65 -0
  24. data/vendor_lib/rspec/core/command_line.rb +36 -0
  25. data/vendor_lib/rspec/core/configuration.rb +1129 -0
  26. data/vendor_lib/rspec/core/configuration_options.rb +143 -0
  27. data/vendor_lib/rspec/core/drb_command_line.rb +26 -0
  28. data/vendor_lib/rspec/core/drb_options.rb +87 -0
  29. data/vendor_lib/rspec/core/dsl.rb +26 -0
  30. data/vendor_lib/rspec/core/example.rb +312 -0
  31. data/vendor_lib/rspec/core/example_group.rb +540 -0
  32. data/vendor_lib/rspec/core/filter_manager.rb +224 -0
  33. data/vendor_lib/rspec/core/flat_map.rb +17 -0
  34. data/vendor_lib/rspec/core/formatters/base_formatter.rb +291 -0
  35. data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +307 -0
  36. data/vendor_lib/rspec/core/formatters/deprecation_formatter.rb +193 -0
  37. data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +67 -0
  38. data/vendor_lib/rspec/core/formatters/helpers.rb +82 -0
  39. data/vendor_lib/rspec/core/formatters/html_formatter.rb +155 -0
  40. data/vendor_lib/rspec/core/formatters/html_printer.rb +408 -0
  41. data/vendor_lib/rspec/core/formatters/json_formatter.rb +99 -0
  42. data/vendor_lib/rspec/core/formatters/progress_formatter.rb +32 -0
  43. data/vendor_lib/rspec/core/formatters/snippet_extractor.rb +101 -0
  44. data/vendor_lib/rspec/core/formatters.rb +54 -0
  45. data/vendor_lib/rspec/core/hooks.rb +535 -0
  46. data/vendor_lib/rspec/core/memoized_helpers.rb +431 -0
  47. data/vendor_lib/rspec/core/metadata.rb +313 -0
  48. data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +11 -0
  49. data/vendor_lib/rspec/core/mocking/with_flexmock.rb +27 -0
  50. data/vendor_lib/rspec/core/mocking/with_mocha.rb +52 -0
  51. data/vendor_lib/rspec/core/mocking/with_rr.rb +27 -0
  52. data/vendor_lib/rspec/core/mocking/with_rspec.rb +27 -0
  53. data/vendor_lib/rspec/core/option_parser.rb +234 -0
  54. data/vendor_lib/rspec/core/ordering.rb +154 -0
  55. data/vendor_lib/rspec/core/pending.rb +110 -0
  56. data/vendor_lib/rspec/core/project_initializer.rb +88 -0
  57. data/vendor_lib/rspec/core/rake_task.rb +128 -0
  58. data/vendor_lib/rspec/core/reporter.rb +132 -0
  59. data/vendor_lib/rspec/core/ruby_project.rb +44 -0
  60. data/vendor_lib/rspec/core/runner.rb +97 -0
  61. data/vendor_lib/rspec/core/shared_context.rb +53 -0
  62. data/vendor_lib/rspec/core/shared_example_group/collection.rb +27 -0
  63. data/vendor_lib/rspec/core/shared_example_group.rb +146 -0
  64. data/vendor_lib/rspec/core/version.rb +7 -0
  65. data/vendor_lib/rspec/core/warnings.rb +22 -0
  66. data/vendor_lib/rspec/core/world.rb +131 -0
  67. data/vendor_lib/rspec/core.rb +203 -0
  68. data/vendor_lib/rspec/expectations/differ.rb +154 -0
  69. data/vendor_lib/rspec/expectations/errors.rb +9 -0
  70. data/vendor_lib/rspec/expectations/expectation_target.rb +87 -0
  71. data/vendor_lib/rspec/expectations/extensions/object.rb +29 -0
  72. data/vendor_lib/rspec/expectations/extensions.rb +1 -0
  73. data/vendor_lib/rspec/expectations/fail_with.rb +79 -0
  74. data/vendor_lib/rspec/expectations/handler.rb +68 -0
  75. data/vendor_lib/rspec/expectations/syntax.rb +182 -0
  76. data/vendor_lib/rspec/expectations/version.rb +8 -0
  77. data/vendor_lib/rspec/expectations.rb +75 -0
  78. data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +68 -0
  79. data/vendor_lib/rspec/matchers/built_in/be.rb +213 -0
  80. data/vendor_lib/rspec/matchers/built_in/be_instance_of.rb +15 -0
  81. data/vendor_lib/rspec/matchers/built_in/be_kind_of.rb +11 -0
  82. data/vendor_lib/rspec/matchers/built_in/be_within.rb +55 -0
  83. data/vendor_lib/rspec/matchers/built_in/change.rb +141 -0
  84. data/vendor_lib/rspec/matchers/built_in/cover.rb +21 -0
  85. data/vendor_lib/rspec/matchers/built_in/eq.rb +22 -0
  86. data/vendor_lib/rspec/matchers/built_in/eql.rb +23 -0
  87. data/vendor_lib/rspec/matchers/built_in/equal.rb +48 -0
  88. data/vendor_lib/rspec/matchers/built_in/exist.rb +26 -0
  89. data/vendor_lib/rspec/matchers/built_in/has.rb +48 -0
  90. data/vendor_lib/rspec/matchers/built_in/include.rb +61 -0
  91. data/vendor_lib/rspec/matchers/built_in/match.rb +17 -0
  92. data/vendor_lib/rspec/matchers/built_in/match_array.rb +51 -0
  93. data/vendor_lib/rspec/matchers/built_in/raise_error.rb +154 -0
  94. data/vendor_lib/rspec/matchers/built_in/respond_to.rb +74 -0
  95. data/vendor_lib/rspec/matchers/built_in/satisfy.rb +30 -0
  96. data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +48 -0
  97. data/vendor_lib/rspec/matchers/built_in/throw_symbol.rb +94 -0
  98. data/vendor_lib/rspec/matchers/built_in/yield.rb +297 -0
  99. data/vendor_lib/rspec/matchers/built_in.rb +39 -0
  100. data/vendor_lib/rspec/matchers/compatibility.rb +14 -0
  101. data/vendor_lib/rspec/matchers/configuration.rb +113 -0
  102. data/vendor_lib/rspec/matchers/dsl.rb +23 -0
  103. data/vendor_lib/rspec/matchers/generated_descriptions.rb +35 -0
  104. data/vendor_lib/rspec/matchers/matcher.rb +301 -0
  105. data/vendor_lib/rspec/matchers/method_missing.rb +12 -0
  106. data/vendor_lib/rspec/matchers/operator_matcher.rb +99 -0
  107. data/vendor_lib/rspec/matchers/pretty.rb +70 -0
  108. data/vendor_lib/rspec/matchers/test_unit_integration.rb +11 -0
  109. data/vendor_lib/rspec/matchers.rb +633 -0
  110. data/vendor_lib/rspec/mocks/any_instance/chain.rb +92 -0
  111. data/vendor_lib/rspec/mocks/any_instance/expectation_chain.rb +47 -0
  112. data/vendor_lib/rspec/mocks/any_instance/message_chains.rb +75 -0
  113. data/vendor_lib/rspec/mocks/any_instance/recorder.rb +200 -0
  114. data/vendor_lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
  115. data/vendor_lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
  116. data/vendor_lib/rspec/mocks/argument_list_matcher.rb +104 -0
  117. data/vendor_lib/rspec/mocks/argument_matchers.rb +264 -0
  118. data/vendor_lib/rspec/mocks/arity_calculator.rb +66 -0
  119. data/vendor_lib/rspec/mocks/configuration.rb +111 -0
  120. data/vendor_lib/rspec/mocks/error_generator.rb +203 -0
  121. data/vendor_lib/rspec/mocks/errors.rb +12 -0
  122. data/vendor_lib/rspec/mocks/example_methods.rb +201 -0
  123. data/vendor_lib/rspec/mocks/extensions/marshal.rb +17 -0
  124. data/vendor_lib/rspec/mocks/framework.rb +36 -0
  125. data/vendor_lib/rspec/mocks/instance_method_stasher.rb +112 -0
  126. data/vendor_lib/rspec/mocks/matchers/have_received.rb +99 -0
  127. data/vendor_lib/rspec/mocks/matchers/receive.rb +112 -0
  128. data/vendor_lib/rspec/mocks/matchers/receive_messages.rb +72 -0
  129. data/vendor_lib/rspec/mocks/message_expectation.rb +643 -0
  130. data/vendor_lib/rspec/mocks/method_double.rb +209 -0
  131. data/vendor_lib/rspec/mocks/method_reference.rb +95 -0
  132. data/vendor_lib/rspec/mocks/mock.rb +7 -0
  133. data/vendor_lib/rspec/mocks/mutate_const.rb +406 -0
  134. data/vendor_lib/rspec/mocks/object_reference.rb +90 -0
  135. data/vendor_lib/rspec/mocks/order_group.rb +82 -0
  136. data/vendor_lib/rspec/mocks/proxy.rb +269 -0
  137. data/vendor_lib/rspec/mocks/proxy_for_nil.rb +37 -0
  138. data/vendor_lib/rspec/mocks/space.rb +95 -0
  139. data/vendor_lib/rspec/mocks/standalone.rb +3 -0
  140. data/vendor_lib/rspec/mocks/stub_chain.rb +51 -0
  141. data/vendor_lib/rspec/mocks/syntax.rb +374 -0
  142. data/vendor_lib/rspec/mocks/targets.rb +90 -0
  143. data/vendor_lib/rspec/mocks/test_double.rb +109 -0
  144. data/vendor_lib/rspec/mocks/verifying_double.rb +77 -0
  145. data/vendor_lib/rspec/mocks/verifying_message_expecation.rb +60 -0
  146. data/vendor_lib/rspec/mocks/verifying_proxy.rb +151 -0
  147. data/vendor_lib/rspec/mocks/version.rb +7 -0
  148. data/vendor_lib/rspec/mocks.rb +100 -0
  149. data/vendor_lib/rspec/support/caller_filter.rb +56 -0
  150. data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +29 -0
  151. data/vendor_lib/rspec/support/spec/in_sub_process.rb +40 -0
  152. data/vendor_lib/rspec/support/spec/stderr_splitter.rb +50 -0
  153. data/vendor_lib/rspec/support/spec.rb +14 -0
  154. data/vendor_lib/rspec/support/version.rb +7 -0
  155. data/vendor_lib/rspec/support/warnings.rb +41 -0
  156. data/vendor_lib/rspec/support.rb +6 -0
  157. data/vendor_lib/rspec/version.rb +5 -0
  158. data/vendor_lib/rspec-expectations.rb +1 -0
  159. data/vendor_lib/rspec.rb +3 -0
  160. metadata +163 -4
  161. data/opal/opal/rspec/rspec.js +0 -20384
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d63becff5bbb79b0f33a63ab926145f4f6b9d7b2
4
- data.tar.gz: 2b43af87ee229788e1f9abcb67f0e97ffe7bc6e6
3
+ metadata.gz: b6ec1f1110451f412a61b923b32d640e293e2929
4
+ data.tar.gz: 6aebaf694d03562bc10ff99c956dc53c7cb36155
5
5
  SHA512:
6
- metadata.gz: 643059f5e8419b5d7f828e8b0687b378ee380641f6379a20df9922345f34cea58d3d6d226487019ce16d83c582aaf1c0ad99faa1ead946ede6275e8a4564c9b4
7
- data.tar.gz: 79a56fd3dd9a7704bb3aedad971cc555fafcc3cb6d9d25501a08bcc3afb34a64394a47c64d94666fc2a2e0df152c0da0def8e8e931d2d7978dd61a8a7f6847a5
6
+ metadata.gz: 1f07f2a9acaa17631c66fa1455670f07d7f05641786e4df60d1641d853818cc2b2ecc17e3379f4e068789ecde5a1df077f076685a9aef09bf8e82570c64ebfac
7
+ data.tar.gz: 06559b78e1349be1765b9a14047f1b290e113b8a435c87fb02fd5c026e23676ad82892e15b3527a0ee27b3739bcfb4dc98aa7487fe892c4e2addd17dc38a1ab3
data/.gitignore CHANGED
@@ -1,4 +1,3 @@
1
1
  .DS_Store
2
2
  Gemfile.lock
3
- opal/opal/rspec/rspec.js
4
3
  *.gem
data/.gitmodules ADDED
@@ -0,0 +1,15 @@
1
+ [submodule "rspec"]
2
+ path = rspec
3
+ url = https://github.com/rspec/rspec.git
4
+ [submodule "rspec-support"]
5
+ path = rspec-support
6
+ url = https://github.com/rspec/rspec-support.git
7
+ [submodule "rspec-core"]
8
+ path = rspec-core
9
+ url = https://github.com/rspec/rspec-core.git
10
+ [submodule "rspec-mocks"]
11
+ path = rspec-mocks
12
+ url = https://github.com/rspec/rspec-mocks.git
13
+ [submodule "rspec-expectations"]
14
+ path = rspec-expectations
15
+ url = https://github.com/rspec/rspec-expectations.git
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+
8
+ before_install:
9
+ - git submodule update --init
10
+
11
+ notifications:
12
+ irc: "irc.freenode.org#opal"
data/.yardopts ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ opal/**/*.rb
3
+ --markup markdown
4
+ -
5
+ CHANGELOG.md
data/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
1
  ## edge
2
2
 
3
+ * Remove predicate matcher fixes as Opal supports $1..$9 special gvars.
4
+
3
5
  * Update Opal dependency for ~> 0.6.0.
4
6
 
5
7
  * Remove double-escaping in inline x-strings (from Opal bug fix).
@@ -10,4 +12,4 @@
10
12
 
11
13
  * Add timeout support to asynchronous specs
12
14
 
13
- ## 0.2.1 2013-11-24
15
+ ## 0.2.1 November 24, 2013
data/Gemfile CHANGED
@@ -1,11 +1,10 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'opal', github: 'opal/opal'
5
- # gem 'opal', path: '../opal'
4
+ gem 'opal', :github => 'opal/opal'
6
5
 
7
- gem 'rspec', '3.0.0.beta1'
8
- gem 'rspec-support', '3.0.0.beta1'
9
- gem 'rspec-core', '3.0.0.beta1'
10
- gem 'rspec-mocks', '3.0.0.beta1'
11
- gem 'rspec-expectations', '3.0.0.beta1'
6
+ gem 'rspec', :path => 'rspec'
7
+ gem 'rspec-support', :path => 'rspec-support'
8
+ gem 'rspec-core', :path => 'rspec-core'
9
+ gem 'rspec-mocks', :path => 'rspec-mocks'
10
+ gem 'rspec-expectations', :path => 'rspec-expectations'
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  An attempt at a compatibility layer of rspec for opal.
4
4
 
5
+ [See the website for documentation](http://opalrb.org/docs/rspec/).
6
+
5
7
  ## Usage
6
8
 
7
9
  Add `opal-rspec` to your Gemfile:
data/Rakefile CHANGED
@@ -1,64 +1,26 @@
1
1
  require 'bundler'
2
2
  Bundler.require
3
+
3
4
  Bundler::GemHelper.install_tasks
4
5
 
5
6
  require 'opal/rspec/rake_task'
6
7
  Opal::RSpec::RakeTask.new(:default)
7
8
 
8
- desc "Build opal/opal/rspec/rspec.js"
9
- task :dist do
10
- File.open('opal/opal/rspec/rspec.js', 'w+') do |out|
11
- out << build_rspec
12
- end
13
- end
14
- task :build => :dist
15
-
16
- desc "Show dev/min sizes"
17
- task :sizes do
18
- code = build_rspec
19
- min = uglify code
20
-
21
- puts "\ndevelopment: #{code.size}, minified: #{min.size}"
22
- end
23
-
24
- def build_rspec
25
- Opal::Processor.dynamic_require_severity = :warning
26
-
27
- code = []
28
- gems = %w(rspec rspec-core rspec-support rspec-expectations rspec-mocks)
29
9
 
30
- gems.each do |gem_name|
31
- spec = Gem::Specification.find_by_name gem_name
32
- gem_dir = File.join spec.gem_dir, 'lib'
33
- prefix = gem_dir + '/'
10
+ require 'fileutils'
11
+ desc "Copy RSpec sources"
12
+ task :copy_rspec do
13
+ gems = %w(rspec rspec-core rspec-expectations rspec-mocks rspec-support)
34
14
 
35
- Dir.glob(File.join(gem_dir, '**/*.rb')).each do |source|
36
- requirable = source.sub(prefix, '').sub(/\.rb$/, '')
15
+ gems.each do |gem|
16
+ spec = Gem::Specification.find_by_name gem
17
+ lib = File.join spec.gem_dir, 'lib'
37
18
 
38
- compiler = Opal::Compiler.new File.read(source),
39
- requirable: true, file: requirable, dynamic_require_severity: :warning
19
+ Dir["#{lib}/**/*.rb"].each do |file|
20
+ out = file.sub(/^#{lib}\//, 'opal/')
40
21
 
41
- code << compiler.compile
22
+ FileUtils.mkdir_p File.dirname(out)
23
+ FileUtils.cp file, out
42
24
  end
43
25
  end
44
-
45
- stubs = %w(shellwords fileutils optparse)
46
-
47
- stubs.each do |stub|
48
- compiler = Opal::Compiler.new '', requirable: true, file: stub
49
- code << compiler.compile
50
- end
51
-
52
- code.join "\n"
53
- end
54
-
55
- def uglify(str)
56
- IO.popen('uglifyjs', 'r+') do |i|
57
- i.puts str
58
- i.close_write
59
- return i.read
60
- end
61
- rescue Errno::ENOENT
62
- $stderr.puts '"uglifyjs" command not found (install with: "npm install -g uglify-js")'
63
- nil
64
26
  end
@@ -1,5 +1,5 @@
1
1
  module Opal
2
2
  module RSpec
3
- VERSION = '0.4.0.beta3'
3
+ VERSION = '0.4.0.beta4'
4
4
  end
5
5
  end
data/lib/opal/rspec.rb CHANGED
@@ -3,4 +3,18 @@ require 'opal/rspec/version'
3
3
 
4
4
  # Just register our opal code path with opal build tools
5
5
  Opal.append_path File.expand_path('../../../opal', __FILE__)
6
+ Opal.append_path File.expand_path('../../../vendor_lib', __FILE__)
6
7
 
8
+ Opal::Processor.dynamic_require_severity = :warning
9
+
10
+ Opal::Processor.stub_file "rspec/matchers/built_in/have"
11
+ Opal::Processor.stub_file "diff/lcs"
12
+ Opal::Processor.stub_file "diff/lcs/hunk"
13
+ Opal::Processor.stub_file "fileutils"
14
+ Opal::Processor.stub_file "test/unit/assertions"
15
+ Opal::Processor.stub_file "coderay"
16
+ Opal::Processor.stub_file "optparse"
17
+ Opal::Processor.stub_file "shellwords"
18
+ Opal::Processor.stub_file "socket"
19
+ Opal::Processor.stub_file "uri"
20
+ Opal::Processor.stub_file "drb/drb"
@@ -1,27 +1,148 @@
1
1
  module Opal
2
2
  module RSpec
3
- module AsyncDefinitions
4
- def async(desc, *args, &block)
5
- options = ::RSpec::Core::Metadata.build_hash_from(args)
6
- Opal::RSpec::AsyncExample.register(self, desc, options, block)
3
+ # {AsyncHelpers} is automatically included in all example groups to add
4
+ # support for running specs async. Usually, rspec runners expect all
5
+ # examples to run synchronously, but this is not ideal in the case for
6
+ # Opal where a lot of underlying libraries expect the ability to run code
7
+ # in an asynchronous manner.
8
+ #
9
+ # This module defines an {AsyncHelpers::ClassMethods.async} method which
10
+ # can be used instead of `it` inside an example group, which marks the
11
+ # example as being async. This makes the runner wait for the example to
12
+ # complete.
13
+ #
14
+ # describe "Some examples" do
15
+ # it "normal example" do
16
+ # # normal test code
17
+ # end
18
+ #
19
+ # async "async example" do
20
+ # # this will wait until completion before moving on
21
+ # end
22
+ # end
23
+ #
24
+ # Marking an example as being async is only half the task. Examples will
25
+ # also have an instance {AsyncHelpers#async} method defined which is then
26
+ # used to complete the example. Any code run inside this block will run
27
+ # inside the context of the example.
28
+ #
29
+ # describe "HTTP requests" do
30
+ # async "might take a while" do
31
+ # HTTP.get("/url/to/get") do |res|
32
+ # async { expect(res).to be_ok }
33
+ # end
34
+ # end
35
+ # end
36
+ #
37
+ # As soon as `async` is run inside the block, the example completes. This
38
+ # means that only 1 `async` call is allowed. However, you can use `async`
39
+ # multiple times aslong as it is only called once:
40
+ #
41
+ # describe "HTTP requests" do
42
+ # async "should work" do
43
+ # HTTP.get("/users/1").then |res|
44
+ # async { expect(res).to be_ok }
45
+ # end.fail do
46
+ # async { raise "this should not be called" }
47
+ # end
48
+ # end
49
+ # end
50
+ #
51
+ # Here, a promise will either be accepted or rejected, so an `async` block
52
+ # can be used in each case as only 1 will be called.
53
+ #
54
+ # Another helper, {AsyncHelpers#delay} can also be used to run a block of
55
+ # code after a given time in seconds. This is useful to wait for animations
56
+ # or time restricted operations to occur.
57
+ module AsyncHelpers
58
+ module ClassMethods
59
+ # Define an async example method. This should be used instead of `it`
60
+ # to inform the spec runner that the example will need to wait for an
61
+ # {AsyncHelpers#async} method to complete the test. Any additional
62
+ # configuration options can be passed to this call, and they just get
63
+ # delegated to the underlying `#it` call.
64
+ #
65
+ # @example
66
+ # describe "Some tests" do
67
+ # async "should be async" do
68
+ # # ... async code
69
+ # end
70
+ #
71
+ # it "should work with normal tests" do
72
+ # expect(1).to eq(1)
73
+ # end
74
+ # end
75
+ #
76
+ # @param desc [String] description
77
+ def async(desc, *args, &block)
78
+ options = ::RSpec::Core::Metadata.build_hash_from(args)
79
+ Opal::RSpec::AsyncExample.register(self, desc, options, block)
80
+ end
7
81
  end
8
- end
9
82
 
10
- module AsyncHelpers
83
+ def self.included(base)
84
+ base.extend ClassMethods
85
+ end
86
+
87
+ # Must be used with {ClassMethods#async} to finish the async action. If
88
+ # this is not called inside the body then the spec runner will time out
89
+ # or the error might give a false positive as it is not caught inside
90
+ # the current example.
91
+ #
92
+ # @example Complete expectation after HTTP request
93
+ # describe "HTTP calls" do
94
+ # async "complete eventually" do
95
+ # HTTP.get("/some_url") do |response|
96
+ # async { expect(response).to be_ok }
97
+ # end
98
+ # end
99
+ # end
100
+ #
11
101
  def async(&block)
12
102
  @example.continue_async(block)
13
103
  end
14
104
 
15
- alias run_async async
16
-
105
+ # Runs the given block after a given duration. You are still required to
106
+ # use a {#async} block inside the delayed callback. This helper can be
107
+ # used to simulate IO delays, or just to wait for animations/other
108
+ # behaviour to finish.
109
+ #
110
+ # The `duaration` should be given in seconds, i.e. `1` means 1 second, or
111
+ # 0.3 means 300ms. The given block is just run after the time delay.
112
+ #
113
+ # @example
114
+ # describe "Some interaction" do
115
+ # async "takes a while to complete" do
116
+ # task = start_long_task!
117
+ #
118
+ # delay(1) do
119
+ # async { expect(task).to be_completed }
120
+ # end
121
+ # end
122
+ # end
123
+ #
124
+ # @param duration [Integer, Float] time in seconds to wait
17
125
  def delay(duration, &block)
18
126
  `setTimeout(block, duration * 1000)`
19
127
  self
20
128
  end
21
129
 
22
- alias set_timeout delay
130
+ # Use {#async} instead.
131
+ #
132
+ # @deprecated
133
+ def run_async(&block)
134
+ async(&block)
135
+ end
136
+
137
+ # Use {#delay} instead.
138
+ #
139
+ # @deprecated
140
+ def set_timeout(*args, &block)
141
+ delay(*args, &block)
142
+ end
23
143
  end
24
144
 
145
+ # Runs all async examples from {AsyncExample.examples}.
25
146
  class AsyncRunner
26
147
  def initialize(runner, reporter, finish_block)
27
148
  @runner = runner
@@ -65,17 +186,31 @@ module Opal
65
186
  end
66
187
  end
67
188
 
189
+ # An {AsyncExample} is a subclass of regular example instances which adds
190
+ # support for running an example, and waiting for a non-sync outcome. All
191
+ # async examples in a set of spec files will get registered through
192
+ # {AsyncExample.register}, and added to the {AsyncExample.examples} array
193
+ # ready for the runner to run.
194
+ #
195
+ # You will not need to create new instances of this class directly, and
196
+ # should instead use {AsyncHelpers} to create async examples.
68
197
  class AsyncExample < ::RSpec::Core::Example
198
+ include AsyncHelpers
199
+
200
+ # Register new async example.
201
+ #
202
+ # @see AsyncHelpers::ClassMethods.async
69
203
  def self.register(*args)
70
204
  examples << new(*args)
71
205
  end
72
206
 
207
+ # All async examples in specs.
208
+ #
209
+ # @return [Array<AsyncExample>]
73
210
  def self.examples
74
211
  @examples ||= []
75
212
  end
76
213
 
77
- include AsyncHelpers
78
-
79
214
  def run(example_group_instance, reporter, &after_run_block)
80
215
  @example_group_instance = example_group_instance
81
216
  @reporter = reporter
@@ -1,3 +1,10 @@
1
+ # IO.closed? missing - BaseFormatter uses it for sync impl
2
+ class IO
3
+ def closed?
4
+ false
5
+ end
6
+ end
7
+
1
8
  # Opal defines enumerable#flat_map, but doesnt implement it
2
9
  module RSpec::Core::FlatMap
3
10
  def flat_map(array)
@@ -42,14 +49,6 @@ module RSpec
42
49
  end
43
50
  end
44
51
 
45
- # Opal does not yet support $1..$9 backrefs
46
- class RSpec::Matchers::BuiltIn::BePredicate
47
- def prefix_and_expected(symbol)
48
- symbol.to_s =~ /^(be_(an?_)?)(.*)/
49
- return $~[1], $~[3]
50
- end
51
- end
52
-
53
52
  module RSpec::ExampleGroups
54
53
  # opal cannot use mutable strings AND opal doesnt support `\A` or `\z` anchors
55
54
  def self.base_name_for(group)
@@ -96,3 +95,14 @@ class RSpec::Mocks::MethodDouble
96
95
  @original_method ||= @method_stasher.original_method
97
96
  end
98
97
  end
98
+
99
+ # Missing on vendored rspec version
100
+ module RSpec
101
+ module Core
102
+ module MemoizedHelpers
103
+ def is_expected
104
+ expect(subject)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,45 @@
1
+ require 'corelib/dir'
2
+ require 'thread'
3
+
4
+ require 'set'
5
+ require 'time'
6
+ require 'rbconfig'
7
+ require 'pathname'
8
+
9
+ # TODO: still needed? meh..
10
+ require 'rspec/core/version'
11
+ require 'rspec/core/flat_map'
12
+ require 'rspec/core/filter_manager'
13
+ require 'rspec/core/dsl'
14
+ require 'rspec/core/reporter'
15
+ require 'rspec/core/hooks'
16
+ require 'rspec/core/memoized_helpers'
17
+ require 'rspec/core/metadata'
18
+ require 'rspec/core/pending'
19
+ require 'rspec/core/formatters'
20
+ require 'rspec/core/ordering'
21
+ require 'rspec/core/world'
22
+ require 'rspec/core/configuration'
23
+ require 'rspec/core/option_parser'
24
+ require 'rspec/core/configuration_options'
25
+ require 'rspec/core/command_line'
26
+ require 'rspec/core/runner'
27
+ require 'rspec/core/example'
28
+ require 'rspec/core/shared_example_group/collection'
29
+ require 'rspec/core/shared_example_group'
30
+ require 'rspec/core/example_group'
31
+
32
+ require 'rspec/core/mocking/with_rspec'
33
+
34
+ require 'rspec/support'
35
+ require 'rspec/core'
36
+ require 'rspec/expectations'
37
+ require 'rspec/mocks'
38
+ require 'rspec'
39
+
40
+ # FIXME: still needed?
41
+ require 'rspec/core/formatters/base_text_formatter'
42
+ require 'rspec/core/formatters/html_printer'
43
+ require 'rspec/matchers/pretty'
44
+ require 'rspec/matchers/built_in/base_matcher'
45
+ require 'rspec/matchers/built_in/be'
data/opal/opal/rspec.rb CHANGED
@@ -4,29 +4,7 @@ end
4
4
 
5
5
  Test = MiniTest
6
6
 
7
- require 'file'
8
- require 'corelib/dir'
9
- require 'thread'
10
-
11
- require 'set'
12
- require 'time'
13
- require 'rbconfig'
14
- require 'pathname'
15
-
16
- # vendor a pre-built rspec
17
- require 'opal/rspec/rspec'
18
-
19
- # we "fix" these files, so require them now so they are loaded before our
20
- # fixes file. We can't use Kernel#require() directly as the compiler will
21
- # complain it can't find these files at compile time, but they are available
22
- # from rspec.js from the gem.
23
- %w[rspec
24
- rspec/core/formatters/base_text_formatter
25
- rspec/core/formatters/html_printer
26
- rspec/matchers/pretty
27
- rspec/matchers/built_in/base_matcher
28
- rspec/matchers/built_in/be].each { |r| `self.$require(r)` }
29
-
7
+ require 'opal/rspec/requires'
30
8
  require 'opal/rspec/fixes'
31
9
  require 'opal/rspec/text_formatter'
32
10
  require 'opal/rspec/browser_formatter'
@@ -39,7 +17,6 @@ RSpec.configure do |config|
39
17
 
40
18
  # Async helpers for specs
41
19
  config.include Opal::RSpec::AsyncHelpers
42
- config.extend Opal::RSpec::AsyncDefinitions
43
20
 
44
21
  # Always support expect() and .should syntax (we should not do this really..)
45
22
  config.expect_with :rspec do |c|
data/opal-rspec.gemspec CHANGED
@@ -11,11 +11,11 @@ Gem::Specification.new do |s|
11
11
  s.description = 'Opal compatible rspec library'
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
- s.files << 'opal/opal/rspec/rspec.js'
15
14
 
16
15
  s.require_paths = ['lib']
17
16
 
18
17
  s.add_dependency 'opal', '~> 0.7.0.beta1'
19
18
  s.add_development_dependency 'rake'
19
+ s.add_development_dependency 'yard'
20
20
  end
21
21
 
data/spec/async_spec.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  describe "Asynchronous helpers" do
2
-
3
2
  let(:foo) { 100 }
4
3
 
5
4
  before do
@@ -7,13 +6,13 @@ describe "Asynchronous helpers" do
7
6
  end
8
7
 
9
8
  async "can run examples async" do
10
- run_async do
9
+ async do
11
10
  1.should == 1
12
11
  end
13
12
  end
14
13
 
15
14
  async "can access let() helpers and before() helpers" do
16
- run_async do
15
+ async do
17
16
  foo.should eq(100)
18
17
  @model.should be_kind_of(Object)
19
18
  end
@@ -23,7 +22,7 @@ describe "Asynchronous helpers" do
23
22
  obj = [1, 2, 3, 4]
24
23
 
25
24
  delay(1) do
26
- run_async { obj.should == [1, 2, 3, 4] }
25
+ async { obj.should == [1, 2, 3, 4] }
27
26
  end
28
27
  end
29
28
 
@@ -33,7 +32,7 @@ describe "Asynchronous helpers" do
33
32
  }.to raise_error(Exception)
34
33
 
35
34
  delay(0) do
36
- run_async { expect(42).to eq(42) }
35
+ async { expect(42).to eq(42) }
37
36
  end
38
37
  end
39
38
  end
@@ -179,3 +179,23 @@ describe "operator ==" do
179
179
  }.to raise_error(Exception)
180
180
  end
181
181
  end
182
+
183
+ class PredicateTest
184
+ def foo?
185
+ true
186
+ end
187
+
188
+ def bar?
189
+ false
190
+ end
191
+ end
192
+
193
+ describe "predicate matchers" do
194
+ it "works with positive expectations" do
195
+ expect(PredicateTest.new).to be_foo
196
+ end
197
+
198
+ it "work with negative expectations" do
199
+ expect(PredicateTest.new).to_not be_bar
200
+ end
201
+ end
@@ -0,0 +1,11 @@
1
+ describe "named subject" do
2
+ subject(:named_subject) { [1, 2, 3] }
3
+
4
+ it "should be the subject" do
5
+ subject.should be_kind_of(Array)
6
+ end
7
+
8
+ it "should be the named subject" do
9
+ subject.should eql(named_subject)
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ describe "One-liner should syntax" do
2
+ subject { 42 }
3
+
4
+ describe "should" do
5
+ it { should == 42 }
6
+ it { should_not == 43 }
7
+ end
8
+
9
+ describe "is_expected" do
10
+ it { is_expected.to eq(42) }
11
+ it { is_expected.to_not eq(43) }
12
+ end
13
+
14
+ describe "expect" do
15
+ it { expect(42).to eq(42) }
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec/core'
2
+ RSpec::Core::Runner.autorun