cuke_modeler 0.4.1 → 1.0.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 (252) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -17
  3. data/.travis.yml +1 -1
  4. data/Gemfile +4 -0
  5. data/History.rdoc +71 -3
  6. data/LICENSE.txt +22 -22
  7. data/README.md +24 -10
  8. data/Rakefile +2 -12
  9. data/cuke_modeler.gemspec +1 -1
  10. data/features/analysis/test_comparison.feature +37 -122
  11. data/features/modeling/background_modeling.feature +77 -0
  12. data/features/modeling/background_output.feature +42 -0
  13. data/features/modeling/cell_modeling.feature +23 -0
  14. data/features/modeling/cell_output.feature +22 -0
  15. data/features/modeling/directory_modeling.feature +65 -0
  16. data/features/modeling/directory_output.feature +12 -0
  17. data/features/modeling/doc_string_modeling.feature +61 -0
  18. data/features/modeling/doc_string_output.feature +32 -0
  19. data/features/modeling/example_modeling.feature +125 -0
  20. data/features/modeling/example_output.feature +39 -0
  21. data/features/modeling/feature_file_modeling.feature +40 -0
  22. data/features/modeling/feature_file_output.feature +12 -0
  23. data/features/modeling/feature_modeling.feature +109 -0
  24. data/features/modeling/feature_output.feature +104 -0
  25. data/features/modeling/model_output.feature +22 -0
  26. data/features/modeling/model_structure.feature +48 -0
  27. data/features/modeling/outline_modeling.feature +144 -0
  28. data/features/modeling/outline_output.feature +69 -0
  29. data/features/modeling/row_modeling.feature +48 -0
  30. data/features/modeling/row_output.feature +22 -0
  31. data/features/modeling/scenario_modeling.feature +118 -0
  32. data/features/modeling/scenario_output.feature +45 -0
  33. data/features/modeling/step_modeling.feature +84 -0
  34. data/features/modeling/step_output.feature +29 -0
  35. data/features/modeling/table_modeling.feature +50 -0
  36. data/features/modeling/table_output.feature +24 -0
  37. data/features/modeling/tag_modeling.feature +43 -0
  38. data/features/modeling/tag_output.feature +22 -0
  39. data/features/step_definitions/action_steps.rb +11 -1
  40. data/features/step_definitions/background_steps.rb +1 -85
  41. data/features/step_definitions/directory_steps.rb +2 -48
  42. data/features/step_definitions/doc_string_steps.rb +1 -67
  43. data/features/step_definitions/feature_file_steps.rb +2 -37
  44. data/features/step_definitions/feature_steps.rb +4 -100
  45. data/features/step_definitions/modeling_steps.rb +44 -0
  46. data/features/step_definitions/setup_steps.rb +19 -41
  47. data/features/step_definitions/step_steps.rb +2 -166
  48. data/features/step_definitions/table_steps.rb +1 -58
  49. data/features/step_definitions/tag_steps.rb +2 -72
  50. data/features/step_definitions/verification_steps.rb +152 -4
  51. data/features/support/env.rb +4 -6
  52. data/gemfiles/{gherkin.gemfile → gherkin2.gemfile} +4 -0
  53. data/gemfiles/gherkin3.gemfile +4 -0
  54. data/gemfiles/gherkin4.gemfile +4 -0
  55. data/lib/cuke_modeler.rb +24 -22
  56. data/lib/cuke_modeler/adapters/gherkin_2_adapter.rb +103 -31
  57. data/lib/cuke_modeler/adapters/gherkin_3_adapter.rb +103 -40
  58. data/lib/cuke_modeler/adapters/gherkin_4_adapter.rb +111 -50
  59. data/lib/cuke_modeler/containing.rb +255 -4
  60. data/lib/cuke_modeler/described.rb +28 -0
  61. data/lib/cuke_modeler/models/background.rb +66 -0
  62. data/lib/cuke_modeler/models/cell.rb +48 -0
  63. data/lib/cuke_modeler/models/directory.rb +95 -0
  64. data/lib/cuke_modeler/models/doc_string.rb +59 -0
  65. data/lib/cuke_modeler/models/example.rb +167 -0
  66. data/lib/cuke_modeler/models/feature.rb +106 -0
  67. data/lib/cuke_modeler/models/feature_file.rb +64 -0
  68. data/lib/cuke_modeler/models/model.rb +32 -0
  69. data/lib/cuke_modeler/models/outline.rb +79 -0
  70. data/lib/cuke_modeler/models/row.rb +49 -0
  71. data/lib/cuke_modeler/models/scenario.rb +69 -0
  72. data/lib/cuke_modeler/models/step.rb +68 -0
  73. data/lib/cuke_modeler/models/table.rb +67 -0
  74. data/lib/cuke_modeler/models/tag.rb +46 -0
  75. data/lib/cuke_modeler/named.rb +19 -0
  76. data/lib/cuke_modeler/nested.rb +22 -15
  77. data/lib/cuke_modeler/parsed.rb +11 -0
  78. data/lib/cuke_modeler/parsing.rb +66 -83
  79. data/lib/cuke_modeler/sourceable.rb +3 -11
  80. data/lib/cuke_modeler/stepped.rb +24 -0
  81. data/lib/cuke_modeler/taggable.rb +6 -29
  82. data/lib/cuke_modeler/version.rb +2 -1
  83. data/spec/integration/background_integration_spec.rb +332 -7
  84. data/spec/integration/cell_integration_spec.rb +321 -0
  85. data/spec/integration/directory_integration_spec.rb +175 -9
  86. data/spec/integration/doc_string_integration_spec.rb +318 -7
  87. data/spec/integration/example_integration_spec.rb +602 -19
  88. data/spec/integration/feature_file_integration_spec.rb +98 -3
  89. data/spec/integration/feature_integration_spec.rb +445 -27
  90. data/spec/integration/gherkin_2_adapter_spec.rb +122 -0
  91. data/spec/integration/gherkin_3_adapter_spec.rb +125 -0
  92. data/spec/integration/gherkin_4_adapter_spec.rb +123 -0
  93. data/spec/integration/model_integration_spec.rb +15 -0
  94. data/spec/integration/nested_integration_spec.rb +91 -0
  95. data/spec/integration/outline_integration_spec.rb +485 -12
  96. data/spec/integration/parsing_integration_spec.rb +85 -0
  97. data/spec/integration/row_integration_spec.rb +221 -18
  98. data/spec/integration/scenario_integration_spec.rb +368 -14
  99. data/spec/integration/shared/models_integration_specs.rb +18 -0
  100. data/spec/integration/step_integration_spec.rb +328 -77
  101. data/spec/integration/table_integration_spec.rb +242 -20
  102. data/spec/integration/tag_integration_spec.rb +178 -13
  103. data/spec/spec_helper.rb +32 -18
  104. data/spec/unit/background_unit_spec.rb +24 -44
  105. data/spec/unit/cell_unit_spec.rb +73 -0
  106. data/spec/unit/described_unit_spec.rb +23 -0
  107. data/spec/unit/directory_unit_spec.rb +52 -62
  108. data/spec/unit/doc_string_unit_spec.rb +47 -100
  109. data/spec/unit/example_unit_spec.rb +50 -296
  110. data/spec/unit/feature_file_unit_spec.rb +53 -52
  111. data/spec/unit/feature_unit_spec.rb +39 -83
  112. data/spec/unit/model_unit_spec.rb +15 -0
  113. data/spec/unit/named_unit_spec.rb +23 -0
  114. data/spec/unit/nested_unit_spec.rb +24 -21
  115. data/spec/unit/outline_unit_spec.rb +46 -69
  116. data/spec/unit/parsed_unit_spec.rb +27 -0
  117. data/spec/unit/parsing_unit_spec.rb +2 -70
  118. data/spec/unit/row_unit_spec.rb +22 -51
  119. data/spec/unit/scenario_unit_spec.rb +27 -59
  120. data/spec/unit/{bare_bones_unit_specs.rb → shared/bare_bones_models_unit_specs.rb} +2 -2
  121. data/spec/unit/shared/containing_models_unit_specs.rb +18 -0
  122. data/spec/unit/shared/described_models_unit_specs.rb +38 -0
  123. data/spec/unit/shared/models_unit_specs.rb +15 -0
  124. data/spec/unit/shared/named_models_unit_specs.rb +39 -0
  125. data/spec/unit/shared/nested_models_unit_specs.rb +51 -0
  126. data/spec/unit/shared/parsed_models_unit_specs.rb +39 -0
  127. data/spec/unit/shared/prepopulated_models_unit_specs.rb +18 -0
  128. data/spec/unit/shared/sourced_models_unit_specs.rb +39 -0
  129. data/spec/unit/shared/stepped_models_unit_specs.rb +46 -0
  130. data/spec/unit/shared/stringifiable_models_unit_specs.rb +18 -0
  131. data/spec/unit/shared/tagged_models_unit_specs.rb +72 -0
  132. data/spec/unit/sourceable_unit_spec.rb +12 -4
  133. data/spec/unit/step_unit_spec.rb +40 -231
  134. data/spec/unit/stepped_unit_spec.rb +23 -0
  135. data/spec/unit/table_unit_spec.rb +27 -89
  136. data/spec/unit/tag_unit_spec.rb +30 -53
  137. data/spec/unit/taggable_unit_spec.rb +26 -42
  138. data/todo.txt +32 -0
  139. metadata +135 -217
  140. data/features/analysis/test_manipulation.feature +0 -37
  141. data/features/modeling/gherkin/background_modeling.feature +0 -65
  142. data/features/modeling/gherkin/background_output.feature +0 -131
  143. data/features/modeling/gherkin/directory_modeling.feature +0 -110
  144. data/features/modeling/gherkin/directory_output.feature +0 -14
  145. data/features/modeling/gherkin/doc_string_modeling.feature +0 -53
  146. data/features/modeling/gherkin/doc_string_output.feature +0 -72
  147. data/features/modeling/gherkin/example_modeling.feature +0 -101
  148. data/features/modeling/gherkin/example_output.feature +0 -193
  149. data/features/modeling/gherkin/feature_file_modeling.feature +0 -54
  150. data/features/modeling/gherkin/feature_file_output.feature +0 -14
  151. data/features/modeling/gherkin/feature_modeling.feature +0 -154
  152. data/features/modeling/gherkin/feature_output.feature +0 -245
  153. data/features/modeling/gherkin/outline_modeling.feature +0 -90
  154. data/features/modeling/gherkin/outline_output.feature +0 -198
  155. data/features/modeling/gherkin/row_modeling.feature +0 -68
  156. data/features/modeling/gherkin/row_output.feature +0 -28
  157. data/features/modeling/gherkin/scenario_modeling.feature +0 -79
  158. data/features/modeling/gherkin/scenario_output.feature +0 -148
  159. data/features/modeling/gherkin/step_modeling.feature +0 -75
  160. data/features/modeling/gherkin/step_output.feature +0 -53
  161. data/features/modeling/gherkin/table_modeling.feature +0 -42
  162. data/features/modeling/gherkin/table_output.feature +0 -43
  163. data/features/modeling/gherkin/table_row_modeling.feature +0 -57
  164. data/features/modeling/gherkin/table_row_output.feature +0 -28
  165. data/features/modeling/gherkin/tag_modeling.feature +0 -48
  166. data/features/modeling/gherkin/tag_output.feature +0 -17
  167. data/features/modeling/gherkin3/background_modeling.feature +0 -64
  168. data/features/modeling/gherkin3/background_output.feature +0 -131
  169. data/features/modeling/gherkin3/directory_modeling.feature +0 -110
  170. data/features/modeling/gherkin3/directory_output.feature +0 -14
  171. data/features/modeling/gherkin3/doc_string_modeling.feature +0 -53
  172. data/features/modeling/gherkin3/doc_string_output.feature +0 -72
  173. data/features/modeling/gherkin3/example_modeling.feature +0 -100
  174. data/features/modeling/gherkin3/example_output.feature +0 -207
  175. data/features/modeling/gherkin3/feature_file_modeling.feature +0 -54
  176. data/features/modeling/gherkin3/feature_file_output.feature +0 -14
  177. data/features/modeling/gherkin3/feature_modeling.feature +0 -155
  178. data/features/modeling/gherkin3/feature_output.feature +0 -249
  179. data/features/modeling/gherkin3/outline_modeling.feature +0 -89
  180. data/features/modeling/gherkin3/outline_output.feature +0 -255
  181. data/features/modeling/gherkin3/row_modeling.feature +0 -68
  182. data/features/modeling/gherkin3/row_output.feature +0 -28
  183. data/features/modeling/gherkin3/scenario_modeling.feature +0 -78
  184. data/features/modeling/gherkin3/scenario_output.feature +0 -148
  185. data/features/modeling/gherkin3/step_modeling.feature +0 -75
  186. data/features/modeling/gherkin3/step_output.feature +0 -53
  187. data/features/modeling/gherkin3/table_modeling.feature +0 -42
  188. data/features/modeling/gherkin3/table_output.feature +0 -43
  189. data/features/modeling/gherkin3/table_row_modeling.feature +0 -57
  190. data/features/modeling/gherkin3/table_row_output.feature +0 -28
  191. data/features/modeling/gherkin3/tag_modeling.feature +0 -49
  192. data/features/modeling/gherkin3/tag_output.feature +0 -17
  193. data/features/modeling/gherkin4/background_modeling.feature +0 -64
  194. data/features/modeling/gherkin4/background_output.feature +0 -131
  195. data/features/modeling/gherkin4/directory_modeling.feature +0 -110
  196. data/features/modeling/gherkin4/directory_output.feature +0 -14
  197. data/features/modeling/gherkin4/doc_string_modeling.feature +0 -53
  198. data/features/modeling/gherkin4/doc_string_output.feature +0 -72
  199. data/features/modeling/gherkin4/example_modeling.feature +0 -100
  200. data/features/modeling/gherkin4/example_output.feature +0 -193
  201. data/features/modeling/gherkin4/feature_file_modeling.feature +0 -54
  202. data/features/modeling/gherkin4/feature_file_output.feature +0 -14
  203. data/features/modeling/gherkin4/feature_modeling.feature +0 -153
  204. data/features/modeling/gherkin4/feature_output.feature +0 -245
  205. data/features/modeling/gherkin4/outline_modeling.feature +0 -89
  206. data/features/modeling/gherkin4/outline_output.feature +0 -198
  207. data/features/modeling/gherkin4/row_modeling.feature +0 -68
  208. data/features/modeling/gherkin4/row_output.feature +0 -28
  209. data/features/modeling/gherkin4/scenario_modeling.feature +0 -78
  210. data/features/modeling/gherkin4/scenario_output.feature +0 -148
  211. data/features/modeling/gherkin4/step_modeling.feature +0 -75
  212. data/features/modeling/gherkin4/step_output.feature +0 -53
  213. data/features/modeling/gherkin4/table_modeling.feature +0 -42
  214. data/features/modeling/gherkin4/table_output.feature +0 -43
  215. data/features/modeling/gherkin4/table_row_modeling.feature +0 -57
  216. data/features/modeling/gherkin4/table_row_output.feature +0 -28
  217. data/features/modeling/gherkin4/tag_modeling.feature +0 -48
  218. data/features/modeling/gherkin4/tag_output.feature +0 -17
  219. data/features/step_definitions/outline_steps.rb +0 -258
  220. data/features/step_definitions/test_steps.rb +0 -123
  221. data/lib/cuke_modeler/background.rb +0 -38
  222. data/lib/cuke_modeler/directory.rb +0 -83
  223. data/lib/cuke_modeler/doc_string.rb +0 -87
  224. data/lib/cuke_modeler/example.rb +0 -195
  225. data/lib/cuke_modeler/feature.rb +0 -147
  226. data/lib/cuke_modeler/feature_element.rb +0 -73
  227. data/lib/cuke_modeler/feature_file.rb +0 -77
  228. data/lib/cuke_modeler/outline.rb +0 -68
  229. data/lib/cuke_modeler/raw.rb +0 -20
  230. data/lib/cuke_modeler/row.rb +0 -64
  231. data/lib/cuke_modeler/scenario.rb +0 -45
  232. data/lib/cuke_modeler/step.rb +0 -216
  233. data/lib/cuke_modeler/table.rb +0 -90
  234. data/lib/cuke_modeler/table_row.rb +0 -64
  235. data/lib/cuke_modeler/tag.rb +0 -62
  236. data/lib/cuke_modeler/test_element.rb +0 -79
  237. data/lib/cuke_modeler/world.rb +0 -113
  238. data/spec/integration/table_row_integration_spec.rb +0 -76
  239. data/spec/integration/world_integration_spec.rb +0 -14
  240. data/spec/unit/containing_element_unit_specs.rb +0 -18
  241. data/spec/unit/feature_element_unit_spec.rb +0 -19
  242. data/spec/unit/feature_element_unit_specs.rb +0 -52
  243. data/spec/unit/nested_element_unit_specs.rb +0 -39
  244. data/spec/unit/prepopulated_unit_specs.rb +0 -14
  245. data/spec/unit/raw_element_unit_specs.rb +0 -27
  246. data/spec/unit/raw_unit_spec.rb +0 -28
  247. data/spec/unit/sourced_element_unit_specs.rb +0 -18
  248. data/spec/unit/table_row_unit_spec.rb +0 -102
  249. data/spec/unit/tagged_element_unit_specs.rb +0 -67
  250. data/spec/unit/test_element_unit_spec.rb +0 -54
  251. data/spec/unit/test_element_unit_specs.rb +0 -34
  252. data/spec/unit/world_unit_spec.rb +0 -140
