rspec-core 2.11.1 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. data/Changelog.md +59 -0
  2. data/README.md +22 -0
  3. data/features/command_line/example_name_option.feature +5 -5
  4. data/features/command_line/exit_status.feature +6 -6
  5. data/features/command_line/format_option.feature +2 -2
  6. data/features/command_line/line_number_appended_to_path.feature +2 -2
  7. data/features/command_line/line_number_option.feature +2 -2
  8. data/features/command_line/pattern_option.feature +2 -2
  9. data/features/command_line/rake_task.feature +62 -8
  10. data/features/command_line/ruby.feature +1 -1
  11. data/features/command_line/tag.feature +1 -1
  12. data/features/configuration/alias_example_to.feature +2 -2
  13. data/features/configuration/custom_settings.feature +3 -3
  14. data/features/configuration/default_path.feature +3 -3
  15. data/features/configuration/fail_fast.feature +5 -5
  16. data/features/configuration/read_options_from_file.feature +4 -4
  17. data/features/example_groups/basic_structure.feature +2 -2
  18. data/features/example_groups/shared_context.feature +3 -3
  19. data/features/example_groups/shared_examples.feature +25 -7
  20. data/features/expectation_framework_integration/configure_expectation_framework.feature +6 -6
  21. data/features/filtering/exclusion_filters.feature +5 -5
  22. data/features/filtering/if_and_unless.feature +5 -5
  23. data/features/filtering/inclusion_filters.feature +5 -5
  24. data/features/filtering/run_all_when_everything_filtered.feature +3 -3
  25. data/features/formatters/custom_formatter.feature +2 -2
  26. data/features/formatters/json_formatter.feature +30 -0
  27. data/features/formatters/text_formatter.feature +5 -5
  28. data/features/helper_methods/arbitrary_methods.feature +2 -2
  29. data/features/helper_methods/let.feature +2 -2
  30. data/features/helper_methods/modules.feature +6 -6
  31. data/features/hooks/around_hooks.feature +11 -11
  32. data/features/hooks/before_and_after_hooks.feature +15 -11
  33. data/features/hooks/filtering.feature +6 -6
  34. data/features/metadata/current_example.feature +1 -1
  35. data/features/metadata/described_class.feature +1 -1
  36. data/features/metadata/user_defined.feature +4 -4
  37. data/features/mock_framework_integration/use_any_framework.feature +6 -6
  38. data/features/mock_framework_integration/use_flexmock.feature +5 -5
  39. data/features/mock_framework_integration/use_mocha.feature +5 -5
  40. data/features/mock_framework_integration/use_rr.feature +5 -5
  41. data/features/mock_framework_integration/use_rspec.feature +5 -5
  42. data/features/pending/pending_examples.feature +11 -11
  43. data/features/spec_files/arbitrary_file_suffix.feature +1 -1
  44. data/features/step_definitions/additional_cli_steps.rb +2 -0
  45. data/features/subject/attribute_of_subject.feature +5 -5
  46. data/features/subject/explicit_subject.feature +5 -5
  47. data/features/subject/implicit_receiver.feature +2 -2
  48. data/features/subject/implicit_subject.feature +3 -3
  49. data/lib/autotest/rspec2.rb +1 -1
  50. data/lib/rspec/core.rb +53 -32
  51. data/lib/rspec/core/configuration.rb +123 -15
  52. data/lib/rspec/core/configuration_options.rb +17 -2
  53. data/lib/rspec/core/example.rb +5 -4
  54. data/lib/rspec/core/example_group.rb +19 -9
  55. data/lib/rspec/core/extensions/ordered.rb +12 -6
  56. data/lib/rspec/core/formatters.rb +55 -0
  57. data/lib/rspec/core/formatters/base_formatter.rb +43 -38
  58. data/lib/rspec/core/formatters/base_text_formatter.rb +9 -5
  59. data/lib/rspec/core/formatters/documentation_formatter.rb +1 -1
  60. data/lib/rspec/core/formatters/helpers.rb +30 -5
  61. data/lib/rspec/core/formatters/html_formatter.rb +58 -368
  62. data/lib/rspec/core/formatters/html_printer.rb +407 -0
  63. data/lib/rspec/core/formatters/json_formatter.rb +73 -0
  64. data/lib/rspec/core/formatters/snippet_extractor.rb +3 -1
  65. data/lib/rspec/core/hooks.rb +4 -4
  66. data/lib/rspec/core/metadata.rb +14 -6
  67. data/lib/rspec/core/mocking/with_mocha.rb +25 -2
  68. data/lib/rspec/core/mocking/with_rspec.rb +6 -2
  69. data/lib/rspec/core/option_parser.rb +28 -7
  70. data/lib/rspec/core/project_initializer.rb +0 -1
  71. data/lib/rspec/core/rake_task.rb +49 -38
  72. data/lib/rspec/core/reporter.rb +2 -2
  73. data/lib/rspec/core/shared_example_group.rb +89 -41
  74. data/lib/rspec/core/subject.rb +6 -2
  75. data/lib/rspec/core/version.rb +1 -1
  76. data/lib/rspec/core/world.rb +2 -2
  77. data/spec/autotest/rspec_spec.rb +6 -1
  78. data/spec/command_line/order_spec.rb +67 -0
  79. data/spec/rspec/core/configuration_options_spec.rb +45 -38
  80. data/spec/rspec/core/configuration_spec.rb +219 -44
  81. data/spec/rspec/core/deprecations_spec.rb +9 -0
  82. data/spec/rspec/core/drb_command_line_spec.rb +1 -7
  83. data/spec/rspec/core/drb_options_spec.rb +1 -1
  84. data/spec/rspec/core/dsl_spec.rb +17 -9
  85. data/spec/rspec/core/example_group_spec.rb +51 -5
  86. data/spec/rspec/core/example_spec.rb +39 -7
  87. data/spec/rspec/core/filter_manager_spec.rb +20 -30
  88. data/spec/rspec/core/formatters/base_formatter_spec.rb +29 -1
  89. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +6 -2
  90. data/spec/rspec/core/formatters/helpers_spec.rb +12 -0
  91. data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +462 -0
  92. data/spec/rspec/core/formatters/html_formatted-1.9.2-jruby.html +410 -0
  93. data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +462 -0
  94. data/spec/rspec/core/formatters/html_formatter_spec.rb +11 -3
  95. data/spec/rspec/core/formatters/json_formatter_spec.rb +110 -0
  96. data/spec/rspec/core/formatters/snippet_extractor_spec.rb +8 -0
  97. data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-rbx.html +462 -0
  98. data/spec/rspec/core/formatters/text_mate_formatted-1.9.2-jruby.html +410 -0
  99. data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-rbx.html +462 -0
  100. data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +11 -3
  101. data/spec/rspec/core/hooks_filtering_spec.rb +6 -6
  102. data/spec/rspec/core/metadata_spec.rb +29 -0
  103. data/spec/rspec/core/option_parser_spec.rb +42 -0
  104. data/spec/rspec/core/project_initializer_spec.rb +2 -2
  105. data/spec/rspec/core/rake_task_spec.rb +60 -17
  106. data/spec/rspec/core/reporter_spec.rb +17 -0
  107. data/spec/rspec/core/runner_spec.rb +1 -0
  108. data/spec/rspec/core/shared_example_group_spec.rb +17 -5
  109. data/spec/rspec/core/subject_spec.rb +11 -0
  110. data/spec/spec_helper.rb +32 -2
  111. data/spec/support/config_options_helper.rb +1 -10
  112. data/spec/support/helper_methods.rb +13 -0
  113. data/spec/support/isolated_directory.rb +10 -0
  114. data/spec/support/isolated_home_directory.rb +16 -0
  115. metadata +145 -148
  116. data/lib/rspec/core/extensions.rb +0 -4
