cutedriver-driver 2.0.0.20210120164037

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 (226) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +16 -0
  3. data/bin/start_app_perf +200 -0
  4. data/bin/tdriver-devtools +3 -0
  5. data/config/sut_parameters.rb +52 -0
  6. data/config/sut_setup.rb +32 -0
  7. data/config/sut_teardown.rb +32 -0
  8. data/config/tdriver_custom_error_recovery.rb +83 -0
  9. data/ext/extconf.rb +70 -0
  10. data/ext/native_extensions.c +315 -0
  11. data/lib/matti.rb +25 -0
  12. data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +120 -0
  13. data/lib/tdriver-devtools/behaviour/old/xml/example/impl.rb_invalid +194 -0
  14. data/lib/tdriver-devtools/behaviour/old/xml/generate_behaviour_xml.rb +95 -0
  15. data/lib/tdriver-devtools/behaviour/old/xml/lib/tdriver_generator.rb +722 -0
  16. data/lib/tdriver-devtools/behaviour/old/xml/qdoc_generator.rb +321 -0
  17. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.method.template +43 -0
  18. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.module.template +54 -0
  19. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument.template +7 -0
  20. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.argument_type.template +7 -0
  21. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.exception.template +5 -0
  22. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.line.template +2 -0
  23. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.howto.template +5 -0
  24. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.method.template +23 -0
  25. data/lib/tdriver-devtools/behaviour/old/xml/templates/behaviour.xml.template +14 -0
  26. data/lib/tdriver-devtools/behaviour/old/xml/update +3 -0
  27. data/lib/tdriver-devtools/behaviour/xml/generate.rb +88 -0
  28. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +1945 -0
  29. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.default.template +1 -0
  30. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument.template +3 -0
  31. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.argument_type.template +4 -0
  32. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.exception.template +4 -0
  33. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.arguments.template +4 -0
  34. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.deprecated.template +3 -0
  35. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.exceptions.template +3 -0
  36. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.info.template +1 -0
  37. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.returns.template +3 -0
  38. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.tables.template +3 -0
  39. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.method.template +12 -0
  40. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.returns.template +5 -0
  41. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.item.template +1 -0
  42. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.row.template +2 -0
  43. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.table.template +8 -0
  44. data/lib/tdriver-devtools/behaviour/xml/templates/behaviour.xml.template +14 -0
  45. data/lib/tdriver-devtools/doc/behaviour_xml/QtExampleGestureBehaviour.xml +138 -0
  46. data/lib/tdriver-devtools/doc/behaviour_xml/created.rid +1 -0
  47. data/lib/tdriver-devtools/doc/behaviour_xml/tdriver.hash +1 -0
  48. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_hold.feature.xml +9 -0
  49. data/lib/tdriver-devtools/doc/feature_xml/qt_widget_tap.feature.xml +9 -0
  50. data/lib/tdriver-devtools/doc/generate.rb +917 -0
  51. data/lib/tdriver-devtools/doc/update +1 -0
  52. data/lib/tdriver-devtools/doc/xslt/html.rb +7 -0
  53. data/lib/tdriver-devtools/doc/xslt/template.xsl +2170 -0
  54. data/lib/tdriver-devtools/doc/xslt/update +3 -0
  55. data/lib/tdriver-devtools/plugin/placeholder.txt +1 -0
  56. data/lib/tdriver-devtools/tdriver-devtools.rb +404 -0
  57. data/lib/tdriver-devtools/tests/feature_tests/example/behaviour_example.rb +100 -0
  58. data/lib/tdriver-devtools/tests/feature_tests/generate.rb +82 -0
  59. data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +468 -0
  60. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_attribute.template +5 -0
  61. data/lib/tdriver-devtools/tests/feature_tests/templates/feature_method.template +5 -0
  62. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_attribute.template +5 -0
  63. data/lib/tdriver-devtools/tests/feature_tests/templates/scenario_method.template +5 -0
  64. data/lib/tdriver-devtools/tests/feature_tests/update +3 -0
  65. data/lib/tdriver.rb +23 -0
  66. data/lib/tdriver/base/behaviour/abstract.rb +29 -0
  67. data/lib/tdriver/base/behaviour/behaviours/object_abstract.rb +107 -0
  68. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +99 -0
  69. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +278 -0
  70. data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +119 -0
  71. data/lib/tdriver/base/behaviour/factory.rb +495 -0
  72. data/lib/tdriver/base/behaviour/loader.rb +46 -0
  73. data/lib/tdriver/base/command_data/command_data.rb +51 -0
  74. data/lib/tdriver/base/command_data/loader.rb +29 -0
  75. data/lib/tdriver/base/controller/abstraction.rb +56 -0
  76. data/lib/tdriver/base/controller/loader.rb +21 -0
  77. data/lib/tdriver/base/errors.rb +134 -0
  78. data/lib/tdriver/base/loader.rb +47 -0
  79. data/lib/tdriver/base/state_object.rb +373 -0
  80. data/lib/tdriver/base/sut/adapter.rb +54 -0
  81. data/lib/tdriver/base/sut/controller.rb +151 -0
  82. data/lib/tdriver/base/sut/factory.rb +339 -0
  83. data/lib/tdriver/base/sut/generic/behaviours/agent.rb +77 -0
  84. data/lib/tdriver/base/sut/generic/behaviours/application.rb +427 -0
  85. data/lib/tdriver/base/sut/generic/behaviours/controller.rb +67 -0
  86. data/lib/tdriver/base/sut/generic/behaviours/find.rb +107 -0
  87. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +337 -0
  88. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +1888 -0
  89. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +210 -0
  90. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +222 -0
  91. data/lib/tdriver/base/sut/generic/commands/agent.rb +43 -0
  92. data/lib/tdriver/base/sut/generic/commands/application.rb +274 -0
  93. data/lib/tdriver/base/sut/generic/commands/fixture.rb +47 -0
  94. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +94 -0
  95. data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +64 -0
  96. data/lib/tdriver/base/sut/generic/plugin.rb +97 -0
  97. data/lib/tdriver/base/sut/loader.rb +35 -0
  98. data/lib/tdriver/base/sut/sut.rb +98 -0
  99. data/lib/tdriver/base/test_object/abstract.rb +208 -0
  100. data/lib/tdriver/base/test_object/adapter.rb +740 -0
  101. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +144 -0
  102. data/lib/tdriver/base/test_object/behaviours/test_object.rb +1047 -0
  103. data/lib/tdriver/base/test_object/cache.rb +134 -0
  104. data/lib/tdriver/base/test_object/factory.rb +684 -0
  105. data/lib/tdriver/base/test_object/loader.rb +51 -0
  106. data/lib/tdriver/base/test_object/verification.rb +178 -0
  107. data/lib/tdriver/base/test_object/xml/abstraction.rb +63 -0
  108. data/lib/tdriver/base/test_object/xml/adapter.rb +773 -0
  109. data/lib/tdriver/env.rb +21 -0
  110. data/lib/tdriver/loader.rb +57 -0
  111. data/lib/tdriver/matti.rb +35 -0
  112. data/lib/tdriver/report/error_recovery/tdriver_custom_error_recovery.rb +83 -0
  113. data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +168 -0
  114. data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +106 -0
  115. data/lib/tdriver/report/report.rb +61 -0
  116. data/lib/tdriver/report/report_api.rb +348 -0
  117. data/lib/tdriver/report/report_combine.rb +86 -0
  118. data/lib/tdriver/report/report_crash_file_capture.rb +178 -0
  119. data/lib/tdriver/report/report_creator.rb +665 -0
  120. data/lib/tdriver/report/report_cucumber.rb +158 -0
  121. data/lib/tdriver/report/report_cucumber_listener.rb +184 -0
  122. data/lib/tdriver/report/report_cucumber_reporter.rb +181 -0
  123. data/lib/tdriver/report/report_data_presentation.rb +156 -0
  124. data/lib/tdriver/report/report_data_table.rb +64 -0
  125. data/lib/tdriver/report/report_execution_statistics.rb +400 -0
  126. data/lib/tdriver/report/report_file_capture.rb +159 -0
  127. data/lib/tdriver/report/report_graph_generator.rb +59 -0
  128. data/lib/tdriver/report/report_grouping.rb +541 -0
  129. data/lib/tdriver/report/report_javascript.rb +199 -0
  130. data/lib/tdriver/report/report_junit_xml.rb +147 -0
  131. data/lib/tdriver/report/report_rspec.rb +108 -0
  132. data/lib/tdriver/report/report_test_case_run.rb +725 -0
  133. data/lib/tdriver/report/report_test_run.rb +1476 -0
  134. data/lib/tdriver/report/report_test_unit.rb +223 -0
  135. data/lib/tdriver/report/report_writer.rb +1621 -0
  136. data/lib/tdriver/tdriver.rb +209 -0
  137. data/lib/tdriver/util/agent/loader.rb +22 -0
  138. data/lib/tdriver/util/agent/service.rb +107 -0
  139. data/lib/tdriver/util/common/array.rb +39 -0
  140. data/lib/tdriver/util/common/boolean.rb +48 -0
  141. data/lib/tdriver/util/common/crc16.rb +149 -0
  142. data/lib/tdriver/util/common/environment.rb +154 -0
  143. data/lib/tdriver/util/common/error.rb +40 -0
  144. data/lib/tdriver/util/common/exception.rb +53 -0
  145. data/lib/tdriver/util/common/exceptions.rb +12 -0
  146. data/lib/tdriver/util/common/file.rb +328 -0
  147. data/lib/tdriver/util/common/gem.rb +109 -0
  148. data/lib/tdriver/util/common/hash.rb +288 -0
  149. data/lib/tdriver/util/common/kernel.rb +253 -0
  150. data/lib/tdriver/util/common/loader.rb +47 -0
  151. data/lib/tdriver/util/common/numeric.rb +159 -0
  152. data/lib/tdriver/util/common/object.rb +159 -0
  153. data/lib/tdriver/util/common/retryable.rb +179 -0
  154. data/lib/tdriver/util/common/stackable.rb +185 -0
  155. data/lib/tdriver/util/common/string.rb +174 -0
  156. data/lib/tdriver/util/database/access.rb +240 -0
  157. data/lib/tdriver/util/database/connection.rb +44 -0
  158. data/lib/tdriver/util/database/error.rb +34 -0
  159. data/lib/tdriver/util/database/loader.rb +28 -0
  160. data/lib/tdriver/util/filters/attribute_filter.rb +121 -0
  161. data/lib/tdriver/util/filters/loader.rb +29 -0
  162. data/lib/tdriver/util/fixture/loader.rb +22 -0
  163. data/lib/tdriver/util/fixture/service.rb +211 -0
  164. data/lib/tdriver/util/hooking/hooking.rb +477 -0
  165. data/lib/tdriver/util/keymap/keymap.rb +81 -0
  166. data/lib/tdriver/util/loader.rb +80 -0
  167. data/lib/tdriver/util/localisation/error.rb +31 -0
  168. data/lib/tdriver/util/localisation/loader.rb +25 -0
  169. data/lib/tdriver/util/localisation/localisation.rb +762 -0
  170. data/lib/tdriver/util/logger/loader.rb +22 -0
  171. data/lib/tdriver/util/logger/logger.rb +591 -0
  172. data/lib/tdriver/util/operator_data/error.rb +29 -0
  173. data/lib/tdriver/util/operator_data/loader.rb +27 -0
  174. data/lib/tdriver/util/operator_data/operator_data.rb +93 -0
  175. data/lib/tdriver/util/other/config.rb +221 -0
  176. data/lib/tdriver/util/parameter/error.rb +48 -0
  177. data/lib/tdriver/util/parameter/loader.rb +25 -0
  178. data/lib/tdriver/util/parameter/parameter.rb +1161 -0
  179. data/lib/tdriver/util/plugin/abstract.rb +61 -0
  180. data/lib/tdriver/util/plugin/error.rb +0 -0
  181. data/lib/tdriver/util/plugin/loader.rb +28 -0
  182. data/lib/tdriver/util/plugin/service.rb +319 -0
  183. data/lib/tdriver/util/recorder/loader.rb +25 -0
  184. data/lib/tdriver/util/recorder/recorder.rb +72 -0
  185. data/lib/tdriver/util/recorder/scripter.rb +294 -0
  186. data/lib/tdriver/util/statistics/statistics.rb +89 -0
  187. data/lib/tdriver/util/user_data/error.rb +28 -0
  188. data/lib/tdriver/util/user_data/loader.rb +25 -0
  189. data/lib/tdriver/util/user_data/user_data.rb +104 -0
  190. data/lib/tdriver/util/video/camera.rb +67 -0
  191. data/lib/tdriver/util/video/camera_linux.rb +153 -0
  192. data/lib/tdriver/util/video/camera_windows.rb +174 -0
  193. data/lib/tdriver/util/video/loader.rb +31 -0
  194. data/lib/tdriver/util/video/video_utils.rb +139 -0
  195. data/lib/tdriver/util/xml/abstraction.rb +117 -0
  196. data/lib/tdriver/util/xml/attribute.rb +32 -0
  197. data/lib/tdriver/util/xml/builder.rb +53 -0
  198. data/lib/tdriver/util/xml/comment.rb +32 -0
  199. data/lib/tdriver/util/xml/document.rb +32 -0
  200. data/lib/tdriver/util/xml/element.rb +32 -0
  201. data/lib/tdriver/util/xml/error.rb +46 -0
  202. data/lib/tdriver/util/xml/loader.rb +62 -0
  203. data/lib/tdriver/util/xml/nil_node.rb +95 -0
  204. data/lib/tdriver/util/xml/nodeset.rb +32 -0
  205. data/lib/tdriver/util/xml/parsers/libxml/libxml.rb +140 -0
  206. data/lib/tdriver/util/xml/parsers/loader.rb +21 -0
  207. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +167 -0
  208. data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +66 -0
  209. data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +64 -0
  210. data/lib/tdriver/util/xml/parsers/nokogiri/comment.rb +39 -0
  211. data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +66 -0
  212. data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +39 -0
  213. data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +58 -0
  214. data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +212 -0
  215. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +237 -0
  216. data/lib/tdriver/util/xml/parsers/nokogiri/text.rb +39 -0
  217. data/lib/tdriver/util/xml/text.rb +32 -0
  218. data/lib/tdriver/util/xml/xml.rb +332 -0
  219. data/lib/tdriver/verify/verify.rb +2398 -0
  220. data/lib/tdriver/version.rb +21 -0
  221. data/xml/behaviours/generic.xml +530 -0
  222. data/xml/defaults/generic.xml +11 -0
  223. data/xml/defaults/sut_generic.xml +8 -0
  224. data/xml/parameters/tdriver_parameters.xml +23 -0
  225. data/xml/templates/generic.xml +292 -0
  226. metadata +324 -0
