rspec-core 3.0.0.beta1 → 3.0.0.beta2

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.
Files changed (145) hide show
  1. data.tar.gz.sig +0 -0
  2. data/Changelog.md +137 -0
  3. data/README.md +2 -2
  4. data/exe/rspec +2 -23
  5. data/features/README.md +1 -5
  6. data/features/command_line/README.md +7 -10
  7. data/features/command_line/exit_status.feature +1 -1
  8. data/features/command_line/format_option.feature +1 -1
  9. data/features/command_line/init.feature +40 -1
  10. data/features/command_line/line_number_option.feature +2 -2
  11. data/features/command_line/ruby.feature +5 -4
  12. data/features/configuration/enable_global_dsl.feature +54 -0
  13. data/features/example_groups/aliasing.feature +48 -0
  14. data/features/example_groups/basic_structure.feature +1 -1
  15. data/features/expectation_framework_integration/configure_expectation_framework.feature +1 -1
  16. data/features/filtering/if_and_unless.feature +0 -30
  17. data/features/formatters/custom_formatter.feature +32 -0
  18. data/features/formatters/regression_tests.feature +95 -0
  19. data/features/hooks/around_hooks.feature +1 -0
  20. data/features/hooks/before_and_after_hooks.feature +2 -2
  21. data/features/mock_framework_integration/use_flexmock.feature +11 -13
  22. data/features/mock_framework_integration/use_mocha.feature +11 -13
  23. data/features/mock_framework_integration/use_rr.feature +11 -13
  24. data/features/mock_framework_integration/use_rspec.feature +11 -13
  25. data/features/pending_and_skipped_examples/README.md +3 -0
  26. data/features/pending_and_skipped_examples/pending_examples.feature +118 -0
  27. data/features/pending_and_skipped_examples/skipped_examples.feature +106 -0
  28. data/features/step_definitions/additional_cli_steps.rb +34 -0
  29. data/features/subject/explicit_subject.feature +1 -1
  30. data/features/subject/one_liner_syntax.feature +71 -0
  31. data/lib/rspec/core.rb +6 -14
  32. data/lib/rspec/core/backtrace_formatter.rb +16 -4
  33. data/lib/rspec/core/command_line.rb +2 -3
  34. data/lib/rspec/core/configuration.rb +114 -125
  35. data/lib/rspec/core/configuration_options.rb +32 -18
  36. data/lib/rspec/core/dsl.rb +80 -18
  37. data/lib/rspec/core/example.rb +84 -33
  38. data/lib/rspec/core/example_group.rb +95 -43
  39. data/lib/rspec/core/filter_manager.rb +31 -40
  40. data/lib/rspec/core/formatters.rb +137 -0
  41. data/lib/rspec/core/formatters/base_formatter.rb +28 -41
  42. data/lib/rspec/core/formatters/base_text_formatter.rb +26 -37
  43. data/lib/rspec/core/formatters/deprecation_formatter.rb +48 -27
  44. data/lib/rspec/core/formatters/documentation_formatter.rb +27 -22
  45. data/lib/rspec/core/formatters/html_formatter.rb +48 -56
  46. data/lib/rspec/core/formatters/html_printer.rb +11 -18
  47. data/lib/rspec/core/formatters/json_formatter.rb +18 -22
  48. data/lib/rspec/core/formatters/legacy_formatter.rb +227 -0
  49. data/lib/rspec/core/formatters/progress_formatter.rb +7 -10
  50. data/lib/rspec/core/hooks.rb +250 -217
  51. data/lib/rspec/core/memoized_helpers.rb +43 -9
  52. data/lib/rspec/core/mocking_adapters/flexmock.rb +29 -0
  53. data/lib/rspec/core/{mocking/with_mocha.rb → mocking_adapters/mocha.rb} +19 -16
  54. data/lib/rspec/core/mocking_adapters/null.rb +12 -0
  55. data/lib/rspec/core/mocking_adapters/rr.rb +28 -0
  56. data/lib/rspec/core/mocking_adapters/rspec.rb +30 -0
  57. data/lib/rspec/core/notifications.rb +100 -0
  58. data/lib/rspec/core/option_parser.rb +11 -18
  59. data/lib/rspec/core/pending.rb +78 -47
  60. data/lib/rspec/core/project_initializer.rb +2 -49
  61. data/lib/rspec/core/project_initializer/dot_rspec +3 -0
  62. data/lib/rspec/core/project_initializer/spec_helper.rb +82 -0
  63. data/lib/rspec/core/rake_task.rb +5 -14
  64. data/lib/rspec/core/reporter.rb +24 -32
  65. data/lib/rspec/core/ruby_project.rb +1 -1
  66. data/lib/rspec/core/runner.rb +14 -4
  67. data/lib/rspec/core/shared_example_group.rb +40 -13
  68. data/lib/rspec/core/version.rb +1 -1
  69. data/spec/command_line/order_spec.rb +15 -15
  70. data/spec/rspec/core/backtrace_formatter_spec.rb +15 -1
  71. data/spec/rspec/core/command_line_spec.rb +18 -17
  72. data/spec/rspec/core/configuration_options_spec.rb +57 -34
  73. data/spec/rspec/core/configuration_spec.rb +162 -184
  74. data/spec/rspec/core/drb_command_line_spec.rb +5 -7
  75. data/spec/rspec/core/drb_options_spec.rb +2 -2
  76. data/spec/rspec/core/dsl_spec.rb +79 -15
  77. data/spec/rspec/core/example_group_spec.rb +253 -39
  78. data/spec/rspec/core/example_spec.rb +149 -33
  79. data/spec/rspec/core/filter_manager_spec.rb +9 -26
  80. data/spec/rspec/core/formatters/base_formatter_spec.rb +2 -5
  81. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +42 -145
  82. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +64 -34
  83. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +15 -28
  84. data/spec/rspec/core/formatters/helpers_spec.rb +2 -2
  85. data/spec/rspec/core/formatters/{html_formatted-1.8.7.html → html_formatted-2.1.0.html} +22 -44
  86. data/spec/rspec/core/formatters/{html_formatted-1.8.7-jruby.html → html_formatted.html} +30 -49
  87. data/spec/rspec/core/formatters/html_formatter_spec.rb +35 -19
  88. data/spec/rspec/core/formatters/json_formatter_spec.rb +42 -40
  89. data/spec/rspec/core/formatters/legacy_formatter_spec.rb +137 -0
  90. data/spec/rspec/core/formatters/progress_formatter_spec.rb +38 -25
  91. data/spec/rspec/core/formatters/snippet_extractor_spec.rb +1 -1
  92. data/spec/rspec/core/formatters_spec.rb +120 -0
  93. data/spec/rspec/core/hooks_filtering_spec.rb +1 -1
  94. data/spec/rspec/core/hooks_spec.rb +13 -2
  95. data/spec/rspec/core/memoized_helpers_spec.rb +17 -8
  96. data/spec/rspec/core/metadata_spec.rb +3 -3
  97. data/spec/rspec/core/option_parser_spec.rb +53 -46
  98. data/spec/rspec/core/ordering_spec.rb +4 -4
  99. data/spec/rspec/core/pending_example_spec.rb +23 -126
  100. data/spec/rspec/core/pending_spec.rb +8 -0
  101. data/spec/rspec/core/project_initializer_spec.rb +8 -41
  102. data/spec/rspec/core/rake_task_spec.rb +15 -4
  103. data/spec/rspec/core/random_spec.rb +1 -1
  104. data/spec/rspec/core/reporter_spec.rb +50 -37
  105. data/spec/rspec/core/resources/formatter_specs.rb +9 -11
  106. data/spec/rspec/core/rspec_matchers_spec.rb +1 -1
  107. data/spec/rspec/core/ruby_project_spec.rb +3 -3
  108. data/spec/rspec/core/runner_spec.rb +65 -23
  109. data/spec/rspec/core/shared_context_spec.rb +4 -4
  110. data/spec/rspec/core/shared_example_group/collection_spec.rb +1 -1
  111. data/spec/rspec/core/shared_example_group_spec.rb +20 -11
  112. data/spec/rspec/core/warnings_spec.rb +1 -1
  113. data/spec/rspec/core/world_spec.rb +10 -10
  114. data/spec/rspec/core_spec.rb +2 -2
  115. data/spec/spec_helper.rb +12 -24
  116. data/spec/support/config_options_helper.rb +1 -3
  117. data/spec/support/formatter_support.rb +83 -0
  118. data/spec/support/isolate_load_path_mutation.rb +1 -2
  119. data/spec/support/isolated_directory.rb +1 -1
  120. data/spec/support/isolated_home_directory.rb +1 -1
  121. data/spec/support/legacy_formatter_using_sub_classing_example.rb +87 -0
  122. data/spec/support/matchers.rb +20 -0
  123. data/spec/support/mathn_integration_support.rb +2 -2
  124. data/spec/support/old_style_formatter_example.rb +69 -0
  125. data/spec/support/shared_example_groups.rb +1 -1
  126. data/spec/support/spec_files.rb +3 -3
  127. metadata +192 -69
  128. metadata.gz.sig +3 -1
  129. checksums.yaml +0 -15
  130. checksums.yaml.gz.sig +0 -2
  131. data/features/configuration/show_failures_in_pending_blocks.feature +0 -61
  132. data/features/pending/pending_examples.feature +0 -229
  133. data/features/subject/implicit_receiver.feature +0 -29
  134. data/lib/rspec/core/mocking/with_absolutely_nothing.rb +0 -11
  135. data/lib/rspec/core/mocking/with_flexmock.rb +0 -27
  136. data/lib/rspec/core/mocking/with_rr.rb +0 -27
  137. data/lib/rspec/core/mocking/with_rspec.rb +0 -27
  138. data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +0 -477
  139. data/spec/rspec/core/formatters/html_formatted-1.9.2.html +0 -425
  140. data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +0 -416
  141. data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +0 -477
  142. data/spec/rspec/core/formatters/html_formatted-1.9.3.html +0 -419
  143. data/spec/rspec/core/formatters/html_formatted-2.0.0.html +0 -425
  144. data/spec/support/in_sub_process.rb +0 -37
  145. data/spec/support/sandboxed_mock_space.rb +0 -100
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
  require 'rspec/core/drb_command_line'