@@ -37,6 +37,15 @@ describe "deprecations" do
37
37
  end
38
38
  end
39
39
 
40
+ describe RSpec::Core::SharedExampleGroup do
41
+ describe 'share_as' do
42
+ it 'is deprecated' do
43
+ RSpec.should_receive(:warn_deprecation)
44
+ RSpec::Core::SharedExampleGroup.share_as(:DeprecatedSharedConst) {}
45
+ end
46
+ end
47
+ end
48
+
40
49
  describe "Spec::Runner.configure" do
41
50
  it "is deprecated" do
42
51
  RSpec.stub(:warn_deprecation)
@@ -26,13 +26,7 @@ describe "::DRbCommandLine", :type => :drb, :unless => RUBY_PLATFORM == 'java' d
26
26
 
27
27
  describe "--drb-port" do
28
28
  def with_RSPEC_DRB_set_to(val)
29
- original = ENV['RSPEC_DRB']
30
- ENV['RSPEC_DRB'] = val
31
- begin
32
- yield
33
- ensure
34
- ENV['RSPEC_DRB'] = original
35
- end
29
+ with_env_vars('RSPEC_DRB' => val) { yield }
36
30
  end
37
31
 
38
32
  context "without RSPEC_DRB environment variable set" do
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
  require 'rspec/core/drb_options'
3
3
 
4
- describe RSpec::Core::DrbOptions, :fakefs do
4
+ describe RSpec::Core::DrbOptions, :isolated_directory => true, :isolated_home => true do
5
5
  include ConfigOptionsHelper
6
6
 
7
7
  describe "#drb_argv" do
@@ -1,17 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  main = self
4
- describe "The describe method" do
5
- it 'is available on the main object' do
6
- main.should respond_to(:describe)
7
- end
8
4
 
9
- it 'is available on modules (so example groups can be nested inside them)' do
10
- Module.new.should respond_to(:describe)
11
- end
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
+ :share_as
13
+ ]
12
14
 
13
- it 'is not available on other types of objects' do
14
- Object.new.should_not respond_to(:describe)
15
+ methods.each do |method_name|
16
+ describe "##{method_name}" do
17
+ it "is not added to every object in the system" do
18
+ main.should respond_to(method_name)
19
+ Module.new.should respond_to(method_name)
20
+ Object.new.should_not respond_to(method_name)
21
+ end
22
+ end
15
23
  end
16
24
  end
17
25
 
@@ -19,6 +19,14 @@ module RSpec::Core
19
19
  end
20
20
  end
21
21
 
22
+ context "when RSpec.configuration.format_docstrings is set to a block" do
23
+ it "formats the description with that block" do
24
+ RSpec.configuration.format_docstrings { |s| s.upcase }
25
+ group = ExampleGroup.describe(' an example ')
26
+ group.description.should eq(' AN EXAMPLE ')
27
+ end
28
+ end
29
+
22
30
  context 'when RSpec.configuration.treat_symbols_as_metadata_keys_with_true_values is set to false' do
23
31
  before(:each) do
24
32
  RSpec.configure { |c| c.treat_symbols_as_metadata_keys_with_true_values = false }
@@ -385,6 +393,15 @@ module RSpec::Core
385
393
  order.should eq([1,2,3])
386
394
  end
387
395
 
396
+ it "does not set RSpec.wants_to_quit in case of an error in before all (without fail_fast?)" do
397
+ group = ExampleGroup.describe
398
+ group.before(:all) { raise "error in before all" }
399
+ group.example("example") {}
400
+
401
+ group.run
402
+ RSpec.wants_to_quit.should be_false
403
+ end
404
+
388
405
  it "runs the before eachs in order" do
389
406
  group = ExampleGroup.describe
