rspec-core 2.0.0.beta.20 → 2.0.0.beta.22
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.
- data/.rspec +1 -1
- data/Gemfile +7 -6
- data/History.md +30 -0
- data/Rakefile +3 -43
- data/bin/rspec +2 -1
- data/features/configuration/{options_file.feature → read_options_from_file.feature} +29 -25
- data/features/example_groups/shared_example_group.feature +10 -6
- data/features/hooks/before_and_after_hooks.feature +38 -0
- data/lib/autotest/rspec2.rb +10 -2
- data/lib/rspec/core.rb +8 -0
- data/lib/rspec/core/configuration.rb +16 -10
- data/lib/rspec/core/configuration_options.rb +7 -3
- data/lib/rspec/core/example.rb +7 -0
- data/lib/rspec/core/example_group.rb +15 -2
- data/lib/rspec/core/extensions/module_eval_with_args.rb +9 -29
- data/lib/rspec/core/extensions/object.rb +0 -2
- data/lib/rspec/core/formatters/base_formatter.rb +8 -6
- data/lib/rspec/core/formatters/base_text_formatter.rb +18 -10
- data/lib/rspec/core/formatters/documentation_formatter.rb +9 -9
- data/lib/rspec/core/option_parser.rb +0 -4
- data/lib/rspec/core/rake_task.rb +85 -39
- data/lib/rspec/core/reporter.rb +18 -5
- data/lib/rspec/core/runner.rb +8 -18
- data/lib/rspec/core/shared_example_group.rb +2 -1
- data/lib/rspec/core/version.rb +1 -1
- data/rspec-core.gemspec +33 -233
- data/spec/autotest/failed_results_re_spec.rb +1 -2
- data/spec/autotest/rspec_spec.rb +62 -42
- data/spec/rspec/core/configuration_options_spec.rb +12 -29
- data/spec/rspec/core/configuration_spec.rb +8 -8
- data/spec/rspec/core/example_group_spec.rb +38 -7
- data/spec/rspec/core/example_spec.rb +16 -1
- data/spec/rspec/core/formatters/base_formatter_spec.rb +6 -0
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +125 -10
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +36 -0
- data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +282 -0
- data/spec/rspec/core/formatters/html_formatted-1.9.1.html +22 -2
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +280 -0
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.1.html +280 -0
- data/spec/rspec/core/rake_task_spec.rb +128 -0
- data/spec/rspec/core/reporter_spec.rb +36 -0
- data/spec/rspec/core/runner_spec.rb +0 -18
- data/spec/rspec/core/shared_example_group_spec.rb +22 -2
- data/spec/rspec/core/world_spec.rb +13 -15
- data/spec/spec_helper.rb +2 -1
- metadata +110 -13
- data/VERSION +0 -1
- data/lib/rspec/autorun.rb +0 -2
@@ -95,13 +95,6 @@ describe RSpec::Core::ConfigurationOptions do
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
describe "options file" do
|
99
|
-
it "is parsed from --options or -o" do
|
100
|
-
options_from_args("--options", "custom/path").should include(:options_file => "custom/path")
|
101
|
-
options_from_args("-o", "custom/path").should include(:options_file => "custom/path")
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
98
|
describe "files_or_directories_to_run" do
|
106
99
|
it "parses files from '-c file.rb dir/file.rb'" do
|
107
100
|
options_from_args("-c", "file.rb", "dir/file.rb").should include(:files_or_directories_to_run => ["file.rb", "dir/file.rb"])
|
@@ -159,14 +152,14 @@ describe RSpec::Core::ConfigurationOptions do
|
|
159
152
|
|
160
153
|
it "turns off the debugger option if --drb is specified in the options file" do
|
161
154
|
File.stub(:exist?) { true }
|
162
|
-
|
155
|
+
IO.stub(:read) { "--drb" }
|
163
156
|
config_options_object("--debug").drb_argv.should_not include("--debug")
|
164
157
|
config_options_object("-d" ).drb_argv.should_not include("--debug")
|
165
158
|
end
|
166
159
|
|
167
160
|
it "turns off the debugger option if --debug is specified in the options file" do
|
168
161
|
File.stub(:exist?) { true }
|
169
|
-
|
162
|
+
IO.stub(:read) { "--debug" }
|
170
163
|
config_options_object("--drb").drb_argv.should_not include("--debug")
|
171
164
|
config_options_object("-X" ).drb_argv.should_not include("--debug")
|
172
165
|
end
|
@@ -197,7 +190,7 @@ describe RSpec::Core::ConfigurationOptions do
|
|
197
190
|
context "--drb specified in the options file" do
|
198
191
|
it "renders all the original arguments except --drb" do
|
199
192
|
File.stub(:exist?) { true }
|
200
|
-
|
193
|
+
IO.stub(:read) { "--drb --color" }
|
201
194
|
config_options_object(*%w[ --format s --line_number 1 --example pattern --profile --backtrace ]).
|
202
195
|
drb_argv.should eq(%w[ --color --profile --backtrace --format s --line_number 1 --example pattern ])
|
203
196
|
end
|
@@ -206,7 +199,7 @@ describe RSpec::Core::ConfigurationOptions do
|
|
206
199
|
context "--drb specified in ARGV and the options file" do
|
207
200
|
it "renders all the original arguments except --drb" do
|
208
201
|
File.stub(:exist?) { true }
|
209
|
-
|
202
|
+
IO.stub(:read) { "--drb --color" }
|
210
203
|
config_options_object(*%w[ --drb --format s --line_number 1 --example pattern --profile --backtrace]).
|
211
204
|
drb_argv.should eq(%w[ --color --profile --backtrace --format s --line_number 1 --example pattern ])
|
212
205
|
end
|
@@ -215,7 +208,7 @@ describe RSpec::Core::ConfigurationOptions do
|
|
215
208
|
context "--drb specified in ARGV and in as ARGV-specified --options file" do
|
216
209
|
it "renders all the original arguments except --drb and --options" do
|
217
210
|
File.stub(:exist?) { true }
|
218
|
-
|
211
|
+
IO.stub(:read) { "--drb --color" }
|
219
212
|
config_options_object(*%w[ --drb --format s --line_number 1 --example pattern --profile --backtrace]).
|
220
213
|
drb_argv.should eq(%w[ --color --profile --backtrace --format s --line_number 1 --example pattern ])
|
221
214
|
end
|
@@ -227,17 +220,7 @@ describe RSpec::Core::ConfigurationOptions do
|
|
227
220
|
|
228
221
|
it "loads automatically" do
|
229
222
|
File.stub(:exist?) { true }
|
230
|
-
|
231
|
-
|
232
|
-
config_options = RSpec::Core::ConfigurationOptions.new([])
|
233
|
-
config_options.parse_options
|
234
|
-
config_options.configure(config)
|
235
|
-
config.formatter.should == 'doc'
|
236
|
-
end
|
237
|
-
|
238
|
-
it "allows options on one line" do
|
239
|
-
File.stub(:exist?) { true }
|
240
|
-
File.stub(:readlines) { ["--format doc"] }
|
223
|
+
IO.stub(:read) { "--format doc" }
|
241
224
|
|
242
225
|
config_options = RSpec::Core::ConfigurationOptions.new([])
|
243
226
|
config_options.parse_options
|
@@ -247,12 +230,12 @@ describe RSpec::Core::ConfigurationOptions do
|
|
247
230
|
|
248
231
|
it "merges options from the global and local .rspec and the command line" do
|
249
232
|
File.stub(:exist?){ true }
|
250
|
-
|
233
|
+
IO.stub(:read) do |path|
|
251
234
|
case path
|
252
235
|
when ".rspec"
|
253
|
-
|
236
|
+
"--format documentation"
|
254
237
|
when /\.rspec/
|
255
|
-
|
238
|
+
"--line 37"
|
256
239
|
else
|
257
240
|
raise "Unexpected path: #{path}"
|
258
241
|
end
|
@@ -269,12 +252,12 @@ describe RSpec::Core::ConfigurationOptions do
|
|
269
252
|
|
270
253
|
it "prefers local options over global" do
|
271
254
|
File.stub(:exist?){ true }
|
272
|
-
|
255
|
+
IO.stub(:read) do |path|
|
273
256
|
case path
|
274
257
|
when ".rspec"
|
275
|
-
|
258
|
+
"--format local"
|
276
259
|
when /\.rspec/
|
277
|
-
|
260
|
+
"--format global"
|
278
261
|
else
|
279
262
|
raise "Unexpected path: #{path}"
|
280
263
|
end
|
@@ -138,7 +138,7 @@ module RSpec::Core
|
|
138
138
|
|
139
139
|
end
|
140
140
|
|
141
|
-
describe "include" do
|
141
|
+
describe "#include" do
|
142
142
|
|
143
143
|
module InstanceLevelMethods
|
144
144
|
def you_call_this_a_blt?
|
@@ -172,7 +172,7 @@ module RSpec::Core
|
|
172
172
|
|
173
173
|
end
|
174
174
|
|
175
|
-
describe "extend" do
|
175
|
+
describe "#extend" do
|
176
176
|
|
177
177
|
module ThatThingISentYou
|
178
178
|
def that_thing
|
@@ -202,7 +202,7 @@ module RSpec::Core
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
|
-
describe
|
205
|
+
describe "#color_enabled=" do
|
206
206
|
context "given true" do
|
207
207
|
context "on windows" do
|
208
208
|
before do
|
@@ -337,7 +337,7 @@ module RSpec::Core
|
|
337
337
|
end
|
338
338
|
end
|
339
339
|
|
340
|
-
describe "full_backtrace=" do
|
340
|
+
describe "#full_backtrace=" do
|
341
341
|
it "clears the backtrace clean patterns" do
|
342
342
|
config.full_backtrace = true
|
343
343
|
config.backtrace_clean_patterns.should == []
|
@@ -352,14 +352,14 @@ module RSpec::Core
|
|
352
352
|
end
|
353
353
|
end
|
354
354
|
|
355
|
-
describe "debug=true" do
|
355
|
+
describe "#debug=true" do
|
356
356
|
it "requires 'ruby-debug'" do
|
357
357
|
config.should_receive(:require).with('ruby-debug')
|
358
358
|
config.debug = true
|
359
359
|
end
|
360
360
|
end
|
361
361
|
|
362
|
-
describe "debug=false" do
|
362
|
+
describe "#debug=false" do
|
363
363
|
it "does not require 'ruby-debug'" do
|
364
364
|
config.should_not_receive(:require).with('ruby-debug')
|
365
365
|
config.debug = false
|
@@ -374,14 +374,14 @@ module RSpec::Core
|
|
374
374
|
end
|
375
375
|
end
|
376
376
|
|
377
|
-
describe "libs=" do
|
377
|
+
describe "#libs=" do
|
378
378
|
it "adds directories to the LOAD_PATH" do
|
379
379
|
$LOAD_PATH.should_receive(:unshift).with("a/dir")
|
380
380
|
config.libs = ["a/dir"]
|
381
381
|
end
|
382
382
|
end
|
383
383
|
|
384
|
-
describe "requires=" do
|
384
|
+
describe "#requires=" do
|
385
385
|
it "requires paths" do
|
386
386
|
config.should_receive(:require).with("a/path")
|
387
387
|
config.requires = ["a/path"]
|
@@ -325,14 +325,15 @@ module RSpec::Core
|
|
325
325
|
end
|
326
326
|
|
327
327
|
it "treats an error in before(:all) as a failure" do
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
group.run_all
|
328
|
+
group = ExampleGroup.describe
|
329
|
+
group.before(:all) { raise "error in before all" }
|
330
|
+
example = group.example("equality") { 1.should == 2}
|
331
|
+
group.run_all
|
333
332
|
|
334
|
-
|
335
|
-
|
333
|
+
example.metadata.should_not be_nil
|
334
|
+
example.metadata[:execution_result].should_not be_nil
|
335
|
+
example.metadata[:execution_result][:exception_encountered].should_not be_nil
|
336
|
+
example.metadata[:execution_result][:exception_encountered].message.should == "error in before all"
|
336
337
|
end
|
337
338
|
|
338
339
|
it "has no 'running example' within before(:all)" do
|
@@ -584,6 +585,36 @@ module RSpec::Core
|
|
584
585
|
describe "#run" do
|
585
586
|
let(:reporter) { double("reporter").as_null_object }
|
586
587
|
|
588
|
+
context "with RSpec.wants_to_quit=true" do
|
589
|
+
before do
|
590
|
+
RSpec.stub(:clear_remaining_example_groups)
|
591
|
+
RSpec.stub(:wants_to_quit) { true }
|
592
|
+
end
|
593
|
+
|
594
|
+
it "returns without starting the group" do
|
595
|
+
group = RSpec::Core::ExampleGroup.describe
|
596
|
+
reporter.should_not_receive(:example_group_started)
|
597
|
+
group.run(reporter)
|
598
|
+
end
|
599
|
+
|
600
|
+
context "at top level" do
|
601
|
+
it "purges remaining groups" do
|
602
|
+
group = RSpec::Core::ExampleGroup.describe
|
603
|
+
RSpec.should_receive(:clear_remaining_example_groups)
|
604
|
+
group.run(reporter)
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
context "in a nested group" do
|
609
|
+
it "does not purge remaining groups" do
|
610
|
+
group = RSpec::Core::ExampleGroup.describe
|
611
|
+
nested_group = group.describe
|
612
|
+
RSpec.should_not_receive(:clear_remaining_example_groups)
|
613
|
+
nested_group.run(reporter)
|
614
|
+
end
|
615
|
+
end
|
616
|
+
end
|
617
|
+
|
587
618
|
context "with all examples passing" do
|
588
619
|
it "returns true" do
|
589
620
|
group = describe("something") do
|
@@ -40,6 +40,19 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "#run" do
|
43
|
+
context "with RSpec.wants_to_quit=true" do
|
44
|
+
it "returns without starting the example" do
|
45
|
+
RSpec.stub(:wants_to_quit) { true }
|
46
|
+
group = RSpec::Core::ExampleGroup.describe
|
47
|
+
example = group.example('example') {}
|
48
|
+
|
49
|
+
reporter = double('reporter').as_null_object
|
50
|
+
reporter.should_not_receive(:example_started)
|
51
|
+
|
52
|
+
example.run(group.new,reporter)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
43
56
|
it "runs after(:each) when the example passes" do
|
44
57
|
after_run = false
|
45
58
|
group = RSpec::Core::ExampleGroup.describe do
|
@@ -163,11 +176,13 @@ describe RSpec::Core::Example, :parent_metadata => 'sample' do
|
|
163
176
|
end
|
164
177
|
|
165
178
|
context "in before(:all)" do
|
166
|
-
|
179
|
+
pending "is not supported" do
|
167
180
|
group = RSpec::Core::ExampleGroup.describe do
|
168
181
|
before(:all) { pending }
|
169
182
|
example {}
|
170
183
|
end
|
184
|
+
group.run_all
|
185
|
+
group.examples.first.should be_pending
|
171
186
|
expect do
|
172
187
|
group.run_all
|
173
188
|
end.to raise_error(/undefined method `metadata'/)
|
@@ -9,6 +9,12 @@ describe RSpec::Core::Formatters::BaseFormatter do
|
|
9
9
|
it "trims current working directory" do
|
10
10
|
formatter.__send__(:backtrace_line, File.expand_path(__FILE__)).should == "./spec/rspec/core/formatters/base_formatter_spec.rb"
|
11
11
|
end
|
12
|
+
|
13
|
+
it "leaves the original line intact" do
|
14
|
+
original_line = File.expand_path(__FILE__)
|
15
|
+
formatter.__send__(:backtrace_line, original_line)
|
16
|
+
original_line.should eq(File.expand_path(__FILE__))
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
20
|
end
|
@@ -3,10 +3,10 @@ require "spec_helper"
|
|
3
3
|
module RSpec::Core::Formatters
|
4
4
|
|
5
5
|
describe BaseTextFormatter do
|
6
|
-
|
7
|
-
|
8
|
-
let(:formatter) { RSpec::Core::Formatters::BaseTextFormatter.new(output) }
|
6
|
+
let(:output) { StringIO.new }
|
7
|
+
let(:formatter) { RSpec::Core::Formatters::BaseTextFormatter.new(output) }
|
9
8
|
|
9
|
+
describe "#summary_line" do
|
10
10
|
context "with 0s" do
|
11
11
|
it "outputs pluralized (excluding pending)" do
|
12
12
|
formatter.summary_line(0,0,0).should eq("0 examples, 0 failures")
|
@@ -27,18 +27,133 @@ module RSpec::Core::Formatters
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe "#dump_failures" do
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
example = group.example("example name") { "this".should eq("that") }
|
34
|
-
formatter = RSpec::Core::Formatters::BaseTextFormatter.new(output)
|
35
|
-
group.run_all(formatter)
|
30
|
+
let(:group) { RSpec::Core::ExampleGroup.describe("group name") }
|
31
|
+
|
32
|
+
before { RSpec.configuration.stub(:color_enabled?) { false } }
|
36
33
|
|
37
|
-
|
34
|
+
def run_all_and_dump_failures
|
35
|
+
group.run_all(formatter)
|
38
36
|
formatter.dump_failures
|
37
|
+
end
|
38
|
+
|
39
|
+
it "preserves formatting" do
|
40
|
+
group.example("example name") { "this".should eq("that") }
|
41
|
+
|
42
|
+
run_all_and_dump_failures
|
43
|
+
|
39
44
|
output.string.should =~ /group name example name/m
|
40
45
|
output.string.should =~ /(\s+)expected \"that\"\n\1 got \"this\"/m
|
41
46
|
end
|
47
|
+
|
48
|
+
context 'for #share_examples_for' do
|
49
|
+
it 'outputs the name and location' do
|
50
|
+
|
51
|
+
share_examples_for 'foo bar' do
|
52
|
+
it("example name") { "this".should eq("that") }
|
53
|
+
end
|
54
|
+
|
55
|
+
line = __LINE__.next
|
56
|
+
group.it_should_behave_like('foo bar')
|
57
|
+
|
58
|
+
run_all_and_dump_failures
|
59
|
+
|
60
|
+
output.string.should include(
|
61
|
+
'Shared Example Group: "foo bar" called from ' +
|
62
|
+
"./spec/rspec/core/formatters/base_text_formatter_spec.rb:#{line}"
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'that contains nested example groups' do
|
67
|
+
it 'outputs the name and location' do
|
68
|
+
share_examples_for 'foo bar' do
|
69
|
+
describe 'nested group' do
|
70
|
+
it("example name") { "this".should eq("that") }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
line = __LINE__.next
|
75
|
+
group.it_should_behave_like('foo bar')
|
76
|
+
|
77
|
+
run_all_and_dump_failures
|
78
|
+
|
79
|
+
output.string.should include(
|
80
|
+
'Shared Example Group: "foo bar" called from ' +
|
81
|
+
"./spec/rspec/core/formatters/base_text_formatter_spec.rb:#{line}"
|
82
|
+
)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'for #share_as' do
|
88
|
+
it 'outputs the name and location' do
|
89
|
+
|
90
|
+
share_as :FooBar do
|
91
|
+
it("example name") { "this".should eq("that") }
|
92
|
+
end
|
93
|
+
|
94
|
+
line = __LINE__.next
|
95
|
+
group.send(:include, FooBar)
|
96
|
+
|
97
|
+
run_all_and_dump_failures
|
98
|
+
|
99
|
+
output.string.should include(
|
100
|
+
'Shared Example Group: "FooBar" called from ' +
|
101
|
+
"./spec/rspec/core/formatters/base_text_formatter_spec.rb:#{line}"
|
102
|
+
)
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'that contains nested example groups' do
|
106
|
+
it 'outputs the name and location' do
|
107
|
+
|
108
|
+
share_as :NestedFoo do
|
109
|
+
describe 'nested group' do
|
110
|
+
describe 'hell' do
|
111
|
+
it("example name") { "this".should eq("that") }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
line = __LINE__.next
|
117
|
+
group.send(:include, NestedFoo)
|
118
|
+
|
119
|
+
run_all_and_dump_failures
|
120
|
+
|
121
|
+
output.string.should include(
|
122
|
+
'Shared Example Group: "NestedFoo" called from ' +
|
123
|
+
"./spec/rspec/core/formatters/base_text_formatter_spec.rb:#{line}"
|
124
|
+
)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#dump_profile" do
|
131
|
+
before do
|
132
|
+
formatter.stub(:examples) do
|
133
|
+
group = RSpec::Core::ExampleGroup.describe("group") do
|
134
|
+
example("example")
|
135
|
+
end
|
136
|
+
group.run_all(double('reporter').as_null_object)
|
137
|
+
group.examples
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
it "names the example" do
|
142
|
+
formatter.dump_profile
|
143
|
+
output.string.should =~ /group example/m
|
144
|
+
end
|
145
|
+
|
146
|
+
it "prints the time" do
|
147
|
+
formatter.dump_profile
|
148
|
+
output.string.should =~ /0\.\d+ seconds/
|
149
|
+
end
|
150
|
+
|
151
|
+
it "prints the path" do
|
152
|
+
formatter.dump_profile
|
153
|
+
filename = __FILE__.split(File::SEPARATOR).last
|
154
|
+
|
155
|
+
output.string.should =~ /#{filename}\:134/
|
156
|
+
end
|
42
157
|
end
|
43
158
|
end
|
44
159
|
end
|
@@ -25,5 +25,41 @@ module RSpec::Core::Formatters
|
|
25
25
|
output.string.should =~ /first example \(FAILED - 1\)/m
|
26
26
|
output.string.should =~ /second example \(FAILED - 2\)/m
|
27
27
|
end
|
28
|
+
|
29
|
+
it "represents nested group using hierarchy tree" do
|
30
|
+
|
31
|
+
output = StringIO.new
|
32
|
+
RSpec.configuration.stub(:color_enabled?) { false }
|
33
|
+
|
34
|
+
formatter = RSpec::Core::Formatters::DocumentationFormatter.new(output)
|
35
|
+
|
36
|
+
group = RSpec::Core::ExampleGroup.describe("root")
|
37
|
+
context1 = group.describe("context 1")
|
38
|
+
context1.example("nested example 1.1"){}
|
39
|
+
context1.example("nested example 1.2"){}
|
40
|
+
|
41
|
+
context11 = context1.describe("context 1.1")
|
42
|
+
context11.example("nested example 1.1.1"){}
|
43
|
+
context11.example("nested example 1.1.2"){}
|
44
|
+
|
45
|
+
context2 = group.describe("context 2")
|
46
|
+
context2.example("nested example 2.1"){}
|
47
|
+
context2.example("nested example 2.2"){}
|
48
|
+
|
49
|
+
group.run_all(RSpec::Core::Reporter.new(formatter))
|
50
|
+
|
51
|
+
output.string.should eql "
|
52
|
+
root
|
53
|
+
context 1
|
54
|
+
nested example 1.1
|
55
|
+
nested example 1.2
|
56
|
+
context 1.1
|
57
|
+
nested example 1.1.1
|
58
|
+
nested example 1.1.2
|
59
|
+
context 2
|
60
|
+
nested example 2.1
|
61
|
+
nested example 2.2
|
62
|
+
"
|
63
|
+
end
|
28
64
|
end
|
29
65
|
end
|