3
3
 
4
- describe "::DRbCommandLine", :type => :drb, :unless => RUBY_PLATFORM == 'java' do
4
+ RSpec.describe "::DRbCommandLine", :type => :drb, :unless => RUBY_PLATFORM == 'java' do
5
5
  let(:config) { RSpec::Core::Configuration.new }
6
6
  let(:out) { StringIO.new }
7
7
  let(:err) { StringIO.new }
@@ -13,9 +13,7 @@ describe "::DRbCommandLine", :type => :drb, :unless => RUBY_PLATFORM == 'java' d
13
13
  end
14
14
 
15
15
  def config_options(*args)
16
- options = RSpec::Core::ConfigurationOptions.new(args)
17
- options.parse_options
18
- options
16
+ RSpec::Core::ConfigurationOptions.new(args)
19
17
  end
20
18
 
21
19
  context "without server running" do
@@ -65,12 +63,12 @@ describe "::DRbCommandLine", :type => :drb, :unless => RUBY_PLATFORM == 'java' d
65
63
  end
66
64
  end
67
65
 
68
- context "with server running" do
66
+ context "with server running", :slow do
69
67
  class SimpleDRbSpecServer
70
68
  def self.run(argv, err, out)
71
69
  options = RSpec::Core::ConfigurationOptions.new(argv)