390
407
  order = []
@@ -553,6 +570,24 @@ module RSpec::Core
553
570
  example.metadata[:execution_result][:exception].message.should eq("error in before all")
554
571
  end
555
572
 
573
+ it "exposes instance variables set in before(:all) from after(:all) even if a before(:all) error occurs" do
574
+ ivar_value_in_after_hook = nil
575
+
576
+ group = ExampleGroup.describe do
577
+ before(:all) do
578
+ @an_ivar = :set_in_before_all
579
+ raise "fail"
580
+ end
581
+
582
+ after(:all) { ivar_value_in_after_hook = @an_ivar }
583
+
584
+ it("has a spec") { }
585
+ end
586
+
587
+ group.run
588
+ ivar_value_in_after_hook.should eq(:set_in_before_all)
589
+ end
590
+
556
591
  it "treats an error in before(:all) as a failure for a spec in a nested group" do
557
592
  example = nil
558
593
  group = ExampleGroup.describe do
@@ -696,7 +731,7 @@ module RSpec::Core
696
731
  example.example_group.description.should eq('A sample nested group')
697
732
  end
698
733
 
699
- it "has top level metadata from the example_group and its ancestors" do
734
+ it "has top level metadata from the example_group and its parent groups" do
700
735
  example.example_group.metadata.should include(:little_less_nested => 'yep', :nested_describe => 'yep')
701
736
  end
702
737
 
@@ -716,7 +751,7 @@ module RSpec::Core
716
751
  example('ex 1') { 1.should eq(1) }
717
752
  example('ex 2') { 1.should eq(1) }
718
753
  end
719
- group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered) }
754
+ group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered::Examples) }
720
755
  group.run(reporter).should be_true
721
756
  end
722
757
 
@@ -725,7 +760,7 @@ module RSpec::Core
725
760
  example('ex 1') { 1.should eq(1) }
726
761
  example('ex 2') { 1.should eq(2) }
727
762
  end
728
- group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered) }
763
+ group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered::Examples) }
729
764
  group.run(reporter).should be_false
730
765
  end
731
766
 
@@ -734,7 +769,7 @@ module RSpec::Core
734
769
  example('ex 1') { 1.should eq(2) }
735
770
  example('ex 2') { 1.should eq(1) }
736
771
  end
737
- group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered) }
772
+ group.stub(:filtered_examples) { group.examples.extend(Extensions::Ordered::Examples) }
738
773
  group.filtered_examples.each do |example|
739
774
  example.should_receive(:run)
740
775
  end
@@ -820,9 +855,13 @@ module RSpec::Core
820
855
  let(:reporter) { double("reporter").as_null_object }
821
856
 
822
857
  context "with fail_fast? => true" do
823
- it "does not run examples after the failed example" do
858
+ let(:group) do
824
859
  group = RSpec::Core::ExampleGroup.describe
825
860
  group.stub(:fail_fast?) { true }
861
+ group
862
+ end
863
+
864
+ it "does not run examples after the failed example" do
826
865
  examples_run = []
827
866
  group.example('example 1') { examples_run << self }
828
867
  group.example('example 2') { examples_run << self; fail; }
@@ -832,6 +871,13 @@ module RSpec::Core
832
871
 
833
872
  examples_run.length.should eq(2)
834
873
  end
874
+
875
+ it "sets RSpec.wants_to_quit flag if encountering an exception in before(:all)" do
876
+ group.before(:all) { raise "error in before all" }
877
+ example = group.example("equality") { 1.should eq(2) }
878
+ group.run.should be_false
879
+ RSpec.wants_to_quit.should be_true
880
+ end
835
881
  end
836
882
 
837
883
  context "with RSpec.wants_to_quit=true" do
@@ -45,6 +45,17 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
45
45
  end
46
46
  end
47
47
 
48
+ describe "when there is an explicit description" do
49
+ context "when RSpec.configuration.format_docstrings is set to a block" do
50
+ it "formats the description using the block" do
51
+ RSpec.configuration.format_docstrings { |s| s.strip }
52
+ example = example_group.example(' an example with whitespace ') {}
53
+ example_group.run
54
+ example.description.should eql('an example with whitespace')
55
+ end
56
+ end
57
+ end
58
+
48
59
  describe "when there is no explicit description" do
49
60
  def expect_with(*frameworks)
50
61
  RSpec.configuration.stub(:expecting_with_rspec?).and_return(frameworks.include?(:rspec))
@@ -58,6 +69,16 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
58
69
  end
59
70
  end
60
71
 
72
+ context "when RSpec.configuration.format_docstrings is set to a block" do
73
+ it "formats the description using the block" do
74
+ RSpec.configuration.format_docstrings { |s| s.upcase }
75
+ example_group.example { 5.should eq(5) }
76
+ example_group.run
77
+ pattern = /EXAMPLE AT #{relative_path(__FILE__).upcase}:#{__LINE__ - 2}/
78
+ example_group.examples.first.description.should match(pattern)
79
+ end
80
+ end
81
+
61
82
  context "when `expect_with :rspec` is configured" do
62
83
  before(:each) { expect_with :rspec }
63
84
 
@@ -221,12 +242,12 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
221
242
 
222
243
  group.run
223
244
  results.should eq([
224
- "around (before)",
225
- "before",
226
- "example",
227
- "after",
228
- "around (after)"
229
- ])
245
+ "around (before)",
246
+ "before",
247
+ "example",
248
+ "after",
249
+ "around (after)"
250
+ ])
230
251
  end
231
252
 
232
253
  context "clearing ivars" do
@@ -328,7 +349,7 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
328
349
  blah.should be(:success)
329
350
  end
330
351
  end
331
-
352
+
332
353
  context "in before(:each)" do
333
354
  it "sets each example to pending" do
