cukedep 0.1.10 → 0.1.11
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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +4 -0
- data/Rakefile +4 -6
- data/lib/cukedep/application.rb +89 -91
- data/lib/cukedep/cli/cmd-line.rb +0 -7
- data/lib/cukedep/config.rb +70 -74
- data/lib/cukedep/constants.rb +1 -1
- data/lib/cukedep/cuke-runner.rb +0 -5
- data/lib/cukedep/customization.rb +0 -5
- data/lib/cukedep/feature-model.rb +1 -7
- data/lib/cukedep/feature-rep.rb +0 -4
- data/lib/cukedep/file-action.rb +209 -221
- data/lib/cukedep/gherkin-facade.rb +7 -10
- data/lib/cukedep/gherkin-listener.rb +82 -89
- data/lib/cukedep/hook-dsl.rb +0 -4
- data/lib/cukedep/sandbox.rb +0 -5
- data/sample/features/step_definitions/steps.rb +30 -26
- data/sample/features/support/env.rb +1 -1
- data/sample/model/model.rb +198 -205
- data/sample/result.html +1 -1
- data/spec/cukedep/application_spec.rb +15 -16
- data/spec/cukedep/cli/cmd-line_spec.rb +13 -16
- data/spec/cukedep/cuke-runner_spec.rb +55 -61
- data/spec/cukedep/customization_spec.rb +21 -26
- data/spec/cukedep/debug-file-action.rb +12 -10
- data/spec/cukedep/feature-model_spec.rb +13 -16
- data/spec/cukedep/feature-rep_spec.rb +4 -7
- data/spec/cukedep/file-action_spec.rb +18 -34
- data/spec/cukedep/file-parsing.rb +9 -11
- data/spec/cukedep/gherkin-facade_spec.rb +3 -8
- data/spec/cukedep/gherkin-listener_spec.rb +10 -12
- data/spec/cukedep/hook-dsl_spec.rb +6 -9
- data/spec/cukedep/sample_features/cukedep.rake +44 -37
- data/spec/cukedep/sample_features/cukedep_hooks.rb +2 -2
- data/spec/cukedep/sample_features/dependencies.dot +1 -1
- data/templates/rake.erb +36 -29
- metadata +2 -2
data/sample/result.html
CHANGED
@@ -469,4 +469,4 @@ e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["
|
|
469
469
|
$('#'+element_id).css('color', '#000000');
|
470
470
|
}
|
471
471
|
|
472
|
-
</script></head><body><!-- Step count 0--><div class="cucumber"><div id="cucumber-header"><div id="label"><h1>Cucumber Features</h1></div><div id="summary"><p id="totals"></p><p id="duration"></p><div id="expand-collapse"><p id="expander">Expand All</p><p id="collapser">Collapse All</p></div></div></div><div class="feature"><span class="tag">@a_few</span> <span class="tag">@feature:qux</span><h2><span class="val">Feature: Registering user credentials</span></h2><p class="narrative">As a video rental employee<br/>I want to enter my credentials<br/>So I can identify myself when use the rental application<br/></p><div class='scenario'><span class="scenario_file">features/a_few_tests.feature:8</span><h3 id="scenario_1"><span class="keyword">Scenario:</span> <span class="val">Start without credentials</span></h3><ol><li id='' class='step passed'><div class="step_name"><span class="keyword">Given </span><span class="step val">there is no registered user</span></div><div class="step_file"><span>features/step_definitions/steps.rb:
|
472
|
+
</script></head><body><!-- Step count 0--><div class="cucumber"><div id="cucumber-header"><div id="label"><h1>Cucumber Features</h1></div><div id="summary"><p id="totals"></p><p id="duration"></p><div id="expand-collapse"><p id="expander">Expand All</p><p id="collapser">Collapse All</p></div></div></div><div class="feature"><span class="tag">@a_few</span> <span class="tag">@feature:qux</span><h2><span class="val">Feature: Registering user credentials</span></h2><p class="narrative">As a video rental employee<br/>I want to enter my credentials<br/>So I can identify myself when use the rental application<br/></p><div class='scenario'><span class="scenario_file">features/a_few_tests.feature:8</span><h3 id="scenario_1"><span class="keyword">Scenario:</span> <span class="val">Start without credentials</span></h3><ol><li id='' class='step passed'><div class="step_name"><span class="keyword">Given </span><span class="step val">there is no registered user</span></div><div class="step_file"><span>features/step_definitions/steps.rb:50</span></div></li> <script type="text/javascript">moveProgressBar('100.0');</script><li id='' class='step passed'><div class="step_name"><span class="keyword">When </span><span class="step val">I enter the credentials "<span class="param">it's me</span>"</span></div><div class="step_file"><span>features/step_definitions/steps.rb:54</span></div></li> <script type="text/javascript">moveProgressBar('100.0');</script><li id='' class='step passed'><div class="step_name"><span class="keyword">Then </span><span class="step val">I should not be authorized</span></div><div class="step_file"><span>features/step_definitions/steps.rb:58</span></div></li><li class="step message">Invalid user credential</li> <script type="text/javascript">moveProgressBar('100.0');</script></ol></div><div class='scenario outline'><span class="scenario_file">features/a_few_tests.feature:14</span><h3 id="scenario_2"><span class="keyword">Scenario Outline:</span> <span class="val">Registering some credentials</span></h3><ol><li id='' class='step skipped'><div class="step_name"><span class="keyword">When </span><span class="step val">I register my credentials "<credentials>"</span></div><div class="step_file"><span>features/a_few_tests.feature:15</span></div></li> <script type="text/javascript">moveProgressBar('100.0');</script><li id='' class='step skipped'><div class="step_name"><span class="keyword">When </span><span class="step val">I enter the credentials "<credentials>"</span></div><div class="step_file"><span>features/a_few_tests.feature:16</span></div></li> <script type="text/javascript">moveProgressBar('100.0');</script><li id='' class='step skipped'><div class="step_name"><span class="keyword">Then </span><span class="step val">I should see a welcome message</span></div><div class="step_file"><span>features/a_few_tests.feature:17</span></div></li> <script type="text/javascript">moveProgressBar('100.0');</script></ol><div class="examples"><h4><span class="keyword">Examples</span> <span class="val"></span></h4><table><tr class='step' id='features_a_few_tests_feature_19'><th id="features_a_few_tests_feature_19_0" class="step skipped_param"><div><span class="step param">credentials</span></div></th></tr> <script type="text/javascript">moveProgressBar('100.0');</script><tr class='step' id='features_a_few_tests_feature_21'><td id="features_a_few_tests_feature_21_0" class="step passed"><div><span class="step param">it's me</span></div></td><td class="message">Welcome to the rental application.</td></tr> <script type="text/javascript">moveProgressBar('100.0');</script><tr class='step' id='features_a_few_tests_feature_22'><td id="features_a_few_tests_feature_22_0" class="step passed"><div><span class="step param">himself</span></div></td><td class="message">Welcome to the rental application.</td></tr> <script type="text/javascript">moveProgressBar('100.0');</script><tr class='step' id='features_a_few_tests_feature_23'><td id="features_a_few_tests_feature_23_0" class="step passed"><div><span class="step param">nemo</span></div></td><td class="message">Welcome to the rental application.</td></tr> <script type="text/javascript">moveProgressBar('100.0');</script></table></div></div></div><script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>0m0.031s seconds</strong>";</script><script type="text/javascript">document.getElementById('totals').innerHTML = "4 scenarios (4 passed)<br />12 steps (12 passed)";</script></div></body></html>
|
@@ -1,15 +1,14 @@
|
|
1
1
|
# File: cmd-line_spec.rb
|
2
2
|
|
3
3
|
require 'stringio'
|
4
|
+
require 'English'
|
4
5
|
require_relative '../spec_helper'
|
5
6
|
|
6
7
|
# Load the class under testing
|
7
8
|
require_relative '../../lib/cukedep/application'
|
8
9
|
|
9
10
|
module Cukedep # Open module to get rid of long qualified names
|
10
|
-
|
11
11
|
describe Application do
|
12
|
-
|
13
12
|
context 'Creation & initialization:' do
|
14
13
|
it 'should be created without argument' do
|
15
14
|
expect { Application.new }.not_to raise_error
|
@@ -20,7 +19,7 @@ describe Application do
|
|
20
19
|
subject { Application.new }
|
21
20
|
|
22
21
|
it 'should read its command-line' do
|
23
|
-
options = subject.send(:options_from,
|
22
|
+
options = subject.send(:options_from, [])
|
24
23
|
expect(options).to be_empty
|
25
24
|
end
|
26
25
|
|
@@ -29,7 +28,7 @@ describe Application do
|
|
29
28
|
File.delete(Cukedep::YMLFilename) if File.exist?(Cukedep::YMLFilename)
|
30
29
|
|
31
30
|
# --setup option creates the config file then stops the application
|
32
|
-
expect { subject.run!(['--setup'])}.to raise_error(SystemExit)
|
31
|
+
expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
|
33
32
|
|
34
33
|
# Check that the config file was effectively created.
|
35
34
|
expect(File.exist?(Cukedep::YMLFilename)).to be true
|
@@ -39,14 +38,14 @@ describe Application do
|
|
39
38
|
# Re-run again with --setup option.
|
40
39
|
# It should ask permission for overwriting
|
41
40
|
# Capture console IO
|
42
|
-
old_stdout =
|
41
|
+
old_stdout = $DEFAULT_OUTPUT
|
43
42
|
ostream = StringIO.new('rw')
|
44
|
-
|
43
|
+
$DEFAULT_OUTPUT = ostream
|
45
44
|
old_stdin = $stdin
|
46
45
|
$stdin = StringIO.new("n\n", 'r')
|
47
|
-
expect { subject.run!(['--setup'])}.to raise_error(SystemExit)
|
48
|
-
|
49
|
-
$
|
46
|
+
expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
|
47
|
+
$DEFAULT_OUTPUT = old_stdout
|
48
|
+
$stdin = old_stdin
|
50
49
|
end
|
51
50
|
|
52
51
|
it 'should complain in absence of project dir' do
|
@@ -55,20 +54,21 @@ describe Application do
|
|
55
54
|
expect(File.exist?(Cukedep::YMLFilename)).to be_falsey
|
56
55
|
|
57
56
|
# Create default config
|
58
|
-
expect { subject.run!(['--setup'])}.to raise_error(SystemExit)
|
57
|
+
expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
|
59
58
|
|
60
59
|
err = StandardError
|
61
|
-
|
62
|
-
|
60
|
+
err_msg1 = "No project dir specified in '.cukedep.yml'"
|
61
|
+
err_msg2 = ' nor via --project option.'
|
62
|
+
expect { subject.run!([]) }.to raise_error(err, err_msg1 + err_msg2)
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'should parse the feature files' do
|
66
|
-
curr_dir = Dir.getwd
|
66
|
+
curr_dir = Dir.getwd
|
67
67
|
begin
|
68
68
|
file_dir = File.dirname(__FILE__)
|
69
69
|
Dir.chdir(file_dir + '/sample_features')
|
70
70
|
unless File.exist?(Cukedep::YMLFilename)
|
71
|
-
expect { subject.run!(['--setup'])}.to raise_error(SystemExit)
|
71
|
+
expect { subject.run!(['--setup']) }.to raise_error(SystemExit)
|
72
72
|
end
|
73
73
|
subject.run!(['--project', '../../../sample'])
|
74
74
|
ensure
|
@@ -77,5 +77,4 @@ describe Application do
|
|
77
77
|
end
|
78
78
|
end # context
|
79
79
|
end # describe
|
80
|
-
|
81
|
-
end # module
|
80
|
+
end # module
|
@@ -1,15 +1,14 @@
|
|
1
1
|
# File: cmd-line_spec.rb
|
2
2
|
|
3
3
|
require 'stringio'
|
4
|
+
require 'English'
|
4
5
|
require_relative '../../spec_helper'
|
5
6
|
|
6
7
|
# Load the class under testing
|
7
8
|
require_relative '../../../lib/cukedep/cli/cmd-line'
|
8
9
|
|
9
10
|
module Cukedep # Open module to get rid of long qualified names
|
10
|
-
|
11
11
|
describe CLI::CmdLine do
|
12
|
-
|
13
12
|
context 'Creation & initialization:' do
|
14
13
|
subject { CLI::CmdLine.new }
|
15
14
|
|
@@ -20,13 +19,13 @@ describe CLI::CmdLine do
|
|
20
19
|
|
21
20
|
context 'Provided services:' do
|
22
21
|
def capture_output()
|
23
|
-
@output =
|
22
|
+
@output = $DEFAULT_OUTPUT
|
24
23
|
ostream = StringIO.new('rw')
|
25
|
-
|
24
|
+
$DEFAULT_OUTPUT = ostream
|
26
25
|
end
|
27
26
|
|
28
27
|
def release_output()
|
29
|
-
|
28
|
+
$DEFAULT_OUTPUT = @output
|
30
29
|
end
|
31
30
|
|
32
31
|
|
@@ -37,12 +36,12 @@ describe CLI::CmdLine do
|
|
37
36
|
|
38
37
|
it 'should accept the dry-run option' do
|
39
38
|
expect { subject.parse!(['--dry-run']) }.not_to raise_error
|
40
|
-
expect(subject.options).to eq(
|
39
|
+
expect(subject.options).to eq(dryrun: true)
|
41
40
|
end
|
42
41
|
|
43
42
|
it 'should accept the setup option' do
|
44
43
|
expect { subject.parse!(['--setup']) }.not_to raise_error
|
45
|
-
expect(subject.options).to eq(
|
44
|
+
expect(subject.options).to eq(setup: true)
|
46
45
|
end
|
47
46
|
|
48
47
|
it 'should validate the project option argument' do
|
@@ -62,16 +61,16 @@ MSG_END
|
|
62
61
|
expect { subject.parse!(cmd_opts) }.to raise_error(err_type, err_msg)
|
63
62
|
|
64
63
|
# Case 3: project dir exists
|
65
|
-
#cmd_opts = ['--project', '../../../sample']
|
66
|
-
#expect { subject.parse!(cmd_opts) }.not_to raise_error
|
67
|
-
#expect(subject.options).to eq({ :project => '../../../sample' })
|
64
|
+
# cmd_opts = ['--project', '../../../sample']
|
65
|
+
# expect { subject.parse!(cmd_opts) }.not_to raise_error
|
66
|
+
# expect(subject.options).to eq({ :project => '../../../sample' })
|
68
67
|
end
|
69
68
|
|
70
69
|
it 'should handle the version option' do
|
71
70
|
capture_output
|
72
71
|
cmd_opts = ['--version']
|
73
72
|
expect { subject.parse!(cmd_opts) }.to raise_error(SystemExit)
|
74
|
-
expect(
|
73
|
+
expect($DEFAULT_OUTPUT.string).to eq(Cukedep::Version + "\n")
|
75
74
|
release_output
|
76
75
|
end
|
77
76
|
|
@@ -79,13 +78,11 @@ MSG_END
|
|
79
78
|
capture_output
|
80
79
|
cmd_opts = ['--help']
|
81
80
|
expect { subject.parse!(cmd_opts) }.to raise_error(SystemExit)
|
82
|
-
expect(
|
81
|
+
expect($DEFAULT_OUTPUT.string).to eq(subject.parser.to_s)
|
83
82
|
release_output
|
84
83
|
end
|
85
84
|
end # context
|
86
|
-
|
87
|
-
|
88
|
-
|
89
85
|
end # describe
|
86
|
+
end # module
|
90
87
|
|
91
|
-
|
88
|
+
# End of file
|
@@ -8,73 +8,67 @@ require_relative '../../lib/cukedep/cuke-runner'
|
|
8
8
|
|
9
9
|
|
10
10
|
module Cukedep # Open module to get rid of long qualified names
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
file_dir + '/sample_features'
|
17
|
-
end
|
18
|
-
|
19
|
-
subject { CukeRunner.new(base_dir, project_dir, Config.default) }
|
20
|
-
|
21
|
-
before(:each) do
|
22
|
-
@orig_dir = Dir.getwd
|
23
|
-
Dir.chdir(File.dirname(__FILE__))
|
24
|
-
end
|
25
|
-
|
26
|
-
after(:each) do
|
27
|
-
Dir.chdir(@orig_dir)
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
context 'Creation & initialization:' do
|
32
|
-
|
33
|
-
it 'should be created with three arguments' do
|
34
|
-
expect { CukeRunner.new(base_dir, project_dir, Config.default) }.not_to raise_error
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should know its work directory' do
|
38
|
-
expect(subject.base_dir).to eq(base_dir)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'should know the project directory' do
|
42
|
-
expect(subject.proj_dir).to eq(File.expand_path(project_dir))
|
43
|
-
end
|
44
|
-
end # context
|
45
|
-
|
46
|
-
|
47
|
-
context 'Provided services:' do
|
48
|
-
|
49
|
-
it 'should launch Cucumber when requested' do
|
50
|
-
#subject.invoke
|
11
|
+
describe CukeRunner do
|
12
|
+
let(:project_dir) { '../../sample' }
|
13
|
+
let(:base_dir) do
|
14
|
+
file_dir = File.dirname(__FILE__)
|
15
|
+
file_dir + '/sample_features'
|
51
16
|
end
|
52
17
|
|
53
|
-
|
54
|
-
expect { subject.before_all }.not_to raise_error
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should reject a second 'before_all' event" do
|
58
|
-
subject.before_all
|
59
|
-
err_msg = "expected state was 'Initialized' instead of 'ReadyToRun'."
|
60
|
-
expect { subject.before_all }.to raise_error(StandardError, err_msg)
|
61
|
-
end
|
18
|
+
subject { CukeRunner.new(base_dir, project_dir, Config.default) }
|
62
19
|
|
63
|
-
|
64
|
-
|
65
|
-
|
20
|
+
before(:each) do
|
21
|
+
@orig_dir = Dir.getwd
|
22
|
+
Dir.chdir(File.dirname(__FILE__))
|
66
23
|
end
|
67
24
|
|
68
|
-
|
69
|
-
|
70
|
-
#expect {
|
71
|
-
subject.run!(['a_few_tests.feature']) #}.not_to raise_error
|
25
|
+
after(:each) do
|
26
|
+
Dir.chdir(@orig_dir)
|
72
27
|
end
|
73
28
|
|
74
|
-
end # context
|
75
|
-
|
76
|
-
end # describe
|
77
29
|
|
30
|
+
context 'Creation & initialization:' do
|
31
|
+
it 'should be created with three arguments' do
|
32
|
+
expect { CukeRunner.new(base_dir, project_dir, Config.default) }
|
33
|
+
.not_to raise_error
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should know its work directory' do
|
37
|
+
expect(subject.base_dir).to eq(base_dir)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should know the project directory' do
|
41
|
+
expect(subject.proj_dir).to eq(File.expand_path(project_dir))
|
42
|
+
end
|
43
|
+
end # context
|
44
|
+
|
45
|
+
|
46
|
+
context 'Provided services:' do
|
47
|
+
it 'should launch Cucumber when requested' do
|
48
|
+
# subject.invoke
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should handle the 'before_all' event" do
|
52
|
+
expect { subject.before_all }.not_to raise_error
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should reject a second 'before_all' event" do
|
56
|
+
subject.before_all
|
57
|
+
err_msg = "expected state was 'Initialized' instead of 'ReadyToRun'."
|
58
|
+
expect { subject.before_all }.to raise_error(StandardError, err_msg)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should handle the 'after_all' event" do
|
62
|
+
subject.before_all
|
63
|
+
expect { subject.after_all }.not_to raise_error
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should run the designated feature files' do
|
67
|
+
subject.before_all
|
68
|
+
# expect {
|
69
|
+
subject.run!(['a_few_tests.feature']) # }.not_to raise_error
|
70
|
+
end
|
71
|
+
end # context
|
72
|
+
end # describe
|
78
73
|
end # module
|
79
|
-
|
80
|
-
# End of file
|
74
|
+
# End of file
|
@@ -6,31 +6,26 @@ require_relative '../spec_helper'
|
|
6
6
|
require_relative '../../lib/cukedep/customization'
|
7
7
|
|
8
8
|
module Cukedep # Open module to get rid of long qualified names
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
end # context
|
31
|
-
|
32
|
-
end # describe
|
33
|
-
|
9
|
+
describe Customization do
|
10
|
+
context 'Provided services:' do
|
11
|
+
it 'should load hook handlers' do
|
12
|
+
directory = File.join(File.dirname(__FILE__), '/sample_features')
|
13
|
+
|
14
|
+
expect { subject.build_handlers(directory) }.not_to raise_error
|
15
|
+
expect(subject.build_handlers(directory)).not_to be_nil
|
16
|
+
handlers = subject.build_handlers(directory)
|
17
|
+
expect(handlers[:before_hooks].size).to eq(2)
|
18
|
+
expect(handlers[:after_hooks].size).to eq(2)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should return nil when hook file absent' do
|
22
|
+
directory = File.dirname(__FILE__)
|
23
|
+
|
24
|
+
expect { subject.build_handlers(directory) }.not_to raise_error
|
25
|
+
expect(subject.build_handlers(directory)).to be_nil
|
26
|
+
end
|
27
|
+
end # context
|
28
|
+
end # describe
|
34
29
|
end # module
|
35
30
|
|
36
|
-
# End of file
|
31
|
+
# End of file
|
@@ -2,26 +2,28 @@ require 'pp'
|
|
2
2
|
|
3
3
|
require_relative '../../lib/cukedep/file-action'
|
4
4
|
|
5
|
-
copy_config = {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
copy_config = {
|
6
|
+
save_patterns: [],
|
7
|
+
save_subdir: '',
|
8
|
+
delete_patterns: [],
|
9
|
+
delete_subdir: '',
|
10
|
+
copy_patterns: ['*.txt'],
|
11
|
+
copy_subdir: ''
|
12
|
+
}
|
11
13
|
|
12
14
|
pp Dir.pwd
|
13
15
|
instance = Cukedep::ActionTriplet.new(copy_config)
|
14
|
-
|
15
|
-
files_to_copy_dir = '
|
16
|
+
path = 'C:/Ruby193/lib/ruby/site_ruby/Cukedep/spec/cukedep/'
|
17
|
+
files_to_copy_dir = path + 'sample_features/files_to_copy'
|
16
18
|
|
17
19
|
Dir.chdir(files_to_copy_dir)
|
18
20
|
pp Dir.pwd
|
19
21
|
|
20
|
-
proj_dir =
|
22
|
+
proj_dir = path + 'dummy_project'
|
21
23
|
instance.run!(Dir.getwd, proj_dir)
|
22
24
|
|
23
25
|
# Check that the project dir contain the requested files
|
24
26
|
Dir.chdir(proj_dir)
|
25
27
|
pp Dir.pwd # TODO
|
26
28
|
actuals = Dir['*.*']
|
27
|
-
pp actuals
|
29
|
+
pp actuals
|
@@ -10,12 +10,11 @@ require_relative '../../lib/cukedep/gherkin-listener'
|
|
10
10
|
require_relative '../../lib/cukedep/feature-model'
|
11
11
|
|
12
12
|
module Cukedep # Open module to get rid of long qualified names
|
13
|
-
|
14
13
|
describe FeatureModel do
|
15
14
|
# An array of FeatureFile objects created after parsing sample files.
|
16
15
|
FeatureFiles = begin
|
17
16
|
listener = GherkinListener.new
|
18
|
-
|
17
|
+
extend(FileParsing) # Add behaviour from mixin module
|
19
18
|
parse_for(listener) # Method from mixin to parse sample feature files
|
20
19
|
listener.feature_files
|
21
20
|
end
|
@@ -31,7 +30,6 @@ describe FeatureModel do
|
|
31
30
|
it 'should know its feature file objects' do
|
32
31
|
expect(subject.feature_files).to eq(FeatureFiles)
|
33
32
|
end
|
34
|
-
|
35
33
|
end # context
|
36
34
|
|
37
35
|
context 'Provided services:' do
|
@@ -52,7 +50,7 @@ describe FeatureModel do
|
|
52
50
|
second_id = 'qux'
|
53
51
|
found = subject.select_by_ids(one_id, second_id)
|
54
52
|
expect(found.size).to eq(2)
|
55
|
-
actual_ids = found.map {|ff| ff.feature.identifier}
|
53
|
+
actual_ids = found.map { |ff| ff.feature.identifier }
|
56
54
|
expected_ids = [one_id, second_id]
|
57
55
|
expect(actual_ids.sort).to eq(expected_ids.sort)
|
58
56
|
|
@@ -60,29 +58,31 @@ describe FeatureModel do
|
|
60
58
|
wrong_id = 'does_not_exist'
|
61
59
|
err_type = StandardError
|
62
60
|
err_msg = "No feature file with identifier 'does_not_exist'."
|
63
|
-
expect { subject.select_by_ids(wrong_id) }
|
61
|
+
expect { subject.select_by_ids(wrong_id) }
|
62
|
+
.to raise_error(err_type, err_msg)
|
64
63
|
end
|
65
64
|
|
66
65
|
|
67
66
|
it 'should resolve dependency links' do
|
68
67
|
mapping = subject.send(:id2features)
|
69
|
-
deps = subject.dependency_links
|
68
|
+
deps = subject.dependency_links
|
70
69
|
expect(deps).not_to be_empty
|
71
70
|
|
72
71
|
# Case of an identified feature without dependencies
|
73
|
-
case1 = deps.find {|a_dep| a_dep.dependee == mapping['baz']}
|
72
|
+
case1 = deps.find { |a_dep| a_dep.dependee == mapping['baz'] }
|
74
73
|
expect(case1.dependents).to be_empty
|
75
74
|
|
76
75
|
# Case of a feature having dependencies
|
77
|
-
case2 = deps.find {|a_dep| a_dep.dependee == mapping['foo']}
|
76
|
+
case2 = deps.find { |a_dep| a_dep.dependee == mapping['foo'] }
|
78
77
|
expectations = subject.select_by_ids('bar', 'qux')
|
79
78
|
expect(case2.dependents).to eq(expectations)
|
80
79
|
end
|
81
80
|
|
82
81
|
it 'should sort the feature files' do
|
83
|
-
sorted_files = subject.sort_features_by_dep
|
84
|
-
actual_order = sorted_files.map {|f| f.feature.identifier}
|
85
|
-
expected_order = %w
|
82
|
+
sorted_files = subject.sort_features_by_dep
|
83
|
+
actual_order = sorted_files.map { |f| f.feature.identifier }
|
84
|
+
expected_order = %w(qux baz quux bar foo)
|
85
|
+
expect(actual_order).to eq(expected_order)
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'should generate mapping reports' do
|
@@ -90,14 +90,11 @@ describe FeatureModel do
|
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'should generate dependency graph' do
|
93
|
-
subject.dependency_links
|
93
|
+
subject.dependency_links
|
94
94
|
subject.draw_dependency_graph('dependencies.dot')
|
95
95
|
end
|
96
|
-
|
97
96
|
end # context
|
98
|
-
|
99
97
|
end # describe
|
100
|
-
|
101
98
|
end # module
|
102
99
|
|
103
|
-
# End of file
|
100
|
+
# End of file
|