72
- options.parse_options
73
- RSpec::Core::CommandLine.new(options, RSpec::Core::Configuration.new).run(err, out)
70
+ config = RSpec::Core::Configuration.new
71
+ RSpec::Core::CommandLine.new(options, config).run(err, out)
74
72
  end
75
73
  end
76
74
 
@@ -1,12 +1,12 @@
1
1
  require "spec_helper"
2
2
  require 'rspec/core/drb_options'
3
3
 
4
- describe RSpec::Core::DrbOptions, :isolated_directory => true, :isolated_home => true do
4
+ RSpec.describe RSpec::Core::DrbOptions, :isolated_directory => true, :isolated_home => true do
5
5
  include ConfigOptionsHelper
6
6
 
7
7
  describe "#drb_argv" do
8
8
  it "preserves extra arguments" do
9
- File.stub(:exist?) { false }
9
+ allow(File).to receive(:exist?) { false }
10
10
  expect(config_options_object(*%w[ a --drb b --color c ]).drb_argv).to match_array %w[ --color a b c ]
11
11
  end
12
12
 
@@ -1,22 +1,86 @@
1
1
  require 'spec_helper'
2
+ require 'rspec/support/spec/in_sub_process'
2
3
 
3
4
  main = self
4
5
 
5
- describe "The RSpec DSL" do
6
- methods = [
7
- :describe,
8
- :share_examples_for,
9
- :shared_examples_for,
10
- :shared_examples,
11
- :shared_context,
12
- ]
13
-
14
- methods.each do |method_name|
15
- describe "##{method_name}" do
16
- it "is not added to every object in the system" do
17
- expect(main).to respond_to(method_name)
18
- expect(Module.new).to respond_to(method_name)
19
- expect(Object.new).not_to respond_to(method_name)
6
+ RSpec.describe "The RSpec DSL" do
7
+ include RSpec::Support::InSubProcess
8
+
9
+ shared_examples_for "dsl methods" do |*method_names|
10
+ context "when expose_dsl_globally is enabled" do
11
+ def enable
12
+ in_sub_process do
13
+ changing_expose_dsl_globally do
14
+ RSpec.configuration.expose_dsl_globally = true
15
+ expect(RSpec.configuration.expose_dsl_globally?).to eq true
16
+ end
17
+
18
+ yield
19
+ end
20
+ end
21
+
22
+ it 'makes them only available off of `RSpec`, `main` and modules' do
23
+ enable do
24
+ expect(::RSpec).to respond_to(*method_names)
25
+ expect(main).to respond_to(*method_names)
26
+ expect(Module.new).to respond_to(*method_names)
27
+
28
+ expect(Object.new).not_to respond_to(*method_names)
29
+ end
30
+ end
31
+ end
32
+
33
+ context "when expose_dsl_globally is disabled" do
34
+ def disable
35
+ in_sub_process do
36
+ changing_expose_dsl_globally do
37
+ RSpec.configuration.expose_dsl_globally = false
38
+ expect(RSpec.configuration.expose_dsl_globally?).to eq false
39
+ end
40
+
41
+ yield
42
+ end
43
+ end
44
+
45
+ it 'makes them only available off of `RSpec`' do
46
+ disable do
47
+ expect(::RSpec).to respond_to(*method_names)
48
+
49
+ expect(main).not_to respond_to(*method_names)
50
+ expect(Module.new).not_to respond_to(*method_names)
51
+ expect(Object.new).not_to respond_to(*method_names)
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ describe "built in DSL methods" do
58
+ include_examples "dsl methods",
59
+ :describe, :context,
60
+ :share_examples_for, :shared_examples_for, :shared_examples, :shared_context do
61
+
62
+ def changing_expose_dsl_globally
63
+ yield
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "custom example group aliases" do
69
+ context "when adding aliases before exposing the DSL globally" do
70
+ include_examples "dsl methods", :detail do
71
+ def changing_expose_dsl_globally
72
+ RSpec.configuration.alias_example_group_to(:detail)
73
+ yield
74
+ end
75
+ end
76
+ end
77
+
78
+ context "when adding aliases after exposing the DSL globally" do
79
+ include_examples "dsl methods", :detail do
80
+ def changing_expose_dsl_globally
81
+ yield
82
+ RSpec.configuration.alias_example_group_to(:detail)
83
+ end
20
84
  end