334
355
  group = RSpec::Core::ExampleGroup.describe do
@@ -365,6 +386,17 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
365
386
  group.examples.first.should be_pending
366
387
  end
367
388
  end
389
+ end
368
390
 
391
+ describe "timing" do
392
+ it "uses RSpec::Core::Time as to not be affected by changes to time in examples" do
393
+ reporter = double(:reporter).as_null_object
394
+ group = RSpec::Core::ExampleGroup.describe
395
+ example = group.example
396
+ example.__send__ :start, reporter
397
+ Time.stub(:now => Time.utc(2012, 10, 1))
398
+ example.__send__ :finish, reporter
399
+ expect(example.metadata[:execution_result][:run_time]).to be < 0.2
400
+ end
369
401
  end
370
402
  end
@@ -32,6 +32,26 @@ module RSpec::Core
32
32
  filter_manager.send(type).should eq(:foo => 2)
33
33
  filter_manager.send(opposite(type)).should be_empty
34
34
  end
35
+
36
+ if name == "include"
37
+ [:locations, :line_numbers, :full_description].each do |filter|
38
+ context "with :#{filter}" do
39
+ it "clears previous inclusions" do
40
+ filter_manager = FilterManager.new
41
+ filter_manager.include :foo => :bar
42
+ filter_manager.include filter => "value"
43
+ filter_manager.inclusions.should eq({filter => "value"})
44
+ end
45
+
46
+ it "does nothing when :#{filter} previously set" do
47
+ filter_manager = FilterManager.new
48
+ filter_manager.include filter => "a_value"
49
+ filter_manager.include :foo => :bar
50
+ filter_manager.inclusions.should eq(filter => "a_value")
51
+ end
52
+ end
53
+ end
54
+ end
35
55
  end
36
56
 
37
57
  describe "##{name}!" do
@@ -222,35 +242,5 @@ module RSpec::Core
222
242
  filter_manager.exclusions.description.should eq({ :unless => :custom_filter }.inspect)
223
243
  end
224
244
  end
225
-
226
- it "clears the inclusion filter on include :line_numbers" do
227
- filter_manager = FilterManager.new
228
- filter_manager.include :foo => :bar
229
- filter_manager.include :line_numbers => [100]
230
- filter_manager.inclusions.should eq(:line_numbers => [100])
231
- end
232
-
233
- it "clears the inclusion filter on include :locations" do
234
- filter_manager = FilterManager.new
235
- filter_manager.include :foo => :bar
236
- filter_manager.include :locations => { "path/to/file.rb" => [37] }
237
- filter_manager.inclusions.should eq(:locations => { "path/to/file.rb" => [37] })
238
- end
239
-
240
- it "clears the inclusion filter on include :full_description" do
241
- filter_manager = FilterManager.new
242
- filter_manager.include :foo => :bar
243
- filter_manager.include :full_description => "this and that"
244
- filter_manager.inclusions.should eq(:full_description => "this and that")
245
- end
246
-
247
- [:locations, :line_numbers, :full_description].each do |filter|
248
- it "does nothing on include if already set standalone filter #{filter}" do
249
- filter_manager = FilterManager.new
250
- filter_manager.include filter => "a_value"
251
- filter_manager.include :foo => :bar
252
- filter_manager.inclusions.should eq(filter => "a_value")
253
- end
254
- end
255
245
  end
256
246
  end
@@ -16,6 +16,14 @@ describe RSpec::Core::Formatters::BaseFormatter do
16
16
  formatter.__send__(:backtrace_line, original_line)
17
17
  original_line.should eq(File.expand_path(__FILE__))
18
18
  end
19
+
20
+ it "deals gracefully with a security error" do
21
+ safely do
22
+ formatter.__send__(:backtrace_line, __FILE__)
23
+ # on some rubies, this doesn't raise a SecurityError; this test just
24
+ # assures that if it *does* raise an error, the error is caught inside
25
+ end
26
+ end
19
27
  end
20
28
 
21
29
  describe "read_failed_line" do
@@ -32,6 +40,26 @@ describe RSpec::Core::Formatters::BaseFormatter do
32
40
  }.should_not raise_error
33
41
  end
34
42
 
43
+ it "deals gracefully with a security error" do
44
+ exception = mock(:Exception, :backtrace => [ "#{__FILE__}:#{__LINE__}"])
45
+ example = mock(:Example, :file_path => __FILE__)
46
+ safely do
47
+ lambda {
48
+ formatter.send(:read_failed_line, exception, example)
49
+ }.should_not raise_error
50
+ end
51
+ end
52
+
53
+ context "when ruby reports a bogus line number in the stack trace" do
54
+ it "reports the filename and that it was unable to find the matching line" do
55
+ exception = mock(:Exception, :backtrace => [ "#{__FILE__}:10000000" ])
56
+ example = mock(:Example, :file_path => __FILE__)
57
+
58
+ msg = formatter.send(:read_failed_line, exception, example)
59
+ expect(msg).to include("Unable to find matching line")
60
+ end
61
+ end
62
+
35
63
  context "when String alias to_int to_i" do
36
64
  before do
37
65
  String.class_eval do
@@ -73,7 +101,7 @@ describe RSpec::Core::Formatters::BaseFormatter do
73
101
  end
74
102
 
75
103
  it "removes lines from rspec and lines that come before the invocation of the at_exit autorun hook" do
76
- formatter.format_backtrace(backtrace, stub.as_null_object).should eq(["./my_spec.rb:5"])
104
+ formatter.format_backtrace(backtrace).should eq(["./my_spec.rb:5"])
77
105
  end
78
106
  end
79
107
 
@@ -61,12 +61,12 @@ describe RSpec::Core::Formatters::BaseTextFormatter do
61
61
  it "preserves ancestry" do