@@ -0,0 +1,106 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling a feature in a Cucumber suite.
4
+
5
+ class Feature < Model
6
+
7
+ include Parsed
8
+ include Named
9
+ include Described
10
+ include Taggable
11
+ include Sourceable
12
+
13
+
14
+ # The Background object contained by the Feature
15
+ attr_accessor :background
16
+
17
+ # The Scenario and Outline objects contained by the Feature
18
+ attr_accessor :tests
19
+
20
+
21
+ # Creates a new Feature object and, if *source_text* is provided, populates the
22
+ # object.
23
+ def initialize(source_text = nil)
24
+ @tags = []
25
+ @tests = []
26
+
27
+ super(source_text)
28
+
29
+ if source_text
30
+ parsed_feature_data = parse_source(source_text)
31
+ populate_feature(self, parsed_feature_data)
32
+ end
33
+ end
34
+
35
+ # Returns *true* if the feature contains a background, *false* otherwise.
36
+ def has_background?
37
+ !@background.nil?
38
+ end
39
+
40
+ # Returns the scenario models contained in the feature.
41
+ def scenarios
42
+ @tests.select { |test| test.is_a? Scenario }
43
+ end
44
+
45
+ # Returns the outline models contained in the feature.
46
+ def outlines
47
+ @tests.select { |test| test.is_a? Outline }
48
+ end
49
+
50
+ # Returns the number of test cases contained in the feature. A test case is a
51
+ # single set of test values, such as an individual scenario or one example row
52
+ # of an outline.
53
+ def test_case_count
54
+ scenarios.count + outlines.reduce(0) { |outline_sum, outline|
55
+ outline_sum += outline.examples.reduce(0) { |example_sum, example|
56
+ example_sum += example.argument_rows.count
57
+ }
58
+ }
59
+ end
60
+
61
+ # Returns the model objects that belong to this model.
62
+ def children
63
+ models = tests + tags
64
+ models << background if background
65
+
66
+ models
67
+ end
68
+
69
+ # Returns a string representation of this model. For a feature model,
70
+ # this will be Gherkin text that is equivalent to the feature being modeled.
71
+ def to_s
72
+ text = ''
73
+
74
+ text << tag_output_string + "\n" unless tags.empty?
75
+ text << "Feature:#{name_output_string}"
76
+ text << "\n" + description_output_string unless (description.nil? || description.empty?)
77
+ text << "\n\n" + background_output_string if background
78
+ text << "\n\n" + tests_output_string unless tests.empty?
79
+
80
+ text
81
+ end
82
+
83
+
84
+ private
85
+
86
+
87
+ def parse_source(source_text)
88
+ parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_feature.feature')
89
+
90
+ parsed_file.first
91
+ end
92
+
93
+ def background_output_string
94
+ test_output_string(background)
95
+ end
96
+
97
+ def tests_output_string
98
+ tests.collect { |test| test_output_string(test) }.join("\n\n")
99
+ end
100
+
101
+ def test_output_string(model)
102
+ model.to_s.split("\n").collect { |line| line.empty? ? '' : " #{line}" }.join("\n")
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,64 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling a feature file in a Cucumber suite.
4
+
5
+ class FeatureFile < Model
6
+
7
+
8
+ # The feature model contained by the modeled feature file
9
+ attr_accessor :feature
10
+
11
+ # The file path of the modeled feature file
12
+ attr_accessor :path
13
+
14
+
15
+ # Creates a new FeatureFile object and, if *file_path* is provided,
16
+ # populates the object.
17
+ def initialize(file_path = nil)
18
+ @path = file_path
19
+
20
+ super(file_path)
21
+
22
+ if file_path
23
+ raise(ArgumentError, "Unknown file: #{file_path.inspect}") unless File.exists?(file_path)
24
+
25
+ processed_feature_file_data = process_feature_file(file_path)
26
+ populate_featurefile(self, processed_feature_file_data)
27
+ end
28
+
29
+ end
30
+
31
+ # Returns the name of the modeled feature file.
32
+ def name
33
+ File.basename(@path.gsub('\\', '/')) if @path
34
+ end
35
+
36
+ # Returns the model objects that belong to this model.
37
+ def children
38
+ [@feature]
39
+ end
40
+
41
+ # Returns a string representation of this model. For a feature file
42
+ # model, this will be the path of the modeled feature file.
43
+ def to_s
44
+ path.to_s
45
+ end
46
+
47
+
48
+ private
49
+
50
+
51
+ def process_feature_file(file_path)
52
+ feature_file_data = {'path' => file_path}
53
+
54
+ source_text = IO.read(file_path)
55
+ feature = Parsing::parse_text(source_text, file_path).first
56
+
57
+ feature_file_data['feature'] = feature
58
+
59
+
60
+ feature_file_data
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,32 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling an element of a Cucumber suite.
4
+
5
+ class Model
6
+
7
+ include Nested
8
+ include Containing
9
+
10
+
11
+ # Creates a new Model object and, if *source_text* is provided,
12
+ # populates the object.
13
+ def initialize(source_text = nil)
14
+ raise(ArgumentError, "Can only create models from Strings but was given a #{source_text.class}.") if source_text && !source_text.is_a?(String)
15
+
16
+ # This should be overridden by a child class
17
+ end
18
+
19
+ # Returns a string representation of this model.
20
+ def to_s
21
+ # This should be overridden by a child class
22
+ super
23
+ end
24
+
25
+ # Returns the model objects that belong to this model.
26
+ def children
27
+ # This should be overridden by a child class
28
+ []
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,79 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling an individual outline in a Cucumber suite.
4
+
5
+ class Outline < Model
6
+
7
+ include Parsed
8
+ include Named
9
+ include Described
10
+ include Stepped
11
+ include Sourceable
12
+ include Taggable
13
+
14
+
15
+ # The Example objects contained by the Outline
16
+ attr_accessor :examples
17
+
18
+
19
+ # Creates a new Outline object and, if *source_text* is provided, populates the
20
+ # object.
21
+ def initialize(source_text = nil)
22
+ @steps = []
23
+ @tags = []
24
+ @examples = []
25
+
26
+ super(source_text)
27
+
28
+ if source_text
29
+ parsed_outline_data = parse_source(source_text)
30
+ populate_outline(self, parsed_outline_data)
31
+ end
32
+ end
33
+
34
+ # Returns *true* if the two models have equivalent steps and *false* otherwise.
35
+ def ==(other_model)
36
+ return false unless other_model.respond_to?(:steps)
37
+
38
+ steps == other_model.steps
39
+ end
40
+
41
+ # Returns the model objects that belong to this model.
42
+ def children
43
+ examples + steps + tags
44
+ end
45
+
46
+ # Returns a string representation of this model. For an outline model,
47
+ # this will be Gherkin text that is equivalent to the outline being modeled.
48
+ def to_s
49
+ text = ''
50
+
51
+ text << tag_output_string + "\n" unless tags.empty?
52
+ text << "Scenario Outline:#{name_output_string}"
53
+ text << "\n" + description_output_string unless (description.nil? || description.empty?)
54
+ text << "\n" unless (steps.empty? || description.nil? || description.empty?)
55
+ text << "\n" + steps_output_string unless steps.empty?
56
+ text << "\n\n" + examples_output_string unless examples.empty?
57
+
58
+ text
59
+ end
60
+
61
+
62
+ private
63
+
64
+
65
+ def parse_source(source_text)
66
+ base_file_string = "Feature: Fake feature to parse\n"
67
+ source_text = base_file_string + source_text
68
+
69
+ parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_outline.feature')
70
+
71
+ parsed_file.first['elements'].first
72
+ end
73
+
74
+ def examples_output_string
75
+ examples.empty? ? '' : examples.collect { |example| example.to_s }.join("\n\n")
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,49 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling a single row of a step table or example table.
4
+
5
+ class Row < Model
6
+
7
+ include Sourceable
8
+ include Parsed
9
+
10
+ # The cell models that make up the row
11
+ attr_accessor :cells
12
+
13
+
14
+ # Creates a new Row object and, if *source_text* is provided, populates
15
+ # the object.
16
+ def initialize(source_text = nil)
17
+ @cells = []
18
+
19
+ super(source_text)
20
+
21
+ if source_text
22
+ parsed_row_data = parse_source(source_text)
23
+ populate_row(self, parsed_row_data)
24
+ end
25
+ end
26
+
27
+ # Returns a string representation of this model. For a row model,
28
+ # this will be Gherkin text that is equivalent to the row being modeled.
29
+ def to_s
30
+ text_cells = cells.collect { |cell| cell.to_s }
31
+
32
+ "| #{text_cells.join(' | ')} |"
33
+ end
34
+
35
+
36
+ private
37
+
38
+
39
+ def parse_source(source_text)
40
+ base_file_string = "Feature: Fake feature to parse\nScenario:\n* fake step\n"
41
+ source_text = base_file_string + source_text
42
+
43
+ parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_row.feature')
44
+
45
+ parsed_file.first['elements'].first['steps'].first['table']['rows'].first
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,69 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling an individual scenario of a Cucumber suite.
4
+
5
+ class Scenario < Model
6
+
7
+ include Parsed
8
+ include Named
9
+ include Described
10
+ include Stepped
11
+ include Sourceable
12
+ include Taggable
13
+
14
+
15
+ # Creates a new Scenario object and, if *source_text* is provided, populates the
16
+ # object.
17
+ def initialize(source_text = nil)
18
+ @steps = []
19
+ @tags = []
20
+
21
+ super(source_text)
22
+
23
+ if source_text
24
+ parsed_scenario_data = parse_source(source_text)
25
+ populate_scenario(self, parsed_scenario_data)
26
+ end
27
+ end
28
+
29
+ # Returns *true* if the two models have equivalent steps and *false* otherwise.
30
+ def ==(other_model)
31
+ return false unless other_model.respond_to?(:steps)
32
+
33
+ steps == other_model.steps
34
+ end
35
+
36
+ # Returns the model objects that belong to this model.
37
+ def children
38
+ steps + tags
39
+ end
40
+
41
+ # Returns a string representation of this model. For a scenario model,
42
+ # this will be Gherkin text that is equivalent to the scenario being modeled.
43
+ def to_s
44
+ text = ''
45
+
46
+ text << tag_output_string + "\n" unless tags.empty?
47
+ text << "Scenario:#{name_output_string}"
48
+ text << "\n" + description_output_string unless (description.nil? || description.empty?)
49
+ text << "\n" unless (steps.empty? || description.nil? || description.empty?)
50
+ text << "\n" + steps_output_string unless steps.empty?
51
+
52
+ text
53
+ end
54
+
55
+
56
+ private
57
+
58
+
59
+ def parse_source(source_text)
60
+ base_file_string = "Feature: Fake feature to parse\n"
61
+ source_text = base_file_string + source_text
62
+
63
+ parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_scenario.feature')
64
+
65
+ parsed_file.first['elements'].first
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,68 @@
1
+ module CukeModeler
2
+
3
+ # A class modeling a single step of a background, scenario, or outline.
4
+
5
+ class Step < Model
6
+
7
+ include Sourceable
8
+ include Parsed
9
+
10
+
11
+ # The step's keyword
12
+ attr_accessor :keyword
13
+
14
+ # The base text of the step
15
+ attr_accessor :text
16
+
17
+ # The step's passed block
18
+ attr_accessor :block
19
+
20
+
21
+ # Creates a new Step object and, if *source_text* is provided, populates the
22
+ # object.
23
+ def initialize(source_text = nil)
24
+ super(source_text)
25
+
26
+ if source_text
27
+ parsed_step_data = parse_source(source_text)
28
+ populate_step(self, parsed_step_data)
29
+ end
30
+ end
31
+
32
+ # Returns *true* if the two steps have the same base text (i.e. minus any keyword,
33
+ # table, or doc string and *false* otherwise.
34
+ def ==(other_step)
35
+ return false unless other_step.respond_to?(:text)
36
+
37
+ text == other_step.text
38
+ end
39
+
40
+ # Returns the model objects that belong to this model.
41
+ def children
42
+ [block]
43
+ end
44
+
45
+ # Returns a string representation of this model. For a step model,
46
+ # this will be Gherkin text that is equivalent to the step being modeled.
47
+ def to_s
48
+ text = "#{keyword} #{self.text}"
49
+ text << "\n" + block.to_s.split("\n").collect { |line| " #{line}" }.join("\n") if block
50
+
51
+ text
52
+ end
53
+
54
+
55
+ private
56
+
57
+
58
+ def parse_source(source_text)
59
+ base_file_string = "Feature: Fake feature to parse\nScenario:\n"
60
+ source_text = base_file_string + source_text
61
+
62
+ parsed_file = Parsing::parse_text(source_text, 'cuke_modeler_stand_alone_step.feature')
63
+
64
+ parsed_file.first['elements'].first['steps'].first
65
+ end
66
+
67
+ end
68
+ end