21
85
  end
22
86
  end
@@ -12,7 +12,7 @@ class SelfObserver
12
12
  end
13
13
 
14
14
  module RSpec::Core
15
- describe ExampleGroup do
15
+ RSpec.describe ExampleGroup do
16
16
  it_behaves_like "metadata hash builder" do
17
17
  def metadata_hash(*args)
18
18
  group = ExampleGroup.describe('example description', *args)
@@ -83,8 +83,8 @@ module RSpec::Core
83
83
  expect(groups[1]).to have_class_const("Collision_2")
84
84
  expect(groups[8]).to have_class_const("Collision_9")
85
85
 
86
- if RUBY_VERSION.to_f > 1.8
87
- # on 1.8.7, "Collision_9".next => "Collisioo_0"
86
+ if RUBY_VERSION.to_f > 1.8 && !(defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx')
87
+ # on 1.8.7, rbx "Collision_9".next => "Collisioo_0"
88
88
  expect(groups[9]).to have_class_const("Collision_10")
89
89
  end
90
90
  end
@@ -282,12 +282,12 @@ module RSpec::Core
282
282
  before do
283
283
  filter_manager = FilterManager.new
284
284
  filter_manager.include filter_metadata
285
- world.stub(:filter_manager => filter_manager)
285
+ allow(world).to receive_messages(:filter_manager => filter_manager)
286
286
  end
287
287
 
288
288
  it "includes examples in groups matching filter" do
289
289
  group = ExampleGroup.describe("does something", spec_metadata)
290
- group.stub(:world) { world }
290
+ allow(group).to receive(:world) { world }
291
291
  all_examples = [ group.example("first"), group.example("second") ]
292
292
 
293
293
  expect(group.filtered_examples).to eq(all_examples)
@@ -295,7 +295,7 @@ module RSpec::Core
295
295
 
296
296
  it "includes examples directly matching filter" do
297
297
  group = ExampleGroup.describe("does something")
298
- group.stub(:world) { world }
298
+ allow(group).to receive(:world) { world }
299
299
  filtered_examples = [
300
300
  group.example("first", spec_metadata),
301
301
  group.example("second", spec_metadata)
@@ -310,12 +310,12 @@ module RSpec::Core
310
310
  before do
311
311
  filter_manager = FilterManager.new
312
312
  filter_manager.exclude filter_metadata
313
- world.stub(:filter_manager => filter_manager)
313
+ allow(world).to receive_messages(:filter_manager => filter_manager)
314
314
  end
315
315
 
316
316
  it "excludes examples in groups matching filter" do
317
317
  group = ExampleGroup.describe("does something", spec_metadata)
318
- group.stub(:world) { world }
318
+ allow(group).to receive(:world) { world }
319
319
  [ group.example("first"), group.example("second") ]
320
320
 
321
321
  expect(group.filtered_examples).to be_empty
@@ -323,7 +323,7 @@ module RSpec::Core
323
323
 
324
324
  it "excludes examples directly matching filter" do
325
325
  group = ExampleGroup.describe("does something")
326
- group.stub(:world) { world }
326
+ allow(group).to receive(:world) { world }
327
327
  [
328
328
  group.example("first", spec_metadata),
329
329
  group.example("second", spec_metadata)
@@ -404,7 +404,7 @@ module RSpec::Core
404
404
  context "with no filters" do
405
405
  it "returns all" do
406
406
  group = ExampleGroup.describe
407
- group.stub(:world) { world }
407
+ allow(group).to receive(:world) { world }
408
408
  example = group.example("does something")
409
409
  expect(group.filtered_examples).to eq([example])
410
410
  end
@@ -414,9 +414,9 @@ module RSpec::Core
414
414
  it "returns none" do
415
415
  filter_manager = FilterManager.new
416
416
  filter_manager.include :awesome => false
417
- world.stub(:filter_manager => filter_manager)
417
+ allow(world).to receive_messages(:filter_manager => filter_manager)
418
418
  group = ExampleGroup.describe
419
- group.stub(:world) { world }
419
+ allow(group).to receive(:world) { world }
420
420
  group.example("does something")
421
421
  expect(group.filtered_examples).to eq([])
422
422
  end
@@ -562,6 +562,52 @@ module RSpec::Core
562
562
  end
563
563
 
564
564
  describe "#before, after, and around hooks" do
565
+ describe "scope aliasing" do
566
+ it "aliases the `:context` hook scope to `:all` for before-hooks" do
567
+ group = ExampleGroup.describe
568
+ order = []
569
+ group.before(:context) { order << :before_context }
570
+ group.example("example") { order << :example }
571
+ group.example("example") { order << :example }
572
+
573
+ group.run
574
+ expect(order).to eq([:before_context, :example, :example])
575
+ end
576
+
577
+ it "aliases the `:example` hook scope to `:each` for before-hooks" do
578
+ group = ExampleGroup.describe
579
+ order = []
580
+ group.before(:example) { order << :before_example }
581
+ group.example("example") { order << :example }
582
+ group.example("example") { order << :example }
583
+
584
+ group.run
585
+ expect(order).to eq([:before_example, :example, :before_example, :example])
586
+ end
587
+
588
+ it "aliases the `:context` hook scope to `:all` for after-hooks" do
589
+ group = ExampleGroup.describe
590
+ order = []
591
+ group.example("example") { order << :example }
592
+ group.example("example") { order << :example }
593
+ group.after(:context) { order << :after_context }
594
+
595
+ group.run
596
+ expect(order).to eq([:example, :example, :after_context])
597
+ end
598
+
599
+ it "aliases the `:example` hook scope to `:each` for after-hooks" do
600
+ group = ExampleGroup.describe
601
+ order = []
602
+ group.example("example") { order << :example }
603
+ group.example("example") { order << :example }
604
+ group.after(:example) { order << :after_example }
605
+
606
+ group.run
607
+ expect(order).to eq([:example, :after_example, :example, :after_example])
608
+ end
609
+ end
610
+
565
611
  it "runs the before alls in order" do
566
612
  group = ExampleGroup.describe
567
613
  order = []
@@ -792,7 +838,7 @@ module RSpec::Core
792
838
 
793
839
  before(:each) do
794
840
  hooks_run = []
795
- RSpec.configuration.reporter.stub(:message)
841
+ allow(RSpec.configuration.reporter).to receive(:message)
796
842
  end
797
843
 
798
844
  let(:group) do
@@ -812,8 +858,8 @@ module RSpec::Core
812
858
  end
813
859
 
814
860
  it "rescues any error(s) and prints them out" do
815
- RSpec.configuration.reporter.should_receive(:message).with(/An error in an after\(:all\) hook/)
816
- RSpec.configuration.reporter.should_receive(:message).with(/A different hook raising an error/)
861
+ expect(RSpec.configuration.reporter).to receive(:message).with(/An error in an after\(:all\) hook/)
862
+ expect(RSpec.configuration.reporter).to receive(:message).with(/A different hook raising an error/)
817
863
  group.run
818
864
  end
819
865
 
@@ -842,30 +888,198 @@ module RSpec::Core
842
888
  end
843
889
  end
844
890
 
845
- %w[pending xit xspecify xexample].each do |method_name|
846
- describe "::#{method_name}" do
847
- before do
848
- @group = ExampleGroup.describe
849
- @group.send(method_name, "is pending") { }
891
+ describe ".pending" do
892
+ let(:group) { ExampleGroup.describe { pending { fail } } }
893
+
894
+ it "generates a pending example" do
895
+ group.run
896
+ expect(group.examples.first).to be_pending
897
+ end
898
+
899
+ it "sets the pending message" do
900
+ group.run
901
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
902
+ end
903
+ end
904
+
905
+ describe "pending with metadata" do
906
+ let(:group) { ExampleGroup.describe {
907
+ example("unimplemented", :pending => true) { fail }
908
+ } }
909
+
910
+ it "generates a pending example" do
911
+ group.run
912
+ expect(group.examples.first).to be_pending
913
+ end
914
+
915
+ it "sets the pending message" do
916
+ group.run
917
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
918
+ end
919
+ end
920
+
921
+ describe "pending with message in metadata" do
922
+ let(:group) { ExampleGroup.describe {
923
+ example("unimplemented", :pending => 'not done') { fail }
924
+ } }
925
+
926
+ it "generates a pending example" do
927
+ group.run
928
+ expect(group.examples.first).to be_pending
929
+ end
930
+
931
+ it "sets the pending message" do
932
+ group.run
933
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq("not done")
934
+ end
935
+ end
936
+
937
+ describe ".skip" do
938
+ let(:group) { ExampleGroup.describe { skip("skip this") { } } }
939
+
940
+ it "generates a skipped example" do
941
+ group.run
942
+ expect(group.examples.first).to be_skipped
943
+ end
944
+
945
+ it "sets the pending message" do
946
+ group.run
947
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
948
+ end
949
+ end
950
+
951
+ describe "skip with metadata" do
952
+ let(:group) { ExampleGroup.describe {
953
+ example("skip this", :skip => true) { }
954
+ } }
955
+
956
+ it "generates a skipped example" do
957
+ group.run
958
+ expect(group.examples.first).to be_skipped
959
+ end
960
+
961
+ it "sets the pending message" do
962
+ group.run
963
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
964
+ end
965
+ end
966
+
967
+ describe "skip with message in metadata" do
968
+ let(:group) { ExampleGroup.describe {
969
+ example("skip this", :skip => 'not done') { }
970
+ } }
971
+
972
+ it "generates a skipped example" do
973
+ group.run
974
+ expect(group.examples.first).to be_skipped
975
+ end
976
+
977
+ it "sets the pending message" do
978
+ group.run
979
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq('not done')
980
+ end
981
+ end
982
+
983
+ %w[xit xspecify xexample].each do |method_name|
984
+ describe ".#{method_name}" do
985
+ let(:group) { ExampleGroup.describe.tap {|x|
986
+ x.send(method_name, "is pending") { }
987
+ }}
988
+
989
+ it "generates a skipped example" do
990
+ group.run
991
+ expect(group.examples.first).to be_skipped
850
992
  end
851
993
 
852
- it "generates a pending example" do
853
- @group.run
854
- expect(@group.examples.first).to be_pending
994
+ it "sets the pending message" do
995
+ group.run
996
+ expect(group.examples.first.metadata[:execution_result][:pending_message]).to eq("Temporarily skipped with #{method_name}")
855
997
  end
998
+ end
999
+ end
856
1000
 
857
- it "sets the pending message", :if => method_name == 'pending' do
858
- @group.run
859
- expect(@group.examples.first.metadata[:execution_result][:pending_message]).to eq(RSpec::Core::Pending::NO_REASON_GIVEN)
1001
+ %w[ xdescribe xcontext ].each do |method_name|
1002
+ describe ".#{method_name}" do
1003
+ def extract_execution_results(group)
1004
+ group.examples.map do |ex|
1005
+ ex.metadata.fetch(:execution_result)
1006
+ end
860
1007
  end
861
1008
 
862
- it "sets the pending message", :unless => method_name == 'pending' do
863
- @group.run
864
- expect(@group.examples.first.metadata[:execution_result][:pending_message]).to eq("Temporarily disabled with #{method_name}")
1009
+ it 'generates a pending example group' do
1010
+ group = ExampleGroup.send(method_name) do
1011
+ it("passes") { }
1012
+ it("fails") { expect(2).to eq(3) }
1013
+ end
1014
+ group.run
1015
+
1016
+ expect(extract_execution_results(group)).to match([
1017
+ a_hash_including(
1018
+ :status => "pending",
1019
+ :pending_message => "Temporarily skipped with #{method_name}"
1020
+ )
1021
+ ] * 2)
865
1022
  end
866
1023
  end
867
1024
  end
868
1025
 
1026
+ %w[ fdescribe fcontext ].each do |method_name|
1027
+ describe ".#{method_name}" do
1028
+ def executed_examples_of(group)
1029
+ examples = group.examples.select { |ex| ex.metadata[:execution_result][:started_at] }
1030
+ group.children.inject(examples) { |exs, child| exs + executed_examples_of(child) }
1031
+ end
1032
+
1033
+ [:focus, :focused].each do |metadata|
1034
+ it "generates an example group that can be filtered with :#{metadata}" do
1035
+ RSpec.configuration.filter_run metadata
1036
+
1037
+ parent_group = ExampleGroup.describe do
1038
+ describe "not focused" do
1039
+ example("not focused example") { }
1040
+ end
1041
+
1042
+ send(method_name, "focused") do
1043
+ example("focused example") { }
1044
+ end
1045
+ end
1046
+
1047
+ parent_group.run
1048
+
1049
+ executed_descriptions = executed_examples_of(parent_group).map(&:description)
1050
+ expect(executed_descriptions).to eq(["focused example"])
1051
+ end
1052
+ end
1053
+ end
1054
+ end
1055
+
1056
+ describe "setting pending metadata in parent" do
1057
+ def extract_execution_results(group)
1058
+ group.examples.map do |ex|
1059
+ ex.metadata.fetch(:execution_result)
1060
+ end
1061
+ end
1062
+
1063
+ it 'marks every example as pending' do
1064
+ group = ExampleGroup.describe(:pending => true) do
1065
+ it("passes") { }
1066
+ it("fails", :pending => 'unimplemented') { fail }
1067
+ end
1068
+ group.run
1069
+
1070
+ expect(extract_execution_results(group)).to match([
1071
+ a_hash_including(
1072
+ :status => "failed",
1073
+ :pending_message => "No reason given"
1074
+ ),
1075
+ a_hash_including(
1076
+ :status => "pending",
1077
+ :pending_message => "unimplemented"
1078
+ )
1079
+ ])
1080
+ end
1081
+ end
1082
+
869
1083
  describe "adding examples" do
870
1084
 
871
1085
  it "allows adding an example using 'it'" do
@@ -925,7 +1139,7 @@ module RSpec::Core
925
1139
  example('ex 1') { expect(1).to eq(1) }
926
1140
  example('ex 2') { expect(1).to eq(1) }
927
1141
  end
928
- group.stub(:filtered_examples) { group.examples }
1142
+ allow(group).to receive(:filtered_examples) { group.examples }
929
1143
  expect(group.run(reporter)).to be_truthy
930
1144
  end
931
1145
 
@@ -934,7 +1148,7 @@ module RSpec::Core
934
1148
  example('ex 1') { expect(1).to eq(1) }
935
1149
  example('ex 2') { expect(1).to eq(2) }
936
1150
  end
937
- group.stub(:filtered_examples) { group.examples }
1151
+ allow(group).to receive(:filtered_examples) { group.examples }
938
1152
  expect(group.run(reporter)).to be_falsey
939
1153
  end
940
1154
 
@@ -943,9 +1157,9 @@ module RSpec::Core
943
1157
  example('ex 1') { expect(1).to eq(2) }
944
1158
  example('ex 2') { expect(1).to eq(1) }
945
1159
  end
946
- group.stub(:filtered_examples) { group.examples }
1160
+ allow(group).to receive(:filtered_examples) { group.examples }
947
1161
  group.filtered_examples.each do |example|
948
- example.should_receive(:run)
1162
+ expect(example).to receive(:run)
949
1163
  end
950
1164
  expect(group.run(reporter)).to be_falsey
951
1165
  end
@@ -1031,7 +1245,7 @@ module RSpec::Core
1031
1245
  context "with fail_fast? => true" do
1032
1246
  let(:group) do
1033
1247
  group = RSpec::Core::ExampleGroup.describe
1034
- group.stub(:fail_fast?) { true }
1248
+ allow(group).to receive(:fail_fast?) { true }
1035
1249
  group
1036
1250
  end
1037
1251
 
@@ -1058,18 +1272,18 @@ module RSpec::Core
1058
1272
  let(:group) { RSpec::Core::ExampleGroup.describe }
1059
1273
 
1060
1274
  before do
1061
- RSpec.stub(:wants_to_quit) { true }
1062
- RSpec.stub(:clear_remaining_example_groups)
1275
+ allow(RSpec).to receive(:wants_to_quit) { true }
1276
+ allow(RSpec).to receive(:clear_remaining_example_groups)
1063
1277
  end
1064
1278
 
1065
1279
  it "returns without starting the group" do
1066
- reporter.should_not_receive(:example_group_started)
1280
+ expect(reporter).not_to receive(:example_group_started)
1067
1281
  group.run(reporter)
1068
1282
  end
1069
1283
 
1070
1284
  context "at top level" do
1071
1285
  it "purges remaining groups" do
1072
- RSpec.should_receive(:clear_remaining_example_groups)
1286
+ expect(RSpec).to receive(:clear_remaining_example_groups)
1073
1287
  group.run(reporter)
1074
1288
  end
1075
1289
  end
@@ -1077,7 +1291,7 @@ module RSpec::Core
1077
1291
  context "in a nested group" do
1078
1292
  it "does not purge remaining groups" do
1079
1293
  nested_group = group.describe
1080
- RSpec.should_not_receive(:clear_remaining_example_groups)
1294
+ expect(RSpec).not_to receive(:clear_remaining_example_groups)
1081
1295
  nested_group.run(reporter)
1082
1296
  end
1083
1297
  end