62
62
  example = group.example("example name") { raise "something" }
63
63
  run_all_and_dump_failures
64
- example.example_group.ancestors.size.should == 1
64
+ example.example_group.parent_groups.size.should == 1
65
65
  end
66
66
  end
67
67
 
68
68
  context "with an exception that has an exception instance as its message" do
69
- it "should not raise NoMethodError" do
69
+ it "does not raise NoMethodError" do
70
70
  gonzo_exception = RuntimeError.new
71
71
  gonzo_exception.stub(:message) { gonzo_exception }
72
72
  group.example("example name") { raise gonzo_exception }
@@ -138,6 +138,8 @@ describe RSpec::Core::Formatters::BaseTextFormatter do
138
138
  end
139
139
 
140
140
  context 'for #share_as' do
141
+ before { RSpec.stub(:warn) }
142
+
141
143
  it 'outputs the name and location' do
142
144
 
143
145
  share_as :FooBar do
@@ -275,6 +277,8 @@ describe RSpec::Core::Formatters::BaseTextFormatter do
275
277
  end
276
278
 
277
279
  context 'for #share_as' do
280
+ before { RSpec.stub(:warn) }
281
+
278
282
  it 'outputs the name and location' do
279
283
 
280
284
  share_as :FooBar2 do
@@ -22,6 +22,18 @@ describe RSpec::Core::Formatters::Helpers do
22
22
  helper.format_duration(45.5).should eq("45.5 seconds")
23
23
  end
24
24
  end
25
+
26
+ context '= 61' do
27
+ it "returns 'x minute x second' formatted string" do
28
+ helper.format_duration(61).should eq("1 minute 1 second")
29
+ end
30
+ end
31
+
32
+ context '= 1' do
33
+ it "returns 'x second' formatted string" do
34
+ helper.format_duration(1).should eq("1 second")
35
+ end
36
+ end
25
37
  end
26
38
 
27
39
  describe "format seconds" do
