Class: RSpec::Core::ExampleGroup
- Inherits:
-
Object
- Object
- RSpec::Core::ExampleGroup
- Defined in:
- opal/opal/rspec/async/example_group.rb
Class Method Summary collapse
- .process_descendants(our_examples_result, reporter) ⇒ Object
-
.run(reporter) ⇒ Object
Promise oriented version.
-
.run_examples(reporter) ⇒ Object
Promise oriented version.
Instance Method Summary collapse
Class Method Details
.process_descendants(our_examples_result, reporter) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'opal/opal/rspec/async/example_group.rb', line 16 def self.process_descendants(our_examples_result, reporter) descendants = ordering_strategy.order(children) return Promise.value(our_examples_result) if descendants.empty? results_for_descendants = [] # Can use true for this because we're AND'ing everything anyways seed = Promise.value(true) latest_descendant = descendants.inject(seed) do |previous_promise, next_descendant| previous_promise.then do |result| results_for_descendants << result next_descendant.run reporter end end latest_descendant.then do |result| results_for_descendants << result our_examples_result && results_for_descendants.all? end end |
.run(reporter) ⇒ Object
Promise oriented version
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'opal/opal/rspec/async/example_group.rb', line 36 def self.run(reporter) if RSpec.world.wants_to_quit RSpec.world.clear_remaining_example_groups if top_level? return end reporter.example_group_started(self) Promise.value(true).then do run_before_context_hooks(new) end.then do run_examples(reporter) end.then do |our_examples_result| process_descendants(our_examples_result, reporter) end.rescue do |ex| result = if ex.is_a? Pending::SkipDeclaredInExample for_filtered_examples(reporter) { |example| example.skip_with_exception(reporter, ex) } else RSpec.world.wants_to_quit = true if fail_fast? for_filtered_examples(reporter) { |example| example.fail_with_exception(reporter, ex) } end result end.always do |result| run_after_context_hooks(new) before_context_ivars.clear reporter.example_group_finished(self) # promise always do not behave exactly like ensure, need to be explicit about value being returned result end end |
.run_examples(reporter) ⇒ Object
Promise oriented version
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'opal/opal/rspec/async/example_group.rb', line 67 def self.run_examples(reporter) examples = ordering_strategy.order(filtered_examples) return Promise.value(true) if examples.empty? example_promise = lambda do |example| next Promise.value(nil) if RSpec.world.wants_to_quit instance = new set_ivars(instance, before_context_ivars) # Always returns a promise since we modified the Example class example.run(instance, reporter) end results = [] # Can use true for this because we're AND'ing everything anyways seed = Promise.value(true) latest_promise = examples.inject(seed) do |previous_promise, next_example| previous_promise.then do |succeeded| RSpec.world.wants_to_quit = true if fail_fast? && !succeeded results << succeeded example_promise[next_example] end end latest_promise.then do |succeeded| RSpec.world.wants_to_quit = true if fail_fast? && !succeeded results << succeeded results.all? end end |
Instance Method Details
#delay(duration, &block) ⇒ Object
5 6 7 8 |
# File 'opal/opal/rspec/async/example_group.rb', line 5 def delay(duration, &block) `setTimeout(block, duration * 1000)` self end |
#delay_with_promise(duration, &block) ⇒ Object
10 11 12 13 14 |
# File 'opal/opal/rspec/async/example_group.rb', line 10 def delay_with_promise(duration, &block) result = Promise.new delay(duration) { result.resolve } result.then &block end |