@@ -0,0 +1,82 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+ #!/usr/bin/env ruby
20
+ require 'rdoc/rdoc'
21
+
22
+ $templates = {}
23
+
24
+ module RDoc
25
+
26
+ class RDoc
27
+
28
+ # install custom generator to RDoc
29
+ def install_generator( name, filename )
30
+
31
+ GENERATORS[ name.to_s.downcase ] = Generator.new( filename, ( "%sFeatureTestGenerator" % [ name ] ).intern , name.to_s.downcase )
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ def load_templates
40
+
41
+ Dir.glob( File.join( File.dirname( File.expand_path( __FILE__ ) ), 'templates', '*.template' ) ).each{ | file |
42
+
43
+ name = File.basename( file ).gsub( '.template', '' )
44
+
45
+ $templates[ name.to_sym ] = open( file, 'r' ).read
46
+
47
+ }
48
+
49
+ end
50
+
51
+ if ARGV.count == 0
52
+
53
+ abort "\nUsage: #{ File.basename( $0 ) } filename.rb\n\n"
54
+
55
+ else
56
+
57
+ ARGV.each{ | filename |
58
+
59
+ abort("\nUnable to create feature test due to implementation file %s not found\n\n" % [ filename ] ) unless File.exist?( File.expand_path( filename ) )
60
+
61
+ }
62
+
63
+ begin
64
+
65
+ load_templates
66
+
67
+ RDoc::RDoc.new.tap{ | rdoc |
68
+
69
+ rdoc.install_generator( 'TDriver', File.expand_path( File.join( File.dirname( __FILE__ ), 'lib/custom_rdoc_generator.rb' ) ) )
70
+
71
+ rdoc.document( ['--inline-source', '--op', 'output', '--fmt', 'tdriver'] + ARGV )
72
+
73
+ }
74
+
75
+ rescue RDoc::RDocError => e
76
+
77
+ abort e.message
78
+
79
+ end
80
+
81
+ end
82
+
@@ -0,0 +1,468 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+ $scenarios = 0
21
+ $templates = {} unless defined?( $templates )
22
+
23
+ $scenario_files = {}
24
+
25
+ module Generators
26
+
27
+ abort("") unless defined?( RDoc )
28
+
29
+ class TDriverFeatureTestGenerator
30
+
31
+ def self.for( options )
32
+
33
+ new( options )
34
+
35
+ end
36
+
37
+ def initialize( options )
38
+
39
+ @options = options
40
+
41
+ @already_processed_files = []
42
+
43
+ @current_module_tests = []
44
+
45
+ @current_module = nil
46
+
47
+ @output = { :files => [], :classes => [], :modules => [], :attributes => [], :methods => [], :aliases => [], :constants => [], :requires => [], :includes => []}
48
+
49
+ end
50
+
51
+ def generate( files )
52
+
53
+ # process files
54
+ files.each{ | file |
55
+
56
+ process_file( file ) unless @already_processed_files.include?( file.file_absolute_name )
57
+
58
+ }
59
+
60
+ p "total scenarios: %s" % $scenarios
61
+
62
+ #p @already_processed_files
63
+
64
+ end
65
+
66
+ def process_file( file )
67
+
68
+ @module_path = []
69
+
70
+ @current_file = file
71
+
72
+ process_modules( file.modules )
73
+
74
+ end
75
+
76
+ def process_modules( modules )
77
+
78
+ modules.each{ | _module |
79
+
80
+ unless @already_processed_files.include?( _module.full_name )
81
+
82
+ @module_path.push( _module.name )
83
+
84
+ process_module( _module )
85
+
86
+ @module_path.pop
87
+
88
+ end
89
+
90
+ }
91
+
92
+ end
93
+
94
+ def process_methods( methods )
95
+
96
+ results = []
97
+
98
+ methods.each{ | method |
99
+
100
+ scenarios = process_method( method )
101
+
102
+ results << { :header => $templates[:feature_method] % [ "%s#%s" % [ @module_path.join("::"), method.name ], method.name, @module_path.join("::") ], :scenarios => scenarios, :file => generate_name( method.name ), :module_path => @module_path, :name => method.name } if scenarios.count > 0
103
+
104
+ }
105
+
106
+ results
107
+
108
+ end
109
+
110
+ def process_arguments( arguments )
111
+
112
+ # tokenize string
113
+ tokenizer = RubyLex.new( arguments )
114
+
115
+ # get first token
116
+ token = tokenizer.token
117
+
118
+ # set previous token to nil by default
119
+ previous_token = nil
120
+
121
+ args = []
122
+
123
+ capture = false
124
+ capture_depth = []
125
+
126
+ # loop while tokens available
127
+ while token
128
+
129
+ if [ RubyToken::TkLBRACE, RubyToken::TkLPAREN, RubyToken::TkLBRACK ].include?( token.class )
130
+
131
+ capture_depth << token
132
+
133
+ capture = true
134
+
135
+ elsif [ RubyToken::TkRBRACE, RubyToken::TkRPAREN, RubyToken::TkRBRACK ].include?( token.class )
136
+
137
+ capture_depth.pop
138
+
139
+ capture = false if capture_depth.empty?
140
+
141
+ # argument name
142
+ elsif capture == false
143
+
144
+ if token.kind_of?( RubyToken::TkIDENTIFIER )
145
+
146
+ args << [ token.name, nil, false ]
147
+
148
+ # &blocks and *arguments are handled as optional parameters
149
+ args.last[ -1 ] = true if [ RubyToken::TkBITAND, RubyToken::TkMULT ].include?( previous_token.class )
150
+
151
+ # detect optional argument
152
+ elsif token.kind_of?( RubyToken::TkASSIGN )
153
+
154
+ # mark arguments as optional
155
+ args.last[ -1 ] = true
156
+
157
+ opt = true
158
+
159
+ end
160
+
161
+ end
162
+
163
+ # store previous token
164
+ previous_token = token
165
+
166
+ # get next token
167
+ token = tokenizer.token
168
+
169
+ end
170
+
171
+ args
172
+
173
+ end
174
+
175
+ def generate_scenarios( mode, arguments_table = nil )
176
+
177
+ results = []
178
+
179
+ # first scenario with all required arguments
180
+ if mode.to_s =~ /method/
181
+
182
+ required_arguments = arguments_table.select{ | argument | argument.last == false }.to_a.collect{ | scenario | scenario.first } # Array conversion for ruby 1.9 compatibility
183
+
184
+ results << $templates[ mode ] % [ @current_method.name, "required", "(s)", @current_method.name, required_arguments.join(", ") ]
185
+
186
+ elsif mode.to_s =~ /attribute/
187
+
188
+ name = @current_attribute.first.name
189
+
190
+ name << "=" if @current_attribute.count > 1
191
+
192
+ results << $templates[ mode ] % [ name, name ]
193
+
194
+ end
195
+
196
+ unless arguments_table.nil?
197
+
198
+ # scenarios with one of each optional argument.. and eventually with all arguments
199
+ arguments_table.select{ | argument | argument.last == true }.to_a.collect{ | scenario | scenario
200
+ # Array conversion for ruby 1.9 compatibility
201
+ scenario = required_arguments << scenario.first
202
+
203
+ results << $templates[ mode ] % [ @current_method.name, "optional", " '%s'" % scenario.last.first, @current_method.name, scenario.join(", ") ]
204
+
205
+ }
206
+
207
+ end
208
+
209
+ results
210
+
211
+ end
212
+
213
+ def process_method( method )
214
+
215
+ scenarios = []
216
+
217
+ if ( method.visibility == :public && @module_path.first =~ /MobyBehaviour/ )
218
+
219
+ arguments_table = process_arguments( method.params )
220
+
221
+ @current_method = method
222
+
223
+ scenarios = generate_scenarios( :scenario_method, arguments_table )
224
+
225
+ $scenarios += scenarios.count
226
+
227
+ else
228
+
229
+ end
230
+
231
+ scenarios
232
+
233
+ end
234
+
235
+ # verify if
236
+ def has_method?( target, method_name )
237
+
238
+ target.method_list.select{ | method |
239
+
240
+ method.name == method_name
241
+
242
+ }.count > 0
243
+
244
+ end
245
+
246
+ def process_attributes( attributes )
247
+
248
+ results = []
249
+
250
+ attributes.each{ | attribute |
251
+
252
+ scenarios = process_attribute( attribute )
253
+
254
+ attr_name = attribute.name.gsub("=",'')
255
+
256
+ results << { :header => $templates[:feature_attribute] % [ "%s#%s" % [ @module_path.join("::"), attribute.name ], attr_name, @module_path.join("::") ], :scenarios => scenarios, :file => generate_name( attr_name ), :module_path => @module_path, :name => attr_name } if scenarios.count > 0
257
+
258
+ }
259
+
260
+ results
261
+
262
+ end
263
+
264
+ def process_attribute( attribute )
265
+
266
+ result = []
267
+
268
+ if ( @module_path.first =~ /MobyBehaviour/ )
269
+
270
+ @current_attribute = [ attribute ]
271
+
272
+ #p @module_path
273
+
274
+ scenarios = []
275
+
276
+ case attribute.rw
277
+
278
+ when 'RW'
279
+ # verify first that if attribute is overwritten as method
280
+ unless has_method?( @current_module[ :object ], attribute.name )
281
+ scenarios << generate_scenarios( :scenario_attribute )
282
+ scenarios.pop if scenarios.last == []
283
+ end
284
+
285
+ # verify first that if attribute is overwritten as method
286
+ unless has_method?( @current_module[ :object ], "%s=" % attribute.name )
287
+ @current_attribute << "W"
288
+ scenarios << generate_scenarios( :scenario_attribute )
289
+ scenarios.pop if scenarios.last == []
290
+ end
291
+
292
+ when 'W'
293
+ # verify first that if attribute is overwritten as method
294
+ unless has_method?( @current_module[ :object ], "%s=" % attribute.name )
295
+ @current_attribute << "W"
296
+ scenarios << generate_scenarios( :scenario_attribute )
297
+ scenarios.pop if scenarios.last == []
298
+ end
299
+
300
+ when 'R'
301
+
302
+ # verify first that if attribute is overwritten as method
303
+ unless has_method?( @current_module[ :object ], attribute.name )
304
+ scenarios << generate_scenarios( :scenario_attribute )
305
+ scenarios.pop if scenarios.last == []
306
+ end
307
+
308
+ else
309
+
310
+ abort( "Unknown attribute rw status: %s" % attribute.rw )
311
+
312
+ end
313
+
314
+ if scenarios.count > 0
315
+
316
+ #puts $templates[:feature]
317
+ result << scenarios
318
+ #puts scenarios
319
+
320
+ $scenarios += scenarios.count
321
+
322
+ end
323
+
324
+
325
+ else
326
+
327
+ #puts "%s method: %s" % [ method.visibility.to_s, method.name ]
328
+
329
+ end
330
+
331
+ result
332
+
333
+ end
334
+
335
+ def generate_name( method )
336
+
337
+ name = @module_path[ 1 .. -1 ].join("_")
338
+
339
+ begin
340
+
341
+ n = name.bytes.to_a
342
+
343
+ result = ""
344
+
345
+ n.each_with_index{ | byte, index |
346
+
347
+ if byte == 95
348
+
349
+ result << byte.chr
350
+ next
351
+
352
+ end
353
+
354
+ unless index == 0
355
+
356
+ prefix = ""
357
+
358
+ if (65..90).include?( byte ) or (48..57).include?( byte )
359
+
360
+ prefix = "_"
361
+
362
+ unless ( index + 1) > ( n.count - 1 )
363
+
364
+ next_byte = n[ index + 1 ]
365
+
366
+ # do not add underscore if next character is in uppercase or numeric
367
+ prefix = "" if (65..90).include?( next_byte ) or (48..57).include?( next_byte ) or next_byte == 95
368
+
369
+ else
370
+
371
+ prev_byte = n[ index - 1 ]
372
+
373
+ prefix = "" if ( 65..90 ).include?( prev_byte ) or ( 48..57 ).include?( prev_byte ) or prev_byte == 95
374
+
375
+ end
376
+
377
+ end
378
+
379
+ result << prefix + byte.chr.downcase
380
+
381
+ else
382
+
383
+ # first char, don't care if uppercase
384
+ result << byte.chr
385
+
386
+ end
387
+
388
+ }
389
+
390
+ name = result.gsub( /_+/, "_")
391
+
392
+ rescue
393
+
394
+ name = name.downcase
395
+
396
+ end
397
+
398
+ name << "_" << method
399
+
400
+ name.gsub!(/[?!=]/){ | char | char = "_0x%x" % char[0] }
401
+
402
+ ( name + ".feature" ).downcase
403
+
404
+ end
405
+
406
+ def generate_feature( data )
407
+
408
+ path = File.join( data[:file] )
409
+
410
+ open( path, 'w' ){ | file |
411
+
412
+ file << data[:header]
413
+
414
+ file << data[:scenarios]
415
+
416
+ }
417
+
418
+ end
419
+
420
+ def process_module( _module )
421
+
422
+ @already_processed_files << _module.full_name
423
+
424
+ @current_module = { :object => _module, :scenarios => [] }
425
+
426
+ # process methods
427
+ methods = process_methods( _module.method_list )
428
+
429
+ # process attributes
430
+ attributes = process_attributes( _module.attributes )
431
+
432
+ unless ( methods.empty? && attributes.empty? )
433
+
434
+ methods.each{ | method |
435
+
436
+ generate_feature( method )
437
+
438
+ puts method[:file]
439
+
440
+ puts method[:header]
441
+
442
+ puts method[:scenarios]
443
+
444
+ }
445
+
446
+
447
+ attributes.each{ | method |
448
+
449
+ generate_feature( method )
450
+
451
+ puts method[:file]
452
+
453
+ puts method[:header]
454
+
455
+ puts method[:scenarios]
456
+
457
+ }
458
+
459
+ end
460
+
461
+ # process if any child modules
462
+ process_modules( _module.modules ) unless _module.modules.empty?
463
+
464
+ end
465
+
466
+ end
467
+
468
+ end