@@ -0,0 +1,462 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
+ <head>
7
+ <title>RSpec results</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
+ <meta http-equiv="Expires" content="-1" />
10
+ <meta http-equiv="Pragma" content="no-cache" />
11
+ <style type="text/css">
12
+ body {
13
+ margin: 0;
14
+ padding: 0;
15
+ background: #fff;
16
+ font-size: 80%;
17
+ }
18
+ </style>
19
+ <script type="text/javascript">
20
+ // <![CDATA[
21
+
22
+ function addClass(element_id, classname) {
23
+ document.getElementById(element_id).className += (" " + classname);
24
+ }
25
+
26
+ function removeClass(element_id, classname) {
27
+ var elem = document.getElementById(element_id);
28
+ var classlist = elem.className.replace(classname,'');
29
+ elem.className = classlist;
30
+ }
31
+
32
+ function moveProgressBar(percentDone) {
33
+ document.getElementById("rspec-header").style.width = percentDone +"%";
34
+ }
35
+
36
+ function makeRed(element_id) {
37
+ removeClass(element_id, 'passed');
38
+ removeClass(element_id, 'not_implemented');
39
+ addClass(element_id,'failed');
40
+ }
41
+
42
+ function makeYellow(element_id) {
43
+ var elem = document.getElementById(element_id);
44
+ if (elem.className.indexOf("failed") == -1) { // class doesn't includes failed
45
+ if (elem.className.indexOf("not_implemented") == -1) { // class doesn't include not_implemented
46
+ removeClass(element_id, 'passed');
47
+ addClass(element_id,'not_implemented');
48
+ }
49
+ }
50
+ }
51
+
52
+ function apply_filters() {
53
+ var passed_filter = document.getElementById('passed_checkbox').checked;
54
+ var failed_filter = document.getElementById('failed_checkbox').checked;
55
+ var pending_filter = document.getElementById('pending_checkbox').checked;
56
+
57
+ assign_display_style("example passed", passed_filter);
58
+ assign_display_style("example failed", failed_filter);
59
+ assign_display_style("example not_implemented", pending_filter);
60
+
61
+ assign_display_style_for_group("example_group passed", passed_filter);
62
+ assign_display_style_for_group("example_group not_implemented", pending_filter, pending_filter || passed_filter);
63
+ assign_display_style_for_group("example_group failed", failed_filter, failed_filter || pending_filter || passed_filter);
64
+ }
65
+
66
+ function get_display_style(display_flag) {
67
+ var style_mode = 'none';
68
+ if (display_flag == true) {
69
+ style_mode = 'block';
70
+ }
71
+ return style_mode;
72
+ }
73
+
74
+ function assign_display_style(classname, display_flag) {
75
+ var style_mode = get_display_style(display_flag);
76
+ var elems = document.getElementsByClassName(classname)
77
+ for (var i=0; i<elems.length;i++) {
78
+ elems[i].style.display = style_mode;
79
+ }
80
+ }
81
+
82
+ function assign_display_style_for_group(classname, display_flag, subgroup_flag) {
83
+ var display_style_mode = get_display_style(display_flag);
84
+ var subgroup_style_mode = get_display_style(subgroup_flag);
85
+ var elems = document.getElementsByClassName(classname)
86
+ for (var i=0; i<elems.length;i++) {
87
+ var style_mode = display_style_mode;
88
+ if ((display_flag != subgroup_flag) && (elems[i].getElementsByTagName('dt')[0].innerHTML.indexOf(", ") != -1)) {
89
+ elems[i].style.display = subgroup_style_mode;
90
+ } else {
91
+ elems[i].style.display = display_style_mode;
92
+ }
93
+ }
94
+ }
95
+
96
+ // ]]>
97
+ </script>
98
+ <style type="text/css">
99
+ #rspec-header {
100
+ background: #65C400; color: #fff; height: 4em;
101
+ }
102
+
103
+ .rspec-report h1 {
104
+ margin: 0px 10px 0px 10px;
105
+ padding: 10px;
106
+ font-family: "Lucida Grande", Helvetica, sans-serif;
107
+ font-size: 1.8em;
108
+ position: absolute;
109
+ }
110
+
111
+ #label {
112
+ float:left;
113
+ }
114
+
115
+ #display-filters {
116
+ float:left;
117
+ padding: 28px 0 0 40%;
118
+ font-family: "Lucida Grande", Helvetica, sans-serif;
119
+ }
120
+
121
+ #summary {
122
+ float:right;
123
+ padding: 5px 10px;
124
+ font-family: "Lucida Grande", Helvetica, sans-serif;
125
+ text-align: right;
126
+ }
127
+
128
+ #summary p {
129
+ margin: 0 0 0 2px;
130
+ }
131
+
132
+ #summary #totals {
133
+ font-size: 1.2em;
134
+ }
135
+
136
+ .example_group {
137
+ margin: 0 10px 5px;
138
+ background: #fff;
139
+ }
140
+
141
+ dl {
142
+ margin: 0; padding: 0 0 5px;
143
+ font: normal 11px "Lucida Grande", Helvetica, sans-serif;
144
+ }
145
+
146
+ dt {
147
+ padding: 3px;
148
+ background: #65C400;
149
+ color: #fff;
150
+ font-weight: bold;
151
+ }
152
+
153
+ dd {
154
+ margin: 5px 0 5px 5px;
155
+ padding: 3px 3px 3px 18px;
156
+ }
157
+
158
+ dd .duration {
159
+ padding-left: 5px;
160
+ text-align: right;
161
+ right: 0px;
162
+ float:right;
163
+ }
164
+
165
+ dd.example.passed {
166
+ border-left: 5px solid #65C400;
167
+ border-bottom: 1px solid #65C400;
168
+ background: #DBFFB4; color: #3D7700;
169
+ }
170
+
171
+ dd.example.not_implemented {
172
+ border-left: 5px solid #FAF834;
173
+ border-bottom: 1px solid #FAF834;
174
+ background: #FCFB98; color: #131313;
175
+ }
176
+
177
+ dd.example.pending_fixed {
178
+ border-left: 5px solid #0000C2;
179
+ border-bottom: 1px solid #0000C2;
180
+ color: #0000C2; background: #D3FBFF;
181
+ }
182
+
183
+ dd.example.failed {
184
+ border-left: 5px solid #C20000;
185
+ border-bottom: 1px solid #C20000;
186
+ color: #C20000; background: #FFFBD3;
187
+ }
188
+
189
+
190
+ dt.not_implemented {
191
+ color: #000000; background: #FAF834;
192
+ }
193
+
194
+ dt.pending_fixed {
195
+ color: #FFFFFF; background: #C40D0D;
196
+ }
197
+
198
+ dt.failed {
199
+ color: #FFFFFF; background: #C40D0D;
200
+ }
201
+
202
+
203
+ #rspec-header.not_implemented {
204
+ color: #000000; background: #FAF834;
205
+ }
206
+
207
+ #rspec-header.pending_fixed {
208
+ color: #FFFFFF; background: #C40D0D;
209
+ }
210
+
211
+ #rspec-header.failed {
212
+ color: #FFFFFF; background: #C40D0D;
213
+ }
214
+
215
+
216
+ .backtrace {
217
+ color: #000;
218
+ font-size: 12px;
219
+ }
220
+
221
+ a {
222
+ color: #BE5C00;
223
+ }
224
+
225
+ /* Ruby code, style similar to vibrant ink */
226
+ .ruby {
227
+ font-size: 12px;
228
+ font-family: monospace;
229
+ color: white;
230
+ background-color: black;
231
+ padding: 0.1em 0 0.2em 0;
232
+ }
233
+
234
+ .ruby .keyword { color: #FF6600; }
235
+ .ruby .constant { color: #339999; }
236
+ .ruby .attribute { color: white; }
237
+ .ruby .global { color: white; }
238
+ .ruby .module { color: white; }
239
+ .ruby .class { color: white; }
240
+ .ruby .string { color: #66FF00; }
241
+ .ruby .ident { color: white; }
242
+ .ruby .method { color: #FFCC00; }
243
+ .ruby .number { color: white; }
244
+ .ruby .char { color: white; }
245
+ .ruby .comment { color: #9933CC; }
246
+ .ruby .symbol { color: white; }
247
+ .ruby .regex { color: #44B4CC; }
248
+ .ruby .punct { color: white; }
249
+ .ruby .escape { color: white; }
250
+ .ruby .interp { color: white; }
251
+ .ruby .expr { color: white; }
252
+
253
+ .ruby .offending { background-color: gray; }
254
+ .ruby .linenum {
255
+ width: 75px;
256
+ padding: 0.1em 1em 0.2em 0;
257
+ color: #000000;
258
+ background-color: #FFFBD3;
259
+ }
260
+
261
+ </style>
262
+ </head>
263
+ <body>
264
+ <div class="rspec-report">
265
+
266
+ <div id="rspec-header">
267
+ <div id="label">
268
+ <h1>RSpec Code Examples</h1>
269
+ </div>
270
+
271
+ <div id="display-filters">
272
+ <input id="passed_checkbox" name="passed_checkbox" type="checkbox" checked onchange="apply_filters()" value="1"> <label for="passed_checkbox">Passed</label>
273
+ <input id="failed_checkbox" name="failed_checkbox" type="checkbox" checked onchange="apply_filters()" value="2"> <label for="failed_checkbox">Failed</label>
274
+ <input id="pending_checkbox" name="pending_checkbox" type="checkbox" checked onchange="apply_filters()" value="3"> <label for="pending_checkbox">Pending</label>
275
+ </div>
276
+
277
+ <div id="summary">
278
+ <p id="totals">&nbsp;</p>
279
+ <p id="duration">&nbsp;</p>
280
+ </div>
281
+ </div>
282
+
283
+
284
+ <div class="results">
285
+ <div id="div_group_1" class="example_group passed">
286
+ <dl style="margin-left: 0px;">
287
+ <dt id="example_group_1" class="passed">pending spec with no implementation</dt>
288
+ <script type="text/javascript">makeYellow('rspec-header');</script>
289
+ <script type="text/javascript">makeYellow('div_group_1');</script>
290
+ <script type="text/javascript">makeYellow('example_group_1');</script>
291
+ <script type="text/javascript">moveProgressBar('14.2');</script>
292
+ <dd class="example not_implemented"><span class="not_implemented_spec_name">is pending (PENDING: Not yet implemented)</span></dd>
293
+ </dl>
294
+ </div>
295
+ <div id="div_group_2" class="example_group passed">
296
+ <dl style="margin-left: 0px;">
297
+ <dt id="example_group_2" class="passed">pending command with block format</dt>
298
+ </dl>
299
+ </div>
300
+ <div id="div_group_3" class="example_group passed">
301
+ <dl style="margin-left: 15px;">
302
+ <dt id="example_group_3" class="passed">with content that would fail</dt>
303
+ <script type="text/javascript">makeYellow('rspec-header');</script>
304
+ <script type="text/javascript">makeYellow('div_group_3');</script>
305
+ <script type="text/javascript">makeYellow('example_group_3');</script>
306
+ <script type="text/javascript">moveProgressBar('28.5');</script>
307
+ <dd class="example not_implemented"><span class="not_implemented_spec_name">is pending (PENDING: No reason given)</span></dd>
308
+ </dl>
309
+ </div>
310
+ <div id="div_group_4" class="example_group passed">
311
+ <dl style="margin-left: 15px;">
312
+ <dt id="example_group_4" class="passed">with content that would pass</dt>
313
+ <script type="text/javascript">makeRed('rspec-header');</script>
314
+ <script type="text/javascript">makeRed('div_group_4');</script>
315
+ <script type="text/javascript">makeRed('example_group_4');</script>
316
+ <script type="text/javascript">moveProgressBar('42.8');</script>
317
+ <dd class="example pending_fixed">
318
+ <span class="failed_spec_name">fails</span>
319
+ <span class="duration">n.nnnns</span>
320
+ <div class="failure" id="failure_1">
321
+ <div class="message"><pre>RSpec::Core::Pending::PendingExampleFixedError</pre></div>
322
+ <div class="backtrace"><pre>./spec/rspec/core/resources/formatter_specs.rb:18:in `__script__'
323
+ kernel/common/eval18.rb:45:in `instance_eval'
324
+ kernel/bootstrap/array18.rb:18:in `map'
325
+ kernel/bootstrap/array18.rb:18:in `map'
326
+ kernel/bootstrap/array18.rb:18:in `map'
327
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:31:in `Formatters'
328
+ kernel/common/eval18.rb:45:in `instance_eval'
329
+ kernel/common/hash18.rb:196:in `fetch'
330
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:53:in `Formatters'
331
+ kernel/common/io.rb:255:in `open'
332
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:53:in `Formatters'
333
+ kernel/common/dir.rb:70:in `chdir'
334
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:52:in `Formatters'
335
+ kernel/common/eval18.rb:45:in `instance_eval'
336
+ kernel/common/eval18.rb:45:in `instance_eval'
337
+ kernel/common/eval18.rb:106:in `instance_exec'
338
+ kernel/bootstrap/array18.rb:18:in `map'
339
+ kernel/bootstrap/array18.rb:18:in `map'
340
+ kernel/bootstrap/array18.rb:18:in `map'
341
+ kernel/loader.rb:696:in `run_at_exits'
342
+ kernel/loader.rb:716:in `epilogue'
343
+ kernel/loader.rb:849:in `main'</pre></div>
344
+ <pre class="ruby"><code><span class="linenum">16</span> <span class="ident">context</span> <span class="punct">&quot;</span><span class="string">with content that would pass</span><span class="punct">&quot;</span> <span class="keyword">do</span>
345
+ <span class="linenum">17</span> <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">fails</span><span class="punct">&quot;</span> <span class="keyword">do</span>
346
+ <span class="offending"><span class="linenum">18</span> <span class="ident">pending</span> <span class="keyword">do</span></span>
347
+ <span class="linenum">19</span> <span class="number">1</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eq</span><span class="punct">(</span><span class="number">1</span><span class="punct">)</span>
348
+ <span class="linenum">20</span> <span class="keyword">end</span></code></pre>
349
+ </div>
350
+ </dd>
351
+ </dl>
352
+ </div>
353
+ <div id="div_group_5" class="example_group passed">
354
+ <dl style="margin-left: 0px;">
355
+ <dt id="example_group_5" class="passed">passing spec</dt>
356
+ <script type="text/javascript">moveProgressBar('57.1');</script>
357
+ <dd class="example passed"><span class="passed_spec_name">passes</span><span class='duration'>n.nnnns</span></dd>
358
+ </dl>
359
+ </div>
360
+ <div id="div_group_6" class="example_group passed">
361
+ <dl style="margin-left: 0px;">
362
+ <dt id="example_group_6" class="passed">failing spec</dt>
363
+ <script type="text/javascript">makeRed('div_group_6');</script>
364
+ <script type="text/javascript">makeRed('example_group_6');</script>
365
+ <script type="text/javascript">moveProgressBar('71.4');</script>
366
+ <dd class="example failed">
367
+ <span class="failed_spec_name">fails</span>
368
+ <span class="duration">n.nnnns</span>
369
+ <div class="failure" id="failure_2">
370
+ <div class="message"><pre>
371
+ expected: 2
372
+ got: 1
373
+
374
+ (compared using ==)
375
+ </pre></div>
376
+ <div class="backtrace"><pre>./spec/rspec/core/resources/formatter_specs.rb:33:in `__script__'
377
+ kernel/common/eval18.rb:45:in `instance_eval'
378
+ kernel/bootstrap/array18.rb:18:in `map'
379
+ kernel/bootstrap/array18.rb:18:in `map'
380
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:31:in `Formatters'
381
+ kernel/common/eval18.rb:45:in `instance_eval'
382
+ kernel/common/hash18.rb:196:in `fetch'
383
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:53:in `Formatters'
384
+ kernel/common/io.rb:255:in `open'
385
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:53:in `Formatters'
386
+ kernel/common/dir.rb:70:in `chdir'
387
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:52:in `Formatters'
388
+ kernel/common/eval18.rb:45:in `instance_eval'
389
+ kernel/common/eval18.rb:45:in `instance_eval'
390
+ kernel/common/eval18.rb:106:in `instance_exec'
391
+ kernel/bootstrap/array18.rb:18:in `map'
392
+ kernel/bootstrap/array18.rb:18:in `map'
393
+ kernel/bootstrap/array18.rb:18:in `map'
394
+ kernel/loader.rb:696:in `run_at_exits'
395
+ kernel/loader.rb:716:in `epilogue'
396
+ kernel/loader.rb:849:in `main'</pre></div>
397
+ <pre class="ruby"><code><span class="linenum">31</span><span class="ident">describe</span> <span class="punct">&quot;</span><span class="string">failing spec</span><span class="punct">&quot;</span> <span class="keyword">do</span>
398
+ <span class="linenum">32</span> <span class="ident">it</span> <span class="punct">&quot;</span><span class="string">fails</span><span class="punct">&quot;</span> <span class="keyword">do</span>
399
+ <span class="offending"><span class="linenum">33</span> <span class="number">1</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eq</span><span class="punct">(</span><span class="number">2</span><span class="punct">)</span></span>
400
+ <span class="linenum">34</span> <span class="keyword">end</span>
401
+ <span class="linenum">35</span><span class="keyword">end</span></code></pre>
402
+ </div>
403
+ </dd>
404
+ </dl>
405
+ </div>
406
+ <div id="div_group_7" class="example_group passed">
407
+ <dl style="margin-left: 0px;">
408
+ <dt id="example_group_7" class="passed">a failing spec with odd backtraces</dt>
409
+ <script type="text/javascript">makeRed('div_group_7');</script>
410
+ <script type="text/javascript">makeRed('example_group_7');</script>
411
+ <script type="text/javascript">moveProgressBar('85.7');</script>
412
+ <dd class="example failed">
413
+ <span class="failed_spec_name">fails with a backtrace that has no file</span>
414
+ <span class="duration">n.nnnns</span>
415
+ <div class="failure" id="failure_3">
416
+ <div class="message"><pre>foo</pre></div>
417
+ <div class="backtrace"><pre>(erb):1:in `__script__'
418
+ kernel/common/block_environment.rb:75:in `call_on_instance'
419
+ kernel/common/eval.rb:75:in `eval'
420
+ /Users/alindeman/.rvm/rubies/rbx-head/lib/18/erb.rb:719:in `result'
421
+ ./spec/rspec/core/resources/formatter_specs.rb:41:in `__script__'
422
+ kernel/common/eval18.rb:45:in `instance_eval'
423
+ kernel/bootstrap/array18.rb:18:in `map'
424
+ kernel/bootstrap/array18.rb:18:in `map'
425
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:31:in `Formatters'
426
+ kernel/common/eval18.rb:45:in `instance_eval'
427
+ kernel/common/hash18.rb:196:in `fetch'
428
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:53:in `Formatters'
429
+ kernel/common/io.rb:255:in `open'
430
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:53:in `Formatters'
431
+ kernel/common/dir.rb:70:in `chdir'
432
+ ./spec/rspec/core/formatters/html_formatter_spec.rb:52:in `Formatters'
433
+ kernel/common/eval18.rb:45:in `instance_eval'
434
+ kernel/common/eval18.rb:45:in `instance_eval'
435
+ kernel/common/eval18.rb:106:in `instance_exec'
436
+ kernel/bootstrap/array18.rb:18:in `map'
437
+ kernel/bootstrap/array18.rb:18:in `map'
438
+ kernel/bootstrap/array18.rb:18:in `map'
439
+ kernel/loader.rb:696:in `run_at_exits'
440
+ kernel/loader.rb:716:in `epilogue'
441
+ kernel/loader.rb:849:in `main'</pre></div>
442
+ <pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for (erb)</span></code></pre>
443
+ </div>
444
+ </dd>
445
+ <script type="text/javascript">moveProgressBar('100.0');</script>
446
+ <dd class="example failed">
447
+ <span class="failed_spec_name">fails with a backtrace containing an erb file</span>
448
+ <span class="duration">n.nnnns</span>
449
+ <div class="failure" id="failure_4">
450
+ <div class="message"><pre>Exception</pre></div>
451
+ <div class="backtrace"><pre>/foo.html.erb:1:in `<main>': foo (RuntimeError)</pre></div>
452
+ <pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for /foo.html.erb</span></code></pre>
453
+ </div>
454
+ </dd>
455
+ </dl>
456
+ </div>
457
+ <script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>n.nnnn seconds</strong>";</script>
458
+ <script type="text/javascript">document.getElementById('totals').innerHTML = "7 examples, 4 failures, 2 pending";</script>
459
+ </div>
460
+ </div>
461
+ </body>
462
+ </html>