busser-robot 0.1.3

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 (1968) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +0 -0
  3. data/.gitignore +17 -0
  4. data/.tailor +4 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +15 -0
  9. data/README.md +41 -0
  10. data/Rakefile +68 -0
  11. data/busser-robot.gemspec +30 -0
  12. data/features/plugin_install_command.feature +11 -0
  13. data/features/plugin_list_command.feature +8 -0
  14. data/features/support/env.rb +13 -0
  15. data/features/test_command.feature +31 -0
  16. data/lib/busser/robot/version.rb +26 -0
  17. data/lib/busser/runner_plugin/robot.rb +37 -0
  18. data/vendor/robot/.gitignore +19 -0
  19. data/vendor/robot/AUTHORS.txt +76 -0
  20. data/vendor/robot/BUILD.rst +212 -0
  21. data/vendor/robot/CONTRIBUTING.rst +309 -0
  22. data/vendor/robot/COPYRIGHT.txt +14 -0
  23. data/vendor/robot/INSTALL.rst +726 -0
  24. data/vendor/robot/LICENSE.txt +202 -0
  25. data/vendor/robot/MANIFEST.in +4 -0
  26. data/vendor/robot/README.rst +150 -0
  27. data/vendor/robot/atest/README.rst +235 -0
  28. data/vendor/robot/atest/genrunner.py +52 -0
  29. data/vendor/robot/atest/interpreter.py +217 -0
  30. data/vendor/robot/atest/requirements.txt +12 -0
  31. data/vendor/robot/atest/resources/TestCheckerLibrary.py +258 -0
  32. data/vendor/robot/atest/resources/TestHelper.py +31 -0
  33. data/vendor/robot/atest/resources/atest_resource.robot +335 -0
  34. data/vendor/robot/atest/resources/atest_variables.py +10 -0
  35. data/vendor/robot/atest/resources/read_interpreter.py +27 -0
  36. data/vendor/robot/atest/resources/rebot_resource.robot +25 -0
  37. data/vendor/robot/atest/resources/unicode_vars.py +15 -0
  38. data/vendor/robot/atest/robot/cli/console/colors_and_width.robot +66 -0
  39. data/vendor/robot/atest/robot/cli/console/console_resource.robot +24 -0
  40. data/vendor/robot/atest/robot/cli/console/console_type.robot +54 -0
  41. data/vendor/robot/atest/robot/cli/console/encoding_from_env_vars.robot +31 -0
  42. data/vendor/robot/atest/robot/cli/console/expected_output/ExpectedOutputLibrary.py +27 -0
  43. data/vendor/robot/atest/robot/cli/console/expected_output/dotted_fatal_error.txt +14 -0
  44. data/vendor/robot/atest/robot/cli/console/expected_output/empty.txt +0 -0
  45. data/vendor/robot/atest/robot/cli/console/expected_output/warnings_and_errors_stderr.txt +6 -0
  46. data/vendor/robot/atest/robot/cli/console/expected_output/warnings_and_errors_stdout.txt +14 -0
  47. data/vendor/robot/atest/robot/cli/console/expected_output/warnings_and_errors_stdout_dotted.txt +11 -0
  48. data/vendor/robot/atest/robot/cli/console/expected_output/warnings_and_errors_stdout_dotted_10.txt +19 -0
  49. data/vendor/robot/atest/robot/cli/console/markers.robot +81 -0
  50. data/vendor/robot/atest/robot/cli/console/non_ascii.robot +15 -0
  51. data/vendor/robot/atest/robot/cli/console/verbose_layout.robot +50 -0
  52. data/vendor/robot/atest/robot/cli/dryrun/args.robot +22 -0
  53. data/vendor/robot/atest/robot/cli/dryrun/dryrun.robot +149 -0
  54. data/vendor/robot/atest/robot/cli/dryrun/executed_builtin_keywords.robot +15 -0
  55. data/vendor/robot/atest/robot/cli/dryrun/java_arguments.robot +62 -0
  56. data/vendor/robot/atest/robot/cli/dryrun/kwargs.robot +16 -0
  57. data/vendor/robot/atest/robot/cli/dryrun/run_keyword_variants.robot +101 -0
  58. data/vendor/robot/atest/robot/cli/dryrun/run_keyword_variants_in_suite_teardown.robot +10 -0
  59. data/vendor/robot/atest/robot/cli/model_modifiers/ModelModifier.py +18 -0
  60. data/vendor/robot/atest/robot/cli/model_modifiers/modifier_resource.robot +38 -0
  61. data/vendor/robot/atest/robot/cli/model_modifiers/pre_rebot.robot +64 -0
  62. data/vendor/robot/atest/robot/cli/model_modifiers/pre_rebot_when_running.robot +59 -0
  63. data/vendor/robot/atest/robot/cli/model_modifiers/pre_run.robot +57 -0
  64. data/vendor/robot/atest/robot/cli/rebot/REBOT_OPTIONS.robot +22 -0
  65. data/vendor/robot/atest/robot/cli/rebot/__init__.robot +3 -0
  66. data/vendor/robot/atest/robot/cli/rebot/argumentfile.robot +28 -0
  67. data/vendor/robot/atest/robot/cli/rebot/help_and_version.robot +26 -0
  68. data/vendor/robot/atest/robot/cli/rebot/invalid_usage.robot +55 -0
  69. data/vendor/robot/atest/robot/cli/rebot/log_level.robot +48 -0
  70. data/vendor/robot/atest/robot/cli/rebot/output_files.robot +56 -0
  71. data/vendor/robot/atest/robot/cli/rebot/process_empty_suite.robot +38 -0
  72. data/vendor/robot/atest/robot/cli/rebot/rebot_cli_resource.robot +24 -0
  73. data/vendor/robot/atest/robot/cli/rebot/remove_keywords/all_passed_tag_and_name.robot +159 -0
  74. data/vendor/robot/atest/robot/cli/rebot/remove_keywords/combinations.robot +43 -0
  75. data/vendor/robot/atest/robot/cli/rebot/remove_keywords/for_loop_keywords.robot +51 -0
  76. data/vendor/robot/atest/robot/cli/rebot/remove_keywords/remove_keywords_resource.robot +25 -0
  77. data/vendor/robot/atest/robot/cli/rebot/remove_keywords/wait_until_keyword_succeeds.robot +37 -0
  78. data/vendor/robot/atest/robot/cli/rebot/status_rc.robot +53 -0
  79. data/vendor/robot/atest/robot/cli/rebot/suite_name_doc_and_metadata.robot +39 -0
  80. data/vendor/robot/atest/robot/cli/rebot/syslog.robot +46 -0
  81. data/vendor/robot/atest/robot/cli/rebot/timestamp_outputs.robot +16 -0
  82. data/vendor/robot/atest/robot/cli/runner/ROBOT_OPTIONS.robot +17 -0
  83. data/vendor/robot/atest/robot/cli/runner/argumentfile.robot +111 -0
  84. data/vendor/robot/atest/robot/cli/runner/cli_resource.robot +44 -0
  85. data/vendor/robot/atest/robot/cli/runner/debugfile.robot +75 -0
  86. data/vendor/robot/atest/robot/cli/runner/exit_on_error.robot +67 -0
  87. data/vendor/robot/atest/robot/cli/runner/exit_on_failure.robot +71 -0
  88. data/vendor/robot/atest/robot/cli/runner/extension.robot +25 -0
  89. data/vendor/robot/atest/robot/cli/runner/help_and_version.robot +33 -0
  90. data/vendor/robot/atest/robot/cli/runner/invalid_usage.robot +34 -0
  91. data/vendor/robot/atest/robot/cli/runner/log_level.robot +88 -0
  92. data/vendor/robot/atest/robot/cli/runner/multisource.robot +57 -0
  93. data/vendor/robot/atest/robot/cli/runner/output_files.robot +75 -0
  94. data/vendor/robot/atest/robot/cli/runner/pythonpath.robot +31 -0
  95. data/vendor/robot/atest/robot/cli/runner/randomize.robot +112 -0
  96. data/vendor/robot/atest/robot/cli/runner/remove_keywords.robot +147 -0
  97. data/vendor/robot/atest/robot/cli/runner/report_background.robot +26 -0
  98. data/vendor/robot/atest/robot/cli/runner/rerunfailed.robot +50 -0
  99. data/vendor/robot/atest/robot/cli/runner/rerunfailed_corners.robot +44 -0
  100. data/vendor/robot/atest/robot/cli/runner/rerunfailedsuites.robot +44 -0
  101. data/vendor/robot/atest/robot/cli/runner/rerunfailedsuites_corners.robot +44 -0
  102. data/vendor/robot/atest/robot/cli/runner/run_empty_suite.robot +36 -0
  103. data/vendor/robot/atest/robot/cli/runner/status_rc.robot +39 -0
  104. data/vendor/robot/atest/robot/cli/runner/suite_name_doc_and_metadata.robot +40 -0
  105. data/vendor/robot/atest/robot/cli/runner/syslog.robot +56 -0
  106. data/vendor/robot/atest/robot/cli/runner/timestamp_outputs.robot +25 -0
  107. data/vendor/robot/atest/robot/core/binary_data.robot +54 -0
  108. data/vendor/robot/atest/robot/core/empty_tc_and_uk.robot +35 -0
  109. data/vendor/robot/atest/robot/core/filter_by_names.robot +191 -0
  110. data/vendor/robot/atest/robot/core/keyword_teardown.robot +69 -0
  111. data/vendor/robot/atest/robot/core/overriding_default_settings_with_none.robot +48 -0
  112. data/vendor/robot/atest/robot/core/resource_and_variable_imports.robot +164 -0
  113. data/vendor/robot/atest/robot/core/same_test_multiple_times_in_suite.robot +30 -0
  114. data/vendor/robot/atest/robot/core/suite_execution_order.robot +10 -0
  115. data/vendor/robot/atest/robot/core/suite_setup_and_teardown.robot +183 -0
  116. data/vendor/robot/atest/robot/core/test_case_status.robot +52 -0
  117. data/vendor/robot/atest/robot/core/test_suite_dir.robot +55 -0
  118. data/vendor/robot/atest/robot/core/test_suite_init_file.robot +111 -0
  119. data/vendor/robot/atest/robot/core/timeouts.robot +153 -0
  120. data/vendor/robot/atest/robot/core/timeouts_with_custom_messages.robot +69 -0
  121. data/vendor/robot/atest/robot/core/unicode.robot +46 -0
  122. data/vendor/robot/atest/robot/core/unicode_with_java_libs.robot +21 -0
  123. data/vendor/robot/atest/robot/external/unit_tests.robot +15 -0
  124. data/vendor/robot/atest/robot/keywords/dots_in_keyword_name.robot +48 -0
  125. data/vendor/robot/atest/robot/keywords/duplicate_dynamic_keywords.robot +26 -0
  126. data/vendor/robot/atest/robot/keywords/duplicate_hybrid_keywords.robot +26 -0
  127. data/vendor/robot/atest/robot/keywords/duplicate_static_keywords.robot +31 -0
  128. data/vendor/robot/atest/robot/keywords/duplicate_user_keywords.robot +37 -0
  129. data/vendor/robot/atest/robot/keywords/embedded_arguments.robot +153 -0
  130. data/vendor/robot/atest/robot/keywords/embedded_arguments_library_keywords.robot +97 -0
  131. data/vendor/robot/atest/robot/keywords/java_argument_type_coercion.robot +23 -0
  132. data/vendor/robot/atest/robot/keywords/java_arguments.robot +98 -0
  133. data/vendor/robot/atest/robot/keywords/keyword_names.robot +138 -0
  134. data/vendor/robot/atest/robot/keywords/keyword_namespaces.robot +67 -0
  135. data/vendor/robot/atest/robot/keywords/keyword_not_found.robot +25 -0
  136. data/vendor/robot/atest/robot/keywords/keyword_recommendations.robot +145 -0
  137. data/vendor/robot/atest/robot/keywords/keyword_tags.robot +48 -0
  138. data/vendor/robot/atest/robot/keywords/named_args/variables_in_names.robot +34 -0
  139. data/vendor/robot/atest/robot/keywords/named_args/with_dynamic_keywords.robot +55 -0
  140. data/vendor/robot/atest/robot/keywords/named_args/with_dynamic_kwargs_support.robot +79 -0
  141. data/vendor/robot/atest/robot/keywords/named_args/with_python_keywords.robot +95 -0
  142. data/vendor/robot/atest/robot/keywords/named_args/with_user_keywords.robot +58 -0
  143. data/vendor/robot/atest/robot/keywords/optional_given_when_then.robot +48 -0
  144. data/vendor/robot/atest/robot/keywords/python_arguments.robot +42 -0
  145. data/vendor/robot/atest/robot/keywords/trace_log_keyword_arguments.robot +104 -0
  146. data/vendor/robot/atest/robot/keywords/trace_log_return_value.robot +60 -0
  147. data/vendor/robot/atest/robot/keywords/user_keyword_arguments.robot +98 -0
  148. data/vendor/robot/atest/robot/keywords/user_keyword_kwargs.robot +62 -0
  149. data/vendor/robot/atest/robot/keywords/user_keyword_return_values.robot +34 -0
  150. data/vendor/robot/atest/robot/libdoc/LibDocLib.py +49 -0
  151. data/vendor/robot/atest/robot/libdoc/__init__.robot +4 -0
  152. data/vendor/robot/atest/robot/libdoc/cli.robot +58 -0
  153. data/vendor/robot/atest/robot/libdoc/console_viewer.robot +97 -0
  154. data/vendor/robot/atest/robot/libdoc/doc_format.robot +72 -0
  155. data/vendor/robot/atest/robot/libdoc/dynamic_library.robot +67 -0
  156. data/vendor/robot/atest/robot/libdoc/dynamic_library_without_get_kw_args_and_doc.robot +38 -0
  157. data/vendor/robot/atest/robot/libdoc/internal_linking.robot +83 -0
  158. data/vendor/robot/atest/robot/libdoc/invalid_library_keywords.robot +30 -0
  159. data/vendor/robot/atest/robot/libdoc/invalid_usage.robot +61 -0
  160. data/vendor/robot/atest/robot/libdoc/invalid_user_keywords.robot +29 -0
  161. data/vendor/robot/atest/robot/libdoc/java_library.robot +80 -0
  162. data/vendor/robot/atest/robot/libdoc/libdoc_resource.robot +141 -0
  163. data/vendor/robot/atest/robot/libdoc/library_version.robot +31 -0
  164. data/vendor/robot/atest/robot/libdoc/module_library.robot +60 -0
  165. data/vendor/robot/atest/robot/libdoc/no_inits.robot +29 -0
  166. data/vendor/robot/atest/robot/libdoc/python_library.robot +68 -0
  167. data/vendor/robot/atest/robot/libdoc/resource_file.robot +81 -0
  168. data/vendor/robot/atest/robot/libdoc/spec_library.robot +64 -0
  169. data/vendor/robot/atest/robot/output/flatten_keyword.robot +106 -0
  170. data/vendor/robot/atest/robot/output/html_output_stats.py +41 -0
  171. data/vendor/robot/atest/robot/output/js_model.robot +49 -0
  172. data/vendor/robot/atest/robot/output/listener_interface/importing_listeners.robot +84 -0
  173. data/vendor/robot/atest/robot/output/listener_interface/listener_failing.robot +61 -0
  174. data/vendor/robot/atest/robot/output/listener_interface/listener_logging.robot +99 -0
  175. data/vendor/robot/atest/robot/output/listener_interface/listener_methods.robot +169 -0
  176. data/vendor/robot/atest/robot/output/listener_interface/listener_resource.robot +50 -0
  177. data/vendor/robot/atest/robot/output/listener_interface/listener_v3.robot +68 -0
  178. data/vendor/robot/atest/robot/output/listener_interface/listening_imports.robot +53 -0
  179. data/vendor/robot/atest/robot/output/listener_interface/log_levels.robot +39 -0
  180. data/vendor/robot/atest/robot/output/listener_interface/output_files.robot +42 -0
  181. data/vendor/robot/atest/robot/output/listener_interface/unsupported_listener_version.robot +34 -0
  182. data/vendor/robot/atest/robot/output/names_needing_escaping.robot +37 -0
  183. data/vendor/robot/atest/robot/output/outputs_have_correct_line_separators.robot +32 -0
  184. data/vendor/robot/atest/robot/output/processing_output.robot +118 -0
  185. data/vendor/robot/atest/robot/output/statistics.robot +90 -0
  186. data/vendor/robot/atest/robot/output/statistics_in_log_and_report.robot +79 -0
  187. data/vendor/robot/atest/robot/output/statistics_with_rebot.robot +70 -0
  188. data/vendor/robot/atest/robot/output/suite_and_test_id_in_output.robot +23 -0
  189. data/vendor/robot/atest/robot/output/test_criticality.robot +22 -0
  190. data/vendor/robot/atest/robot/output/timeouts.robot +27 -0
  191. data/vendor/robot/atest/robot/output/xunit.robot +84 -0
  192. data/vendor/robot/atest/robot/parsing/caching_libs_and_resources.robot +59 -0
  193. data/vendor/robot/atest/robot/parsing/data_formats/formats_resource.robot +71 -0
  194. data/vendor/robot/atest/robot/parsing/data_formats/html.robot +19 -0
  195. data/vendor/robot/atest/robot/parsing/data_formats/mixed.robot +99 -0
  196. data/vendor/robot/atest/robot/parsing/data_formats/rest.robot +22 -0
  197. data/vendor/robot/atest/robot/parsing/data_formats/rest_directives.robot +8 -0
  198. data/vendor/robot/atest/robot/parsing/data_formats/robot.robot +18 -0
  199. data/vendor/robot/atest/robot/parsing/data_formats/tsv.robot +18 -0
  200. data/vendor/robot/atest/robot/parsing/data_formats/txt.robot +18 -0
  201. data/vendor/robot/atest/robot/parsing/data_formats/txt_special_cases.robot +49 -0
  202. data/vendor/robot/atest/robot/parsing/deprecated_settings.robot +66 -0
  203. data/vendor/robot/atest/robot/parsing/escaping.robot +87 -0
  204. data/vendor/robot/atest/robot/parsing/failing_init.robot +12 -0
  205. data/vendor/robot/atest/robot/parsing/html_entityrefs.robot +22 -0
  206. data/vendor/robot/atest/robot/parsing/ignore_bom.robot +21 -0
  207. data/vendor/robot/atest/robot/parsing/invalid.robot +57 -0
  208. data/vendor/robot/atest/robot/parsing/multirow.robot +63 -0
  209. data/vendor/robot/atest/robot/parsing/non_ascii_paths.robot +54 -0
  210. data/vendor/robot/atest/robot/parsing/non_breaking_space.robot +19 -0
  211. data/vendor/robot/atest/robot/parsing/paths_are_not_case_normalized.robot +14 -0
  212. data/vendor/robot/atest/robot/parsing/same_setting_multiple_times.robot +127 -0
  213. data/vendor/robot/atest/robot/parsing/suite_metadata.robot +32 -0
  214. data/vendor/robot/atest/robot/parsing/suite_settings.robot +61 -0
  215. data/vendor/robot/atest/robot/parsing/table_names.robot +55 -0
  216. data/vendor/robot/atest/robot/parsing/test_case_settings.robot +162 -0
  217. data/vendor/robot/atest/robot/parsing/test_suite_names.robot +47 -0
  218. data/vendor/robot/atest/robot/parsing/user_keyword_settings.robot +103 -0
  219. data/vendor/robot/atest/robot/parsing/utf8_data/utf8_in_html.robot +25 -0
  220. data/vendor/robot/atest/robot/parsing/utf8_data/utf8_in_html5.robot +25 -0
  221. data/vendor/robot/atest/robot/parsing/utf8_data/utf8_in_tsv.robot +25 -0
  222. data/vendor/robot/atest/robot/parsing/utf8_data/utf8_in_txt.robot +25 -0
  223. data/vendor/robot/atest/robot/rebot/combine.robot +208 -0
  224. data/vendor/robot/atest/robot/rebot/filter_by_names.robot +160 -0
  225. data/vendor/robot/atest/robot/rebot/merge.robot +237 -0
  226. data/vendor/robot/atest/robot/rebot/output_file.robot +23 -0
  227. data/vendor/robot/atest/robot/rebot/start_and_endtime_from_cli.robot +75 -0
  228. data/vendor/robot/atest/robot/rebot/xunit.robot +61 -0
  229. data/vendor/robot/atest/robot/running/ProcessManager.py +73 -0
  230. data/vendor/robot/atest/robot/running/continue_for_loop.robot +54 -0
  231. data/vendor/robot/atest/robot/running/continue_on_failure.robot +106 -0
  232. data/vendor/robot/atest/robot/running/dynamic_teardown.robot +7 -0
  233. data/vendor/robot/atest/robot/running/empty_and_none_setup_and_teardown_are_ignored.robot +31 -0
  234. data/vendor/robot/atest/robot/running/exit_for_loop.robot +57 -0
  235. data/vendor/robot/atest/robot/running/failures_in_teardown.robot +60 -0
  236. data/vendor/robot/atest/robot/running/fatal_exception.robot +72 -0
  237. data/vendor/robot/atest/robot/running/for.robot +437 -0
  238. data/vendor/robot/atest/robot/running/html_error_message.robot +57 -0
  239. data/vendor/robot/atest/robot/running/long_error_messages.robot +65 -0
  240. data/vendor/robot/atest/robot/running/non_ascii_bytes.robot +33 -0
  241. data/vendor/robot/atest/robot/running/pass_execution.robot +162 -0
  242. data/vendor/robot/atest/robot/running/prevent_recursion.robot +22 -0
  243. data/vendor/robot/atest/robot/running/return_from_keyword.robot +60 -0
  244. data/vendor/robot/atest/robot/running/stopping_with_signal.robot +128 -0
  245. data/vendor/robot/atest/robot/running/test_template.robot +86 -0
  246. data/vendor/robot/atest/robot/running/test_template_with_embeded_args.robot +47 -0
  247. data/vendor/robot/atest/robot/standard_libraries/builtin/builtin_resource.robot +16 -0
  248. data/vendor/robot/atest/robot/standard_libraries/builtin/call_method.robot +34 -0
  249. data/vendor/robot/atest/robot/standard_libraries/builtin/convert_to_bytes.robot +88 -0
  250. data/vendor/robot/atest/robot/standard_libraries/builtin/converter.robot +72 -0
  251. data/vendor/robot/atest/robot/standard_libraries/builtin/count.robot +42 -0
  252. data/vendor/robot/atest/robot/standard_libraries/builtin/create_dictionary.robot +70 -0
  253. data/vendor/robot/atest/robot/standard_libraries/builtin/evaluate.robot +66 -0
  254. data/vendor/robot/atest/robot/standard_libraries/builtin/exit_on_failure.robot +24 -0
  255. data/vendor/robot/atest/robot/standard_libraries/builtin/fail.robot +49 -0
  256. data/vendor/robot/atest/robot/standard_libraries/builtin/fatal_error.robot +15 -0
  257. data/vendor/robot/atest/robot/standard_libraries/builtin/get_library_instance.robot +42 -0
  258. data/vendor/robot/atest/robot/standard_libraries/builtin/get_time.robot +38 -0
  259. data/vendor/robot/atest/robot/standard_libraries/builtin/get_variable_value.robot +26 -0
  260. data/vendor/robot/atest/robot/standard_libraries/builtin/get_variables.robot +47 -0
  261. data/vendor/robot/atest/robot/standard_libraries/builtin/import_library.robot +39 -0
  262. data/vendor/robot/atest/robot/standard_libraries/builtin/import_resource.robot +29 -0
  263. data/vendor/robot/atest/robot/standard_libraries/builtin/import_variables.robot +31 -0
  264. data/vendor/robot/atest/robot/standard_libraries/builtin/imports_without_path_set.robot +20 -0
  265. data/vendor/robot/atest/robot/standard_libraries/builtin/keyword_should_exist.robot +48 -0
  266. data/vendor/robot/atest/robot/standard_libraries/builtin/length.robot +52 -0
  267. data/vendor/robot/atest/robot/standard_libraries/builtin/listener_printing_start_end_kw.py +14 -0
  268. data/vendor/robot/atest/robot/standard_libraries/builtin/listener_using_builtin.py +9 -0
  269. data/vendor/robot/atest/robot/standard_libraries/builtin/log.robot +165 -0
  270. data/vendor/robot/atest/robot/standard_libraries/builtin/log_variables.robot +180 -0
  271. data/vendor/robot/atest/robot/standard_libraries/builtin/misc.robot +19 -0
  272. data/vendor/robot/atest/robot/standard_libraries/builtin/reload_library.robot +39 -0
  273. data/vendor/robot/atest/robot/standard_libraries/builtin/reload_with_name.robot +14 -0
  274. data/vendor/robot/atest/robot/standard_libraries/builtin/repeat_keyword.robot +96 -0
  275. data/vendor/robot/atest/robot/standard_libraries/builtin/replace_variables.robot +22 -0
  276. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword.robot +84 -0
  277. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_and_continue_on_failure.robot +40 -0
  278. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_and_return.robot +56 -0
  279. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_and_return_status.robot +12 -0
  280. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_based_on_suite_stats.robot +51 -0
  281. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_if_test_passed_failed.robot +81 -0
  282. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_if_timeout_occurred.robot +37 -0
  283. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_if_unless.robot +127 -0
  284. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_variants_registering.robot +23 -0
  285. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_variants_variable_handling.robot +54 -0
  286. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_variants_with_escaping_control_arguments.robot +36 -0
  287. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keyword_with_errors.robot +148 -0
  288. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keywords.robot +58 -0
  289. data/vendor/robot/atest/robot/standard_libraries/builtin/run_keywords_with_arguments.robot +56 -0
  290. data/vendor/robot/atest/robot/standard_libraries/builtin/set_documentation.robot +39 -0
  291. data/vendor/robot/atest/robot/standard_libraries/builtin/set_library_search_order.robot +41 -0
  292. data/vendor/robot/atest/robot/standard_libraries/builtin/set_log_level.robot +30 -0
  293. data/vendor/robot/atest/robot/standard_libraries/builtin/set_resource_search_order.robot +40 -0
  294. data/vendor/robot/atest/robot/standard_libraries/builtin/set_suite_metadata.robot +63 -0
  295. data/vendor/robot/atest/robot/standard_libraries/builtin/set_test_message.robot +70 -0
  296. data/vendor/robot/atest/robot/standard_libraries/builtin/set_variable_if.robot +48 -0
  297. data/vendor/robot/atest/robot/standard_libraries/builtin/setting_variables.robot +140 -0
  298. data/vendor/robot/atest/robot/standard_libraries/builtin/should_be_equal.robot +64 -0
  299. data/vendor/robot/atest/robot/standard_libraries/builtin/should_be_equal_as_xxx.robot +50 -0
  300. data/vendor/robot/atest/robot/standard_libraries/builtin/should_be_true.robot +28 -0
  301. data/vendor/robot/atest/robot/standard_libraries/builtin/should_contain.robot +22 -0
  302. data/vendor/robot/atest/robot/standard_libraries/builtin/should_contain_any.robot +34 -0
  303. data/vendor/robot/atest/robot/standard_libraries/builtin/should_match.robot +36 -0
  304. data/vendor/robot/atest/robot/standard_libraries/builtin/should_xxx_with.robot +34 -0
  305. data/vendor/robot/atest/robot/standard_libraries/builtin/sleep.robot +28 -0
  306. data/vendor/robot/atest/robot/standard_libraries/builtin/tags.robot +89 -0
  307. data/vendor/robot/atest/robot/standard_libraries/builtin/used_in_custom_libs_and_listeners.robot +20 -0
  308. data/vendor/robot/atest/robot/standard_libraries/builtin/variable_should_exist.robot +82 -0
  309. data/vendor/robot/atest/robot/standard_libraries/builtin/wait_until_keyword_succeeds.robot +96 -0
  310. data/vendor/robot/atest/robot/standard_libraries/collections/dictionary.robot +159 -0
  311. data/vendor/robot/atest/robot/standard_libraries/collections/list.robot +318 -0
  312. data/vendor/robot/atest/robot/standard_libraries/datetime/add_time_to_date.robot +10 -0
  313. data/vendor/robot/atest/robot/standard_libraries/datetime/convert_date_input_format.robot +28 -0
  314. data/vendor/robot/atest/robot/standard_libraries/datetime/convert_date_result_format.robot +28 -0
  315. data/vendor/robot/atest/robot/standard_libraries/datetime/convert_time_input_format.robot +28 -0
  316. data/vendor/robot/atest/robot/standard_libraries/datetime/convert_time_result_format.robot +28 -0
  317. data/vendor/robot/atest/robot/standard_libraries/datetime/date_ranges.robot +22 -0
  318. data/vendor/robot/atest/robot/standard_libraries/datetime/get_current_date.robot +28 -0
  319. data/vendor/robot/atest/robot/standard_libraries/datetime/subtract_date_from_date.robot +10 -0
  320. data/vendor/robot/atest/robot/standard_libraries/datetime/subtract_time_from_date.robot +10 -0
  321. data/vendor/robot/atest/robot/standard_libraries/datetime/time_calculations.robot +10 -0
  322. data/vendor/robot/atest/robot/standard_libraries/dialogs/dialogs.robot +55 -0
  323. data/vendor/robot/atest/robot/standard_libraries/easter.robot +14 -0
  324. data/vendor/robot/atest/robot/standard_libraries/operating_system/create_and_remove_dir.robot +37 -0
  325. data/vendor/robot/atest/robot/standard_libraries/operating_system/create_file.robot +40 -0
  326. data/vendor/robot/atest/robot/standard_libraries/operating_system/env_vars.robot +64 -0
  327. data/vendor/robot/atest/robot/standard_libraries/operating_system/file_and_dir_empty_or_not.robot +52 -0
  328. data/vendor/robot/atest/robot/standard_libraries/operating_system/file_and_dir_existence.robot +82 -0
  329. data/vendor/robot/atest/robot/standard_libraries/operating_system/get_file.robot +113 -0
  330. data/vendor/robot/atest/robot/standard_libraries/operating_system/get_file_size.robot +21 -0
  331. data/vendor/robot/atest/robot/standard_libraries/operating_system/list_dir.robot +64 -0
  332. data/vendor/robot/atest/robot/standard_libraries/operating_system/modified_time.robot +56 -0
  333. data/vendor/robot/atest/robot/standard_libraries/operating_system/move_copy_directory.robot +34 -0
  334. data/vendor/robot/atest/robot/standard_libraries/operating_system/move_copy_file.robot +93 -0
  335. data/vendor/robot/atest/robot/standard_libraries/operating_system/move_copy_files.robot +76 -0
  336. data/vendor/robot/atest/robot/standard_libraries/operating_system/path.robot +28 -0
  337. data/vendor/robot/atest/robot/standard_libraries/operating_system/path_expansion.robot +11 -0
  338. data/vendor/robot/atest/robot/standard_libraries/operating_system/remove_file.robot +33 -0
  339. data/vendor/robot/atest/robot/standard_libraries/operating_system/run.robot +44 -0
  340. data/vendor/robot/atest/robot/standard_libraries/operating_system/special_names.robot +32 -0
  341. data/vendor/robot/atest/robot/standard_libraries/operating_system/touch.robot +28 -0
  342. data/vendor/robot/atest/robot/standard_libraries/operating_system/wait_until_removed_created.robot +52 -0
  343. data/vendor/robot/atest/robot/standard_libraries/process/active_process.robot +22 -0
  344. data/vendor/robot/atest/robot/standard_libraries/process/commandline.robot +25 -0
  345. data/vendor/robot/atest/robot/standard_libraries/process/env_config.robot +25 -0
  346. data/vendor/robot/atest/robot/standard_libraries/process/get_process_result.robot +25 -0
  347. data/vendor/robot/atest/robot/standard_libraries/process/is_process_alive.robot +13 -0
  348. data/vendor/robot/atest/robot/standard_libraries/process/newlines.robot +13 -0
  349. data/vendor/robot/atest/robot/standard_libraries/process/no_active_process.robot +13 -0
  350. data/vendor/robot/atest/robot/standard_libraries/process/output_encoding.robot +19 -0
  351. data/vendor/robot/atest/robot/standard_libraries/process/passing_arguments.robot +68 -0
  352. data/vendor/robot/atest/robot/standard_libraries/process/process_library.robot +27 -0
  353. data/vendor/robot/atest/robot/standard_libraries/process/run_process_with_timeout.robot +38 -0
  354. data/vendor/robot/atest/robot/standard_libraries/process/sending_signal.robot +48 -0
  355. data/vendor/robot/atest/robot/standard_libraries/process/stdout_and_stderr.robot +43 -0
  356. data/vendor/robot/atest/robot/standard_libraries/process/terminate_process.robot +51 -0
  357. data/vendor/robot/atest/robot/standard_libraries/process/wait_for_process.robot +32 -0
  358. data/vendor/robot/atest/robot/standard_libraries/remote/argument_coersion.robot +97 -0
  359. data/vendor/robot/atest/robot/standard_libraries/remote/arguments.robot +64 -0
  360. data/vendor/robot/atest/robot/standard_libraries/remote/binary_result.robot +27 -0
  361. data/vendor/robot/atest/robot/standard_libraries/remote/dict_result.robot +10 -0
  362. data/vendor/robot/atest/robot/standard_libraries/remote/documentation.robot +52 -0
  363. data/vendor/robot/atest/robot/standard_libraries/remote/invalid.robot +20 -0
  364. data/vendor/robot/atest/robot/standard_libraries/remote/keyword_tags.robot +29 -0
  365. data/vendor/robot/atest/robot/standard_libraries/remote/remote_resource.robot +30 -0
  366. data/vendor/robot/atest/robot/standard_libraries/remote/simple_server.robot +42 -0
  367. data/vendor/robot/atest/robot/standard_libraries/remote/special_errors.robot +19 -0
  368. data/vendor/robot/atest/robot/standard_libraries/remote/timeouts.robot +10 -0
  369. data/vendor/robot/atest/robot/standard_libraries/reserved.robot +20 -0
  370. data/vendor/robot/atest/robot/standard_libraries/screenshot/set_screenshot_directory.robot +8 -0
  371. data/vendor/robot/atest/robot/standard_libraries/screenshot/take_screenshot.robot +42 -0
  372. data/vendor/robot/atest/robot/standard_libraries/string/convert_to.robot +10 -0
  373. data/vendor/robot/atest/robot/standard_libraries/string/encode_decode.robot +36 -0
  374. data/vendor/robot/atest/robot/standard_libraries/string/generate_random_string.robot +29 -0
  375. data/vendor/robot/atest/robot/standard_libraries/string/get_matching_lines.robot +90 -0
  376. data/vendor/robot/atest/robot/standard_libraries/string/get_regexp_matches.robot +28 -0
  377. data/vendor/robot/atest/robot/standard_libraries/string/remove_from_string.robot +25 -0
  378. data/vendor/robot/atest/robot/standard_libraries/string/replace_string.robot +32 -0
  379. data/vendor/robot/atest/robot/standard_libraries/string/should_be.robot +64 -0
  380. data/vendor/robot/atest/robot/standard_libraries/string/split_string.robot +65 -0
  381. data/vendor/robot/atest/robot/standard_libraries/string/string.robot +71 -0
  382. data/vendor/robot/atest/robot/standard_libraries/telnet/__init__.robot +2 -0
  383. data/vendor/robot/atest/robot/standard_libraries/telnet/configuration.robot +108 -0
  384. data/vendor/robot/atest/robot/standard_libraries/telnet/connections.robot +22 -0
  385. data/vendor/robot/atest/robot/standard_libraries/telnet/login.robot +40 -0
  386. data/vendor/robot/atest/robot/standard_libraries/telnet/read_and_write.robot +101 -0
  387. data/vendor/robot/atest/robot/standard_libraries/telnet/telnet_resource.robot +3 -0
  388. data/vendor/robot/atest/robot/standard_libraries/telnet/terminal_emulation.robot +68 -0
  389. data/vendor/robot/atest/robot/standard_libraries/xml/add_and_remove_elements.robot +75 -0
  390. data/vendor/robot/atest/robot/standard_libraries/xml/add_and_remove_elements_with_lxml.robot +74 -0
  391. data/vendor/robot/atest/robot/standard_libraries/xml/clear_element.robot +17 -0
  392. data/vendor/robot/atest/robot/standard_libraries/xml/clear_element_with_lxml.robot +17 -0
  393. data/vendor/robot/atest/robot/standard_libraries/xml/copy_element.robot +17 -0
  394. data/vendor/robot/atest/robot/standard_libraries/xml/copy_element_with_lxml.robot +17 -0
  395. data/vendor/robot/atest/robot/standard_libraries/xml/element_attribute.robot +52 -0
  396. data/vendor/robot/atest/robot/standard_libraries/xml/element_attribute_with_lxml.robot +51 -0
  397. data/vendor/robot/atest/robot/standard_libraries/xml/element_should_exist.robot +39 -0
  398. data/vendor/robot/atest/robot/standard_libraries/xml/element_should_exist_with_lxml.robot +39 -0
  399. data/vendor/robot/atest/robot/standard_libraries/xml/element_text.robot +52 -0
  400. data/vendor/robot/atest/robot/standard_libraries/xml/element_text_with_lxml.robot +53 -0
  401. data/vendor/robot/atest/robot/standard_libraries/xml/elements_should_be_equal.robot +40 -0
  402. data/vendor/robot/atest/robot/standard_libraries/xml/elements_should_be_equal_with_lxml.robot +41 -0
  403. data/vendor/robot/atest/robot/standard_libraries/xml/elements_should_match.robot +38 -0
  404. data/vendor/robot/atest/robot/standard_libraries/xml/elements_should_match_with_lxml.robot +38 -0
  405. data/vendor/robot/atest/robot/standard_libraries/xml/etree_namespaces.robot +23 -0
  406. data/vendor/robot/atest/robot/standard_libraries/xml/etree_namespaces_with_lxml.robot +23 -0
  407. data/vendor/robot/atest/robot/standard_libraries/xml/get_elements.robot +44 -0
  408. data/vendor/robot/atest/robot/standard_libraries/xml/get_elements_with_lxml.robot +44 -0
  409. data/vendor/robot/atest/robot/standard_libraries/xml/namespaces.robot +26 -0
  410. data/vendor/robot/atest/robot/standard_libraries/xml/namespaces_with_lxml.robot +26 -0
  411. data/vendor/robot/atest/robot/standard_libraries/xml/parsing.robot +25 -0
  412. data/vendor/robot/atest/robot/standard_libraries/xml/parsing_with_lxml.robot +26 -0
  413. data/vendor/robot/atest/robot/standard_libraries/xml/save_xml.robot +52 -0
  414. data/vendor/robot/atest/robot/standard_libraries/xml/save_xml_with_lxml.robot +47 -0
  415. data/vendor/robot/atest/robot/standard_libraries/xml/set_element_information.robot +64 -0
  416. data/vendor/robot/atest/robot/standard_libraries/xml/set_element_information_with_lxml.robot +65 -0
  417. data/vendor/robot/atest/robot/standard_libraries/xml/strip_namespaces.robot +19 -0
  418. data/vendor/robot/atest/robot/standard_libraries/xml/strip_namespaces_with_lxml.robot +20 -0
  419. data/vendor/robot/atest/robot/standard_libraries/xml/to_string.robot +23 -0
  420. data/vendor/robot/atest/robot/standard_libraries/xml/to_string_with_lxml.robot +24 -0
  421. data/vendor/robot/atest/robot/standard_libraries/xml/xml_resource.robot +6 -0
  422. data/vendor/robot/atest/robot/standard_libraries/xml/xpath.robot +69 -0
  423. data/vendor/robot/atest/robot/standard_libraries/xml/xpath_with_lxml.robot +59 -0
  424. data/vendor/robot/atest/robot/tags/critical_tags.robot +58 -0
  425. data/vendor/robot/atest/robot/tags/critical_tags_with_rebot.robot +64 -0
  426. data/vendor/robot/atest/robot/tags/default_and_force_tags.robot +13 -0
  427. data/vendor/robot/atest/robot/tags/default_tags.robot +13 -0
  428. data/vendor/robot/atest/robot/tags/force_tags.robot +13 -0
  429. data/vendor/robot/atest/robot/tags/include_and_exclude.robot +122 -0
  430. data/vendor/robot/atest/robot/tags/include_and_exclude_with_rebot.robot +171 -0
  431. data/vendor/robot/atest/robot/tags/no_force_nor_default_tags.robot +13 -0
  432. data/vendor/robot/atest/robot/tags/set_tag.robot +33 -0
  433. data/vendor/robot/atest/robot/tags/set_tag_with_rebot.robot +38 -0
  434. data/vendor/robot/atest/robot/tags/tag_doc.robot +40 -0
  435. data/vendor/robot/atest/robot/tags/tag_doc_with_rebot.robot +43 -0
  436. data/vendor/robot/atest/robot/tags/tag_stat_include_and_exclude.robot +73 -0
  437. data/vendor/robot/atest/robot/tags/tag_stat_include_and_exclude_with_rebot.robot +77 -0
  438. data/vendor/robot/atest/robot/tags/tag_stat_link.robot +42 -0
  439. data/vendor/robot/atest/robot/tags/tag_stat_link_with_rebot.robot +44 -0
  440. data/vendor/robot/atest/robot/tags/tags_are_not_normalized.robot +37 -0
  441. data/vendor/robot/atest/robot/test_libraries/as_listener.robot +87 -0
  442. data/vendor/robot/atest/robot/test_libraries/as_listener_in_java.robot +26 -0
  443. data/vendor/robot/atest/robot/test_libraries/as_listener_with_empty_library.robot +13 -0
  444. data/vendor/robot/atest/robot/test_libraries/as_listener_with_import_library.robot +10 -0
  445. data/vendor/robot/atest/robot/test_libraries/as_listener_with_log_level.robot +15 -0
  446. data/vendor/robot/atest/robot/test_libraries/as_listenerv3.robot +41 -0
  447. data/vendor/robot/atest/robot/test_libraries/avoid_properties_when_creating_libraries.robot +18 -0
  448. data/vendor/robot/atest/robot/test_libraries/deprecated_keywords.robot +45 -0
  449. data/vendor/robot/atest/robot/test_libraries/dynamic_kwargs_support_java.robot +26 -0
  450. data/vendor/robot/atest/robot/test_libraries/dynamic_kwargs_support_python.robot +44 -0
  451. data/vendor/robot/atest/robot/test_libraries/dynamic_libraries_with_invalid_argspec.robot +48 -0
  452. data/vendor/robot/atest/robot/test_libraries/dynamic_library_args_and_docs.robot +92 -0
  453. data/vendor/robot/atest/robot/test_libraries/dynamic_library_java.robot +19 -0
  454. data/vendor/robot/atest/robot/test_libraries/dynamic_library_python.robot +60 -0
  455. data/vendor/robot/atest/robot/test_libraries/dynamic_library_tags.robot +25 -0
  456. data/vendor/robot/atest/robot/test_libraries/error_msg_and_details.robot +130 -0
  457. data/vendor/robot/atest/robot/test_libraries/hybrid_library.robot +49 -0
  458. data/vendor/robot/atest/robot/test_libraries/import_and_init_logging.robot +57 -0
  459. data/vendor/robot/atest/robot/test_libraries/internal_modules_not_importable.robot +28 -0
  460. data/vendor/robot/atest/robot/test_libraries/invalid_java_libraries.robot +42 -0
  461. data/vendor/robot/atest/robot/test_libraries/java_libraries.robot +89 -0
  462. data/vendor/robot/atest/robot/test_libraries/java_library_imports_with_args.robot +48 -0
  463. data/vendor/robot/atest/robot/test_libraries/libraries_extending_existing_classes.robot +45 -0
  464. data/vendor/robot/atest/robot/test_libraries/library_import_by_path.robot +60 -0
  465. data/vendor/robot/atest/robot/test_libraries/library_import_failing.robot +58 -0
  466. data/vendor/robot/atest/robot/test_libraries/library_import_from_archive.robot +19 -0
  467. data/vendor/robot/atest/robot/test_libraries/library_imports.robot +70 -0
  468. data/vendor/robot/atest/robot/test_libraries/library_imports_with_args.robot +49 -0
  469. data/vendor/robot/atest/robot/test_libraries/library_scope.robot +18 -0
  470. data/vendor/robot/atest/robot/test_libraries/library_version.robot +21 -0
  471. data/vendor/robot/atest/robot/test_libraries/logging_api.robot +58 -0
  472. data/vendor/robot/atest/robot/test_libraries/logging_with_logging.robot +66 -0
  473. data/vendor/robot/atest/robot/test_libraries/module_library.robot +76 -0
  474. data/vendor/robot/atest/robot/test_libraries/named_args_in_imports.robot +20 -0
  475. data/vendor/robot/atest/robot/test_libraries/new_style_classes.robot +18 -0
  476. data/vendor/robot/atest/robot/test_libraries/non_main_threads_logging.robot +16 -0
  477. data/vendor/robot/atest/robot/test_libraries/package_library.robot +58 -0
  478. data/vendor/robot/atest/robot/test_libraries/print_logging.robot +77 -0
  479. data/vendor/robot/atest/robot/test_libraries/print_logging_java.robot +45 -0
  480. data/vendor/robot/atest/robot/test_libraries/resource_for_importing_libs_with_args.robot +15 -0
  481. data/vendor/robot/atest/robot/test_libraries/timestamps_for_stdout_messages.robot +33 -0
  482. data/vendor/robot/atest/robot/test_libraries/with_name.robot +159 -0
  483. data/vendor/robot/atest/robot/testdoc/testdoc.robot +92 -0
  484. data/vendor/robot/atest/robot/tidy/TidyLib.py +86 -0
  485. data/vendor/robot/atest/robot/tidy/empty_tables.robot +12 -0
  486. data/vendor/robot/atest/robot/tidy/format_documentation.robot +21 -0
  487. data/vendor/robot/atest/robot/tidy/inplace.robot +24 -0
  488. data/vendor/robot/atest/robot/tidy/line_separator.robot +33 -0
  489. data/vendor/robot/atest/robot/tidy/tidy.robot +71 -0
  490. data/vendor/robot/atest/robot/tidy/tidy_resource.robot +31 -0
  491. data/vendor/robot/atest/robot/variables/automatic_variables.robot +69 -0
  492. data/vendor/robot/atest/robot/variables/builtin_variables.robot +67 -0
  493. data/vendor/robot/atest/robot/variables/catenate_scalars_in_variable_table.robot +59 -0
  494. data/vendor/robot/atest/robot/variables/commandline_variable_files.robot +64 -0
  495. data/vendor/robot/atest/robot/variables/commandline_variables.robot +27 -0
  496. data/vendor/robot/atest/robot/variables/dict_variable_in_variable_table.robot +65 -0
  497. data/vendor/robot/atest/robot/variables/dict_variable_items.robot +34 -0
  498. data/vendor/robot/atest/robot/variables/environment_variables.robot +58 -0
  499. data/vendor/robot/atest/robot/variables/extended_assign.robot +38 -0
  500. data/vendor/robot/atest/robot/variables/extended_variables.robot +76 -0
  501. data/vendor/robot/atest/robot/variables/getting_vars_from_dynamic_var_file.robot +23 -0
  502. data/vendor/robot/atest/robot/variables/keyword_status_and_message.robot +40 -0
  503. data/vendor/robot/atest/robot/variables/list_and_dict_from_variable_file.robot +64 -0
  504. data/vendor/robot/atest/robot/variables/list_as_scalar.robot +19 -0
  505. data/vendor/robot/atest/robot/variables/list_variable_items.robot +32 -0
  506. data/vendor/robot/atest/robot/variables/non_string_variables.robot +18 -0
  507. data/vendor/robot/atest/robot/variables/outputfile_variables.robot +26 -0
  508. data/vendor/robot/atest/robot/variables/recursive_definition.robot +67 -0
  509. data/vendor/robot/atest/robot/variables/reserved_syntax.robot +22 -0
  510. data/vendor/robot/atest/robot/variables/return_values.robot +213 -0
  511. data/vendor/robot/atest/robot/variables/return_values_java.robot +71 -0
  512. data/vendor/robot/atest/robot/variables/same_variable_file_names.robot +16 -0
  513. data/vendor/robot/atest/robot/variables/scalar_as_list.robot +25 -0
  514. data/vendor/robot/atest/robot/variables/shared_scope.robot +13 -0
  515. data/vendor/robot/atest/robot/variables/suite_source.robot +16 -0
  516. data/vendor/robot/atest/robot/variables/using_dict_variables.robot +62 -0
  517. data/vendor/robot/atest/robot/variables/variable_file_implemented_as_class.robot +37 -0
  518. data/vendor/robot/atest/robot/variables/variable_priorities.robot +36 -0
  519. data/vendor/robot/atest/robot/variables/variable_recommendations.robot +82 -0
  520. data/vendor/robot/atest/robot/variables/variable_scopes.robot +17 -0
  521. data/vendor/robot/atest/robot/variables/variable_table.robot +94 -0
  522. data/vendor/robot/atest/robot/variables/variable_table_in_resource_file.robot +88 -0
  523. data/vendor/robot/atest/robot/variables/variables_from_resource_files.robot +61 -0
  524. data/vendor/robot/atest/robot/variables/variables_from_variable_files.robot +52 -0
  525. data/vendor/robot/atest/robot/variables/variables_in_import_settings.robot +14 -0
  526. data/vendor/robot/atest/robot/variables/variables_inside_variables.robot +26 -0
  527. data/vendor/robot/atest/robot/variables/yaml_variable_file.robot +62 -0
  528. data/vendor/robot/atest/run.py +135 -0
  529. data/vendor/robot/atest/testdata/cli/console/markers.robot +64 -0
  530. data/vendor/robot/atest/testdata/cli/dryrun/EmbeddedArgs.py +7 -0
  531. data/vendor/robot/atest/testdata/cli/dryrun/Library.py +22 -0
  532. data/vendor/robot/atest/testdata/cli/dryrun/args.robot +50 -0
  533. data/vendor/robot/atest/testdata/cli/dryrun/dryrun.robot +172 -0
  534. data/vendor/robot/atest/testdata/cli/dryrun/executed_builtin_keywords.robot +20 -0
  535. data/vendor/robot/atest/testdata/cli/dryrun/kwargs.robot +27 -0
  536. data/vendor/robot/atest/testdata/cli/dryrun/more_tests.robot +9 -0
  537. data/vendor/robot/atest/testdata/cli/dryrun/resource.robot +17 -0
  538. data/vendor/robot/atest/testdata/cli/dryrun/run_keyword_variants.robot +226 -0
  539. data/vendor/robot/atest/testdata/cli/dryrun/run_keyword_variants_in_suite_teardown.robot +24 -0
  540. data/vendor/robot/atest/testdata/cli/dryrun/vars.py +1 -0
  541. data/vendor/robot/atest/testdata/cli/error/import_error.robot +8 -0
  542. data/vendor/robot/atest/testdata/cli/error/parsing_error.robot +8 -0
  543. data/vendor/robot/atest/testdata/cli/error/resource_error.robot +8 -0
  544. data/vendor/robot/atest/testdata/cli/error/resource_with_error.robot +6 -0
  545. data/vendor/robot/atest/testdata/cli/error/runtime_error.robot +14 -0
  546. data/vendor/robot/atest/testdata/cli/remove_keywords/all_combinations.robot +147 -0
  547. data/vendor/robot/atest/testdata/cli/remove_keywords/wait_until_keyword_succeeds.robot +39 -0
  548. data/vendor/robot/atest/testdata/cli/runfailed/onlypassing/passing.robot +3 -0
  549. data/vendor/robot/atest/testdata/cli/runfailed/runfailed1.robot +11 -0
  550. data/vendor/robot/atest/testdata/cli/runfailed/runfailed2.robot +8 -0
  551. data/vendor/robot/atest/testdata/cli/runfailed/suite/subsuite/suite_failed.robot +7 -0
  552. data/vendor/robot/atest/testdata/cli/runfailed/suite/subsuite/suite_failed_with_excluded_tag.robot +8 -0
  553. data/vendor/robot/atest/testdata/cli/runfailed/suite/subsuite/suite_succeed.robot +4 -0
  554. data/vendor/robot/atest/testdata/cli/runfailed/suite/suite_teardown_failing.robot +7 -0
  555. data/vendor/robot/atest/testdata/core/binary_data.robot +20 -0
  556. data/vendor/robot/atest/testdata/core/empty_testcase_and_uk.robot +68 -0
  557. data/vendor/robot/atest/testdata/core/erroring_suite_setup.robot +19 -0
  558. data/vendor/robot/atest/testdata/core/erroring_suite_teardown.robot +22 -0
  559. data/vendor/robot/atest/testdata/core/failing_higher_level_suite_setup/__init__.robot +2 -0
  560. data/vendor/robot/atest/testdata/core/failing_higher_level_suite_setup/suite1.robot +14 -0
  561. data/vendor/robot/atest/testdata/core/failing_higher_level_suite_setup/suite2.robot +5 -0
  562. data/vendor/robot/atest/testdata/core/failing_suite_setup.robot +12 -0
  563. data/vendor/robot/atest/testdata/core/failing_suite_setup_and_teardown.robot +24 -0
  564. data/vendor/robot/atest/testdata/core/failing_suite_teardown.robot +29 -0
  565. data/vendor/robot/atest/testdata/core/failing_suite_teardown_2.robot +41 -0
  566. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/__init__.robot +2 -0
  567. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/failing_teardown.robot +23 -0
  568. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/failing_teardown_dir/__init__.robot +2 -0
  569. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/failing_teardown_dir/ftd_failing_teardown.robot +29 -0
  570. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/failing_teardown_dir/ftd_passing_teardown.robot +20 -0
  571. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/passing_teardown.robot +14 -0
  572. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/passing_teardown_dir/ptd_failing_teardown.robot +23 -0
  573. data/vendor/robot/atest/testdata/core/failing_suite_teardown_dir/passing_teardown_dir/ptd_passing_teardown.robot +14 -0
  574. data/vendor/robot/atest/testdata/core/keyword_teardown.robot +109 -0
  575. data/vendor/robot/atest/testdata/core/long_suite_setup_and_teardown_errors.robot +21 -0
  576. data/vendor/robot/atest/testdata/core/overriding_default_settings_with_none.robot +60 -0
  577. data/vendor/robot/atest/testdata/core/passing_suite_setup.robot +6 -0
  578. data/vendor/robot/atest/testdata/core/passing_suite_setup_and_teardown.robot +26 -0
  579. data/vendor/robot/atest/testdata/core/passing_suite_teardown.robot +11 -0
  580. data/vendor/robot/atest/testdata/core/resource_and_variable_imports.robot +130 -0
  581. data/vendor/robot/atest/testdata/core/resources.robot +8 -0
  582. data/vendor/robot/atest/testdata/core/resources_and_variables/dynamicVariables.py +6 -0
  583. data/vendor/robot/atest/testdata/core/resources_and_variables/dynamic_variables.py +20 -0
  584. data/vendor/robot/atest/testdata/core/resources_and_variables/empty_resource.robot +1 -0
  585. data/vendor/robot/atest/testdata/core/resources_and_variables/invalid_list_variable.py +2 -0
  586. data/vendor/robot/atest/testdata/core/resources_and_variables/invalid_variable_file.py +1 -0
  587. data/vendor/robot/atest/testdata/core/resources_and_variables/resource_with_testcase_table.robot +4 -0
  588. data/vendor/robot/atest/testdata/core/resources_and_variables/resources.robot +17 -0
  589. data/vendor/robot/atest/testdata/core/resources_and_variables/resources2.robot +7 -0
  590. data/vendor/robot/atest/testdata/core/resources_and_variables/resources_imported_by_resource.robot +7 -0
  591. data/vendor/robot/atest/testdata/core/resources_and_variables/variables.py +6 -0
  592. data/vendor/robot/atest/testdata/core/resources_and_variables/variables2.py +1 -0
  593. data/vendor/robot/atest/testdata/core/resources_and_variables/variables_imported_by_resource.py +1 -0
  594. data/vendor/robot/atest/testdata/core/resources_and_variables/vars_from_cli.py +5 -0
  595. data/vendor/robot/atest/testdata/core/resources_and_variables/vars_from_cli2.py +11 -0
  596. data/vendor/robot/atest/testdata/core/same_test_multiple_times_in_suite.robot +27 -0
  597. data/vendor/robot/atest/testdata/core/test_case_status.robot +81 -0
  598. data/vendor/robot/atest/testdata/core/test_suite_dir/_ignore_this_dir/ignore_this_file.robot +3 -0
  599. data/vendor/robot/atest/testdata/core/test_suite_dir/_ignore_this_file.robot +3 -0
  600. data/vendor/robot/atest/testdata/core/test_suite_dir/no_extension +2 -0
  601. data/vendor/robot/atest/testdata/core/test_suite_dir/no_tests_dir_1/some.txt +1 -0
  602. data/vendor/robot/atest/testdata/core/test_suite_dir/no_tests_file_1.robot +7 -0
  603. data/vendor/robot/atest/testdata/core/test_suite_dir/test_dir_1/no_tests_dir_2/no_tests_file_3.robot +7 -0
  604. data/vendor/robot/atest/testdata/core/test_suite_dir/test_dir_1/no_tests_file_2.robot +7 -0
  605. data/vendor/robot/atest/testdata/core/test_suite_dir/test_dir_1/test_dir_2/test_dir_3/test_file_3.robot +3 -0
  606. data/vendor/robot/atest/testdata/core/test_suite_dir/test_dir_1/test_file_2.robot +3 -0
  607. data/vendor/robot/atest/testdata/core/test_suite_dir/test_file_1.robot +3 -0
  608. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/__init__.robot +31 -0
  609. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/sub_suite_with_init_file/__INIT__.robot +23 -0
  610. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/sub_suite_with_init_file/test_cases_1.robot +26 -0
  611. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/sub_suite_with_init_file/test_cases_2.robot +16 -0
  612. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/sub_suite_without_init_file/test_cases_1.robot +26 -0
  613. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/sub_suite_without_init_file/test_cases_2.robot +16 -0
  614. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/test_cases_1.robot +26 -0
  615. data/vendor/robot/atest/testdata/core/test_suite_dir_with_init_file/test_cases_2.robot +16 -0
  616. data/vendor/robot/atest/testdata/core/timeouts.robot +329 -0
  617. data/vendor/robot/atest/testdata/core/timeouts_with_custom_messages.robot +61 -0
  618. data/vendor/robot/atest/testdata/core/unicode_failure_in_suite_setup_and_teardown.robot +13 -0
  619. data/vendor/robot/atest/testdata/core/unicode_with_java_libs.robot +14 -0
  620. data/vendor/robot/atest/testdata/core/variables.py +3 -0
  621. data/vendor/robot/atest/testdata/keywords/DupeDynamicKeywords.py +10 -0
  622. data/vendor/robot/atest/testdata/keywords/DupeHybridKeywords.py +12 -0
  623. data/vendor/robot/atest/testdata/keywords/DupeKeywords.py +26 -0
  624. data/vendor/robot/atest/testdata/keywords/DynamicLibraryWithKeywordTags.py +10 -0
  625. data/vendor/robot/atest/testdata/keywords/LibraryWithKeywordTags.py +32 -0
  626. data/vendor/robot/atest/testdata/keywords/TraceLogArgsLibrary.py +42 -0
  627. data/vendor/robot/atest/testdata/keywords/dots_in_keyword_name.robot +85 -0
  628. data/vendor/robot/atest/testdata/keywords/dupe_keywords.robot +12 -0
  629. data/vendor/robot/atest/testdata/keywords/duplicate_dynamic_keywords.robot +20 -0
  630. data/vendor/robot/atest/testdata/keywords/duplicate_hybrid_keywords.robot +20 -0
  631. data/vendor/robot/atest/testdata/keywords/duplicate_static_keywords.robot +28 -0
  632. data/vendor/robot/atest/testdata/keywords/duplicate_user_keywords.robot +61 -0
  633. data/vendor/robot/atest/testdata/keywords/embedded_arguments.robot +274 -0
  634. data/vendor/robot/atest/testdata/keywords/embedded_arguments_library_keywords.robot +152 -0
  635. data/vendor/robot/atest/testdata/keywords/embedded_arguments_match_all.robot +14 -0
  636. data/vendor/robot/atest/testdata/keywords/java_argument_type_coercion.robot +41 -0
  637. data/vendor/robot/atest/testdata/keywords/java_arguments.robot +276 -0
  638. data/vendor/robot/atest/testdata/keywords/keyword_names.robot +127 -0
  639. data/vendor/robot/atest/testdata/keywords/keyword_namespaces.robot +106 -0
  640. data/vendor/robot/atest/testdata/keywords/keyword_not_found.robot +38 -0
  641. data/vendor/robot/atest/testdata/keywords/keyword_recommendations.robot +315 -0
  642. data/vendor/robot/atest/testdata/keywords/keyword_tags.robot +67 -0
  643. data/vendor/robot/atest/testdata/keywords/library/__init__.py +0 -0
  644. data/vendor/robot/atest/testdata/keywords/library/with/__init__.py +0 -0
  645. data/vendor/robot/atest/testdata/keywords/library/with/dots/__init__.py +8 -0
  646. data/vendor/robot/atest/testdata/keywords/library/with/dots/in/__init__.py +0 -0
  647. data/vendor/robot/atest/testdata/keywords/library/with/dots/in/name/__init__.py +12 -0
  648. data/vendor/robot/atest/testdata/keywords/library_with_keywords_with_dots_in_name.py +9 -0
  649. data/vendor/robot/atest/testdata/keywords/named_args/DynamicLibrary.py +40 -0
  650. data/vendor/robot/atest/testdata/keywords/named_args/DynamicLibraryWithKwargsSupport.py +15 -0
  651. data/vendor/robot/atest/testdata/keywords/named_args/KwargsLibrary.py +16 -0
  652. data/vendor/robot/atest/testdata/keywords/named_args/helper.py +21 -0
  653. data/vendor/robot/atest/testdata/keywords/named_args/python_library.py +19 -0
  654. data/vendor/robot/atest/testdata/keywords/named_args/variables_in_names.robot +63 -0
  655. data/vendor/robot/atest/testdata/keywords/named_args/with_dynamic_keywords.robot +131 -0
  656. data/vendor/robot/atest/testdata/keywords/named_args/with_dynamic_kwargs_support.robot +94 -0
  657. data/vendor/robot/atest/testdata/keywords/named_args/with_python_keywords.robot +250 -0
  658. data/vendor/robot/atest/testdata/keywords/named_args/with_user_keywords.robot +172 -0
  659. data/vendor/robot/atest/testdata/keywords/optional_given_when_then.robot +71 -0
  660. data/vendor/robot/atest/testdata/keywords/python_arguments.robot +95 -0
  661. data/vendor/robot/atest/testdata/keywords/resource.with.dots.in.name.robot +12 -0
  662. data/vendor/robot/atest/testdata/keywords/resource_with_keywords_with_dots_in_name.robot +9 -0
  663. data/vendor/robot/atest/testdata/keywords/resources/MyLibrary1.py +78 -0
  664. data/vendor/robot/atest/testdata/keywords/resources/MyLibrary2.py +34 -0
  665. data/vendor/robot/atest/testdata/keywords/resources/RecLibrary1.py +82 -0
  666. data/vendor/robot/atest/testdata/keywords/resources/RecLibrary2.py +21 -0
  667. data/vendor/robot/atest/testdata/keywords/resources/embedded_args_in_lk_1.py +118 -0
  668. data/vendor/robot/atest/testdata/keywords/resources/embedded_args_in_lk_2.py +7 -0
  669. data/vendor/robot/atest/testdata/keywords/resources/embedded_args_in_uk_1.robot +10 -0
  670. data/vendor/robot/atest/testdata/keywords/resources/embedded_args_in_uk_2.robot +4 -0
  671. data/vendor/robot/atest/testdata/keywords/resources/my_resource_1.robot +42 -0
  672. data/vendor/robot/atest/testdata/keywords/resources/my_resource_2.robot +15 -0
  673. data/vendor/robot/atest/testdata/keywords/resources/optional_given_when_then.robot +10 -0
  674. data/vendor/robot/atest/testdata/keywords/resources/recommendation_resource_1.robot +18 -0
  675. data/vendor/robot/atest/testdata/keywords/resources/recommendation_resource_2.robot +15 -0
  676. data/vendor/robot/atest/testdata/keywords/trace_log_keyword_arguments.robot +115 -0
  677. data/vendor/robot/atest/testdata/keywords/trace_log_return_value.robot +36 -0
  678. data/vendor/robot/atest/testdata/keywords/user_keyword_arguments.robot +306 -0
  679. data/vendor/robot/atest/testdata/keywords/user_keyword_kwargs.robot +186 -0
  680. data/vendor/robot/atest/testdata/keywords/user_keyword_return_values.robot +84 -0
  681. data/vendor/robot/atest/testdata/libdoc/DocFormat.py +39 -0
  682. data/vendor/robot/atest/testdata/libdoc/DocFormatHtml.java +20 -0
  683. data/vendor/robot/atest/testdata/libdoc/DocFormatHtml.py +8 -0
  684. data/vendor/robot/atest/testdata/libdoc/DocFormatInvalid.py +8 -0
  685. data/vendor/robot/atest/testdata/libdoc/DocSetInInit.py +4 -0
  686. data/vendor/robot/atest/testdata/libdoc/DynamicLibrary.py +48 -0
  687. data/vendor/robot/atest/testdata/libdoc/DynamicLibraryWithoutGetKwArgsAndDoc.py +13 -0
  688. data/vendor/robot/atest/testdata/libdoc/Example.java +113 -0
  689. data/vendor/robot/atest/testdata/libdoc/ExampleSpec.xml +56 -0
  690. data/vendor/robot/atest/testdata/libdoc/InternalLinking.py +68 -0
  691. data/vendor/robot/atest/testdata/libdoc/InvalidKeywords.py +23 -0
  692. data/vendor/robot/atest/testdata/libdoc/NewStyleNoInit.py +5 -0
  693. data/vendor/robot/atest/testdata/libdoc/NoArgConstructor.java +17 -0
  694. data/vendor/robot/atest/testdata/libdoc/NoConstructor.java +5 -0
  695. data/vendor/robot/atest/testdata/libdoc/invalid_user_keywords.robot +13 -0
  696. data/vendor/robot/atest/testdata/libdoc/module.py +54 -0
  697. data/vendor/robot/atest/testdata/libdoc/no_arg_init.py +8 -0
  698. data/vendor/robot/atest/testdata/libdoc/resource.robot +62 -0
  699. data/vendor/robot/atest/testdata/misc/dummy_lib_test.robot +6 -0
  700. data/vendor/robot/atest/testdata/misc/for_loops.robot +12 -0
  701. data/vendor/robot/atest/testdata/misc/formatting_and_escaping.robot +26 -0
  702. data/vendor/robot/atest/testdata/misc/many_tests.robot +24 -0
  703. data/vendor/robot/atest/testdata/misc/multiple_suites/01__suite_first.robot +36 -0
  704. data/vendor/robot/atest/testdata/misc/multiple_suites/02__sub.suite.1/first__suite4.robot +36 -0
  705. data/vendor/robot/atest/testdata/misc/multiple_suites/02__sub.suite.1/second__.Sui.te.2..robot +36 -0
  706. data/vendor/robot/atest/testdata/misc/multiple_suites/03__suite3.robot +36 -0
  707. data/vendor/robot/atest/testdata/misc/multiple_suites/04__suite4.robot +36 -0
  708. data/vendor/robot/atest/testdata/misc/multiple_suites/05__suite5.robot +36 -0
  709. data/vendor/robot/atest/testdata/misc/multiple_suites/10__suite10.robot +36 -0
  710. data/vendor/robot/atest/testdata/misc/multiple_suites/SUite7.robot +39 -0
  711. data/vendor/robot/atest/testdata/misc/multiple_suites/suiTe_8.robot +36 -0
  712. data/vendor/robot/atest/testdata/misc/multiple_suites/suite 6.robot +39 -0
  713. data/vendor/robot/atest/testdata/misc/multiple_suites/suite_9_name.robot +36 -0
  714. data/vendor/robot/atest/testdata/misc/normal.robot +24 -0
  715. data/vendor/robot/atest/testdata/misc/pass_and_fail.robot +28 -0
  716. data/vendor/robot/atest/testdata/misc/setups_and_teardowns.robot +61 -0
  717. data/vendor/robot/atest/testdata/misc/suites/__init__.robot +7 -0
  718. data/vendor/robot/atest/testdata/misc/suites/fourth.robot +15 -0
  719. data/vendor/robot/atest/testdata/misc/suites/subsuites/sub1.robot +20 -0
  720. data/vendor/robot/atest/testdata/misc/suites/subsuites/sub2.robot +14 -0
  721. data/vendor/robot/atest/testdata/misc/suites/subsuites2/sub.suite.4.robot +3 -0
  722. data/vendor/robot/atest/testdata/misc/suites/subsuites2/subsuite3.robot +15 -0
  723. data/vendor/robot/atest/testdata/misc/suites/tsuite1.robot +18 -0
  724. data/vendor/robot/atest/testdata/misc/suites/tsuite2.robot +11 -0
  725. data/vendor/robot/atest/testdata/misc/suites/tsuite3.robot +12 -0
  726. data/vendor/robot/atest/testdata/misc/timeouts.robot +26 -0
  727. data/vendor/robot/atest/testdata/misc/unicode.robot +38 -0
  728. data/vendor/robot/atest/testdata/misc/warnings_and_errors.robot +29 -0
  729. data/vendor/robot/atest/testdata/output/flatten_keywords.robot +45 -0
  730. data/vendor/robot/atest/testdata/output/js_model.robot +22 -0
  731. data/vendor/robot/atest/testdata/output/listeners/LibraryWithFailingListener.py +4 -0
  732. data/vendor/robot/atest/testdata/output/listeners/RunKeywordWithNonStringArguments.py +5 -0
  733. data/vendor/robot/atest/testdata/output/listeners/failing_library_listener.robot +10 -0
  734. data/vendor/robot/atest/testdata/output/listeners/failing_listener.py +19 -0
  735. data/vendor/robot/atest/testdata/output/listeners/imports/another_resource.robot +3 -0
  736. data/vendor/robot/atest/testdata/output/listeners/imports/dynamically_imported_resource.robot +3 -0
  737. data/vendor/robot/atest/testdata/output/listeners/imports/imports.robot +29 -0
  738. data/vendor/robot/atest/testdata/output/listeners/imports/local_lib.py +7 -0
  739. data/vendor/robot/atest/testdata/output/listeners/imports/resource_with_imports.robot +7 -0
  740. data/vendor/robot/atest/testdata/output/listeners/imports/vars.py +2 -0
  741. data/vendor/robot/atest/testdata/output/listeners/keyword_argument_types.robot +16 -0
  742. data/vendor/robot/atest/testdata/output/listeners/logging_listener.py +23 -0
  743. data/vendor/robot/atest/testdata/output/listeners/test_template.robot +22 -0
  744. data/vendor/robot/atest/testdata/output/listeners/v3.py +103 -0
  745. data/vendor/robot/atest/testdata/output/listeners/verify_template_listener.py +12 -0
  746. data/vendor/robot/atest/testdata/output/names_needing_escaping.robot +46 -0
  747. data/vendor/robot/atest/testdata/parsing/bom.robot +9 -0
  748. data/vendor/robot/atest/testdata/parsing/bom.tsv +10 -0
  749. data/vendor/robot/atest/testdata/parsing/data_formats/html/empty.html +0 -0
  750. data/vendor/robot/atest/testdata/parsing/data_formats/html/invalid.html +1 -0
  751. data/vendor/robot/atest/testdata/parsing/data_formats/html/malformed.html +11 -0
  752. data/vendor/robot/atest/testdata/parsing/data_formats/html/not_a_picture.jpg +1 -0
  753. data/vendor/robot/atest/testdata/parsing/data_formats/html/sample.html +787 -0
  754. data/vendor/robot/atest/testdata/parsing/data_formats/html/with_init/__init__.html +303 -0
  755. data/vendor/robot/atest/testdata/parsing/data_formats/html/with_init/sub_suite1.html +291 -0
  756. data/vendor/robot/atest/testdata/parsing/data_formats/html/with_init/sub_suite2.html +397 -0
  757. data/vendor/robot/atest/testdata/parsing/data_formats/mixed_data/HTML.html +309 -0
  758. data/vendor/robot/atest/testdata/parsing/data_formats/mixed_data/REST.rest +71 -0
  759. data/vendor/robot/atest/testdata/parsing/data_formats/mixed_data/TSV.tsv +30 -0
  760. data/vendor/robot/atest/testdata/parsing/data_formats/mixed_data/TXT.txt +30 -0
  761. data/vendor/robot/atest/testdata/parsing/data_formats/resources/html_resource.html +226 -0
  762. data/vendor/robot/atest/testdata/parsing/data_formats/resources/html_resource2.html +213 -0
  763. data/vendor/robot/atest/testdata/parsing/data_formats/resources/rest_resource.rst +23 -0
  764. data/vendor/robot/atest/testdata/parsing/data_formats/resources/rest_resource2.rest +11 -0
  765. data/vendor/robot/atest/testdata/parsing/data_formats/resources/robot_resource.robot +11 -0
  766. data/vendor/robot/atest/testdata/parsing/data_formats/resources/robot_resource2.robot +6 -0
  767. data/vendor/robot/atest/testdata/parsing/data_formats/resources/tsv_resource.tsv +11 -0
  768. data/vendor/robot/atest/testdata/parsing/data_formats/resources/tsv_resource2.tsv +6 -0
  769. data/vendor/robot/atest/testdata/parsing/data_formats/resources/txt_resource.txt +11 -0
  770. data/vendor/robot/atest/testdata/parsing/data_formats/resources/txt_resource2.txt +6 -0
  771. data/vendor/robot/atest/testdata/parsing/data_formats/resources/variables.py +4 -0
  772. data/vendor/robot/atest/testdata/parsing/data_formats/rest/empty.rest +0 -0
  773. data/vendor/robot/atest/testdata/parsing/data_formats/rest/include.rst +9 -0
  774. data/vendor/robot/atest/testdata/parsing/data_formats/rest/invalid.rest +5 -0
  775. data/vendor/robot/atest/testdata/parsing/data_formats/rest/sample.rst +240 -0
  776. data/vendor/robot/atest/testdata/parsing/data_formats/rest/with_init/__init__.rest +24 -0
  777. data/vendor/robot/atest/testdata/parsing/data_formats/rest/with_init/sub_suite1.rst +5 -0
  778. data/vendor/robot/atest/testdata/parsing/data_formats/rest/with_init/sub_suite2.rst +16 -0
  779. data/vendor/robot/atest/testdata/parsing/data_formats/rest_directives/include.rst +9 -0
  780. data/vendor/robot/atest/testdata/parsing/data_formats/rest_directives/sample.rst +150 -0
  781. data/vendor/robot/atest/testdata/parsing/data_formats/robot/empty.robot +0 -0
  782. data/vendor/robot/atest/testdata/parsing/data_formats/robot/invalid.robot +5 -0
  783. data/vendor/robot/atest/testdata/parsing/data_formats/robot/sample.robot +116 -0
  784. data/vendor/robot/atest/testdata/parsing/data_formats/robot/with_init/__init__.robot +9 -0
  785. data/vendor/robot/atest/testdata/parsing/data_formats/robot/with_init/sub_suite1.robot +23 -0
  786. data/vendor/robot/atest/testdata/parsing/data_formats/robot/with_init/sub_suite2.robot +11 -0
  787. data/vendor/robot/atest/testdata/parsing/data_formats/tsv/empty.tsv +0 -0
  788. data/vendor/robot/atest/testdata/parsing/data_formats/tsv/invalid.tsv +5 -0
  789. data/vendor/robot/atest/testdata/parsing/data_formats/tsv/sample.tsv +113 -0
  790. data/vendor/robot/atest/testdata/parsing/data_formats/tsv/with_init/__init__.tsv +9 -0
  791. data/vendor/robot/atest/testdata/parsing/data_formats/tsv/with_init/sub_suite1.tsv +23 -0
  792. data/vendor/robot/atest/testdata/parsing/data_formats/tsv/with_init/sub_suite2.tsv +10 -0
  793. data/vendor/robot/atest/testdata/parsing/data_formats/txt/empty.txt +0 -0
  794. data/vendor/robot/atest/testdata/parsing/data_formats/txt/invalid.txt +5 -0
  795. data/vendor/robot/atest/testdata/parsing/data_formats/txt/sample.txt +117 -0
  796. data/vendor/robot/atest/testdata/parsing/data_formats/txt/with_init/__init__.txt +9 -0
  797. data/vendor/robot/atest/testdata/parsing/data_formats/txt/with_init/sub_suite1.txt +23 -0
  798. data/vendor/robot/atest/testdata/parsing/data_formats/txt/with_init/sub_suite2.txt +11 -0
  799. data/vendor/robot/atest/testdata/parsing/data_formats/txt_special_cases/escaping.txt +12 -0
  800. data/vendor/robot/atest/testdata/parsing/data_formats/txt_special_cases/pipes.txt +73 -0
  801. data/vendor/robot/atest/testdata/parsing/data_formats/txt_special_cases/spaces.txt +31 -0
  802. data/vendor/robot/atest/testdata/parsing/data_formats/txt_special_cases/txt_with_tabs.txt +10 -0
  803. data/vendor/robot/atest/testdata/parsing/deprecated_settings.robot +22 -0
  804. data/vendor/robot/atest/testdata/parsing/empty_testcase_table.robot +1 -0
  805. data/vendor/robot/atest/testdata/parsing/escaping.robot +185 -0
  806. data/vendor/robot/atest/testdata/parsing/escaping_variables.py +15 -0
  807. data/vendor/robot/atest/testdata/parsing/failing_init/__init__.robot +6 -0
  808. data/vendor/robot/atest/testdata/parsing/failing_init/failing_init.robot +3 -0
  809. data/vendor/robot/atest/testdata/parsing/html_entityrefs.html +223 -0
  810. data/vendor/robot/atest/testdata/parsing/html_entityrefs_variables.py +3 -0
  811. data/vendor/robot/atest/testdata/parsing/invalid_table_names.html +47 -0
  812. data/vendor/robot/atest/testdata/parsing/invalid_table_names.robot +21 -0
  813. data/vendor/robot/atest/testdata/parsing/invalid_tables_resource.html +40 -0
  814. data/vendor/robot/atest/testdata/parsing/invalid_tables_resource.robot +15 -0
  815. data/vendor/robot/atest/testdata/parsing/library_caching/file1.robot +11 -0
  816. data/vendor/robot/atest/testdata/parsing/library_caching/file2.robot +11 -0
  817. data/vendor/robot/atest/testdata/parsing/library_caching/resource.robot +6 -0
  818. data/vendor/robot/atest/testdata/parsing/multirow.robot +208 -0
  819. data/vendor/robot/atest/testdata/parsing/nbsp.html +22 -0
  820. data/vendor/robot/atest/testdata/parsing/nbsp.robot +6 -0
  821. data/vendor/robot/atest/testdata/parsing/nbsp.tsv +3 -0
  822. data/vendor/robot/atest/testdata/parsing/non_ascii_paths/Ty-ouml/sect-test-sect.robot +3 -0
  823. data/vendor/robot/atest/testdata/parsing/non_ascii_paths/Ty-ouml/tyhj-auml.robot +0 -0
  824. data/vendor/robot/atest/testdata/parsing/non_ascii_paths/test-auml-ouml.robot +3 -0
  825. data/vendor/robot/atest/testdata/parsing/notests/empty.tsv +0 -0
  826. data/vendor/robot/atest/testdata/parsing/notests/no_tests.txt +1 -0
  827. data/vendor/robot/atest/testdata/parsing/notests/subdir/content +1 -0
  828. data/vendor/robot/atest/testdata/parsing/resource_parsing/01_tests.robot +7 -0
  829. data/vendor/robot/atest/testdata/parsing/resource_parsing/02_resource.robot +6 -0
  830. data/vendor/robot/atest/testdata/parsing/resource_parsing/03_resource.robot +11 -0
  831. data/vendor/robot/atest/testdata/parsing/resource_parsing/04_tests.robot +12 -0
  832. data/vendor/robot/atest/testdata/parsing/same_setting_multiple_times.robot +67 -0
  833. data/vendor/robot/atest/testdata/parsing/suite_metadata.robot +20 -0
  834. data/vendor/robot/atest/testdata/parsing/suite_settings.robot +28 -0
  835. data/vendor/robot/atest/testdata/parsing/table_names.robot +41 -0
  836. data/vendor/robot/atest/testdata/parsing/test_case_settings.robot +167 -0
  837. data/vendor/robot/atest/testdata/parsing/unsupported.log +1 -0
  838. data/vendor/robot/atest/testdata/parsing/user_keyword_settings.robot +183 -0
  839. data/vendor/robot/atest/testdata/parsing/utf8_data.html +342 -0
  840. data/vendor/robot/atest/testdata/parsing/utf8_data.robot +38 -0
  841. data/vendor/robot/atest/testdata/parsing/utf8_data.tsv +40 -0
  842. data/vendor/robot/atest/testdata/parsing/utf8_data_in_html5.html +341 -0
  843. data/vendor/robot/atest/testdata/rebot/created_normal.xml +23 -0
  844. data/vendor/robot/atest/testdata/rebot/times.xml +77 -0
  845. data/vendor/robot/atest/testdata/running/NonAsciiByteLibrary.py +11 -0
  846. data/vendor/robot/atest/testdata/running/binary_list.py +2 -0
  847. data/vendor/robot/atest/testdata/running/continue_for_loop.robot +146 -0
  848. data/vendor/robot/atest/testdata/running/continue_on_failure.robot +221 -0
  849. data/vendor/robot/atest/testdata/running/continue_on_failure_in_suite_setup.robot +14 -0
  850. data/vendor/robot/atest/testdata/running/dynamic_teardown.robot +8 -0
  851. data/vendor/robot/atest/testdata/running/empty_setup_and_teardown_are_ignored.robot +15 -0
  852. data/vendor/robot/atest/testdata/running/exit_for_loop.robot +128 -0
  853. data/vendor/robot/atest/testdata/running/expbytevalues.py +41 -0
  854. data/vendor/robot/atest/testdata/running/failures_in_teardown.robot +158 -0
  855. data/vendor/robot/atest/testdata/running/fatal_error_in_suite_teardown.robot +12 -0
  856. data/vendor/robot/atest/testdata/running/fatal_exception/01__python_library_kw.robot +14 -0
  857. data/vendor/robot/atest/testdata/running/fatal_exception/02__irrelevant.robot +16 -0
  858. data/vendor/robot/atest/testdata/running/fatal_exception/03__java_library_kw.robot +12 -0
  859. data/vendor/robot/atest/testdata/running/fatal_exception_suite_setup/01__suite_setup.robot +9 -0
  860. data/vendor/robot/atest/testdata/running/fatal_exception_suite_setup/02__irrelevant.robot +14 -0
  861. data/vendor/robot/atest/testdata/running/for.robot +552 -0
  862. data/vendor/robot/atest/testdata/running/html_error_message.robot +67 -0
  863. data/vendor/robot/atest/testdata/running/long_error_messages.robot +64 -0
  864. data/vendor/robot/atest/testdata/running/non_ascii_bytes.robot +30 -0
  865. data/vendor/robot/atest/testdata/running/none_setup_and_teardown_are_ignored.robot +15 -0
  866. data/vendor/robot/atest/testdata/running/pass_execution.robot +253 -0
  867. data/vendor/robot/atest/testdata/running/pass_execution_in_suite_setup_and_teardown.robot +15 -0
  868. data/vendor/robot/atest/testdata/running/pass_execution_in_suite_teardown_invalid.robot +12 -0
  869. data/vendor/robot/atest/testdata/running/pass_execution_library.py +10 -0
  870. data/vendor/robot/atest/testdata/running/prevent_recursion.robot +66 -0
  871. data/vendor/robot/atest/testdata/running/return_from_keyword.robot +173 -0
  872. data/vendor/robot/atest/testdata/running/stopping_with_signal/Library.py +15 -0
  873. data/vendor/robot/atest/testdata/running/stopping_with_signal/keyword_timeout.robot +21 -0
  874. data/vendor/robot/atest/testdata/running/stopping_with_signal/run_keyword.robot +15 -0
  875. data/vendor/robot/atest/testdata/running/stopping_with_signal/swallow_exception.robot +15 -0
  876. data/vendor/robot/atest/testdata/running/stopping_with_signal/test_timeout.robot +16 -0
  877. data/vendor/robot/atest/testdata/running/stopping_with_signal/with_teardown.robot +21 -0
  878. data/vendor/robot/atest/testdata/running/stopping_with_signal/without_any_timeout.robot +15 -0
  879. data/vendor/robot/atest/testdata/running/test_template.robot +305 -0
  880. data/vendor/robot/atest/testdata/running/test_template_with_embeded_args.robot +47 -0
  881. data/vendor/robot/atest/testdata/standard_libraries/builtin/DynamicRegisteredLibrary.py +14 -0
  882. data/vendor/robot/atest/testdata/standard_libraries/builtin/FailUntilSucceeds.py +14 -0
  883. data/vendor/robot/atest/testdata/standard_libraries/builtin/NotRegisteringLibrary.py +5 -0
  884. data/vendor/robot/atest/testdata/standard_libraries/builtin/RegisteredClass.py +12 -0
  885. data/vendor/robot/atest/testdata/standard_libraries/builtin/RegisteringLibrary.py +13 -0
  886. data/vendor/robot/atest/testdata/standard_libraries/builtin/UseBuiltIn.py +17 -0
  887. data/vendor/robot/atest/testdata/standard_libraries/builtin/call_method.robot +60 -0
  888. data/vendor/robot/atest/testdata/standard_libraries/builtin/convert_to_bytes.robot +170 -0
  889. data/vendor/robot/atest/testdata/standard_libraries/builtin/converter.robot +220 -0
  890. data/vendor/robot/atest/testdata/standard_libraries/builtin/count.robot +74 -0
  891. data/vendor/robot/atest/testdata/standard_libraries/builtin/create_dictionary.robot +120 -0
  892. data/vendor/robot/atest/testdata/standard_libraries/builtin/documentation/__init__.robot +4 -0
  893. data/vendor/robot/atest/testdata/standard_libraries/builtin/documentation/set_documentation.robot +39 -0
  894. data/vendor/robot/atest/testdata/standard_libraries/builtin/evaluate.robot +147 -0
  895. data/vendor/robot/atest/testdata/standard_libraries/builtin/exit_on_failure.robot +20 -0
  896. data/vendor/robot/atest/testdata/standard_libraries/builtin/fail.robot +40 -0
  897. data/vendor/robot/atest/testdata/standard_libraries/builtin/fatal_error.robot +21 -0
  898. data/vendor/robot/atest/testdata/standard_libraries/builtin/get_library_instance.robot +111 -0
  899. data/vendor/robot/atest/testdata/standard_libraries/builtin/get_time.robot +73 -0
  900. data/vendor/robot/atest/testdata/standard_libraries/builtin/get_user_dict.py +8 -0
  901. data/vendor/robot/atest/testdata/standard_libraries/builtin/get_variable_value.robot +54 -0
  902. data/vendor/robot/atest/testdata/standard_libraries/builtin/get_variables.robot +92 -0
  903. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_library.robot +55 -0
  904. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_resource.robot +89 -0
  905. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_resource_resource_1.robot +13 -0
  906. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_resource_resource_2.robot +12 -0
  907. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_resource_resource_3.robot +10 -0
  908. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_resource_resource_resource.robot +14 -0
  909. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_resource_vars.py +2 -0
  910. data/vendor/robot/atest/testdata/standard_libraries/builtin/import_variables.robot +95 -0
  911. data/vendor/robot/atest/testdata/standard_libraries/builtin/keyword_should_exist.robot +83 -0
  912. data/vendor/robot/atest/testdata/standard_libraries/builtin/keyword_should_exist_resource_1.robot +6 -0
  913. data/vendor/robot/atest/testdata/standard_libraries/builtin/keyword_should_exist_resource_2.robot +3 -0
  914. data/vendor/robot/atest/testdata/standard_libraries/builtin/length.robot +114 -0
  915. data/vendor/robot/atest/testdata/standard_libraries/builtin/length_variables.py +44 -0
  916. data/vendor/robot/atest/testdata/standard_libraries/builtin/log.robot +115 -0
  917. data/vendor/robot/atest/testdata/standard_libraries/builtin/log_variables.robot +37 -0
  918. data/vendor/robot/atest/testdata/standard_libraries/builtin/misc.robot +46 -0
  919. data/vendor/robot/atest/testdata/standard_libraries/builtin/numbers_to_convert.py +33 -0
  920. data/vendor/robot/atest/testdata/standard_libraries/builtin/objects_for_call_method.py +32 -0
  921. data/vendor/robot/atest/testdata/standard_libraries/builtin/reload_library/Reloadable.py +34 -0
  922. data/vendor/robot/atest/testdata/standard_libraries/builtin/reload_library/StaticLibrary.py +11 -0
  923. data/vendor/robot/atest/testdata/standard_libraries/builtin/reload_library/module_library.py +6 -0
  924. data/vendor/robot/atest/testdata/standard_libraries/builtin/reload_library/reload_library.robot +66 -0
  925. data/vendor/robot/atest/testdata/standard_libraries/builtin/reload_library/reload_with_name.robot +24 -0
  926. data/vendor/robot/atest/testdata/standard_libraries/builtin/repeat_keyword.robot +97 -0
  927. data/vendor/robot/atest/testdata/standard_libraries/builtin/replace_variables.robot +56 -0
  928. data/vendor/robot/atest/testdata/standard_libraries/builtin/resource_for_get_variables.robot +7 -0
  929. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword.robot +95 -0
  930. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_and_continue_on_failure.robot +92 -0
  931. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_and_return.robot +176 -0
  932. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_and_return_status.robot +9 -0
  933. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_all_critical_tests_passed_when_critical_fails.robot +8 -0
  934. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_all_critical_tests_passed_when_criticals_pass.robot +21 -0
  935. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_all_tests_passed_when_all_pass.robot +18 -0
  936. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_all_tests_passed_when_test_fails.robot +7 -0
  937. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_any_critical_tests_failed_when_critical_fails.robot +14 -0
  938. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_any_critical_tests_failed_when_criticals_pass.robot +7 -0
  939. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_any_tests_failed_when_all_pass.robot +6 -0
  940. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_keyword_if_any_tests_failed_when_test_fails.robot +13 -0
  941. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_based_on_suite_stats/run_kw_variants_used_outside_suite_teardown.robot +16 -0
  942. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_if_test_passed_failed/run_keyword_if_test_failed_in_suite_fixtures.robot +12 -0
  943. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_if_test_passed_failed/run_keyword_if_test_passed_failed.robot +138 -0
  944. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_if_test_passed_failed/run_keyword_if_test_passed_in_suite_fixtures.robot +13 -0
  945. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_if_timeout_occurred.robot +86 -0
  946. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_if_unless.robot +183 -0
  947. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_variants_registering.robot +43 -0
  948. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_variants_variable_handling.robot +56 -0
  949. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_variants_with_escaping_control_arguments.robot +55 -0
  950. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keyword_with_errors.robot +236 -0
  951. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keywords.robot +123 -0
  952. data/vendor/robot/atest/testdata/standard_libraries/builtin/run_keywords_with_arguments.robot +54 -0
  953. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_library_search_order/TestLibrary.py +13 -0
  954. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_library_search_order/setting_library_order.robot +71 -0
  955. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_library_search_order/setting_library_order_does_not_affect_next_suite.robot +11 -0
  956. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_log_level.robot +41 -0
  957. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_resource_search_order/resource1.robot +3 -0
  958. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_resource_search_order/resource2.robot +3 -0
  959. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_resource_search_order/setting_resource_order.robot +68 -0
  960. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_resource_search_order/setting_resource_order_does_not_affect_next_suite.robot +11 -0
  961. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_suite_metadata.robot +49 -0
  962. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_test_message.robot +102 -0
  963. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_test_message_in_suite_level.robot +7 -0
  964. data/vendor/robot/atest/testdata/standard_libraries/builtin/set_variable_if.robot +148 -0
  965. data/vendor/robot/atest/testdata/standard_libraries/builtin/setting_variables/__init__.robot +31 -0
  966. data/vendor/robot/atest/testdata/standard_libraries/builtin/setting_variables/variables.robot +611 -0
  967. data/vendor/robot/atest/testdata/standard_libraries/builtin/setting_variables/variables2.robot +43 -0
  968. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_be_equal.robot +101 -0
  969. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_be_equal_as_xxx.robot +107 -0
  970. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_be_true.robot +48 -0
  971. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_contain.robot +62 -0
  972. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_contain_any.robot +100 -0
  973. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_match.robot +72 -0
  974. data/vendor/robot/atest/testdata/standard_libraries/builtin/should_xxx_with.robot +66 -0
  975. data/vendor/robot/atest/testdata/standard_libraries/builtin/sleep.robot +29 -0
  976. data/vendor/robot/atest/testdata/standard_libraries/builtin/tags/__init__.robot +8 -0
  977. data/vendor/robot/atest/testdata/standard_libraries/builtin/tags/sub1.robot +95 -0
  978. data/vendor/robot/atest/testdata/standard_libraries/builtin/tags/sub2.robot +37 -0
  979. data/vendor/robot/atest/testdata/standard_libraries/builtin/template.txt +2 -0
  980. data/vendor/robot/atest/testdata/standard_libraries/builtin/times.py +8 -0
  981. data/vendor/robot/atest/testdata/standard_libraries/builtin/used_in_custom_libs_and_listeners.robot +17 -0
  982. data/vendor/robot/atest/testdata/standard_libraries/builtin/variable.py +9 -0
  983. data/vendor/robot/atest/testdata/standard_libraries/builtin/variable_should_exist.robot +142 -0
  984. data/vendor/robot/atest/testdata/standard_libraries/builtin/variables_to_import_1.py +2 -0
  985. data/vendor/robot/atest/testdata/standard_libraries/builtin/variables_to_import_2.py +4 -0
  986. data/vendor/robot/atest/testdata/standard_libraries/builtin/variables_to_verify.py +62 -0
  987. data/vendor/robot/atest/testdata/standard_libraries/builtin/vars_for_get_variables.py +1 -0
  988. data/vendor/robot/atest/testdata/standard_libraries/builtin/wait_until_keyword_succeeds.robot +131 -0
  989. data/vendor/robot/atest/testdata/standard_libraries/collections/CollectionsHelperLibrary.py +9 -0
  990. data/vendor/robot/atest/testdata/standard_libraries/collections/collections_resources.robot +8 -0
  991. data/vendor/robot/atest/testdata/standard_libraries/collections/dictionary.robot +250 -0
  992. data/vendor/robot/atest/testdata/standard_libraries/collections/list.robot +598 -0
  993. data/vendor/robot/atest/testdata/standard_libraries/datetime/add_time_to_date.robot +27 -0
  994. data/vendor/robot/atest/testdata/standard_libraries/datetime/convert_date_input_format.robot +74 -0
  995. data/vendor/robot/atest/testdata/standard_libraries/datetime/convert_date_result_format.robot +101 -0
  996. data/vendor/robot/atest/testdata/standard_libraries/datetime/convert_time_input_format.robot +80 -0
  997. data/vendor/robot/atest/testdata/standard_libraries/datetime/convert_time_result_format.robot +72 -0
  998. data/vendor/robot/atest/testdata/standard_libraries/datetime/date_ranges.robot +48 -0
  999. data/vendor/robot/atest/testdata/standard_libraries/datetime/datesandtimes.py +28 -0
  1000. data/vendor/robot/atest/testdata/standard_libraries/datetime/get_current_date.robot +43 -0
  1001. data/vendor/robot/atest/testdata/standard_libraries/datetime/subtract_date_from_date.robot +30 -0
  1002. data/vendor/robot/atest/testdata/standard_libraries/datetime/subtract_time_from_date.robot +25 -0
  1003. data/vendor/robot/atest/testdata/standard_libraries/datetime/time_calculations.robot +27 -0
  1004. data/vendor/robot/atest/testdata/standard_libraries/dialogs/dialogs.robot +76 -0
  1005. data/vendor/robot/atest/testdata/standard_libraries/easter.robot +7 -0
  1006. data/vendor/robot/atest/testdata/standard_libraries/operating_system/create_and_remove_dir.robot +66 -0
  1007. data/vendor/robot/atest/testdata/standard_libraries/operating_system/create_file.robot +95 -0
  1008. data/vendor/robot/atest/testdata/standard_libraries/operating_system/env_vars.robot +134 -0
  1009. data/vendor/robot/atest/testdata/standard_libraries/operating_system/file_and_dir_empty_or_not.robot +101 -0
  1010. data/vendor/robot/atest/testdata/standard_libraries/operating_system/file_and_dir_existence.robot +178 -0
  1011. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/HelperLib.py +7 -0
  1012. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/ascii.txt +1 -0
  1013. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/latin-1.txt +1 -0
  1014. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/latin-1_multiple_rows.txt +5 -0
  1015. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/prog.py +14 -0
  1016. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-16BE.txt +0 -0
  1017. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-16BEBOM.txt +0 -0
  1018. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-16LE.txt +0 -0
  1019. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-16LEBOM.txt +0 -0
  1020. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-8.txt +1 -0
  1021. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-8_multiple_rows.txt +5 -0
  1022. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/utf-8_windows_line_endings.txt +5 -0
  1023. data/vendor/robot/atest/testdata/standard_libraries/operating_system/files/writable_prog.py +5 -0
  1024. data/vendor/robot/atest/testdata/standard_libraries/operating_system/get_file.robot +185 -0
  1025. data/vendor/robot/atest/testdata/standard_libraries/operating_system/get_file_size.robot +26 -0
  1026. data/vendor/robot/atest/testdata/standard_libraries/operating_system/list_dir.robot +105 -0
  1027. data/vendor/robot/atest/testdata/standard_libraries/operating_system/modified_time.robot +109 -0
  1028. data/vendor/robot/atest/testdata/standard_libraries/operating_system/move_copy_directory.robot +88 -0
  1029. data/vendor/robot/atest/testdata/standard_libraries/operating_system/move_copy_file.robot +169 -0
  1030. data/vendor/robot/atest/testdata/standard_libraries/operating_system/move_copy_files.robot +220 -0
  1031. data/vendor/robot/atest/testdata/standard_libraries/operating_system/os_resource.robot +31 -0
  1032. data/vendor/robot/atest/testdata/standard_libraries/operating_system/path.robot +121 -0
  1033. data/vendor/robot/atest/testdata/standard_libraries/operating_system/path_expansion.robot +28 -0
  1034. data/vendor/robot/atest/testdata/standard_libraries/operating_system/remove_file.robot +63 -0
  1035. data/vendor/robot/atest/testdata/standard_libraries/operating_system/run.robot +91 -0
  1036. data/vendor/robot/atest/testdata/standard_libraries/operating_system/special_names.robot +87 -0
  1037. data/vendor/robot/atest/testdata/standard_libraries/operating_system/touch.robot +42 -0
  1038. data/vendor/robot/atest/testdata/standard_libraries/operating_system/wait_until_library.py +23 -0
  1039. data/vendor/robot/atest/testdata/standard_libraries/operating_system/wait_until_removed_created.robot +112 -0
  1040. data/vendor/robot/atest/testdata/standard_libraries/process/CustomLib.py +4 -0
  1041. data/vendor/robot/atest/testdata/standard_libraries/process/PlatformLib.py +10 -0
  1042. data/vendor/robot/atest/testdata/standard_libraries/process/active_process.robot +48 -0
  1043. data/vendor/robot/atest/testdata/standard_libraries/process/commandline.robot +99 -0
  1044. data/vendor/robot/atest/testdata/standard_libraries/process/env_config.robot +51 -0
  1045. data/vendor/robot/atest/testdata/standard_libraries/process/files/countdown.py +22 -0
  1046. data/vendor/robot/atest/testdata/standard_libraries/process/files/encoding.py +25 -0
  1047. data/vendor/robot/atest/testdata/standard_libraries/process/files/non_terminable.py +31 -0
  1048. data/vendor/robot/atest/testdata/standard_libraries/process/files/script.py +11 -0
  1049. data/vendor/robot/atest/testdata/standard_libraries/process/files/timeout.py +12 -0
  1050. data/vendor/robot/atest/testdata/standard_libraries/process/get_process_result.robot +67 -0
  1051. data/vendor/robot/atest/testdata/standard_libraries/process/is_process_alive.robot +24 -0
  1052. data/vendor/robot/atest/testdata/standard_libraries/process/newlines.robot +20 -0
  1053. data/vendor/robot/atest/testdata/standard_libraries/process/no_active_process.robot +16 -0
  1054. data/vendor/robot/atest/testdata/standard_libraries/process/output_encoding.robot +51 -0
  1055. data/vendor/robot/atest/testdata/standard_libraries/process/passing_arguments.robot +51 -0
  1056. data/vendor/robot/atest/testdata/standard_libraries/process/process_library.robot +54 -0
  1057. data/vendor/robot/atest/testdata/standard_libraries/process/process_resource.robot +122 -0
  1058. data/vendor/robot/atest/testdata/standard_libraries/process/run_process_with_timeout.robot +54 -0
  1059. data/vendor/robot/atest/testdata/standard_libraries/process/sending_signal.robot +71 -0
  1060. data/vendor/robot/atest/testdata/standard_libraries/process/stdout_and_stderr.robot +93 -0
  1061. data/vendor/robot/atest/testdata/standard_libraries/process/terminate_process.robot +107 -0
  1062. data/vendor/robot/atest/testdata/standard_libraries/process/wait_for_process.robot +43 -0
  1063. data/vendor/robot/atest/testdata/standard_libraries/remote/Conflict.py +2 -0
  1064. data/vendor/robot/atest/testdata/standard_libraries/remote/Helper.py +4 -0
  1065. data/vendor/robot/atest/testdata/standard_libraries/remote/argument_coersion.robot +143 -0
  1066. data/vendor/robot/atest/testdata/standard_libraries/remote/arguments.py +88 -0
  1067. data/vendor/robot/atest/testdata/standard_libraries/remote/arguments.robot +133 -0
  1068. data/vendor/robot/atest/testdata/standard_libraries/remote/binary_result.robot +70 -0
  1069. data/vendor/robot/atest/testdata/standard_libraries/remote/binaryresult.py +44 -0
  1070. data/vendor/robot/atest/testdata/standard_libraries/remote/dict_result.robot +35 -0
  1071. data/vendor/robot/atest/testdata/standard_libraries/remote/dictresult.py +19 -0
  1072. data/vendor/robot/atest/testdata/standard_libraries/remote/documentation.py +40 -0
  1073. data/vendor/robot/atest/testdata/standard_libraries/remote/documentation.robot +20 -0
  1074. data/vendor/robot/atest/testdata/standard_libraries/remote/invalid.py +24 -0
  1075. data/vendor/robot/atest/testdata/standard_libraries/remote/invalid.robot +27 -0
  1076. data/vendor/robot/atest/testdata/standard_libraries/remote/keyword_tags.robot +25 -0
  1077. data/vendor/robot/atest/testdata/standard_libraries/remote/keywordtags.py +38 -0
  1078. data/vendor/robot/atest/testdata/standard_libraries/remote/remoteserver.py +77 -0
  1079. data/vendor/robot/atest/testdata/standard_libraries/remote/simple_server.robot +47 -0
  1080. data/vendor/robot/atest/testdata/standard_libraries/remote/simpleserver.py +41 -0
  1081. data/vendor/robot/atest/testdata/standard_libraries/remote/special_errors.robot +26 -0
  1082. data/vendor/robot/atest/testdata/standard_libraries/remote/specialerrors.py +20 -0
  1083. data/vendor/robot/atest/testdata/standard_libraries/remote/timeouts.py +13 -0
  1084. data/vendor/robot/atest/testdata/standard_libraries/remote/timeouts.robot +43 -0
  1085. data/vendor/robot/atest/testdata/standard_libraries/remote/variables.py +28 -0
  1086. data/vendor/robot/atest/testdata/standard_libraries/reserved.robot +25 -0
  1087. data/vendor/robot/atest/testdata/standard_libraries/screenshot/screenshot_resource.robot +22 -0
  1088. data/vendor/robot/atest/testdata/standard_libraries/screenshot/set_screenshot_directory.robot +33 -0
  1089. data/vendor/robot/atest/testdata/standard_libraries/screenshot/take_screenshot.robot +49 -0
  1090. data/vendor/robot/atest/testdata/standard_libraries/string/convert_to.robot +31 -0
  1091. data/vendor/robot/atest/testdata/standard_libraries/string/encode_decode.robot +72 -0
  1092. data/vendor/robot/atest/testdata/standard_libraries/string/generate_random_string.robot +49 -0
  1093. data/vendor/robot/atest/testdata/standard_libraries/string/get_matching_lines.robot +115 -0
  1094. data/vendor/robot/atest/testdata/standard_libraries/string/get_regexp_matches.robot +54 -0
  1095. data/vendor/robot/atest/testdata/standard_libraries/string/remove_from_string.robot +33 -0
  1096. data/vendor/robot/atest/testdata/standard_libraries/string/replace_string.robot +43 -0
  1097. data/vendor/robot/atest/testdata/standard_libraries/string/should_be.robot +79 -0
  1098. data/vendor/robot/atest/testdata/standard_libraries/string/split_string.robot +95 -0
  1099. data/vendor/robot/atest/testdata/standard_libraries/string/string.robot +112 -0
  1100. data/vendor/robot/atest/testdata/standard_libraries/telnet/README.rst +15 -0
  1101. data/vendor/robot/atest/testdata/standard_libraries/telnet/configuration.robot +272 -0
  1102. data/vendor/robot/atest/testdata/standard_libraries/telnet/connections.robot +53 -0
  1103. data/vendor/robot/atest/testdata/standard_libraries/telnet/login.robot +38 -0
  1104. data/vendor/robot/atest/testdata/standard_libraries/telnet/read_and_write.robot +173 -0
  1105. data/vendor/robot/atest/testdata/standard_libraries/telnet/telnet_resource.robot +24 -0
  1106. data/vendor/robot/atest/testdata/standard_libraries/telnet/telnet_variables.py +10 -0
  1107. data/vendor/robot/atest/testdata/standard_libraries/telnet/terminal_emulation.robot +159 -0
  1108. data/vendor/robot/atest/testdata/standard_libraries/xml/add_and_remove_elements.robot +118 -0
  1109. data/vendor/robot/atest/testdata/standard_libraries/xml/add_and_remove_elements_with_lxml.robot +120 -0
  1110. data/vendor/robot/atest/testdata/standard_libraries/xml/clear_element.robot +27 -0
  1111. data/vendor/robot/atest/testdata/standard_libraries/xml/clear_element_with_lxml.robot +28 -0
  1112. data/vendor/robot/atest/testdata/standard_libraries/xml/copy_element.robot +35 -0
  1113. data/vendor/robot/atest/testdata/standard_libraries/xml/copy_element_with_lxml.robot +36 -0
  1114. data/vendor/robot/atest/testdata/standard_libraries/xml/element_attribute.robot +81 -0
  1115. data/vendor/robot/atest/testdata/standard_libraries/xml/element_attribute_with_lxml.robot +82 -0
  1116. data/vendor/robot/atest/testdata/standard_libraries/xml/element_should_exist.robot +47 -0
  1117. data/vendor/robot/atest/testdata/standard_libraries/xml/element_should_exist_with_lxml.robot +48 -0
  1118. data/vendor/robot/atest/testdata/standard_libraries/xml/element_text.robot +89 -0
  1119. data/vendor/robot/atest/testdata/standard_libraries/xml/element_text_with_lxml.robot +90 -0
  1120. data/vendor/robot/atest/testdata/standard_libraries/xml/elements_should_be_equal.robot +91 -0
  1121. data/vendor/robot/atest/testdata/standard_libraries/xml/elements_should_be_equal_with_lxml.robot +92 -0
  1122. data/vendor/robot/atest/testdata/standard_libraries/xml/elements_should_match.robot +87 -0
  1123. data/vendor/robot/atest/testdata/standard_libraries/xml/elements_should_match_with_lxml.robot +88 -0
  1124. data/vendor/robot/atest/testdata/standard_libraries/xml/etree_namespaces.robot +97 -0
  1125. data/vendor/robot/atest/testdata/standard_libraries/xml/etree_namespaces_with_lxml.robot +54 -0
  1126. data/vendor/robot/atest/testdata/standard_libraries/xml/get_elements.robot +71 -0
  1127. data/vendor/robot/atest/testdata/standard_libraries/xml/get_elements_with_lxml.robot +72 -0
  1128. data/vendor/robot/atest/testdata/standard_libraries/xml/namespaces.robot +76 -0
  1129. data/vendor/robot/atest/testdata/standard_libraries/xml/namespaces.xml +17 -0
  1130. data/vendor/robot/atest/testdata/standard_libraries/xml/namespaces_with_lxml.robot +60 -0
  1131. data/vendor/robot/atest/testdata/standard_libraries/xml/parsing.robot +39 -0
  1132. data/vendor/robot/atest/testdata/standard_libraries/xml/parsing_with_lxml.robot +40 -0
  1133. data/vendor/robot/atest/testdata/standard_libraries/xml/save_xml.robot +83 -0
  1134. data/vendor/robot/atest/testdata/standard_libraries/xml/save_xml_with_lxml.robot +81 -0
  1135. data/vendor/robot/atest/testdata/standard_libraries/xml/set_element_information.robot +125 -0
  1136. data/vendor/robot/atest/testdata/standard_libraries/xml/set_element_information_with_lxml.robot +126 -0
  1137. data/vendor/robot/atest/testdata/standard_libraries/xml/strip_namespaces.robot +63 -0
  1138. data/vendor/robot/atest/testdata/standard_libraries/xml/strip_namespaces_with_lxml.robot +63 -0
  1139. data/vendor/robot/atest/testdata/standard_libraries/xml/test.xml +24 -0
  1140. data/vendor/robot/atest/testdata/standard_libraries/xml/to_string.robot +36 -0
  1141. data/vendor/robot/atest/testdata/standard_libraries/xml/to_string_with_lxml.robot +38 -0
  1142. data/vendor/robot/atest/testdata/standard_libraries/xml/xml_resource.robot +88 -0
  1143. data/vendor/robot/atest/testdata/standard_libraries/xml/xpath.robot +102 -0
  1144. data/vendor/robot/atest/testdata/standard_libraries/xml/xpath_with_lxml.robot +127 -0
  1145. data/vendor/robot/atest/testdata/tags/default_and_force_tags.robot +19 -0
  1146. data/vendor/robot/atest/testdata/tags/default_tags.robot +14 -0
  1147. data/vendor/robot/atest/testdata/tags/force_tags.robot +14 -0
  1148. data/vendor/robot/atest/testdata/tags/include_and_exclude.robot +28 -0
  1149. data/vendor/robot/atest/testdata/tags/no_force_no_default_tags.robot +11 -0
  1150. data/vendor/robot/atest/testdata/tags/tags_are_not_normalized.robot +55 -0
  1151. data/vendor/robot/atest/testdata/test_libraries/AbstractJavaLibrary.class +0 -0
  1152. data/vendor/robot/atest/testdata/test_libraries/AbstractJavaLibrary.java +2 -0
  1153. data/vendor/robot/atest/testdata/test_libraries/ConstructorLogging.class +0 -0
  1154. data/vendor/robot/atest/testdata/test_libraries/ConstructorLogging.java +12 -0
  1155. data/vendor/robot/atest/testdata/test_libraries/DeprecatedKeywords.py +34 -0
  1156. data/vendor/robot/atest/testdata/test_libraries/DynamicLibraryTags.py +26 -0
  1157. data/vendor/robot/atest/testdata/test_libraries/ImportLogging.py +10 -0
  1158. data/vendor/robot/atest/testdata/test_libraries/ImportRobotModuleTestLibrary.py +24 -0
  1159. data/vendor/robot/atest/testdata/test_libraries/InitImportingAndIniting.py +31 -0
  1160. data/vendor/robot/atest/testdata/test_libraries/InitLogging.py +17 -0
  1161. data/vendor/robot/atest/testdata/test_libraries/InitializationFailJavaLibrary.class +0 -0
  1162. data/vendor/robot/atest/testdata/test_libraries/InitializationFailJavaLibrary.java +7 -0
  1163. data/vendor/robot/atest/testdata/test_libraries/InitializationFailLibrary.py +4 -0
  1164. data/vendor/robot/atest/testdata/test_libraries/JavaLibUsingTimestamps.class +0 -0
  1165. data/vendor/robot/atest/testdata/test_libraries/JavaLibUsingTimestamps.java +16 -0
  1166. data/vendor/robot/atest/testdata/test_libraries/JavaLibraryWithoutPublicConstructor.class +0 -0
  1167. data/vendor/robot/atest/testdata/test_libraries/JavaLibraryWithoutPublicConstructor.java +3 -0
  1168. data/vendor/robot/atest/testdata/test_libraries/LibUsingLoggingApi.py +41 -0
  1169. data/vendor/robot/atest/testdata/test_libraries/LibUsingPyLogging.py +67 -0
  1170. data/vendor/robot/atest/testdata/test_libraries/MyInvalidLibFile.py +2 -0
  1171. data/vendor/robot/atest/testdata/test_libraries/MyJavaLib.class +0 -0
  1172. data/vendor/robot/atest/testdata/test_libraries/MyJavaLib.java +6 -0
  1173. data/vendor/robot/atest/testdata/test_libraries/MyJavaLib2.class +0 -0
  1174. data/vendor/robot/atest/testdata/test_libraries/MyJavaLib2.java +6 -0
  1175. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/ClassLib.py +4 -0
  1176. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/SubModuleLib.py +2 -0
  1177. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/SubPackage/ClassLib.py +4 -0
  1178. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/SubPackage/SubModuleLib.py +2 -0
  1179. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/SubPackage/__init__.py +4 -0
  1180. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/SubPackage2/__init__.py +2 -0
  1181. data/vendor/robot/atest/testdata/test_libraries/MyLibDir/__init__.py +9 -0
  1182. data/vendor/robot/atest/testdata/test_libraries/MyLibFile.py +7 -0
  1183. data/vendor/robot/atest/testdata/test_libraries/NamedArgsImportLibrary.py +11 -0
  1184. data/vendor/robot/atest/testdata/test_libraries/PrintLib.py +23 -0
  1185. data/vendor/robot/atest/testdata/test_libraries/PythonLibUsingTimestamps.py +19 -0
  1186. data/vendor/robot/atest/testdata/test_libraries/ThreadLoggingLib.py +23 -0
  1187. data/vendor/robot/atest/testdata/test_libraries/as_listener/LogLevels.py +15 -0
  1188. data/vendor/robot/atest/testdata/test_libraries/as_listener/empty_library.robot +6 -0
  1189. data/vendor/robot/atest/testdata/test_libraries/as_listener/empty_listenerlibrary.py +26 -0
  1190. data/vendor/robot/atest/testdata/test_libraries/as_listener/global_listenerlibrary.py +5 -0
  1191. data/vendor/robot/atest/testdata/test_libraries/as_listener/global_scope.robot +35 -0
  1192. data/vendor/robot/atest/testdata/test_libraries/as_listener/global_scope_2.robot +55 -0
  1193. data/vendor/robot/atest/testdata/test_libraries/as_listener/import_library.robot +42 -0
  1194. data/vendor/robot/atest/testdata/test_libraries/as_listener/listener_library3.robot +9 -0
  1195. data/vendor/robot/atest/testdata/test_libraries/as_listener/listenerlibrary.py +55 -0
  1196. data/vendor/robot/atest/testdata/test_libraries/as_listener/listenerlibrary3.py +52 -0
  1197. data/vendor/robot/atest/testdata/test_libraries/as_listener/log_levels.robot +31 -0
  1198. data/vendor/robot/atest/testdata/test_libraries/as_listener/module_v1_listenerlibrary.py +12 -0
  1199. data/vendor/robot/atest/testdata/test_libraries/as_listener/module_v1_listenerlibrary.robot +7 -0
  1200. data/vendor/robot/atest/testdata/test_libraries/as_listener/multiple_listenerlibrary.py +24 -0
  1201. data/vendor/robot/atest/testdata/test_libraries/as_listener/multiple_listeners.robot +11 -0
  1202. data/vendor/robot/atest/testdata/test_libraries/as_listener/multiple_listeners_java.robot +7 -0
  1203. data/vendor/robot/atest/testdata/test_libraries/as_listener/nested_scopes/01__no_listener.robot +3 -0
  1204. data/vendor/robot/atest/testdata/test_libraries/as_listener/nested_scopes/02__yes_listener.robot +141 -0
  1205. data/vendor/robot/atest/testdata/test_libraries/as_listener/nested_scopes/03__no_listener.robot +3 -0
  1206. data/vendor/robot/atest/testdata/test_libraries/as_listener/nested_scopes/__init__.robot +92 -0
  1207. data/vendor/robot/atest/testdata/test_libraries/as_listener/suite_listenerlibrary.py +5 -0
  1208. data/vendor/robot/atest/testdata/test_libraries/as_listener/suite_scope.robot +35 -0
  1209. data/vendor/robot/atest/testdata/test_libraries/as_listener/suite_scope_2.robot +35 -0
  1210. data/vendor/robot/atest/testdata/test_libraries/as_listener/suite_scope_java.robot +25 -0
  1211. data/vendor/robot/atest/testdata/test_libraries/as_listener/test_scope.robot +29 -0
  1212. data/vendor/robot/atest/testdata/test_libraries/as_listener/test_scope_2.robot +17 -0
  1213. data/vendor/robot/atest/testdata/test_libraries/avoid_properties_when_creating_libraries.robot +16 -0
  1214. data/vendor/robot/atest/testdata/test_libraries/deprecated_keywords.robot +52 -0
  1215. data/vendor/robot/atest/testdata/test_libraries/dir_for_libs/MyLibDir2/__init__.py +2 -0
  1216. data/vendor/robot/atest/testdata/test_libraries/dir_for_libs/MyLibFile2.py +4 -0
  1217. data/vendor/robot/atest/testdata/test_libraries/dir_for_libs/lib1/Lib.py +7 -0
  1218. data/vendor/robot/atest/testdata/test_libraries/dir_for_libs/lib2/Lib.py +5 -0
  1219. data/vendor/robot/atest/testdata/test_libraries/dynamic_kwargs_support_java.robot +26 -0
  1220. data/vendor/robot/atest/testdata/test_libraries/dynamic_kwargs_support_python.robot +33 -0
  1221. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries/DynamicLibraryWithKwargsSupportWithoutArgspec.py +12 -0
  1222. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries/DynamicLibraryWithoutArgspec.py +19 -0
  1223. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries/EmbeddedArgs.py +8 -0
  1224. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries/InvalidArgSpecs.py +20 -0
  1225. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries/InvalidKeywordNames.py +8 -0
  1226. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries/NonAsciiKeywordNames.py +17 -0
  1227. data/vendor/robot/atest/testdata/test_libraries/dynamic_libraries_with_invalid_argspec.robot +36 -0
  1228. data/vendor/robot/atest/testdata/test_libraries/dynamic_library_args_and_docs.robot +54 -0
  1229. data/vendor/robot/atest/testdata/test_libraries/dynamic_library_java.robot +35 -0
  1230. data/vendor/robot/atest/testdata/test_libraries/dynamic_library_python.robot +72 -0
  1231. data/vendor/robot/atest/testdata/test_libraries/dynamic_library_tags.robot +17 -0
  1232. data/vendor/robot/atest/testdata/test_libraries/error_msg_and_details.robot +89 -0
  1233. data/vendor/robot/atest/testdata/test_libraries/hybrid_library.robot +41 -0
  1234. data/vendor/robot/atest/testdata/test_libraries/import_and_init_logging.robot +21 -0
  1235. data/vendor/robot/atest/testdata/test_libraries/internal_modules_not_importable.robot +21 -0
  1236. data/vendor/robot/atest/testdata/test_libraries/invalid_java_libraries.robot +10 -0
  1237. data/vendor/robot/atest/testdata/test_libraries/java_libraries.robot +113 -0
  1238. data/vendor/robot/atest/testdata/test_libraries/java_library_imports_with_args.robot +42 -0
  1239. data/vendor/robot/atest/testdata/test_libraries/java_vars_for_imports.py +6 -0
  1240. data/vendor/robot/atest/testdata/test_libraries/libraries_extending_existing_classes.robot +39 -0
  1241. data/vendor/robot/atest/testdata/test_libraries/library_import_by_path.robot +52 -0
  1242. data/vendor/robot/atest/testdata/test_libraries/library_import_failing.robot +24 -0
  1243. data/vendor/robot/atest/testdata/test_libraries/library_import_from_archive.robot +11 -0
  1244. data/vendor/robot/atest/testdata/test_libraries/library_import_normal.robot +28 -0
  1245. data/vendor/robot/atest/testdata/test_libraries/library_import_with_variable.robot +18 -0
  1246. data/vendor/robot/atest/testdata/test_libraries/library_import_with_variable_from_resource.robot +14 -0
  1247. data/vendor/robot/atest/testdata/test_libraries/library_imports_with_args.robot +76 -0
  1248. data/vendor/robot/atest/testdata/test_libraries/library_scope/01_tests.robot +33 -0
  1249. data/vendor/robot/atest/testdata/test_libraries/library_scope/02_tests.robot +35 -0
  1250. data/vendor/robot/atest/testdata/test_libraries/library_scope/__init__.robot +19 -0
  1251. data/vendor/robot/atest/testdata/test_libraries/library_scope/resource.robot +26 -0
  1252. data/vendor/robot/atest/testdata/test_libraries/library_scope_java/01_tests.robot +33 -0
  1253. data/vendor/robot/atest/testdata/test_libraries/library_scope_java/02_tests.robot +35 -0
  1254. data/vendor/robot/atest/testdata/test_libraries/library_scope_java/__init__.robot +19 -0
  1255. data/vendor/robot/atest/testdata/test_libraries/library_scope_java/resource.robot +32 -0
  1256. data/vendor/robot/atest/testdata/test_libraries/library_version.robot +11 -0
  1257. data/vendor/robot/atest/testdata/test_libraries/library_with_0_parameters.robot +9 -0
  1258. data/vendor/robot/atest/testdata/test_libraries/library_with_1_parameters.robot +10 -0
  1259. data/vendor/robot/atest/testdata/test_libraries/library_with_2_parameters.robot +10 -0
  1260. data/vendor/robot/atest/testdata/test_libraries/logging_api.robot +33 -0
  1261. data/vendor/robot/atest/testdata/test_libraries/logging_with_logging.robot +36 -0
  1262. data/vendor/robot/atest/testdata/test_libraries/module_lib_with_all.py +15 -0
  1263. data/vendor/robot/atest/testdata/test_libraries/module_library.robot +105 -0
  1264. data/vendor/robot/atest/testdata/test_libraries/named_args_in_imports.robot +30 -0
  1265. data/vendor/robot/atest/testdata/test_libraries/new_style_classes.robot +20 -0
  1266. data/vendor/robot/atest/testdata/test_libraries/non_main_threads_logging.robot +10 -0
  1267. data/vendor/robot/atest/testdata/test_libraries/package_library.robot +50 -0
  1268. data/vendor/robot/atest/testdata/test_libraries/print_logging.robot +48 -0
  1269. data/vendor/robot/atest/testdata/test_libraries/print_logging_java.robot +28 -0
  1270. data/vendor/robot/atest/testdata/test_libraries/spaces in path/SpacePathLib.py +2 -0
  1271. data/vendor/robot/atest/testdata/test_libraries/timestamps_for_stdout_messages.robot +15 -0
  1272. data/vendor/robot/atest/testdata/test_libraries/variables_for_library_import.robot +4 -0
  1273. data/vendor/robot/atest/testdata/test_libraries/with_name_1.robot +48 -0
  1274. data/vendor/robot/atest/testdata/test_libraries/with_name_2.robot +124 -0
  1275. data/vendor/robot/atest/testdata/test_libraries/with_name_3.robot +28 -0
  1276. data/vendor/robot/atest/testdata/test_libraries/with_name_4.robot +23 -0
  1277. data/vendor/robot/atest/testdata/testdoc/testdoc.robot +13 -0
  1278. data/vendor/robot/atest/testdata/tidy/__init__.robot +10 -0
  1279. data/vendor/robot/atest/testdata/tidy/documentation.robot +31 -0
  1280. data/vendor/robot/atest/testdata/tidy/documentation_expected.html +195 -0
  1281. data/vendor/robot/atest/testdata/tidy/documentation_expected.robot +39 -0
  1282. data/vendor/robot/atest/testdata/tidy/documentation_expected.tsv +32 -0
  1283. data/vendor/robot/atest/testdata/tidy/documentation_expected.txt +39 -0
  1284. data/vendor/robot/atest/testdata/tidy/else_tidy.robot +83 -0
  1285. data/vendor/robot/atest/testdata/tidy/else_untidy.robot +51 -0
  1286. data/vendor/robot/atest/testdata/tidy/golden.html +358 -0
  1287. data/vendor/robot/atest/testdata/tidy/golden.robot +37 -0
  1288. data/vendor/robot/atest/testdata/tidy/golden.tsv +34 -0
  1289. data/vendor/robot/atest/testdata/tidy/golden_pipes.robot +37 -0
  1290. data/vendor/robot/atest/testdata/tidy/golden_pipes_resource.robot +24 -0
  1291. data/vendor/robot/atest/testdata/tidy/golden_resource.html +278 -0
  1292. data/vendor/robot/atest/testdata/tidy/golden_resource.robot +24 -0
  1293. data/vendor/robot/atest/testdata/tidy/golden_resource.tsv +23 -0
  1294. data/vendor/robot/atest/testdata/tidy/golden_two_spaces.robot +37 -0
  1295. data/vendor/robot/atest/testdata/tidy/golden_with_headers.robot +12 -0
  1296. data/vendor/robot/atest/testdata/tidy/resource_with_empty_tables.robot +5 -0
  1297. data/vendor/robot/atest/testdata/tidy/tests/__init__.robot +2 -0
  1298. data/vendor/robot/atest/testdata/tidy/tests/sub/sub1.robot +4 -0
  1299. data/vendor/robot/atest/testdata/tidy/tests/suite1.robot +15 -0
  1300. data/vendor/robot/atest/testdata/tidy/testsuite_with_empty_tables.robot +7 -0
  1301. data/vendor/robot/atest/testdata/variables/DynamicJavaClass.class +0 -0
  1302. data/vendor/robot/atest/testdata/variables/DynamicJavaClass.java +13 -0
  1303. data/vendor/robot/atest/testdata/variables/DynamicPythonClass.py +5 -0
  1304. data/vendor/robot/atest/testdata/variables/InvalidClass.py +4 -0
  1305. data/vendor/robot/atest/testdata/variables/JavaClass.class +0 -0
  1306. data/vendor/robot/atest/testdata/variables/JavaClass.java +21 -0
  1307. data/vendor/robot/atest/testdata/variables/PythonClass.py +14 -0
  1308. data/vendor/robot/atest/testdata/variables/automatic_variables/HelperLib.py +23 -0
  1309. data/vendor/robot/atest/testdata/variables/automatic_variables/__init__.robot +6 -0
  1310. data/vendor/robot/atest/testdata/variables/automatic_variables/auto1.robot +108 -0
  1311. data/vendor/robot/atest/testdata/variables/automatic_variables/auto2.robot +18 -0
  1312. data/vendor/robot/atest/testdata/variables/automatic_variables/resource.robot +49 -0
  1313. data/vendor/robot/atest/testdata/variables/builtin_variables.robot +168 -0
  1314. data/vendor/robot/atest/testdata/variables/catenate_scalars_in_variable_table.robot +107 -0
  1315. data/vendor/robot/atest/testdata/variables/commandline_variable_files.robot +27 -0
  1316. data/vendor/robot/atest/testdata/variables/commandline_variables.robot +10 -0
  1317. data/vendor/robot/atest/testdata/variables/dict_variable_in_variable_table.robot +140 -0
  1318. data/vendor/robot/atest/testdata/variables/dict_variable_items.robot +55 -0
  1319. data/vendor/robot/atest/testdata/variables/dict_vars.py +17 -0
  1320. data/vendor/robot/atest/testdata/variables/dynamic_variable_files/dyn_vars.py +63 -0
  1321. data/vendor/robot/atest/testdata/variables/dynamic_variable_files/getting_vars_from_dynamic_var_file.robot +32 -0
  1322. data/vendor/robot/atest/testdata/variables/environment_variables.robot +94 -0
  1323. data/vendor/robot/atest/testdata/variables/extended_assign.robot +78 -0
  1324. data/vendor/robot/atest/testdata/variables/extended_assign_vars.py +30 -0
  1325. data/vendor/robot/atest/testdata/variables/extended_variables.py +20 -0
  1326. data/vendor/robot/atest/testdata/variables/extended_variables.robot +132 -0
  1327. data/vendor/robot/atest/testdata/variables/get_file_lib.py +2 -0
  1328. data/vendor/robot/atest/testdata/variables/invalid.YAML +1 -0
  1329. data/vendor/robot/atest/testdata/variables/invalid_encoding.yaml +3 -0
  1330. data/vendor/robot/atest/testdata/variables/keyword_status_and_message.robot +142 -0
  1331. data/vendor/robot/atest/testdata/variables/list_and_dict_from_variable_file.robot +89 -0
  1332. data/vendor/robot/atest/testdata/variables/list_and_dict_variable_file.py +37 -0
  1333. data/vendor/robot/atest/testdata/variables/list_as_scalar.robot +37 -0
  1334. data/vendor/robot/atest/testdata/variables/list_variable_items.robot +47 -0
  1335. data/vendor/robot/atest/testdata/variables/non_dict.yaml +2 -0
  1336. data/vendor/robot/atest/testdata/variables/non_string_variables.py +36 -0
  1337. data/vendor/robot/atest/testdata/variables/non_string_variables.robot +27 -0
  1338. data/vendor/robot/atest/testdata/variables/outputfile_variables/subdir/sub_level_tests.robot +4 -0
  1339. data/vendor/robot/atest/testdata/variables/outputfile_variables/top_level_tests.robot +4 -0
  1340. data/vendor/robot/atest/testdata/variables/recursive_definition.robot +37 -0
  1341. data/vendor/robot/atest/testdata/variables/reserved_syntax.robot +9 -0
  1342. data/vendor/robot/atest/testdata/variables/resource_for_variable_table_in_resource_file.robot +33 -0
  1343. data/vendor/robot/atest/testdata/variables/resvarfiles/cli_vars.py +6 -0
  1344. data/vendor/robot/atest/testdata/variables/resvarfiles/cli_vars_2.py +10 -0
  1345. data/vendor/robot/atest/testdata/variables/resvarfiles/pythonpath_dir/pythonpath_varfile.py +3 -0
  1346. data/vendor/robot/atest/testdata/variables/resvarfiles/resource.robot +31 -0
  1347. data/vendor/robot/atest/testdata/variables/resvarfiles/resource_2.robot +6 -0
  1348. data/vendor/robot/atest/testdata/variables/resvarfiles/resource_3.robot +13 -0
  1349. data/vendor/robot/atest/testdata/variables/resvarfiles/variables.py +34 -0
  1350. data/vendor/robot/atest/testdata/variables/resvarfiles/variables_2.py +2 -0
  1351. data/vendor/robot/atest/testdata/variables/return_values.robot +347 -0
  1352. data/vendor/robot/atest/testdata/variables/return_values_java.robot +66 -0
  1353. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite1/subsuite1/testcase.robot +13 -0
  1354. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite1/subsuite1/variable.py +1 -0
  1355. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite1/testcase.robot +13 -0
  1356. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite1/variable.py +2 -0
  1357. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite2/testcase.robot +13 -0
  1358. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite2/variable.py +1 -0
  1359. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite3/subsuite1/testcase.robot +13 -0
  1360. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite3/subsuite1/variable.py +1 -0
  1361. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite3/subsuite2/testcase.robot +13 -0
  1362. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite3/subsuite2/variable.py +1 -0
  1363. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite3/testcase.robot +13 -0
  1364. data/vendor/robot/atest/testdata/variables/same_variable_file_names/different_variable_files/suite3/variable.py +1 -0
  1365. data/vendor/robot/atest/testdata/variables/same_variable_file_names/same_file.robot +22 -0
  1366. data/vendor/robot/atest/testdata/variables/scalar_as_list.robot +41 -0
  1367. data/vendor/robot/atest/testdata/variables/scalar_lists.py +17 -0
  1368. data/vendor/robot/atest/testdata/variables/shared_scope.robot +23 -0
  1369. data/vendor/robot/atest/testdata/variables/suite_source/__init__.robot +10 -0
  1370. data/vendor/robot/atest/testdata/variables/suite_source/resource.robot +7 -0
  1371. data/vendor/robot/atest/testdata/variables/suite_source/suite_source_in_file_suite.robot +25 -0
  1372. data/vendor/robot/atest/testdata/variables/using_dict_variables.robot +149 -0
  1373. data/vendor/robot/atest/testdata/variables/valid.yaml +16 -0
  1374. data/vendor/robot/atest/testdata/variables/valid2.yaml +1 -0
  1375. data/vendor/robot/atest/testdata/variables/variable_file_implemented_as_class.robot +41 -0
  1376. data/vendor/robot/atest/testdata/variables/variable_priorities.robot +61 -0
  1377. data/vendor/robot/atest/testdata/variables/variable_recommendation_vars.py +6 -0
  1378. data/vendor/robot/atest/testdata/variables/variable_recommendations.robot +174 -0
  1379. data/vendor/robot/atest/testdata/variables/variable_scopes.robot +73 -0
  1380. data/vendor/robot/atest/testdata/variables/variable_table.robot +133 -0
  1381. data/vendor/robot/atest/testdata/variables/variable_table_in_resource_file.robot +93 -0
  1382. data/vendor/robot/atest/testdata/variables/variables_from_resource_files.robot +120 -0
  1383. data/vendor/robot/atest/testdata/variables/variables_from_variable_files.robot +104 -0
  1384. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/common_resource.robot +3 -0
  1385. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/resource1.robot +4 -0
  1386. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/resource2.robot +4 -0
  1387. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/test_cases1.robot +9 -0
  1388. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/test_cases2.robot +9 -0
  1389. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/variables1.py +1 -0
  1390. data/vendor/robot/atest/testdata/variables/variables_in_import_settings/variables2.py +1 -0
  1391. data/vendor/robot/atest/testdata/variables/variables_inside_variables.robot +57 -0
  1392. data/vendor/robot/atest/testdata/variables/yaml_variable_file.robot +42 -0
  1393. data/vendor/robot/atest/testresources/compile_java.sh +9 -0
  1394. data/vendor/robot/atest/testresources/listeners/JavaAttributeVerifyingListener$1.class +0 -0
  1395. data/vendor/robot/atest/testresources/listeners/JavaAttributeVerifyingListener.class +0 -0
  1396. data/vendor/robot/atest/testresources/listeners/JavaAttributeVerifyingListener.java +94 -0
  1397. data/vendor/robot/atest/testresources/listeners/JavaListener.class +0 -0
  1398. data/vendor/robot/atest/testresources/listeners/JavaListener.java +119 -0
  1399. data/vendor/robot/atest/testresources/listeners/JavaListenerWithArgs.class +0 -0
  1400. data/vendor/robot/atest/testresources/listeners/JavaListenerWithArgs.java +14 -0
  1401. data/vendor/robot/atest/testresources/listeners/JavaSuiteAndTestCountListener$1.class +0 -0
  1402. data/vendor/robot/atest/testresources/listeners/JavaSuiteAndTestCountListener.class +0 -0
  1403. data/vendor/robot/atest/testresources/listeners/JavaSuiteAndTestCountListener.java +37 -0
  1404. data/vendor/robot/atest/testresources/listeners/JavaTempDir.class +0 -0
  1405. data/vendor/robot/atest/testresources/listeners/JavaTempDir.java +5 -0
  1406. data/vendor/robot/atest/testresources/listeners/ListenAll.py +84 -0
  1407. data/vendor/robot/atest/testresources/listeners/ListenImports.py +40 -0
  1408. data/vendor/robot/atest/testresources/listeners/OldJavaListener.class +0 -0
  1409. data/vendor/robot/atest/testresources/listeners/OldJavaListener.java +10 -0
  1410. data/vendor/robot/atest/testresources/listeners/attributeverifyinglistener.py +108 -0
  1411. data/vendor/robot/atest/testresources/listeners/listeners.py +139 -0
  1412. data/vendor/robot/atest/testresources/listeners/module_listener.py +67 -0
  1413. data/vendor/robot/atest/testresources/listeners/unsupported_listeners.py +19 -0
  1414. data/vendor/robot/atest/testresources/res_and_var_files/cli.yaml +1 -0
  1415. data/vendor/robot/atest/testresources/res_and_var_files/different_variables.py +3 -0
  1416. data/vendor/robot/atest/testresources/res_and_var_files/pythonpath.yaml +1 -0
  1417. data/vendor/robot/atest/testresources/res_and_var_files/resource_in_pythonpath.robot +8 -0
  1418. data/vendor/robot/atest/testresources/res_and_var_files/resvar_subdir/resource_in_pythonpath_2.robot +8 -0
  1419. data/vendor/robot/atest/testresources/res_and_var_files/resvar_subdir/variables_in_pythonpath_2.py +3 -0
  1420. data/vendor/robot/atest/testresources/res_and_var_files/variables_in_pythonpath.py +1 -0
  1421. data/vendor/robot/atest/testresources/testlibs/ArgDocDynamicJavaLibrary.class +0 -0
  1422. data/vendor/robot/atest/testresources/testlibs/ArgDocDynamicJavaLibrary.java +61 -0
  1423. data/vendor/robot/atest/testresources/testlibs/ArgDocDynamicJavaLibraryWithKwargsSupport.class +0 -0
  1424. data/vendor/robot/atest/testresources/testlibs/ArgDocDynamicJavaLibraryWithKwargsSupport.java +26 -0
  1425. data/vendor/robot/atest/testresources/testlibs/ArgTypeCoercion.class +0 -0
  1426. data/vendor/robot/atest/testresources/testlibs/ArgTypeCoercion.java +73 -0
  1427. data/vendor/robot/atest/testresources/testlibs/ArgumentTypes.class +0 -0
  1428. data/vendor/robot/atest/testresources/testlibs/ArgumentTypes.java +202 -0
  1429. data/vendor/robot/atest/testresources/testlibs/ArgumentsJava.class +0 -0
  1430. data/vendor/robot/atest/testresources/testlibs/ArgumentsJava.java +118 -0
  1431. data/vendor/robot/atest/testresources/testlibs/ArgumentsPython.py +35 -0
  1432. data/vendor/robot/atest/testresources/testlibs/BinaryDataLibrary.py +18 -0
  1433. data/vendor/robot/atest/testresources/testlibs/DefaultArgs.class +0 -0
  1434. data/vendor/robot/atest/testresources/testlibs/DefaultArgs.java +19 -0
  1435. data/vendor/robot/atest/testresources/testlibs/DynamicJavaLibraryWithLists.class +0 -0
  1436. data/vendor/robot/atest/testresources/testlibs/DynamicJavaLibraryWithLists.java +22 -0
  1437. data/vendor/robot/atest/testresources/testlibs/DynamicLibraryWithKwargsAndOnlyOneRunKeyword.class +0 -0
  1438. data/vendor/robot/atest/testresources/testlibs/DynamicLibraryWithKwargsAndOnlyOneRunKeyword.java +26 -0
  1439. data/vendor/robot/atest/testresources/testlibs/ExampleJavaLibrary$1.class +0 -0
  1440. data/vendor/robot/atest/testresources/testlibs/ExampleJavaLibrary$MyJavaException.class +0 -0
  1441. data/vendor/robot/atest/testresources/testlibs/ExampleJavaLibrary.class +0 -0
  1442. data/vendor/robot/atest/testresources/testlibs/ExampleJavaLibrary.java +164 -0
  1443. data/vendor/robot/atest/testresources/testlibs/ExampleLibrary.py +180 -0
  1444. data/vendor/robot/atest/testresources/testlibs/Exceptions.py +11 -0
  1445. data/vendor/robot/atest/testresources/testlibs/ExtendPythonLib.py +12 -0
  1446. data/vendor/robot/atest/testresources/testlibs/Extended.class +0 -0
  1447. data/vendor/robot/atest/testresources/testlibs/Extended.java +10 -0
  1448. data/vendor/robot/atest/testresources/testlibs/FatalCatastrophyException.class +0 -0
  1449. data/vendor/robot/atest/testresources/testlibs/FatalCatastrophyException.java +3 -0
  1450. data/vendor/robot/atest/testresources/testlibs/GetKeywordNamesLibrary.py +54 -0
  1451. data/vendor/robot/atest/testresources/testlibs/InvalidAttributeArgDocDynamicJavaLibrary.class +0 -0
  1452. data/vendor/robot/atest/testresources/testlibs/InvalidAttributeArgDocDynamicJavaLibrary.java +15 -0
  1453. data/vendor/robot/atest/testresources/testlibs/InvalidSignatureArgDocDynamicJavaLibrary.class +0 -0
  1454. data/vendor/robot/atest/testresources/testlibs/InvalidSignatureArgDocDynamicJavaLibrary.java +18 -0
  1455. data/vendor/robot/atest/testresources/testlibs/JarLib.jar +0 -0
  1456. data/vendor/robot/atest/testresources/testlibs/JavaExceptions.class +0 -0
  1457. data/vendor/robot/atest/testresources/testlibs/JavaExceptions.java +48 -0
  1458. data/vendor/robot/atest/testresources/testlibs/JavaListenerLibrary.class +0 -0
  1459. data/vendor/robot/atest/testresources/testlibs/JavaListenerLibrary.java +58 -0
  1460. data/vendor/robot/atest/testresources/testlibs/JavaMultipleListenerLibrary.class +0 -0
  1461. data/vendor/robot/atest/testresources/testlibs/JavaMultipleListenerLibrary.java +18 -0
  1462. data/vendor/robot/atest/testresources/testlibs/JavaObject.class +0 -0
  1463. data/vendor/robot/atest/testresources/testlibs/JavaObject.java +36 -0
  1464. data/vendor/robot/atest/testresources/testlibs/JavaVersionLibrary.class +0 -0
  1465. data/vendor/robot/atest/testresources/testlibs/JavaVersionLibrary.java +9 -0
  1466. data/vendor/robot/atest/testresources/testlibs/ListArgumentsJava.class +0 -0
  1467. data/vendor/robot/atest/testresources/testlibs/ListArgumentsJava.java +24 -0
  1468. data/vendor/robot/atest/testresources/testlibs/MandatoryArgs.class +0 -0
  1469. data/vendor/robot/atest/testresources/testlibs/MandatoryArgs.java +12 -0
  1470. data/vendor/robot/atest/testresources/testlibs/MultipleArguments.class +0 -0
  1471. data/vendor/robot/atest/testresources/testlibs/MultipleArguments.java +17 -0
  1472. data/vendor/robot/atest/testresources/testlibs/MultipleSignatures.class +0 -0
  1473. data/vendor/robot/atest/testresources/testlibs/MultipleSignatures.java +42 -0
  1474. data/vendor/robot/atest/testresources/testlibs/NamespaceUsingLibrary.py +13 -0
  1475. data/vendor/robot/atest/testresources/testlibs/NoHandlers.class +0 -0
  1476. data/vendor/robot/atest/testresources/testlibs/NoHandlers.java +9 -0
  1477. data/vendor/robot/atest/testresources/testlibs/OverrideGetName.class +0 -0
  1478. data/vendor/robot/atest/testresources/testlibs/OverrideGetName.java +11 -0
  1479. data/vendor/robot/atest/testresources/testlibs/ParameterLibrary.py +23 -0
  1480. data/vendor/robot/atest/testresources/testlibs/PythonVarArgsConstructor.py +9 -0
  1481. data/vendor/robot/atest/testresources/testlibs/ReturnTypes.class +0 -0
  1482. data/vendor/robot/atest/testresources/testlibs/ReturnTypes.java +64 -0
  1483. data/vendor/robot/atest/testresources/testlibs/RunKeywordButNoGetKeywordNamesLibraryJava.class +0 -0
  1484. data/vendor/robot/atest/testresources/testlibs/RunKeywordButNoGetKeywordNamesLibraryJava.java +16 -0
  1485. data/vendor/robot/atest/testresources/testlibs/RunKeywordLibrary.py +41 -0
  1486. data/vendor/robot/atest/testresources/testlibs/RunKeywordLibraryJava.class +0 -0
  1487. data/vendor/robot/atest/testresources/testlibs/RunKeywordLibraryJava.java +44 -0
  1488. data/vendor/robot/atest/testresources/testlibs/RunKeywordLibraryJavaWithKwargsSupport.class +0 -0
  1489. data/vendor/robot/atest/testresources/testlibs/RunKeywordLibraryJavaWithKwargsSupport.java +16 -0
  1490. data/vendor/robot/atest/testresources/testlibs/SameNamesAsInBuiltIn.py +4 -0
  1491. data/vendor/robot/atest/testresources/testlibs/UnicodeJavaLibrary.class +0 -0
  1492. data/vendor/robot/atest/testresources/testlibs/UnicodeJavaLibrary.java +44 -0
  1493. data/vendor/robot/atest/testresources/testlibs/UnicodeLibrary.py +38 -0
  1494. data/vendor/robot/atest/testresources/testlibs/archive_src/ZipLib.py +5 -0
  1495. data/vendor/robot/atest/testresources/testlibs/archive_src/org/robotframework/JarLib.class +0 -0
  1496. data/vendor/robot/atest/testresources/testlibs/archive_src/org/robotframework/JarLib.java +8 -0
  1497. data/vendor/robot/atest/testresources/testlibs/classes.py +186 -0
  1498. data/vendor/robot/atest/testresources/testlibs/dynlibs.py +41 -0
  1499. data/vendor/robot/atest/testresources/testlibs/extendingjava.py +37 -0
  1500. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/BaseLib.class +0 -0
  1501. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/BaseLib.java +26 -0
  1502. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/Global.class +0 -0
  1503. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/Global.java +7 -0
  1504. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidEmpty.class +0 -0
  1505. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidEmpty.java +5 -0
  1506. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidMethod.class +0 -0
  1507. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidMethod.java +9 -0
  1508. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidNull.class +0 -0
  1509. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidNull.java +7 -0
  1510. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidPrivate.class +0 -0
  1511. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidPrivate.java +7 -0
  1512. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidProtected.class +0 -0
  1513. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidProtected.java +7 -0
  1514. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidValue.class +0 -0
  1515. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/InvalidValue.java +7 -0
  1516. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/Suite.class +0 -0
  1517. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/Suite.java +7 -0
  1518. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/Test.class +0 -0
  1519. data/vendor/robot/atest/testresources/testlibs/javalibraryscope/Test.java +7 -0
  1520. data/vendor/robot/atest/testresources/testlibs/javapkg/JavaPackageExample.class +0 -0
  1521. data/vendor/robot/atest/testresources/testlibs/javapkg/JavaPackageExample.java +26 -0
  1522. data/vendor/robot/atest/testresources/testlibs/libmodule.py +11 -0
  1523. data/vendor/robot/atest/testresources/testlibs/libraryscope.py +51 -0
  1524. data/vendor/robot/atest/testresources/testlibs/libswithargs.py +32 -0
  1525. data/vendor/robot/atest/testresources/testlibs/module_library.py +54 -0
  1526. data/vendor/robot/atest/testresources/testlibs/newstyleclasses.py +27 -0
  1527. data/vendor/robot/atest/testresources/testlibs/newstyleclasses2.py +15 -0
  1528. data/vendor/robot/atest/testresources/testlibs/newstyleclasses3.py +14 -0
  1529. data/vendor/robot/atest/testresources/testlibs/objecttoreturn.py +14 -0
  1530. data/vendor/robot/atest/testresources/testlibs/pythonmodule/__init__.py +8 -0
  1531. data/vendor/robot/atest/testresources/testlibs/pythonmodule/library.py +5 -0
  1532. data/vendor/robot/atest/testresources/testlibs/pythonmodule/submodule/__init__.py +1 -0
  1533. data/vendor/robot/atest/testresources/testlibs/pythonmodule/submodule/sublib.py +9 -0
  1534. data/vendor/robot/atest/testresources/testlibs/ziplib.zip +0 -0
  1535. data/vendor/robot/pom.xml +34 -0
  1536. data/vendor/robot/rundevel.py +58 -0
  1537. data/vendor/robot/setup.py +100 -0
  1538. data/vendor/robot/src/bin/ipybot +6 -0
  1539. data/vendor/robot/src/bin/ipybot.bat +2 -0
  1540. data/vendor/robot/src/bin/ipyrebot +6 -0
  1541. data/vendor/robot/src/bin/ipyrebot.bat +2 -0
  1542. data/vendor/robot/src/bin/jybot +6 -0
  1543. data/vendor/robot/src/bin/jybot.bat +2 -0
  1544. data/vendor/robot/src/bin/jyrebot +6 -0
  1545. data/vendor/robot/src/bin/jyrebot.bat +2 -0
  1546. data/vendor/robot/src/bin/pybot +6 -0
  1547. data/vendor/robot/src/bin/pybot.bat +2 -0
  1548. data/vendor/robot/src/bin/rebot +9 -0
  1549. data/vendor/robot/src/bin/rebot.bat +2 -0
  1550. data/vendor/robot/src/bin/robot +9 -0
  1551. data/vendor/robot/src/bin/robot.bat +2 -0
  1552. data/vendor/robot/src/java/org/robotframework/RobotFramework.java +64 -0
  1553. data/vendor/robot/src/java/org/robotframework/RobotPythonRunner.java +27 -0
  1554. data/vendor/robot/src/java/org/robotframework/RobotRunner.java +83 -0
  1555. data/vendor/robot/src/robot/__init__.py +47 -0
  1556. data/vendor/robot/src/robot/__main__.py +28 -0
  1557. data/vendor/robot/src/robot/api/__init__.py +74 -0
  1558. data/vendor/robot/src/robot/api/deco.py +54 -0
  1559. data/vendor/robot/src/robot/api/logger.py +144 -0
  1560. data/vendor/robot/src/robot/conf/__init__.py +27 -0
  1561. data/vendor/robot/src/robot/conf/gatherfailed.py +76 -0
  1562. data/vendor/robot/src/robot/conf/settings.py +588 -0
  1563. data/vendor/robot/src/robot/errors.py +296 -0
  1564. data/vendor/robot/src/robot/htmldata/__init__.py +27 -0
  1565. data/vendor/robot/src/robot/htmldata/common/doc_formatting.css +49 -0
  1566. data/vendor/robot/src/robot/htmldata/common/js_disabled.css +21 -0
  1567. data/vendor/robot/src/robot/htmldata/common/storage.js +24 -0
  1568. data/vendor/robot/src/robot/htmldata/htmlfilewriter.py +115 -0
  1569. data/vendor/robot/src/robot/htmldata/jartemplate.py +46 -0
  1570. data/vendor/robot/src/robot/htmldata/jsonwriter.py +146 -0
  1571. data/vendor/robot/src/robot/htmldata/lib/jquery.highlight.min.js +11 -0
  1572. data/vendor/robot/src/robot/htmldata/lib/jquery.min.js +2 -0
  1573. data/vendor/robot/src/robot/htmldata/lib/jquery.tablesorter.min.js +5 -0
  1574. data/vendor/robot/src/robot/htmldata/lib/jquery.tmpl.min.js +10 -0
  1575. data/vendor/robot/src/robot/htmldata/lib/jsxcompressor.min.js +19 -0
  1576. data/vendor/robot/src/robot/htmldata/lib/versions.txt +29 -0
  1577. data/vendor/robot/src/robot/htmldata/libdoc/libdoc.css +148 -0
  1578. data/vendor/robot/src/robot/htmldata/libdoc/libdoc.html +379 -0
  1579. data/vendor/robot/src/robot/htmldata/libdoc/print.css +11 -0
  1580. data/vendor/robot/src/robot/htmldata/libdoc/pygments.css +69 -0
  1581. data/vendor/robot/src/robot/htmldata/normaltemplate.py +29 -0
  1582. data/vendor/robot/src/robot/htmldata/rebot/common.css +222 -0
  1583. data/vendor/robot/src/robot/htmldata/rebot/fileloading.js +44 -0
  1584. data/vendor/robot/src/robot/htmldata/rebot/log.css +183 -0
  1585. data/vendor/robot/src/robot/htmldata/rebot/log.html +389 -0
  1586. data/vendor/robot/src/robot/htmldata/rebot/log.js +213 -0
  1587. data/vendor/robot/src/robot/htmldata/rebot/model.js +309 -0
  1588. data/vendor/robot/src/robot/htmldata/rebot/print.css +38 -0
  1589. data/vendor/robot/src/robot/htmldata/rebot/report.css +189 -0
  1590. data/vendor/robot/src/robot/htmldata/rebot/report.html +841 -0
  1591. data/vendor/robot/src/robot/htmldata/rebot/testdata.js +297 -0
  1592. data/vendor/robot/src/robot/htmldata/rebot/util.js +224 -0
  1593. data/vendor/robot/src/robot/htmldata/rebot/view.js +182 -0
  1594. data/vendor/robot/src/robot/htmldata/template.py +19 -0
  1595. data/vendor/robot/src/robot/htmldata/testdata/create_jsdata.py +64 -0
  1596. data/vendor/robot/src/robot/htmldata/testdata/create_libdoc_data.py +22 -0
  1597. data/vendor/robot/src/robot/htmldata/testdata/create_testdoc_data.py +25 -0
  1598. data/vendor/robot/src/robot/htmldata/testdata/data.js +10 -0
  1599. data/vendor/robot/src/robot/htmldata/testdata/dir.suite/__init__.txt +38 -0
  1600. data/vendor/robot/src/robot/htmldata/testdata/dir.suite/test.suite.1.txt +22 -0
  1601. data/vendor/robot/src/robot/htmldata/testdata/dir.suite/test.suite.2.txt +22 -0
  1602. data/vendor/robot/src/robot/htmldata/testdata/dir.suite/tests.txt +119 -0
  1603. data/vendor/robot/src/robot/htmldata/testdata/libdoc.js +1 -0
  1604. data/vendor/robot/src/robot/htmldata/testdata/libdoc.txt +165 -0
  1605. data/vendor/robot/src/robot/htmldata/testdata/testdoc.js +1 -0
  1606. data/vendor/robot/src/robot/htmldata/testdoc/testdoc.css +9 -0
  1607. data/vendor/robot/src/robot/htmldata/testdoc/testdoc.html +259 -0
  1608. data/vendor/robot/src/robot/jarrunner.py +69 -0
  1609. data/vendor/robot/src/robot/libdoc.py +228 -0
  1610. data/vendor/robot/src/robot/libdocpkg/__init__.py +47 -0
  1611. data/vendor/robot/src/robot/libdocpkg/builder.py +39 -0
  1612. data/vendor/robot/src/robot/libdocpkg/consoleviewer.py +109 -0
  1613. data/vendor/robot/src/robot/libdocpkg/htmlwriter.py +167 -0
  1614. data/vendor/robot/src/robot/libdocpkg/javabuilder.py +129 -0
  1615. data/vendor/robot/src/robot/libdocpkg/model.py +70 -0
  1616. data/vendor/robot/src/robot/libdocpkg/output.py +38 -0
  1617. data/vendor/robot/src/robot/libdocpkg/robotbuilder.py +121 -0
  1618. data/vendor/robot/src/robot/libdocpkg/specbuilder.py +61 -0
  1619. data/vendor/robot/src/robot/libdocpkg/writer.py +28 -0
  1620. data/vendor/robot/src/robot/libdocpkg/xmlwriter.py +47 -0
  1621. data/vendor/robot/src/robot/libraries/BuiltIn.py +3469 -0
  1622. data/vendor/robot/src/robot/libraries/Collections.py +940 -0
  1623. data/vendor/robot/src/robot/libraries/DateTime.py +678 -0
  1624. data/vendor/robot/src/robot/libraries/Dialogs.py +115 -0
  1625. data/vendor/robot/src/robot/libraries/Easter.py +27 -0
  1626. data/vendor/robot/src/robot/libraries/OperatingSystem.py +1468 -0
  1627. data/vendor/robot/src/robot/libraries/Process.py +952 -0
  1628. data/vendor/robot/src/robot/libraries/Remote.py +286 -0
  1629. data/vendor/robot/src/robot/libraries/Reserved.py +31 -0
  1630. data/vendor/robot/src/robot/libraries/Screenshot.py +382 -0
  1631. data/vendor/robot/src/robot/libraries/String.py +684 -0
  1632. data/vendor/robot/src/robot/libraries/Telnet.py +1273 -0
  1633. data/vendor/robot/src/robot/libraries/XML.py +1514 -0
  1634. data/vendor/robot/src/robot/libraries/__init__.py +31 -0
  1635. data/vendor/robot/src/robot/libraries/dialogs_ipy.py +201 -0
  1636. data/vendor/robot/src/robot/libraries/dialogs_jy.py +113 -0
  1637. data/vendor/robot/src/robot/libraries/dialogs_py.py +179 -0
  1638. data/vendor/robot/src/robot/model/__init__.py +41 -0
  1639. data/vendor/robot/src/robot/model/configurer.py +88 -0
  1640. data/vendor/robot/src/robot/model/criticality.py +43 -0
  1641. data/vendor/robot/src/robot/model/filter.py +102 -0
  1642. data/vendor/robot/src/robot/model/imports.py +62 -0
  1643. data/vendor/robot/src/robot/model/itemlist.py +102 -0
  1644. data/vendor/robot/src/robot/model/keyword.py +182 -0
  1645. data/vendor/robot/src/robot/model/message.py +75 -0
  1646. data/vendor/robot/src/robot/model/metadata.py +33 -0
  1647. data/vendor/robot/src/robot/model/modelobject.py +85 -0
  1648. data/vendor/robot/src/robot/model/modifier.py +52 -0
  1649. data/vendor/robot/src/robot/model/namepatterns.py +54 -0
  1650. data/vendor/robot/src/robot/model/statistics.py +67 -0
  1651. data/vendor/robot/src/robot/model/stats.py +196 -0
  1652. data/vendor/robot/src/robot/model/suitestatistics.py +71 -0
  1653. data/vendor/robot/src/robot/model/tags.py +180 -0
  1654. data/vendor/robot/src/robot/model/tagsetter.py +39 -0
  1655. data/vendor/robot/src/robot/model/tagstatistics.py +178 -0
  1656. data/vendor/robot/src/robot/model/testcase.py +88 -0
  1657. data/vendor/robot/src/robot/model/testsuite.py +168 -0
  1658. data/vendor/robot/src/robot/model/totalstatistics.py +71 -0
  1659. data/vendor/robot/src/robot/model/visitor.py +163 -0
  1660. data/vendor/robot/src/robot/output/__init__.py +25 -0
  1661. data/vendor/robot/src/robot/output/console/__init__.py +35 -0
  1662. data/vendor/robot/src/robot/output/console/dotted.py +87 -0
  1663. data/vendor/robot/src/robot/output/console/highlighting.py +190 -0
  1664. data/vendor/robot/src/robot/output/console/quiet.py +32 -0
  1665. data/vendor/robot/src/robot/output/console/verbose.py +175 -0
  1666. data/vendor/robot/src/robot/output/debugfile.py +112 -0
  1667. data/vendor/robot/src/robot/output/filelogger.py +62 -0
  1668. data/vendor/robot/src/robot/output/librarylogger.py +75 -0
  1669. data/vendor/robot/src/robot/output/listenerarguments.py +141 -0
  1670. data/vendor/robot/src/robot/output/listenermethods.py +109 -0
  1671. data/vendor/robot/src/robot/output/listeners.py +168 -0
  1672. data/vendor/robot/src/robot/output/logger.py +220 -0
  1673. data/vendor/robot/src/robot/output/loggerhelper.py +150 -0
  1674. data/vendor/robot/src/robot/output/output.py +74 -0
  1675. data/vendor/robot/src/robot/output/pyloggingconf.py +84 -0
  1676. data/vendor/robot/src/robot/output/stdoutlogsplitter.py +58 -0
  1677. data/vendor/robot/src/robot/output/xmllogger.py +161 -0
  1678. data/vendor/robot/src/robot/parsing/__init__.py +66 -0
  1679. data/vendor/robot/src/robot/parsing/comments.py +63 -0
  1680. data/vendor/robot/src/robot/parsing/datarow.py +97 -0
  1681. data/vendor/robot/src/robot/parsing/htmlreader.py +205 -0
  1682. data/vendor/robot/src/robot/parsing/model.py +717 -0
  1683. data/vendor/robot/src/robot/parsing/populators.py +215 -0
  1684. data/vendor/robot/src/robot/parsing/restreader.py +52 -0
  1685. data/vendor/robot/src/robot/parsing/restsupport.py +55 -0
  1686. data/vendor/robot/src/robot/parsing/settings.py +393 -0
  1687. data/vendor/robot/src/robot/parsing/tablepopulators.py +335 -0
  1688. data/vendor/robot/src/robot/parsing/tsvreader.py +48 -0
  1689. data/vendor/robot/src/robot/parsing/txtreader.py +36 -0
  1690. data/vendor/robot/src/robot/pythonpathsetter.py +41 -0
  1691. data/vendor/robot/src/robot/rebot.py +412 -0
  1692. data/vendor/robot/src/robot/reporting/__init__.py +29 -0
  1693. data/vendor/robot/src/robot/reporting/jsbuildingcontext.py +97 -0
  1694. data/vendor/robot/src/robot/reporting/jsexecutionresult.py +105 -0
  1695. data/vendor/robot/src/robot/reporting/jsmodelbuilders.py +189 -0
  1696. data/vendor/robot/src/robot/reporting/jswriter.py +108 -0
  1697. data/vendor/robot/src/robot/reporting/logreportwriters.py +70 -0
  1698. data/vendor/robot/src/robot/reporting/outputwriter.py +38 -0
  1699. data/vendor/robot/src/robot/reporting/resultwriter.py +142 -0
  1700. data/vendor/robot/src/robot/reporting/stringcache.py +52 -0
  1701. data/vendor/robot/src/robot/reporting/xunitwriter.py +100 -0
  1702. data/vendor/robot/src/robot/result/__init__.py +47 -0
  1703. data/vendor/robot/src/robot/result/configurer.py +76 -0
  1704. data/vendor/robot/src/robot/result/executionerrors.py +51 -0
  1705. data/vendor/robot/src/robot/result/executionresult.py +136 -0
  1706. data/vendor/robot/src/robot/result/flattenkeywordmatcher.py +77 -0
  1707. data/vendor/robot/src/robot/result/keywordremover.py +164 -0
  1708. data/vendor/robot/src/robot/result/merger.py +87 -0
  1709. data/vendor/robot/src/robot/result/messagefilter.py +28 -0
  1710. data/vendor/robot/src/robot/result/model.py +295 -0
  1711. data/vendor/robot/src/robot/result/resultbuilder.py +195 -0
  1712. data/vendor/robot/src/robot/result/suiteteardownfailed.py +47 -0
  1713. data/vendor/robot/src/robot/result/visitor.py +124 -0
  1714. data/vendor/robot/src/robot/result/xmlelementhandlers.py +258 -0
  1715. data/vendor/robot/src/robot/run.py +550 -0
  1716. data/vendor/robot/src/robot/running/__init__.py +109 -0
  1717. data/vendor/robot/src/robot/running/arguments/__init__.py +26 -0
  1718. data/vendor/robot/src/robot/running/arguments/argumentmapper.py +73 -0
  1719. data/vendor/robot/src/robot/running/arguments/argumentparser.py +192 -0
  1720. data/vendor/robot/src/robot/running/arguments/argumentresolver.py +134 -0
  1721. data/vendor/robot/src/robot/running/arguments/argumentspec.py +50 -0
  1722. data/vendor/robot/src/robot/running/arguments/argumentvalidator.py +68 -0
  1723. data/vendor/robot/src/robot/running/arguments/embedded.py +88 -0
  1724. data/vendor/robot/src/robot/running/arguments/javaargumentcoercer.py +146 -0
  1725. data/vendor/robot/src/robot/running/builder.py +231 -0
  1726. data/vendor/robot/src/robot/running/context.py +198 -0
  1727. data/vendor/robot/src/robot/running/defaults.py +43 -0
  1728. data/vendor/robot/src/robot/running/dynamicmethods.py +145 -0
  1729. data/vendor/robot/src/robot/running/handlers.py +269 -0
  1730. data/vendor/robot/src/robot/running/handlerstore.py +85 -0
  1731. data/vendor/robot/src/robot/running/importer.py +149 -0
  1732. data/vendor/robot/src/robot/running/librarykeywordrunner.py +224 -0
  1733. data/vendor/robot/src/robot/running/libraryscopes.py +101 -0
  1734. data/vendor/robot/src/robot/running/model.py +319 -0
  1735. data/vendor/robot/src/robot/running/namespace.py +440 -0
  1736. data/vendor/robot/src/robot/running/outputcapture.py +137 -0
  1737. data/vendor/robot/src/robot/running/randomizer.py +53 -0
  1738. data/vendor/robot/src/robot/running/runkwregister.py +65 -0
  1739. data/vendor/robot/src/robot/running/runner.py +220 -0
  1740. data/vendor/robot/src/robot/running/signalhandler.py +89 -0
  1741. data/vendor/robot/src/robot/running/status.py +234 -0
  1742. data/vendor/robot/src/robot/running/statusreporter.py +74 -0
  1743. data/vendor/robot/src/robot/running/steprunner.py +272 -0
  1744. data/vendor/robot/src/robot/running/testlibraries.py +411 -0
  1745. data/vendor/robot/src/robot/running/timeouts/__init__.py +133 -0
  1746. data/vendor/robot/src/robot/running/timeouts/ironpython.py +56 -0
  1747. data/vendor/robot/src/robot/running/timeouts/jython.py +55 -0
  1748. data/vendor/robot/src/robot/running/timeouts/posix.py +40 -0
  1749. data/vendor/robot/src/robot/running/timeouts/windows.py +71 -0
  1750. data/vendor/robot/src/robot/running/usererrorhandler.py +66 -0
  1751. data/vendor/robot/src/robot/running/userkeyword.py +114 -0
  1752. data/vendor/robot/src/robot/running/userkeywordrunner.py +236 -0
  1753. data/vendor/robot/src/robot/testdoc.py +303 -0
  1754. data/vendor/robot/src/robot/tidy.py +330 -0
  1755. data/vendor/robot/src/robot/utils/__init__.py +76 -0
  1756. data/vendor/robot/src/robot/utils/application.py +130 -0
  1757. data/vendor/robot/src/robot/utils/argumentparser.py +476 -0
  1758. data/vendor/robot/src/robot/utils/asserts.py +239 -0
  1759. data/vendor/robot/src/robot/utils/charwidth.py +139 -0
  1760. data/vendor/robot/src/robot/utils/compat.py +76 -0
  1761. data/vendor/robot/src/robot/utils/compress.py +54 -0
  1762. data/vendor/robot/src/robot/utils/connectioncache.py +178 -0
  1763. data/vendor/robot/src/robot/utils/dotdict.py +65 -0
  1764. data/vendor/robot/src/robot/utils/encoding.py +104 -0
  1765. data/vendor/robot/src/robot/utils/encodingsniffer.py +109 -0
  1766. data/vendor/robot/src/robot/utils/error.py +206 -0
  1767. data/vendor/robot/src/robot/utils/escaping.py +145 -0
  1768. data/vendor/robot/src/robot/utils/etreewrapper.py +88 -0
  1769. data/vendor/robot/src/robot/utils/frange.py +63 -0
  1770. data/vendor/robot/src/robot/utils/htmlformatters.py +303 -0
  1771. data/vendor/robot/src/robot/utils/importer.py +274 -0
  1772. data/vendor/robot/src/robot/utils/markuputils.py +49 -0
  1773. data/vendor/robot/src/robot/utils/markupwriters.py +108 -0
  1774. data/vendor/robot/src/robot/utils/match.py +103 -0
  1775. data/vendor/robot/src/robot/utils/misc.py +128 -0
  1776. data/vendor/robot/src/robot/utils/normalizing.py +124 -0
  1777. data/vendor/robot/src/robot/utils/ordereddict.py +127 -0
  1778. data/vendor/robot/src/robot/utils/platform.py +32 -0
  1779. data/vendor/robot/src/robot/utils/recommendations.py +75 -0
  1780. data/vendor/robot/src/robot/utils/robotenv.py +44 -0
  1781. data/vendor/robot/src/robot/utils/robotinspect.py +36 -0
  1782. data/vendor/robot/src/robot/utils/robotio.py +43 -0
  1783. data/vendor/robot/src/robot/utils/robotpath.py +174 -0
  1784. data/vendor/robot/src/robot/utils/robottime.py +431 -0
  1785. data/vendor/robot/src/robot/utils/robottypes.py +35 -0
  1786. data/vendor/robot/src/robot/utils/robottypes2.py +74 -0
  1787. data/vendor/robot/src/robot/utils/robottypes3.py +65 -0
  1788. data/vendor/robot/src/robot/utils/setter.py +46 -0
  1789. data/vendor/robot/src/robot/utils/sortable.py +53 -0
  1790. data/vendor/robot/src/robot/utils/text.py +151 -0
  1791. data/vendor/robot/src/robot/utils/unic.py +89 -0
  1792. data/vendor/robot/src/robot/utils/utf8reader.py +52 -0
  1793. data/vendor/robot/src/robot/variables/__init__.py +27 -0
  1794. data/vendor/robot/src/robot/variables/assigner.py +252 -0
  1795. data/vendor/robot/src/robot/variables/filesetter.py +144 -0
  1796. data/vendor/robot/src/robot/variables/finders.py +150 -0
  1797. data/vendor/robot/src/robot/variables/isvar.py +52 -0
  1798. data/vendor/robot/src/robot/variables/notfound.py +46 -0
  1799. data/vendor/robot/src/robot/variables/replacer.py +177 -0
  1800. data/vendor/robot/src/robot/variables/scopes.py +256 -0
  1801. data/vendor/robot/src/robot/variables/splitter.py +187 -0
  1802. data/vendor/robot/src/robot/variables/store.py +116 -0
  1803. data/vendor/robot/src/robot/variables/tablesetter.py +150 -0
  1804. data/vendor/robot/src/robot/variables/variables.py +81 -0
  1805. data/vendor/robot/src/robot/version.py +46 -0
  1806. data/vendor/robot/src/robot/writer/__init__.py +26 -0
  1807. data/vendor/robot/src/robot/writer/aligners.py +64 -0
  1808. data/vendor/robot/src/robot/writer/dataextractor.py +57 -0
  1809. data/vendor/robot/src/robot/writer/datafilewriter.py +126 -0
  1810. data/vendor/robot/src/robot/writer/filewriters.py +149 -0
  1811. data/vendor/robot/src/robot/writer/formatters.py +150 -0
  1812. data/vendor/robot/src/robot/writer/htmlformatter.py +131 -0
  1813. data/vendor/robot/src/robot/writer/htmltemplate.py +71 -0
  1814. data/vendor/robot/src/robot/writer/rowsplitter.py +108 -0
  1815. data/vendor/robot/tasks.py +265 -0
  1816. data/vendor/robot/templates/README.rst +24 -0
  1817. data/vendor/robot/templates/atdd_template.html +130 -0
  1818. data/vendor/robot/templates/resource_template.html +154 -0
  1819. data/vendor/robot/templates/resource_template.tsv +9 -0
  1820. data/vendor/robot/templates/testcase_template.html +173 -0
  1821. data/vendor/robot/templates/testcase_template.tsv +13 -0
  1822. data/vendor/robot/utest/README.rst +55 -0
  1823. data/vendor/robot/utest/__init__.py +0 -0
  1824. data/vendor/robot/utest/api/import_test.robot +7 -0
  1825. data/vendor/robot/utest/api/test_deco.py +32 -0
  1826. data/vendor/robot/utest/api/test_exposed_api.py +71 -0
  1827. data/vendor/robot/utest/api/test_logging_api.py +90 -0
  1828. data/vendor/robot/utest/api/test_run_and_rebot.py +352 -0
  1829. data/vendor/robot/utest/api/test_using_libraries.py +37 -0
  1830. data/vendor/robot/utest/conf/test_settings.py +102 -0
  1831. data/vendor/robot/utest/envjs.bootstrap.js +6 -0
  1832. data/vendor/robot/utest/htmldata/test_htmltemplate.py +24 -0
  1833. data/vendor/robot/utest/htmldata/test_jsonwriter.py +99 -0
  1834. data/vendor/robot/utest/model/test_filter.py +168 -0
  1835. data/vendor/robot/utest/model/test_itemlist.py +195 -0
  1836. data/vendor/robot/utest/model/test_keyword.py +209 -0
  1837. data/vendor/robot/utest/model/test_message.py +51 -0
  1838. data/vendor/robot/utest/model/test_metadata.py +51 -0
  1839. data/vendor/robot/utest/model/test_statistics.py +231 -0
  1840. data/vendor/robot/utest/model/test_tags.py +364 -0
  1841. data/vendor/robot/utest/model/test_tagstatistics.py +371 -0
  1842. data/vendor/robot/utest/model/test_testcase.py +124 -0
  1843. data/vendor/robot/utest/model/test_testsuite.py +127 -0
  1844. data/vendor/robot/utest/output/NewStyleJavaListener.class +0 -0
  1845. data/vendor/robot/utest/output/NewStyleJavaListener.java +79 -0
  1846. data/vendor/robot/utest/output/test_console.py +123 -0
  1847. data/vendor/robot/utest/output/test_filelogger.py +58 -0
  1848. data/vendor/robot/utest/output/test_listeners.py +202 -0
  1849. data/vendor/robot/utest/output/test_logger.py +202 -0
  1850. data/vendor/robot/utest/output/test_loggerhelper.py +25 -0
  1851. data/vendor/robot/utest/output/test_stdout_splitter.py +86 -0
  1852. data/vendor/robot/utest/parsing/test_htmlreader.py +188 -0
  1853. data/vendor/robot/utest/parsing/test_model.py +449 -0
  1854. data/vendor/robot/utest/parsing/test_populator.py +609 -0
  1855. data/vendor/robot/utest/parsing/test_tsvreader.py +81 -0
  1856. data/vendor/robot/utest/parsing/test_txtreader.py +23 -0
  1857. data/vendor/robot/utest/reporting/test_jsbuildingcontext.py +82 -0
  1858. data/vendor/robot/utest/reporting/test_jsexecutionresult.py +94 -0
  1859. data/vendor/robot/utest/reporting/test_jsmodelbuilders.py +430 -0
  1860. data/vendor/robot/utest/reporting/test_jswriter.py +104 -0
  1861. data/vendor/robot/utest/reporting/test_logreportwriters.py +39 -0
  1862. data/vendor/robot/utest/reporting/test_reporting.py +175 -0
  1863. data/vendor/robot/utest/reporting/test_stringcache.py +76 -0
  1864. data/vendor/robot/utest/resources/Listener.py +26 -0
  1865. data/vendor/robot/utest/resources/__init__.py +7 -0
  1866. data/vendor/robot/utest/resources/golden_suite/__init__.txt +5 -0
  1867. data/vendor/robot/utest/resources/golden_suite/all_settings.txt +27 -0
  1868. data/vendor/robot/utest/resources/golden_suite/expected.js +3 -0
  1869. data/vendor/robot/utest/resources/golden_suite/failing_suite.txt +15 -0
  1870. data/vendor/robot/utest/resources/golden_suite/output.xml +206 -0
  1871. data/vendor/robot/utest/resources/golden_suite/output2.xml +206 -0
  1872. data/vendor/robot/utest/resources/runningtestcase.py +71 -0
  1873. data/vendor/robot/utest/resources/test_resource.txt +4 -0
  1874. data/vendor/robot/utest/resources/variables_file.py +1 -0
  1875. data/vendor/robot/utest/result/golden.xml +61 -0
  1876. data/vendor/robot/utest/result/goldenTwice.xml +110 -0
  1877. data/vendor/robot/utest/result/suite_teardown_failed.xml +81 -0
  1878. data/vendor/robot/utest/result/test_configurer.py +263 -0
  1879. data/vendor/robot/utest/result/test_resultbuilder.py +248 -0
  1880. data/vendor/robot/utest/result/test_resultmodel.py +209 -0
  1881. data/vendor/robot/utest/result/test_resultserializer.py +63 -0
  1882. data/vendor/robot/utest/result/test_visitor.py +72 -0
  1883. data/vendor/robot/utest/run.py +100 -0
  1884. data/vendor/robot/utest/run_jasmine.py +53 -0
  1885. data/vendor/robot/utest/running/test_builder.py +132 -0
  1886. data/vendor/robot/utest/running/test_handlers.py +309 -0
  1887. data/vendor/robot/utest/running/test_importer.py +73 -0
  1888. data/vendor/robot/utest/running/test_imports.py +75 -0
  1889. data/vendor/robot/utest/running/test_namespace.py +16 -0
  1890. data/vendor/robot/utest/running/test_randomizer.py +87 -0
  1891. data/vendor/robot/utest/running/test_run_model.py +94 -0
  1892. data/vendor/robot/utest/running/test_runkwregister.py +114 -0
  1893. data/vendor/robot/utest/running/test_running.py +284 -0
  1894. data/vendor/robot/utest/running/test_signalhandler.py +115 -0
  1895. data/vendor/robot/utest/running/test_testlibrary.py +638 -0
  1896. data/vendor/robot/utest/running/test_timeouts.py +193 -0
  1897. data/vendor/robot/utest/running/test_userhandlers.py +165 -0
  1898. data/vendor/robot/utest/running/test_userlibrary.py +128 -0
  1899. data/vendor/robot/utest/running/thread_resources.py +27 -0
  1900. data/vendor/robot/utest/testdoc/test_jsonconverter.py +225 -0
  1901. data/vendor/robot/utest/tidy/test_argument_validation.py +106 -0
  1902. data/vendor/robot/utest/utils/ImportByPath.class +0 -0
  1903. data/vendor/robot/utest/utils/ImportByPath.java +6 -0
  1904. data/vendor/robot/utest/utils/test_argumentparser.py +438 -0
  1905. data/vendor/robot/utest/utils/test_asserts.py +148 -0
  1906. data/vendor/robot/utest/utils/test_compat.py +36 -0
  1907. data/vendor/robot/utest/utils/test_compress.py +28 -0
  1908. data/vendor/robot/utest/utils/test_connectioncache.py +239 -0
  1909. data/vendor/robot/utest/utils/test_dotdict.py +101 -0
  1910. data/vendor/robot/utest/utils/test_encoding.py +34 -0
  1911. data/vendor/robot/utest/utils/test_encodingsniffer.py +49 -0
  1912. data/vendor/robot/utest/utils/test_error.py +123 -0
  1913. data/vendor/robot/utest/utils/test_escaping.py +188 -0
  1914. data/vendor/robot/utest/utils/test_etreesource.py +58 -0
  1915. data/vendor/robot/utest/utils/test_frange.py +66 -0
  1916. data/vendor/robot/utest/utils/test_htmlwriter.py +119 -0
  1917. data/vendor/robot/utest/utils/test_importer_util.py +493 -0
  1918. data/vendor/robot/utest/utils/test_markuputils.py +803 -0
  1919. data/vendor/robot/utest/utils/test_match.py +170 -0
  1920. data/vendor/robot/utest/utils/test_misc.py +183 -0
  1921. data/vendor/robot/utest/utils/test_normalizing.py +318 -0
  1922. data/vendor/robot/utest/utils/test_robotenv.py +61 -0
  1923. data/vendor/robot/utest/utils/test_robotpath.py +215 -0
  1924. data/vendor/robot/utest/utils/test_robottime.py +355 -0
  1925. data/vendor/robot/utest/utils/test_robottypes.py +160 -0
  1926. data/vendor/robot/utest/utils/test_setter.py +66 -0
  1927. data/vendor/robot/utest/utils/test_sortable.py +54 -0
  1928. data/vendor/robot/utest/utils/test_text.py +279 -0
  1929. data/vendor/robot/utest/utils/test_timestampcache.py +56 -0
  1930. data/vendor/robot/utest/utils/test_unic.py +224 -0
  1931. data/vendor/robot/utest/utils/test_utf8reader.py +66 -0
  1932. data/vendor/robot/utest/utils/test_xmlwriter.py +143 -0
  1933. data/vendor/robot/utest/variables/test_isvar.py +36 -0
  1934. data/vendor/robot/utest/variables/test_variableassigner.py +54 -0
  1935. data/vendor/robot/utest/variables/test_variables.py +261 -0
  1936. data/vendor/robot/utest/variables/test_variablesplitter.py +235 -0
  1937. data/vendor/robot/utest/webcontent/SpecRunner.html +52 -0
  1938. data/vendor/robot/utest/webcontent/jasmine-1.0.2/MIT.LICENSE +20 -0
  1939. data/vendor/robot/utest/webcontent/jasmine-1.0.2/jasmine-html.js +188 -0
  1940. data/vendor/robot/utest/webcontent/jasmine-1.0.2/jasmine.css +166 -0
  1941. data/vendor/robot/utest/webcontent/jasmine-1.0.2/jasmine.js +2421 -0
  1942. data/vendor/robot/utest/webcontent/spec/ContainsTag.js +106 -0
  1943. data/vendor/robot/utest/webcontent/spec/LogLevelSpec.js +19 -0
  1944. data/vendor/robot/utest/webcontent/spec/ParsingSpec.js +579 -0
  1945. data/vendor/robot/utest/webcontent/spec/StatisticsSpec.js +172 -0
  1946. data/vendor/robot/utest/webcontent/spec/UtilSpec.js +86 -0
  1947. data/vendor/robot/utest/webcontent/spec/data/Messages.js +20 -0
  1948. data/vendor/robot/utest/webcontent/spec/data/Messages.txt +10 -0
  1949. data/vendor/robot/utest/webcontent/spec/data/PassingFailing.js +20 -0
  1950. data/vendor/robot/utest/webcontent/spec/data/SetupsAndTeardowns.js +20 -0
  1951. data/vendor/robot/utest/webcontent/spec/data/SetupsAndTeardowns.txt +15 -0
  1952. data/vendor/robot/utest/webcontent/spec/data/Suite.js +20 -0
  1953. data/vendor/robot/utest/webcontent/spec/data/Suite.txt +18 -0
  1954. data/vendor/robot/utest/webcontent/spec/data/TeardownFailure.js +20 -0
  1955. data/vendor/robot/utest/webcontent/spec/data/TestsAndKeywords.js +20 -0
  1956. data/vendor/robot/utest/webcontent/spec/data/TestsAndKeywords.txt +22 -0
  1957. data/vendor/robot/utest/webcontent/spec/data/allData.js +20 -0
  1958. data/vendor/robot/utest/webcontent/spec/data/create_jsdata_for_specs.py +57 -0
  1959. data/vendor/robot/utest/webcontent/spec/data/splitting.js +44 -0
  1960. data/vendor/robot/utest/webcontent/spec/data/teardownFailure/PassingFailing.txt +5 -0
  1961. data/vendor/robot/utest/webcontent/spec/data/teardownFailure/__init__.txt +2 -0
  1962. data/vendor/robot/utest/writer/test_aligners.py +16 -0
  1963. data/vendor/robot/utest/writer/test_extractor.py +55 -0
  1964. data/vendor/robot/utest/writer/test_filewriters.py +82 -0
  1965. data/vendor/robot/utest/writer/test_formatters.py +188 -0
  1966. data/vendor/robot/utest/writer/test_rowsplitter.py +130 -0
  1967. data/vendor/robot/utest/writer/test_write_configuration.py +40 -0
  1968. metadata +2112 -0
@@ -0,0 +1,47 @@
1
+ # Copyright 2008-2015 Nokia Networks
2
+ # Copyright 2016- Robot Framework Foundation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from robot.utils import XmlWriter, get_timestamp
17
+
18
+
19
+ class LibdocXmlWriter(object):
20
+
21
+ def write(self, libdoc, outfile):
22
+ writer = XmlWriter(outfile)
23
+ writer.start('keywordspec', {'name': libdoc.name, 'type': libdoc.type,
24
+ 'format': libdoc.doc_format,
25
+ 'generated': get_timestamp(millissep=None)})
26
+ writer.element('version', libdoc.version)
27
+ writer.element('scope', libdoc.scope)
28
+ writer.element('namedargs', 'yes' if libdoc.named_args else 'no')
29
+ writer.element('doc', libdoc.doc)
30
+ self._write_keywords('init', libdoc.inits, writer)
31
+ self._write_keywords('kw', libdoc.keywords, writer)
32
+ writer.end('keywordspec')
33
+ writer.close()
34
+
35
+ def _write_keywords(self, type, keywords, writer):
36
+ for kw in keywords:
37
+ writer.start(type, {'name': kw.name} if type == 'kw' else {})
38
+ writer.start('arguments')
39
+ for arg in kw.args:
40
+ writer.element('arg', arg)
41
+ writer.end('arguments')
42
+ writer.element('doc', kw.doc)
43
+ writer.start('tags')
44
+ for tag in kw.tags:
45
+ writer.element('tag', tag)
46
+ writer.end('tags')
47
+ writer.end(type)
@@ -0,0 +1,3469 @@
1
+ # Copyright 2008-2015 Nokia Networks
2
+ # Copyright 2016- Robot Framework Foundation
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import difflib
17
+ import re
18
+ import time
19
+ import token
20
+ from tokenize import generate_tokens, untokenize
21
+
22
+ from robot.api import logger
23
+ from robot.errors import (ContinueForLoop, DataError, ExecutionFailed,
24
+ ExecutionFailures, ExecutionPassed, ExitForLoop,
25
+ PassExecution, ReturnFromKeyword)
26
+ from robot.running import Keyword, RUN_KW_REGISTER
27
+ from robot.running.context import EXECUTION_CONTEXTS
28
+ from robot.running.usererrorhandler import UserErrorHandler
29
+ from robot.utils import (DotDict, escape, format_assign_message,
30
+ get_error_message, get_time, is_falsy, is_integer,
31
+ is_string, is_truthy, is_unicode, IRONPYTHON, JYTHON,
32
+ Matcher, normalize, NormalizedDict, parse_time, prepr,
33
+ RERAISED_EXCEPTIONS, plural_or_not as s, roundup,
34
+ secs_to_timestr, seq2str, split_from_equals, StringIO,
35
+ timestr_to_secs, type_name, unic, is_list_like)
36
+ from robot.utils.asserts import assert_equal, assert_not_equal
37
+ from robot.variables import (is_list_var, is_var, DictVariableTableValue,
38
+ VariableTableValue, VariableSplitter,
39
+ variable_not_found)
40
+ from robot.version import get_version
41
+
42
+ if JYTHON:
43
+ from java.lang import String, Number
44
+
45
+
46
+ # TODO: Clean-up registering run keyword variants in RF 3.1.
47
+ # https://github.com/robotframework/robotframework/issues/2190
48
+
49
+ def run_keyword_variant(resolve):
50
+ def decorator(method):
51
+ RUN_KW_REGISTER.register_run_keyword('BuiltIn', method.__name__,
52
+ resolve, deprecation_warning=False)
53
+ return method
54
+ return decorator
55
+
56
+
57
+ class _BuiltInBase(object):
58
+
59
+ @property
60
+ def _context(self):
61
+ return self._get_context()
62
+
63
+ def _get_context(self, top=False):
64
+ ctx = EXECUTION_CONTEXTS.current if not top else EXECUTION_CONTEXTS.top
65
+ if ctx is None:
66
+ raise RobotNotRunningError('Cannot access execution context')
67
+ return ctx
68
+
69
+ @property
70
+ def _namespace(self):
71
+ return self._get_context().namespace
72
+
73
+ @property
74
+ def _variables(self):
75
+ return self._namespace.variables
76
+
77
+ def _matches(self, string, pattern):
78
+ # Must use this instead of fnmatch when string may contain newlines.
79
+ matcher = Matcher(pattern, caseless=False, spaceless=False)
80
+ return matcher.match(string)
81
+
82
+ def _is_true(self, condition):
83
+ if is_string(condition):
84
+ condition = self.evaluate(condition, modules='os,sys')
85
+ return bool(condition)
86
+
87
+ def _log_types(self, *args):
88
+ self._log_types_at_level('DEBUG', *args)
89
+
90
+ def _log_types_at_level(self, level, *args):
91
+ msg = ["Argument types are:"] + [self._get_type(a) for a in args]
92
+ self.log('\n'.join(msg), level)
93
+
94
+ def _get_type(self, arg):
95
+ # In IronPython type(u'x') is str. We want to report unicode anyway.
96
+ if is_unicode(arg):
97
+ return "<type 'unicode'>"
98
+ return str(type(arg))
99
+
100
+
101
+ class _Converter(_BuiltInBase):
102
+
103
+ def convert_to_integer(self, item, base=None):
104
+ """Converts the given item to an integer number.
105
+
106
+ If the given item is a string, it is by default expected to be an
107
+ integer in base 10. There are two ways to convert from other bases:
108
+
109
+ - Give base explicitly to the keyword as ``base`` argument.
110
+
111
+ - Prefix the given string with the base so that ``0b`` means binary
112
+ (base 2), ``0o`` means octal (base 8), and ``0x`` means hex (base 16).
113
+ The prefix is considered only when ``base`` argument is not given and
114
+ may itself be prefixed with a plus or minus sign.
115
+
116
+ The syntax is case-insensitive and possible spaces are ignored.
117
+
118
+ Examples:
119
+ | ${result} = | Convert To Integer | 100 | | # Result is 100 |
120
+ | ${result} = | Convert To Integer | FF AA | 16 | # Result is 65450 |
121
+ | ${result} = | Convert To Integer | 100 | 8 | # Result is 64 |
122
+ | ${result} = | Convert To Integer | -100 | 2 | # Result is -4 |
123
+ | ${result} = | Convert To Integer | 0b100 | | # Result is 4 |
124
+ | ${result} = | Convert To Integer | -0x100 | | # Result is -256 |
125
+
126
+ See also `Convert To Number`, `Convert To Binary`, `Convert To Octal`,
127
+ `Convert To Hex`, and `Convert To Bytes`.
128
+ """
129
+ self._log_types(item)
130
+ return self._convert_to_integer(item, base)
131
+
132
+ def _convert_to_integer(self, orig, base=None):
133
+ try:
134
+ item = self._handle_java_numbers(orig)
135
+ item, base = self._get_base(item, base)
136
+ if base:
137
+ return int(item, self._convert_to_integer(base))
138
+ return int(item)
139
+ except:
140
+ raise RuntimeError("'%s' cannot be converted to an integer: %s"
141
+ % (orig, get_error_message()))
142
+
143
+ def _handle_java_numbers(self, item):
144
+ if not JYTHON:
145
+ return item
146
+ if isinstance(item, String):
147
+ return unic(item)
148
+ if isinstance(item, Number):
149
+ return item.doubleValue()
150
+ return item
151
+
152
+ def _get_base(self, item, base):
153
+ if not is_string(item):
154
+ return item, base
155
+ item = normalize(item)
156
+ if item.startswith(('-', '+')):
157
+ sign = item[0]
158
+ item = item[1:]
159
+ else:
160
+ sign = ''
161
+ bases = {'0b': 2, '0o': 8, '0x': 16}
162
+ if base or not item.startswith(tuple(bases)):
163
+ return sign+item, base
164
+ return sign+item[2:], bases[item[:2]]
165
+
166
+ def convert_to_binary(self, item, base=None, prefix=None, length=None):
167
+ """Converts the given item to a binary string.
168
+
169
+ The ``item``, with an optional ``base``, is first converted to an
170
+ integer using `Convert To Integer` internally. After that it
171
+ is converted to a binary number (base 2) represented as a
172
+ string such as ``1011``.
173
+
174
+ The returned value can contain an optional ``prefix`` and can be
175
+ required to be of minimum ``length`` (excluding the prefix and a
176
+ possible minus sign). If the value is initially shorter than
177
+ the required length, it is padded with zeros.
178
+
179
+ Examples:
180
+ | ${result} = | Convert To Binary | 10 | | | # Result is 1010 |
181
+ | ${result} = | Convert To Binary | F | base=16 | prefix=0b | # Result is 0b1111 |
182
+ | ${result} = | Convert To Binary | -2 | prefix=B | length=4 | # Result is -B0010 |
183
+
184
+ See also `Convert To Integer`, `Convert To Octal` and `Convert To Hex`.
185
+ """
186
+ return self._convert_to_bin_oct_hex(item, base, prefix, length, 'b')
187
+
188
+ def convert_to_octal(self, item, base=None, prefix=None, length=None):
189
+ """Converts the given item to an octal string.
190
+
191
+ The ``item``, with an optional ``base``, is first converted to an
192
+ integer using `Convert To Integer` internally. After that it
193
+ is converted to an octal number (base 8) represented as a
194
+ string such as ``775``.
195
+
196
+ The returned value can contain an optional ``prefix`` and can be
197
+ required to be of minimum ``length`` (excluding the prefix and a
198
+ possible minus sign). If the value is initially shorter than
199
+ the required length, it is padded with zeros.
200
+
201
+ Examples:
202
+ | ${result} = | Convert To Octal | 10 | | | # Result is 12 |
203
+ | ${result} = | Convert To Octal | -F | base=16 | prefix=0 | # Result is -017 |
204
+ | ${result} = | Convert To Octal | 16 | prefix=oct | length=4 | # Result is oct0020 |
205
+
206
+ See also `Convert To Integer`, `Convert To Binary` and `Convert To Hex`.
207
+ """
208
+ return self._convert_to_bin_oct_hex(item, base, prefix, length, 'o')
209
+
210
+ def convert_to_hex(self, item, base=None, prefix=None, length=None,
211
+ lowercase=False):
212
+ """Converts the given item to a hexadecimal string.
213
+
214
+ The ``item``, with an optional ``base``, is first converted to an
215
+ integer using `Convert To Integer` internally. After that it
216
+ is converted to a hexadecimal number (base 16) represented as
217
+ a string such as ``FF0A``.
218
+
219
+ The returned value can contain an optional ``prefix`` and can be
220
+ required to be of minimum ``length`` (excluding the prefix and a
221
+ possible minus sign). If the value is initially shorter than
222
+ the required length, it is padded with zeros.
223
+
224
+ By default the value is returned as an upper case string, but the
225
+ ``lowercase`` argument a true value (see `Boolean arguments`) turns
226
+ the value (but not the given prefix) to lower case.
227
+
228
+ Examples:
229
+ | ${result} = | Convert To Hex | 255 | | | # Result is FF |
230
+ | ${result} = | Convert To Hex | -10 | prefix=0x | length=2 | # Result is -0x0A |
231
+ | ${result} = | Convert To Hex | 255 | prefix=X | lowercase=yes | # Result is Xff |
232
+
233
+ See also `Convert To Integer`, `Convert To Binary` and `Convert To Octal`.
234
+ """
235
+ spec = 'x' if is_truthy(lowercase) else 'X'
236
+ return self._convert_to_bin_oct_hex(item, base, prefix, length, spec)
237
+
238
+ def _convert_to_bin_oct_hex(self, item, base, prefix, length, format_spec):
239
+ self._log_types(item)
240
+ ret = format(self._convert_to_integer(item, base), format_spec)
241
+ prefix = prefix or ''
242
+ if ret[0] == '-':
243
+ prefix = '-' + prefix
244
+ ret = ret[1:]
245
+ if length:
246
+ ret = ret.rjust(self._convert_to_integer(length), '0')
247
+ return prefix + ret
248
+
249
+ def convert_to_number(self, item, precision=None):
250
+ """Converts the given item to a floating point number.
251
+
252
+ If the optional ``precision`` is positive or zero, the returned number
253
+ is rounded to that number of decimal digits. Negative precision means
254
+ that the number is rounded to the closest multiple of 10 to the power
255
+ of the absolute precision. If a number is equally close to a certain
256
+ precision, it is always rounded away from zero.
257
+
258
+ Examples:
259
+ | ${result} = | Convert To Number | 42.512 | | # Result is 42.512 |
260
+ | ${result} = | Convert To Number | 42.512 | 1 | # Result is 42.5 |
261
+ | ${result} = | Convert To Number | 42.512 | 0 | # Result is 43.0 |
262
+ | ${result} = | Convert To Number | 42.512 | -1 | # Result is 40.0 |
263
+
264
+ Notice that machines generally cannot store floating point numbers
265
+ accurately. This may cause surprises with these numbers in general
266
+ and also when they are rounded. For more information see, for example,
267
+ these resources:
268
+
269
+ - http://docs.python.org/2/tutorial/floatingpoint.html
270
+ - http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition
271
+
272
+ If you need an integer number, use `Convert To Integer` instead.
273
+ """
274
+ self._log_types(item)
275
+ return self._convert_to_number(item, precision)
276
+
277
+ def _convert_to_number(self, item, precision=None):
278
+ number = self._convert_to_number_without_precision(item)
279
+ if precision is not None:
280
+ number = roundup(number, self._convert_to_integer(precision),
281
+ return_type=float)
282
+ return number
283
+
284
+ def _convert_to_number_without_precision(self, item):
285
+ try:
286
+ if JYTHON:
287
+ item = self._handle_java_numbers(item)
288
+ return float(item)
289
+ except:
290
+ error = get_error_message()
291
+ try:
292
+ return float(self._convert_to_integer(item))
293
+ except RuntimeError:
294
+ raise RuntimeError("'%s' cannot be converted to a floating "
295
+ "point number: %s" % (item, error))
296
+
297
+ def convert_to_string(self, item):
298
+ """Converts the given item to a Unicode string.
299
+
300
+ Uses ``__unicode__`` or ``__str__`` method with Python objects and
301
+ ``toString`` with Java objects.
302
+
303
+ Use `Encode String To Bytes` and `Decode Bytes To String` keywords
304
+ in ``String`` library if you need to convert between Unicode and byte
305
+ strings using different encodings. Use `Convert To Bytes` if you just
306
+ want to create byte strings.
307
+ """
308
+ self._log_types(item)
309
+ return self._convert_to_string(item)
310
+
311
+ def _convert_to_string(self, item):
312
+ return unic(item)
313
+
314
+ def convert_to_boolean(self, item):
315
+ """Converts the given item to Boolean true or false.
316
+
317
+ Handles strings ``True`` and ``False`` (case-insensitive) as expected,
318
+ otherwise returns item's
319
+ [http://docs.python.org/2/library/stdtypes.html#truth|truth value]
320
+ using Python's ``bool()`` method.
321
+ """
322
+ self._log_types(item)
323
+ if is_string(item):
324
+ if item.upper() == 'TRUE':
325
+ return True
326
+ if item.upper() == 'FALSE':
327
+ return False
328
+ return bool(item)
329
+
330
+ def convert_to_bytes(self, input, input_type='text'):
331
+ u"""Converts the given ``input`` to bytes according to the ``input_type``.
332
+
333
+ Valid input types are listed below:
334
+
335
+ - ``text:`` Converts text to bytes character by character. All
336
+ characters with ordinal below 256 can be used and are converted to
337
+ bytes with same values. Many characters are easiest to represent
338
+ using escapes like ``\\x00`` or ``\\xff``. Supports both Unicode
339
+ strings and bytes.
340
+
341
+ - ``int:`` Converts integers separated by spaces to bytes. Similarly as
342
+ with `Convert To Integer`, it is possible to use binary, octal, or
343
+ hex values by prefixing the values with ``0b``, ``0o``, or ``0x``,
344
+ respectively.
345
+
346
+ - ``hex:`` Converts hexadecimal values to bytes. Single byte is always
347
+ two characters long (e.g. ``01`` or ``FF``). Spaces are ignored and
348
+ can be used freely as a visual separator.
349
+
350
+ - ``bin:`` Converts binary values to bytes. Single byte is always eight
351
+ characters long (e.g. ``00001010``). Spaces are ignored and can be
352
+ used freely as a visual separator.
353
+
354
+ In addition to giving the input as a string, it is possible to use
355
+ lists or other iterables containing individual characters or numbers.
356
+ In that case numbers do not need to be padded to certain length and
357
+ they cannot contain extra spaces.
358
+
359
+ Examples (last column shows returned bytes):
360
+ | ${bytes} = | Convert To Bytes | hyv\xe4 | | # hyv\\xe4 |
361
+ | ${bytes} = | Convert To Bytes | \\xff\\x07 | | # \\xff\\x07 |
362
+ | ${bytes} = | Convert To Bytes | 82 70 | int | # RF |
363
+ | ${bytes} = | Convert To Bytes | 0b10 0x10 | int | # \\x02\\x10 |
364
+ | ${bytes} = | Convert To Bytes | ff 00 07 | hex | # \\xff\\x00\\x07 |
365
+ | ${bytes} = | Convert To Bytes | 5246212121 | hex | # RF!!! |
366
+ | ${bytes} = | Convert To Bytes | 0000 1000 | bin | # \\x08 |
367
+ | ${input} = | Create List | 1 | 2 | 12 |
368
+ | ${bytes} = | Convert To Bytes | ${input} | int | # \\x01\\x02\\x0c |
369
+ | ${bytes} = | Convert To Bytes | ${input} | hex | # \\x01\\x02\\x12 |
370
+
371
+ Use `Encode String To Bytes` in ``String`` library if you need to
372
+ convert text to bytes using a certain encoding.
373
+
374
+ New in Robot Framework 2.8.2.
375
+ """
376
+ try:
377
+ try:
378
+ ordinals = getattr(self, '_get_ordinals_from_%s' % input_type)
379
+ except AttributeError:
380
+ raise RuntimeError("Invalid input type '%s'." % input_type)
381
+ return bytes(bytearray(o for o in ordinals(input)))
382
+ except:
383
+ raise RuntimeError("Creating bytes failed: %s" % get_error_message())
384
+
385
+ def _get_ordinals_from_text(self, input):
386
+ # https://github.com/IronLanguages/main/issues/1237
387
+ if IRONPYTHON and isinstance(input, bytearray):
388
+ input = bytes(input)
389
+ for char in input:
390
+ ordinal = char if is_integer(char) else ord(char)
391
+ yield self._test_ordinal(ordinal, char, 'Character')
392
+
393
+ def _test_ordinal(self, ordinal, original, type):
394
+ if 0 <= ordinal <= 255:
395
+ return ordinal
396
+ raise RuntimeError("%s '%s' cannot be represented as a byte."
397
+ % (type, original))
398
+
399
+ def _get_ordinals_from_int(self, input):
400
+ if is_string(input):
401
+ input = input.split()
402
+ elif is_integer(input):
403
+ input = [input]
404
+ for integer in input:
405
+ ordinal = self._convert_to_integer(integer)
406
+ yield self._test_ordinal(ordinal, integer, 'Integer')
407
+
408
+ def _get_ordinals_from_hex(self, input):
409
+ for token in self._input_to_tokens(input, length=2):
410
+ ordinal = self._convert_to_integer(token, base=16)
411
+ yield self._test_ordinal(ordinal, token, 'Hex value')
412
+
413
+ def _get_ordinals_from_bin(self, input):
414
+ for token in self._input_to_tokens(input, length=8):
415
+ ordinal = self._convert_to_integer(token, base=2)
416
+ yield self._test_ordinal(ordinal, token, 'Binary value')
417
+
418
+ def _input_to_tokens(self, input, length):
419
+ if not is_string(input):
420
+ return input
421
+ input = ''.join(input.split())
422
+ if len(input) % length != 0:
423
+ raise RuntimeError('Expected input to be multiple of %d.' % length)
424
+ return (input[i:i+length] for i in range(0, len(input), length))
425
+
426
+ def create_list(self, *items):
427
+ """Returns a list containing given items.
428
+
429
+ The returned list can be assigned both to ``${scalar}`` and ``@{list}``
430
+ variables.
431
+
432
+ Examples:
433
+ | @{list} = | Create List | a | b | c |
434
+ | ${scalar} = | Create List | a | b | c |
435
+ | ${ints} = | Create List | ${1} | ${2} | ${3} |
436
+ """
437
+ return list(items)
438
+
439
+ @run_keyword_variant(resolve=0)
440
+ def create_dictionary(self, *items):
441
+ """Creates and returns a dictionary based on the given ``items``.
442
+
443
+ Items are typically given using the ``key=value`` syntax same way as
444
+ ``&{dictionary}`` variables are created in the Variable table. Both
445
+ keys and values can contain variables, and possible equal sign in key
446
+ can be escaped with a backslash like ``escaped\\=key=value``. It is
447
+ also possible to get items from existing dictionaries by simply using
448
+ them like ``&{dict}``.
449
+
450
+ Alternatively items can be specified so that keys and values are given
451
+ separately. This and the ``key=value`` syntax can even be combined,
452
+ but separately given items must be first.
453
+
454
+ If same key is used multiple times, the last value has precedence.
455
+ The returned dictionary is ordered, and values with strings as keys
456
+ can also be accessed using a convenient dot-access syntax like
457
+ ``${dict.key}``.
458
+
459
+ Examples:
460
+ | &{dict} = | Create Dictionary | key=value | foo=bar | | | # key=value syntax |
461
+ | Should Be True | ${dict} == {'key': 'value', 'foo': 'bar'} |
462
+ | &{dict2} = | Create Dictionary | key | value | foo | bar | # separate key and value |
463
+ | Should Be Equal | ${dict} | ${dict2} |
464
+ | &{dict} = | Create Dictionary | ${1}=${2} | &{dict} | foo=new | | # using variables |
465
+ | Should Be True | ${dict} == {1: 2, 'key': 'value', 'foo': 'new'} |
466
+ | Should Be Equal | ${dict.key} | value | | | | # dot-access |
467
+
468
+ This keyword was changed in Robot Framework 2.9 in many ways:
469
+ - Moved from ``Collections`` library to ``BuiltIn``.
470
+ - Support also non-string keys in ``key=value`` syntax.
471
+ - Returned dictionary is ordered and dot-accessible.
472
+ - Old syntax to give keys and values separately was deprecated, but
473
+ deprecation was later removed in RF 3.0.1.
474
+ """
475
+ separate, combined = self._split_dict_items(items)
476
+ result = DotDict(self._format_separate_dict_items(separate))
477
+ combined = DictVariableTableValue(combined).resolve(self._variables)
478
+ result.update(combined)
479
+ return result
480
+
481
+ def _split_dict_items(self, items):
482
+ separate = []
483
+ for item in items:
484
+ name, value = split_from_equals(item)
485
+ if value is not None or VariableSplitter(item).is_dict_variable():
486
+ break
487
+ separate.append(item)
488
+ return separate, items[len(separate):]
489
+
490
+ def _format_separate_dict_items(self, separate):
491
+ separate = self._variables.replace_list(separate)
492
+ if len(separate) % 2 != 0:
493
+ raise DataError('Expected even number of keys and values, got %d.'
494
+ % len(separate))
495
+ return [separate[i:i+2] for i in range(0, len(separate), 2)]
496
+
497
+
498
+ class _Verify(_BuiltInBase):
499
+
500
+ def _set_and_remove_tags(self, tags):
501
+ set_tags = [tag for tag in tags if not tag.startswith('-')]
502
+ remove_tags = [tag[1:] for tag in tags if tag.startswith('-')]
503
+ if remove_tags:
504
+ self.remove_tags(*remove_tags)
505
+ if set_tags:
506
+ self.set_tags(*set_tags)
507
+
508
+ def fail(self, msg=None, *tags):
509
+ """Fails the test with the given message and optionally alters its tags.
510
+
511
+ The error message is specified using the ``msg`` argument.
512
+ It is possible to use HTML in the given error message, similarly
513
+ as with any other keyword accepting an error message, by prefixing
514
+ the error with ``*HTML*``.
515
+
516
+ It is possible to modify tags of the current test case by passing tags
517
+ after the message. Tags starting with a hyphen (e.g. ``-regression``)
518
+ are removed and others added. Tags are modified using `Set Tags` and
519
+ `Remove Tags` internally, and the semantics setting and removing them
520
+ are the same as with these keywords.
521
+
522
+ Examples:
523
+ | Fail | Test not ready | | | # Fails with the given message. |
524
+ | Fail | *HTML*<b>Test not ready</b> | | | # Fails using HTML in the message. |
525
+ | Fail | Test not ready | not-ready | | # Fails and adds 'not-ready' tag. |
526
+ | Fail | OS not supported | -regression | | # Removes tag 'regression'. |
527
+ | Fail | My message | tag | -t* | # Removes all tags starting with 't' except the newly added 'tag'. |
528
+
529
+ See `Fatal Error` if you need to stop the whole test execution.
530
+
531
+ Support for modifying tags was added in Robot Framework 2.7.4 and
532
+ HTML message support in 2.8.
533
+ """
534
+ self._set_and_remove_tags(tags)
535
+ raise AssertionError(msg) if msg else AssertionError()
536
+
537
+ def fatal_error(self, msg=None):
538
+ """Stops the whole test execution.
539
+
540
+ The test or suite where this keyword is used fails with the provided
541
+ message, and subsequent tests fail with a canned message.
542
+ Possible teardowns will nevertheless be executed.
543
+
544
+ See `Fail` if you only want to stop one test case unconditionally.
545
+ """
546
+ error = AssertionError(msg) if msg else AssertionError()
547
+ error.ROBOT_EXIT_ON_FAILURE = True
548
+ raise error
549
+
550
+ def should_not_be_true(self, condition, msg=None):
551
+ """Fails if the given condition is true.
552
+
553
+ See `Should Be True` for details about how ``condition`` is evaluated
554
+ and how ``msg`` can be used to override the default error message.
555
+ """
556
+ if self._is_true(condition):
557
+ raise AssertionError(msg or "'%s' should not be true." % condition)
558
+
559
+ def should_be_true(self, condition, msg=None):
560
+ """Fails if the given condition is not true.
561
+
562
+ If ``condition`` is a string (e.g. ``${rc} < 10``), it is evaluated as
563
+ a Python expression as explained in `Evaluating expressions` and the
564
+ keyword status is decided based on the result. If a non-string item is
565
+ given, the status is got directly from its
566
+ [http://docs.python.org/2/library/stdtypes.html#truth|truth value].
567
+
568
+ The default error message (``<condition> should be true``) is not very
569
+ informative, but it can be overridden with the ``msg`` argument.
570
+
571
+ Examples:
572
+ | Should Be True | ${rc} < 10 |
573
+ | Should Be True | '${status}' == 'PASS' | # Strings must be quoted |
574
+ | Should Be True | ${number} | # Passes if ${number} is not zero |
575
+ | Should Be True | ${list} | # Passes if ${list} is not empty |
576
+
577
+ Variables used like ``${variable}``, as in the examples above, are
578
+ replaced in the expression before evaluation. Variables are also
579
+ available in the evaluation namespace and can be accessed using special
580
+ syntax ``$variable``. This is a new feature in Robot Framework 2.9
581
+ and it is explained more thoroughly in `Evaluating expressions`.
582
+
583
+ Examples:
584
+ | Should Be True | $rc < 10 |
585
+ | Should Be True | $status == 'PASS' | # Expected string must be quoted |
586
+
587
+ Starting from Robot Framework 2.8, `Should Be True` automatically
588
+ imports Python's [http://docs.python.org/2/library/os.html|os] and
589
+ [http://docs.python.org/2/library/sys.html|sys] modules that contain
590
+ several useful attributes:
591
+
592
+ | Should Be True | os.linesep == '\\n' | # Unixy |
593
+ | Should Be True | os.linesep == '\\r\\n' | # Windows |
594
+ | Should Be True | sys.platform == 'darwin' | # OS X |
595
+ | Should Be True | sys.platform.startswith('java') | # Jython |
596
+ """
597
+ if not self._is_true(condition):
598
+ raise AssertionError(msg or "'%s' should be true." % condition)
599
+
600
+ def should_be_equal(self, first, second, msg=None, values=True,
601
+ ignore_case=False):
602
+ """Fails if the given objects are unequal.
603
+
604
+ Optional ``msg`` and ``values`` arguments specify how to construct
605
+ the error message if this keyword fails:
606
+
607
+ - If ``msg`` is not given, the error message is ``<first> != <second>``.
608
+ - If ``msg`` is given and ``values`` gets a true value (default),
609
+ the error message is ``<msg>: <first> != <second>``.
610
+ - If ``msg`` is given and ``values`` gets a false value, the error
611
+ message is simply ``<msg>``. See `Boolean arguments` for more details
612
+ about using false values.
613
+
614
+ If ``ignore_case`` is given a true value (see `Boolean arguments`) and
615
+ arguments are strings, it indicates that comparison should be
616
+ case-insensitive. New option in Robot Framework 3.0.1.
617
+
618
+ If both arguments are multiline strings, the comparison is done using
619
+ `multiline string comparisons`.
620
+
621
+ Examples:
622
+ | Should Be Equal | ${x} | expected |
623
+ | Should Be Equal | ${x} | expected | Custom error message |
624
+ | Should Be Equal | ${x} | expected | Custom message | values=False |
625
+ | Should Be Equal | ${x} | expected | ignore_case=True |
626
+ """
627
+ self._log_types_at_info_if_different(first, second)
628
+ if is_truthy(ignore_case) and is_string(first) and is_string(second):
629
+ first = first.lower()
630
+ second = second.lower()
631
+ self._should_be_equal(first, second, msg, values)
632
+
633
+ def _should_be_equal(self, first, second, msg, values):
634
+ if first == second:
635
+ return
636
+ include_values = self._include_values(values)
637
+ if include_values and is_string(first) and is_string(second):
638
+ self._raise_multi_diff(first, second)
639
+ assert_equal(first, second, msg, include_values)
640
+
641
+ def _log_types_at_info_if_different(self, first, second):
642
+ level = 'DEBUG' if type(first) == type(second) else 'INFO'
643
+ self._log_types_at_level(level, first, second)
644
+
645
+ def _raise_multi_diff(self, first, second):
646
+ first_lines, second_lines = first.splitlines(), second.splitlines()
647
+ if len(first_lines) < 3 or len(second_lines) < 3:
648
+ return
649
+ self.log("%s\n!=\n%s" % (first, second))
650
+ err = 'Multiline strings are different:\n'
651
+ for line in difflib.unified_diff(first_lines, second_lines,
652
+ fromfile='first', tofile='second',
653
+ lineterm=''):
654
+ err += line + '\n'
655
+ raise AssertionError(err)
656
+
657
+ def _include_values(self, values):
658
+ return is_truthy(values) and str(values).upper() != 'NO VALUES'
659
+
660
+ def should_not_be_equal(self, first, second, msg=None, values=True,
661
+ ignore_case=False):
662
+ """Fails if the given objects are equal.
663
+
664
+ See `Should Be Equal` for an explanation on how to override the default
665
+ error message with ``msg`` and ``values``.
666
+
667
+ If ``ignore_case`` is given a true value (see `Boolean arguments`) and
668
+ both arguments are strings, it indicates that comparison should be
669
+ case-insensitive. New option in Robot Framework 3.0.1.
670
+ """
671
+ self._log_types_at_info_if_different(first, second)
672
+ if is_truthy(ignore_case) and is_string(first) and is_string(second):
673
+ first = first.lower()
674
+ second = second.lower()
675
+ self._should_not_be_equal(first, second, msg, values)
676
+
677
+ def _should_not_be_equal(self, first, second, msg, values):
678
+ assert_not_equal(first, second, msg, self._include_values(values))
679
+
680
+ def should_not_be_equal_as_integers(self, first, second, msg=None,
681
+ values=True, base=None):
682
+ """Fails if objects are equal after converting them to integers.
683
+
684
+ See `Convert To Integer` for information how to convert integers from
685
+ other bases than 10 using ``base`` argument or ``0b/0o/0x`` prefixes.
686
+
687
+ See `Should Be Equal` for an explanation on how to override the default
688
+ error message with ``msg`` and ``values``.
689
+
690
+ See `Should Be Equal As Integers` for some usage examples.
691
+ """
692
+ self._log_types_at_info_if_different(first, second)
693
+ self._should_not_be_equal(self._convert_to_integer(first, base),
694
+ self._convert_to_integer(second, base),
695
+ msg, values)
696
+
697
+ def should_be_equal_as_integers(self, first, second, msg=None, values=True,
698
+ base=None):
699
+ """Fails if objects are unequal after converting them to integers.
700
+
701
+ See `Convert To Integer` for information how to convert integers from
702
+ other bases than 10 using ``base`` argument or ``0b/0o/0x`` prefixes.
703
+
704
+ See `Should Be Equal` for an explanation on how to override the default
705
+ error message with ``msg`` and ``values``.
706
+
707
+ Examples:
708
+ | Should Be Equal As Integers | 42 | ${42} | Error message |
709
+ | Should Be Equal As Integers | ABCD | abcd | base=16 |
710
+ | Should Be Equal As Integers | 0b1011 | 11 |
711
+ """
712
+ self._log_types_at_info_if_different(first, second)
713
+ self._should_be_equal(self._convert_to_integer(first, base),
714
+ self._convert_to_integer(second, base),
715
+ msg, values)
716
+
717
+ def should_not_be_equal_as_numbers(self, first, second, msg=None,
718
+ values=True, precision=6):
719
+ """Fails if objects are equal after converting them to real numbers.
720
+
721
+ The conversion is done with `Convert To Number` keyword using the
722
+ given ``precision``.
723
+
724
+ See `Should Be Equal As Numbers` for examples on how to use
725
+ ``precision`` and why it does not always work as expected. See also
726
+ `Should Be Equal` for an explanation on how to override the default
727
+ error message with ``msg`` and ``values``.
728
+ """
729
+ self._log_types_at_info_if_different(first, second)
730
+ first = self._convert_to_number(first, precision)
731
+ second = self._convert_to_number(second, precision)
732
+ self._should_not_be_equal(first, second, msg, values)
733
+
734
+ def should_be_equal_as_numbers(self, first, second, msg=None, values=True,
735
+ precision=6):
736
+ """Fails if objects are unequal after converting them to real numbers.
737
+
738
+ The conversion is done with `Convert To Number` keyword using the
739
+ given ``precision``.
740
+
741
+ Examples:
742
+ | Should Be Equal As Numbers | ${x} | 1.1 | | # Passes if ${x} is 1.1 |
743
+ | Should Be Equal As Numbers | 1.123 | 1.1 | precision=1 | # Passes |
744
+ | Should Be Equal As Numbers | 1.123 | 1.4 | precision=0 | # Passes |
745
+ | Should Be Equal As Numbers | 112.3 | 75 | precision=-2 | # Passes |
746
+
747
+ As discussed in the documentation of `Convert To Number`, machines
748
+ generally cannot store floating point numbers accurately. Because of
749
+ this limitation, comparing floats for equality is problematic and
750
+ a correct approach to use depends on the context. This keyword uses
751
+ a very naive approach of rounding the numbers before comparing them,
752
+ which is both prone to rounding errors and does not work very well if
753
+ numbers are really big or small. For more information about comparing
754
+ floats, and ideas on how to implement your own context specific
755
+ comparison algorithm, see
756
+ http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/.
757
+
758
+ See `Should Not Be Equal As Numbers` for a negative version of this
759
+ keyword and `Should Be Equal` for an explanation on how to override
760
+ the default error message with ``msg`` and ``values``.
761
+ """
762
+ self._log_types_at_info_if_different(first, second)
763
+ first = self._convert_to_number(first, precision)
764
+ second = self._convert_to_number(second, precision)
765
+ self._should_be_equal(first, second, msg, values)
766
+
767
+ def should_not_be_equal_as_strings(self, first, second, msg=None,
768
+ values=True, ignore_case=False):
769
+ """Fails if objects are equal after converting them to strings.
770
+
771
+ If ``ignore_case`` is given a true value (see `Boolean arguments`), it
772
+ indicates that comparison should be case-insensitive. New option in
773
+ Robot Framework 3.0.1.
774
+
775
+ See `Should Be Equal` for an explanation on how to override the default
776
+ error message with ``msg`` and ``values``.
777
+ """
778
+ self._log_types_at_info_if_different(first, second)
779
+ first = self._convert_to_string(first)
780
+ second = self._convert_to_string(second)
781
+ if is_truthy(ignore_case):
782
+ first = first.lower()
783
+ second = second.lower()
784
+ self._should_not_be_equal(first, second, msg, values)
785
+
786
+ def should_be_equal_as_strings(self, first, second, msg=None, values=True,
787
+ ignore_case=False):
788
+ """Fails if objects are unequal after converting them to strings.
789
+
790
+ See `Should Be Equal` for an explanation on how to override the default
791
+ error message with ``msg`` and ``values``.
792
+
793
+ If ``ignore_case`` is given a true value (see `Boolean arguments`), it
794
+ indicates that comparison should be case-insensitive. New option in
795
+ Robot Framework 3.0.1.
796
+
797
+ If both arguments are multiline strings, the comparison is done using
798
+ `multiline string comparisons`.
799
+ """
800
+ self._log_types_at_info_if_different(first, second)
801
+ first = self._convert_to_string(first)
802
+ second = self._convert_to_string(second)
803
+ if is_truthy(ignore_case):
804
+ first = first.lower()
805
+ second = second.lower()
806
+ self._should_be_equal(first, second, msg, values)
807
+
808
+ def should_not_start_with(self, str1, str2, msg=None, values=True,
809
+ ignore_case=False):
810
+ """Fails if the string ``str1`` starts with the string ``str2``.
811
+
812
+ See `Should Be Equal` for an explanation on how to override the default
813
+ error message with ``msg`` and ``values``, as well as for semantics
814
+ of the ``ignore_case`` option.
815
+ """
816
+ if is_truthy(ignore_case):
817
+ str1 = str1.lower()
818
+ str2 = str2.lower()
819
+ if str1.startswith(str2):
820
+ raise AssertionError(self._get_string_msg(str1, str2, msg, values,
821
+ 'starts with'))
822
+
823
+ def should_start_with(self, str1, str2, msg=None, values=True,
824
+ ignore_case=False):
825
+ """Fails if the string ``str1`` does not start with the string ``str2``.
826
+
827
+ See `Should Be Equal` for an explanation on how to override the default
828
+ error message with ``msg`` and ``values``, as well as for semantics
829
+ of the ``ignore_case`` option.
830
+ """
831
+ if is_truthy(ignore_case):
832
+ str1 = str1.lower()
833
+ str2 = str2.lower()
834
+ if not str1.startswith(str2):
835
+ raise AssertionError(self._get_string_msg(str1, str2, msg, values,
836
+ 'does not start with'))
837
+
838
+ def should_not_end_with(self, str1, str2, msg=None, values=True,
839
+ ignore_case=False):
840
+ """Fails if the string ``str1`` ends with the string ``str2``.
841
+
842
+ See `Should Be Equal` for an explanation on how to override the default
843
+ error message with ``msg`` and ``values``, as well as for semantics
844
+ of the ``ignore_case`` option.
845
+ """
846
+ if is_truthy(ignore_case):
847
+ str1 = str1.lower()
848
+ str2 = str2.lower()
849
+ if str1.endswith(str2):
850
+ raise AssertionError(self._get_string_msg(str1, str2, msg, values,
851
+ 'ends with'))
852
+
853
+ def should_end_with(self, str1, str2, msg=None, values=True,
854
+ ignore_case=False):
855
+ """Fails if the string ``str1`` does not end with the string ``str2``.
856
+
857
+ See `Should Be Equal` for an explanation on how to override the default
858
+ error message with ``msg`` and ``values``, as well as for semantics
859
+ of the ``ignore_case`` option.
860
+ """
861
+ if is_truthy(ignore_case):
862
+ str1 = str1.lower()
863
+ str2 = str2.lower()
864
+ if not str1.endswith(str2):
865
+ raise AssertionError(self._get_string_msg(str1, str2, msg, values,
866
+ 'does not end with'))
867
+
868
+ def should_not_contain(self, container, item, msg=None, values=True,
869
+ ignore_case=False):
870
+ """Fails if ``container`` contains ``item`` one or more times.
871
+
872
+ Works with strings, lists, and anything that supports Python's ``in``
873
+ operator.
874
+
875
+ See `Should Be Equal` for an explanation on how to override the default
876
+ error message with arguments ``msg`` and ``values``. ``ignore_case``
877
+ has exactly the same semantics as with `Should Contain`.
878
+
879
+ Examples:
880
+ | Should Not Contain | ${some list} | value |
881
+ | Should Not Contain | ${output} | FAILED | ignore_case=True |
882
+ """
883
+ # TODO: It is inconsistent that errors show original case in 'container'
884
+ # 'item' is in lower case. Should rather show original case everywhere
885
+ # and add separate '(case-insensitive)' not to the error message.
886
+ # This same logic should be used with all keywords supporting
887
+ # case-insensitive comparisons.
888
+ orig_container = container
889
+ if is_truthy(ignore_case) and is_string(item):
890
+ item = item.lower()
891
+ if is_string(container):
892
+ container = container.lower()
893
+ elif is_list_like(container):
894
+ container = set(x.lower() if is_string(x) else x for x in container)
895
+ if item in container:
896
+ raise AssertionError(self._get_string_msg(orig_container, item, msg,
897
+ values, 'contains'))
898
+
899
+ def should_contain(self, container, item, msg=None, values=True,
900
+ ignore_case=False):
901
+ """Fails if ``container`` does not contain ``item`` one or more times.
902
+
903
+ Works with strings, lists, and anything that supports Python's ``in``
904
+ operator.
905
+
906
+ See `Should Be Equal` for an explanation on how to override the default
907
+ error message with arguments ``msg`` and ``values``.
908
+
909
+ If ``ignore_case`` is given a true value (see `Boolean arguments`) and
910
+ compared items are strings, it indicates that comparison should be
911
+ case-insensitive. If the ``container`` is a list-like object, string
912
+ items in it are compared case-insensitively. New option in Robot
913
+ Framework 3.0.1.
914
+
915
+ Examples:
916
+ | Should Contain | ${output} | PASS |
917
+ | Should Contain | ${some list} | value | msg=Failure! | values=False |
918
+ | Should Contain | ${some list} | value | case_insensitive=True |
919
+ """
920
+ orig_container = container
921
+ if is_truthy(ignore_case) and is_string(item):
922
+ item = item.lower()
923
+ if is_string(container):
924
+ container = container.lower()
925
+ elif is_list_like(container):
926
+ container = set(x.lower() if is_string(x) else x for x in container)
927
+ if item not in container:
928
+ raise AssertionError(self._get_string_msg(orig_container, item, msg,
929
+ values, 'does not contain'))
930
+
931
+ def should_contain_any(self, container, *items, **configuration):
932
+ """Fails if ``container`` does not contain any of the ``*items``.
933
+
934
+ Works with strings, lists, and anything that supports Python's ``in``
935
+ operator.
936
+
937
+ Supports additional configuration parameters ``msg``, ``values``
938
+ and ``ignore_case``, which have exactly the same semantics as arguments
939
+ with same names have with `Should Contain`. These arguments must
940
+ always be given using ``name=value`` syntax after all ``items``.
941
+
942
+ Note that possible equal signs in ``items`` must be escaped with
943
+ a backslash (e.g. ``foo\\=bar``) to avoid them to be passed in
944
+ as ``**configuration``.
945
+
946
+ Examples:
947
+ | Should Contain Any | ${string} | substring 1 | substring 2 |
948
+ | Should Contain Any | ${list} | item 1 | item 2 | item 3 |
949
+ | Should Contain Any | ${list} | item 1 | item 2 | item 3 | ignore_case=True |
950
+ | Should Contain Any | ${list} | @{items} | msg=Custom message | values=False |
951
+
952
+ New in Robot Framework 3.0.1.
953
+ """
954
+ msg = configuration.pop('msg', None)
955
+ values = configuration.pop('values', True)
956
+ ignore_case = configuration.pop('ignore_case', False)
957
+ if configuration:
958
+ raise RuntimeError("Unsupported configuration parameter%s: %s."
959
+ % (s(configuration),
960
+ seq2str(sorted(configuration))))
961
+ if not items:
962
+ raise RuntimeError('One or more items required.')
963
+ orig_container = container
964
+ if is_truthy(ignore_case):
965
+ items = [x.lower() if is_string(x) else x for x in items]
966
+ if is_string(container):
967
+ container = container.lower()
968
+ elif is_list_like(container):
969
+ container = set(x.lower() if is_string(x) else x for x in container)
970
+ if not any(item in container for item in items):
971
+ msg = self._get_string_msg(orig_container,
972
+ seq2str(items, lastsep=' or '),
973
+ msg, values,
974
+ 'does not contain any of',
975
+ quote_item2=False)
976
+ raise AssertionError(msg)
977
+
978
+ def should_not_contain_any(self, container, *items, **configuration):
979
+ """Fails if ``container`` contains one or more of the ``*items``.
980
+
981
+ Works with strings, lists, and anything that supports Python's ``in``
982
+ operator.
983
+
984
+ Supports additional configuration parameters ``msg``, ``values``
985
+ and ``ignore_case``, which have exactly the same semantics as arguments
986
+ with same names have with `Should Contain`. These arguments must
987
+ always be given using ``name=value`` syntax after all ``items``.
988
+
989
+ Note that possible equal signs in ``items`` must be escaped with
990
+ a backslash (e.g. ``foo\\=bar``) to avoid them to be passed in
991
+ as ``**configuration``.
992
+
993
+ Examples:
994
+ | Should Not Contain Any | ${string} | substring 1 | substring 2 |
995
+ | Should Not Contain Any | ${list} | item 1 | item 2 | item 3 |
996
+ | Should Not Contain Any | ${list} | item 1 | item 2 | item 3 | ignore_case=True |
997
+ | Should Not Contain Any | ${list} | @{items} | msg=Custom message | values=False |
998
+
999
+ New in Robot Framework 3.0.1.
1000
+ """
1001
+ msg = configuration.pop('msg', None)
1002
+ values = configuration.pop('values', True)
1003
+ ignore_case = configuration.pop('ignore_case', False)
1004
+ if configuration:
1005
+ raise RuntimeError("Unsupported configuration parameter%s: %s."
1006
+ % (s(configuration),
1007
+ seq2str(sorted(configuration))))
1008
+ if not items:
1009
+ raise RuntimeError('One or more items required.')
1010
+ orig_container = container
1011
+ if is_truthy(ignore_case):
1012
+ items = [x.lower() if is_string(x) else x for x in items]
1013
+ if is_string(container):
1014
+ container = container.lower()
1015
+ elif is_list_like(container):
1016
+ container = set(x.lower() if is_string(x) else x for x in container)
1017
+ if any(item in container for item in items):
1018
+ msg = self._get_string_msg(orig_container,
1019
+ seq2str(items, lastsep=' or '),
1020
+ msg, values,
1021
+ 'contains one or more of',
1022
+ quote_item2=False)
1023
+ raise AssertionError(msg)
1024
+
1025
+ def should_contain_x_times(self, item1, item2, count, msg=None,
1026
+ ignore_case=False):
1027
+ """Fails if ``item1`` does not contain ``item2`` ``count`` times.
1028
+
1029
+ Works with strings, lists and all objects that `Get Count` works
1030
+ with. The default error message can be overridden with ``msg`` and
1031
+ the actual count is always logged.
1032
+
1033
+ If ``ignore_case`` is given a true value (see `Boolean arguments`) and
1034
+ compared items are strings, it indicates that comparison should be
1035
+ case-insensitive. If the ``item1`` is a list-like object, string
1036
+ items in it are compared case-insensitively. New option in Robot
1037
+ Framework 3.0.1.
1038
+
1039
+ Examples:
1040
+ | Should Contain X Times | ${output} | hello | 2 |
1041
+ | Should Contain X Times | ${some list} | value | 3 | ignore_case=True |
1042
+ """
1043
+ # TODO: Rename 'item1' and 'item2' to 'container' and 'item' in RF 3.1.
1044
+ # Other 'contain' keywords use these names. And 'Get Count' should too.
1045
+ # Cannot be done in minor release due to backwards compatibility.
1046
+ # Remember to update it also in the docstring!!
1047
+ count = self._convert_to_integer(count)
1048
+ orig_item1 = item1
1049
+ if is_truthy(ignore_case) and is_string(item2):
1050
+ item2 = item2.lower()
1051
+ if is_string(item1):
1052
+ item1 = item1.lower()
1053
+ elif is_list_like(item1):
1054
+ item1 = [x.lower() if is_string(x) else x for x in item1]
1055
+ x = self.get_count(item1, item2)
1056
+ if not msg:
1057
+ msg = "'%s' contains '%s' %d time%s, not %d time%s." \
1058
+ % (unic(orig_item1), unic(item2), x, s(x), count, s(count))
1059
+ self.should_be_equal_as_integers(x, count, msg, values=False)
1060
+
1061
+ def get_count(self, item1, item2):
1062
+ """Returns and logs how many times ``item2`` is found from ``item1``.
1063
+
1064
+ This keyword works with Python strings and lists and all objects
1065
+ that either have ``count`` method or can be converted to Python lists.
1066
+
1067
+ Example:
1068
+ | ${count} = | Get Count | ${some item} | interesting value |
1069
+ | Should Be True | 5 < ${count} < 10 |
1070
+ """
1071
+ if not hasattr(item1, 'count'):
1072
+ try:
1073
+ item1 = list(item1)
1074
+ except:
1075
+ raise RuntimeError("Converting '%s' to list failed: %s"
1076
+ % (item1, get_error_message()))
1077
+ count = item1.count(item2)
1078
+ self.log('Item found from the first item %d time%s' % (count, s(count)))
1079
+ return count
1080
+
1081
+ def should_not_match(self, string, pattern, msg=None, values=True,
1082
+ ignore_case=False):
1083
+ """Fails if the given ``string`` matches the given ``pattern``.
1084
+
1085
+ Pattern matching is similar as matching files in a shell, and it is
1086
+ always case-sensitive. In the pattern ``*`` matches to anything and
1087
+ ``?`` matches to any single character.
1088
+
1089
+ See `Should Be Equal` for an explanation on how to override the default
1090
+ error message with ``msg`` and ``values``, as well as for semantics
1091
+ of the ``ignore_case`` option.
1092
+ """
1093
+ if is_truthy(ignore_case):
1094
+ string = string.lower()
1095
+ pattern = pattern.lower()
1096
+ if self._matches(string, pattern):
1097
+ raise AssertionError(self._get_string_msg(string, pattern, msg,
1098
+ values, 'matches'))
1099
+
1100
+ def should_match(self, string, pattern, msg=None, values=True,
1101
+ ignore_case=False):
1102
+ """Fails unless the given ``string`` matches the given ``pattern``.
1103
+
1104
+ Pattern matching is similar as matching files in a shell, and it is
1105
+ always case-sensitive. In the pattern, ``*`` matches to anything and
1106
+ ``?`` matches to any single character.
1107
+
1108
+ See `Should Be Equal` for an explanation on how to override the default
1109
+ error message with ``msg`` and ``values``, as well as for semantics
1110
+ of the ``ignore_case`` option.
1111
+ """
1112
+ if is_truthy(ignore_case):
1113
+ string = string.lower()
1114
+ pattern = pattern.lower()
1115
+ if not self._matches(string, pattern):
1116
+ raise AssertionError(self._get_string_msg(string, pattern, msg,
1117
+ values, 'does not match'))
1118
+
1119
+ def should_match_regexp(self, string, pattern, msg=None, values=True):
1120
+ """Fails if ``string`` does not match ``pattern`` as a regular expression.
1121
+
1122
+ Regular expression check is implemented using the Python
1123
+ [http://docs.python.org/2/library/re.html|re module]. Python's regular
1124
+ expression syntax is derived from Perl, and it is thus also very
1125
+ similar to the syntax used, for example, in Java, Ruby and .NET.
1126
+
1127
+ Things to note about the regexp syntax in Robot Framework test data:
1128
+
1129
+ 1) Backslash is an escape character in the test data, and possible
1130
+ backslashes in the pattern must thus be escaped with another backslash
1131
+ (e.g. ``\\\\d\\\\w+``).
1132
+
1133
+ 2) Strings that may contain special characters, but should be handled
1134
+ as literal strings, can be escaped with the `Regexp Escape` keyword.
1135
+
1136
+ 3) The given pattern does not need to match the whole string. For
1137
+ example, the pattern ``ello`` matches the string ``Hello world!``. If
1138
+ a full match is needed, the ``^`` and ``$`` characters can be used to
1139
+ denote the beginning and end of the string, respectively. For example,
1140
+ ``^ello$`` only matches the exact string ``ello``.
1141
+
1142
+ 4) Possible flags altering how the expression is parsed (e.g.
1143
+ ``re.IGNORECASE``, ``re.MULTILINE``) can be set by prefixing the
1144
+ pattern with the ``(?iLmsux)`` group like ``(?im)pattern``. The
1145
+ available flags are ``i`` (case-insensitive), ``m`` (multiline mode),
1146
+ ``s`` (dotall mode), ``x`` (verbose), ``u`` (Unicode dependent) and
1147
+ ``L`` (locale dependent).
1148
+
1149
+ If this keyword passes, it returns the portion of the string that
1150
+ matched the pattern. Additionally, the possible captured groups are
1151
+ returned.
1152
+
1153
+ See the `Should Be Equal` keyword for an explanation on how to override
1154
+ the default error message with the ``msg`` and ``values`` arguments.
1155
+
1156
+ Examples:
1157
+ | Should Match Regexp | ${output} | \\\\d{6} | # Output contains six numbers |
1158
+ | Should Match Regexp | ${output} | ^\\\\d{6}$ | # Six numbers and nothing more |
1159
+ | ${ret} = | Should Match Regexp | Foo: 42 | (?i)foo: \\\\d+ |
1160
+ | ${match} | ${group1} | ${group2} = |
1161
+ | ... | Should Match Regexp | Bar: 43 | (Foo|Bar): (\\\\d+) |
1162
+ =>
1163
+ | ${ret} = 'Foo: 42'
1164
+ | ${match} = 'Bar: 43'
1165
+ | ${group1} = 'Bar'
1166
+ | ${group2} = '43'
1167
+ """
1168
+ res = re.search(pattern, string)
1169
+ if res is None:
1170
+ raise AssertionError(self._get_string_msg(string, pattern, msg,
1171
+ values, 'does not match'))
1172
+ match = res.group(0)
1173
+ groups = res.groups()
1174
+ if groups:
1175
+ return [match] + list(groups)
1176
+ return match
1177
+
1178
+ def should_not_match_regexp(self, string, pattern, msg=None, values=True):
1179
+ """Fails if ``string`` matches ``pattern`` as a regular expression.
1180
+
1181
+ See `Should Match Regexp` for more information about arguments.
1182
+ """
1183
+ if re.search(pattern, string) is not None:
1184
+ raise AssertionError(self._get_string_msg(string, pattern, msg,
1185
+ values, 'matches'))
1186
+
1187
+ def get_length(self, item):
1188
+ """Returns and logs the length of the given item as an integer.
1189
+
1190
+ The item can be anything that has a length, for example, a string,
1191
+ a list, or a mapping. The keyword first tries to get the length with
1192
+ the Python function ``len``, which calls the item's ``__len__`` method
1193
+ internally. If that fails, the keyword tries to call the item's
1194
+ possible ``length`` and ``size`` methods directly. The final attempt is
1195
+ trying to get the value of the item's ``length`` attribute. If all
1196
+ these attempts are unsuccessful, the keyword fails.
1197
+
1198
+ Examples:
1199
+ | ${length} = | Get Length | Hello, world! | |
1200
+ | Should Be Equal As Integers | ${length} | 13 |
1201
+ | @{list} = | Create List | Hello, | world! |
1202
+ | ${length} = | Get Length | ${list} | |
1203
+ | Should Be Equal As Integers | ${length} | 2 |
1204
+
1205
+ See also `Length Should Be`, `Should Be Empty` and `Should Not Be
1206
+ Empty`.
1207
+ """
1208
+ length = self._get_length(item)
1209
+ self.log('Length is %d' % length)
1210
+ return length
1211
+
1212
+ def _get_length(self, item):
1213
+ try:
1214
+ return len(item)
1215
+ except RERAISED_EXCEPTIONS:
1216
+ raise
1217
+ except:
1218
+ try:
1219
+ return item.length()
1220
+ except RERAISED_EXCEPTIONS:
1221
+ raise
1222
+ except:
1223
+ try:
1224
+ return item.size()
1225
+ except RERAISED_EXCEPTIONS:
1226
+ raise
1227
+ except:
1228
+ try:
1229
+ return item.length
1230
+ except RERAISED_EXCEPTIONS:
1231
+ raise
1232
+ except:
1233
+ raise RuntimeError("Could not get length of '%s'." % item)
1234
+
1235
+ def length_should_be(self, item, length, msg=None):
1236
+ """Verifies that the length of the given item is correct.
1237
+
1238
+ The length of the item is got using the `Get Length` keyword. The
1239
+ default error message can be overridden with the ``msg`` argument.
1240
+ """
1241
+ length = self._convert_to_integer(length)
1242
+ actual = self.get_length(item)
1243
+ if actual != length:
1244
+ raise AssertionError(msg or "Length of '%s' should be %d but is %d."
1245
+ % (item, length, actual))
1246
+
1247
+ def should_be_empty(self, item, msg=None):
1248
+ """Verifies that the given item is empty.
1249
+
1250
+ The length of the item is got using the `Get Length` keyword. The
1251
+ default error message can be overridden with the ``msg`` argument.
1252
+ """
1253
+ if self.get_length(item) > 0:
1254
+ raise AssertionError(msg or "'%s' should be empty." % item)
1255
+
1256
+ def should_not_be_empty(self, item, msg=None):
1257
+ """Verifies that the given item is not empty.
1258
+
1259
+ The length of the item is got using the `Get Length` keyword. The
1260
+ default error message can be overridden with the ``msg`` argument.
1261
+ """
1262
+ if self.get_length(item) == 0:
1263
+ raise AssertionError(msg or "'%s' should not be empty." % item)
1264
+
1265
+ def _get_string_msg(self, item1, item2, custom_message, include_values,
1266
+ delimiter, quote_item1=True, quote_item2=True):
1267
+ if custom_message and not self._include_values(include_values):
1268
+ return custom_message
1269
+ item1 = "'%s'" % unic(item1) if quote_item1 else unic(item1)
1270
+ item2 = "'%s'" % unic(item2) if quote_item2 else unic(item2)
1271
+ default_message = '%s %s %s' % (item1, delimiter, item2)
1272
+ if not custom_message:
1273
+ return default_message
1274
+ return '%s: %s' % (custom_message, default_message)
1275
+
1276
+
1277
+ class _Variables(_BuiltInBase):
1278
+
1279
+ def get_variables(self, no_decoration=False):
1280
+ """Returns a dictionary containing all variables in the current scope.
1281
+
1282
+ Variables are returned as a special dictionary that allows accessing
1283
+ variables in space, case, and underscore insensitive manner similarly
1284
+ as accessing variables in the test data. This dictionary supports all
1285
+ same operations as normal Python dictionaries and, for example,
1286
+ Collections library can be used to access or modify it. Modifying the
1287
+ returned dictionary has no effect on the variables available in the
1288
+ current scope.
1289
+
1290
+ By default variables are returned with ``${}``, ``@{}`` or ``&{}``
1291
+ decoration based on variable types. Giving a true value (see `Boolean
1292
+ arguments`) to the optional argument ``no_decoration`` will return
1293
+ the variables without the decoration. This option is new in Robot
1294
+ Framework 2.9.
1295
+
1296
+ Example:
1297
+ | ${example_variable} = | Set Variable | example value |
1298
+ | ${variables} = | Get Variables | |
1299
+ | Dictionary Should Contain Key | ${variables} | \\${example_variable} |
1300
+ | Dictionary Should Contain Key | ${variables} | \\${ExampleVariable} |
1301
+ | Set To Dictionary | ${variables} | \\${name} | value |
1302
+ | Variable Should Not Exist | \\${name} | | |
1303
+ | ${no decoration} = | Get Variables | no_decoration=Yes |
1304
+ | Dictionary Should Contain Key | ${no decoration} | example_variable |
1305
+
1306
+ Note: Prior to Robot Framework 2.7.4 variables were returned as
1307
+ a custom object that did not support all dictionary methods.
1308
+ """
1309
+ return self._variables.as_dict(decoration=is_falsy(no_decoration))
1310
+
1311
+ @run_keyword_variant(resolve=0)
1312
+ def get_variable_value(self, name, default=None):
1313
+ """Returns variable value or ``default`` if the variable does not exist.
1314
+
1315
+ The name of the variable can be given either as a normal variable name
1316
+ (e.g. ``${NAME}``) or in escaped format (e.g. ``\\${NAME}``). Notice
1317
+ that the former has some limitations explained in `Set Suite Variable`.
1318
+
1319
+ Examples:
1320
+ | ${x} = | Get Variable Value | ${a} | default |
1321
+ | ${y} = | Get Variable Value | ${a} | ${b} |
1322
+ | ${z} = | Get Variable Value | ${z} | |
1323
+ =>
1324
+ | ${x} gets value of ${a} if ${a} exists and string 'default' otherwise
1325
+ | ${y} gets value of ${a} if ${a} exists and value of ${b} otherwise
1326
+ | ${z} is set to Python None if it does not exist previously
1327
+
1328
+ See `Set Variable If` for another keyword to set variables dynamically.
1329
+ """
1330
+ try:
1331
+ return self._variables[self._get_var_name(name)]
1332
+ except DataError:
1333
+ return self._variables.replace_scalar(default)
1334
+
1335
+ def log_variables(self, level='INFO'):
1336
+ """Logs all variables in the current scope with given log level."""
1337
+ variables = self.get_variables()
1338
+ for name in sorted(variables, key=lambda s: s[2:-1].lower()):
1339
+ msg = format_assign_message(name, variables[name], cut_long=False)
1340
+ self.log(msg, level)
1341
+
1342
+ @run_keyword_variant(resolve=0)
1343
+ def variable_should_exist(self, name, msg=None):
1344
+ """Fails unless the given variable exists within the current scope.
1345
+
1346
+ The name of the variable can be given either as a normal variable name
1347
+ (e.g. ``${NAME}``) or in escaped format (e.g. ``\\${NAME}``). Notice
1348
+ that the former has some limitations explained in `Set Suite Variable`.
1349
+
1350
+ The default error message can be overridden with the ``msg`` argument.
1351
+
1352
+ See also `Variable Should Not Exist` and `Keyword Should Exist`.
1353
+ """
1354
+ name = self._get_var_name(name)
1355
+ msg = self._variables.replace_string(msg) if msg \
1356
+ else "Variable %s does not exist." % name
1357
+ try:
1358
+ self._variables[name]
1359
+ except DataError:
1360
+ raise AssertionError(msg)
1361
+
1362
+ @run_keyword_variant(resolve=0)
1363
+ def variable_should_not_exist(self, name, msg=None):
1364
+ """Fails if the given variable exists within the current scope.
1365
+
1366
+ The name of the variable can be given either as a normal variable name
1367
+ (e.g. ``${NAME}``) or in escaped format (e.g. ``\\${NAME}``). Notice
1368
+ that the former has some limitations explained in `Set Suite Variable`.
1369
+
1370
+ The default error message can be overridden with the ``msg`` argument.
1371
+
1372
+ See also `Variable Should Exist` and `Keyword Should Exist`.
1373
+ """
1374
+ name = self._get_var_name(name)
1375
+ msg = self._variables.replace_string(msg) if msg \
1376
+ else "Variable %s exists." % name
1377
+ try:
1378
+ self._variables[name]
1379
+ except DataError:
1380
+ pass
1381
+ else:
1382
+ raise AssertionError(msg)
1383
+
1384
+ def replace_variables(self, text):
1385
+ """Replaces variables in the given text with their current values.
1386
+
1387
+ If the text contains undefined variables, this keyword fails.
1388
+ If the given ``text`` contains only a single variable, its value is
1389
+ returned as-is and it can be any object. Otherwise this keyword
1390
+ always returns a string.
1391
+
1392
+ Example:
1393
+
1394
+ The file ``template.txt`` contains ``Hello ${NAME}!`` and variable
1395
+ ``${NAME}`` has the value ``Robot``.
1396
+
1397
+ | ${template} = | Get File | ${CURDIR}/template.txt |
1398
+ | ${message} = | Replace Variables | ${template} |
1399
+ | Should Be Equal | ${message} | Hello Robot! |
1400
+ """
1401
+ return self._variables.replace_scalar(text)
1402
+
1403
+ def set_variable(self, *values):
1404
+ """Returns the given values which can then be assigned to a variables.
1405
+
1406
+ This keyword is mainly used for setting scalar variables.
1407
+ Additionally it can be used for converting a scalar variable
1408
+ containing a list to a list variable or to multiple scalar variables.
1409
+ It is recommended to use `Create List` when creating new lists.
1410
+
1411
+ Examples:
1412
+ | ${hi} = | Set Variable | Hello, world! |
1413
+ | ${hi2} = | Set Variable | I said: ${hi} |
1414
+ | ${var1} | ${var2} = | Set Variable | Hello | world |
1415
+ | @{list} = | Set Variable | ${list with some items} |
1416
+ | ${item1} | ${item2} = | Set Variable | ${list with 2 items} |
1417
+
1418
+ Variables created with this keyword are available only in the
1419
+ scope where they are created. See `Set Global Variable`,
1420
+ `Set Test Variable` and `Set Suite Variable` for information on how to
1421
+ set variables so that they are available also in a larger scope.
1422
+ """
1423
+ if len(values) == 0:
1424
+ return ''
1425
+ elif len(values) == 1:
1426
+ return values[0]
1427
+ else:
1428
+ return list(values)
1429
+
1430
+ @run_keyword_variant(resolve=0)
1431
+ def set_test_variable(self, name, *values):
1432
+ """Makes a variable available everywhere within the scope of the current test.
1433
+
1434
+ Variables set with this keyword are available everywhere within the
1435
+ scope of the currently executed test case. For example, if you set a
1436
+ variable in a user keyword, it is available both in the test case level
1437
+ and also in all other user keywords used in the current test. Other
1438
+ test cases will not see variables set with this keyword.
1439
+
1440
+ See `Set Suite Variable` for more information and examples.
1441
+ """
1442
+ name = self._get_var_name(name)
1443
+ value = self._get_var_value(name, values)
1444
+ self._variables.set_test(name, value)
1445
+ self._log_set_variable(name, value)
1446
+
1447
+ @run_keyword_variant(resolve=0)
1448
+ def set_suite_variable(self, name, *values):
1449
+ """Makes a variable available everywhere within the scope of the current suite.
1450
+
1451
+ Variables set with this keyword are available everywhere within the
1452
+ scope of the currently executed test suite. Setting variables with this
1453
+ keyword thus has the same effect as creating them using the Variable
1454
+ table in the test data file or importing them from variable files.
1455
+
1456
+ Possible child test suites do not see variables set with this keyword
1457
+ by default. Starting from Robot Framework 2.9, that can be controlled
1458
+ by using ``children=<option>`` as the last argument. If the specified
1459
+ ``<option>`` is a non-empty string or any other value considered true
1460
+ in Python, the variable is set also to the child suites. Parent and
1461
+ sibling suites will never see variables set with this keyword.
1462
+
1463
+ The name of the variable can be given either as a normal variable name
1464
+ (e.g. ``${NAME}``) or in escaped format as ``\\${NAME}`` or ``$NAME``.
1465
+ Variable value can be given using the same syntax as when variables
1466
+ are created in the Variable table.
1467
+
1468
+ If a variable already exists within the new scope, its value will be
1469
+ overwritten. Otherwise a new variable is created. If a variable already
1470
+ exists within the current scope, the value can be left empty and the
1471
+ variable within the new scope gets the value within the current scope.
1472
+
1473
+ Examples:
1474
+ | Set Suite Variable | ${SCALAR} | Hello, world! |
1475
+ | Set Suite Variable | ${SCALAR} | Hello, world! | children=true |
1476
+ | Set Suite Variable | @{LIST} | First item | Second item |
1477
+ | Set Suite Variable | &{DICT} | key=value | foo=bar |
1478
+ | ${ID} = | Get ID |
1479
+ | Set Suite Variable | ${ID} |
1480
+
1481
+ To override an existing value with an empty value, use built-in
1482
+ variables ``${EMPTY}``, ``@{EMPTY}`` or ``&{EMPTY}``:
1483
+
1484
+ | Set Suite Variable | ${SCALAR} | ${EMPTY} |
1485
+ | Set Suite Variable | @{LIST} | @{EMPTY} | # New in RF 2.7.4 |
1486
+ | Set Suite Variable | &{DICT} | &{EMPTY} | # New in RF 2.9 |
1487
+
1488
+ *NOTE:* If the variable has value which itself is a variable (escaped
1489
+ or not), you must always use the escaped format to set the variable:
1490
+
1491
+ Example:
1492
+ | ${NAME} = | Set Variable | \\${var} |
1493
+ | Set Suite Variable | ${NAME} | value | # Sets variable ${var} |
1494
+ | Set Suite Variable | \\${NAME} | value | # Sets variable ${NAME} |
1495
+
1496
+ This limitation applies also to `Set Test Variable`, `Set Global
1497
+ Variable`, `Variable Should Exist`, `Variable Should Not Exist` and
1498
+ `Get Variable Value` keywords.
1499
+ """
1500
+ name = self._get_var_name(name)
1501
+ if (values and is_string(values[-1]) and
1502
+ values[-1].startswith('children=')):
1503
+ children = self._variables.replace_scalar(values[-1][9:])
1504
+ children = is_truthy(children)
1505
+ values = values[:-1]
1506
+ else:
1507
+ children = False
1508
+ value = self._get_var_value(name, values)
1509
+ self._variables.set_suite(name, value, children=children)
1510
+ self._log_set_variable(name, value)
1511
+
1512
+ @run_keyword_variant(resolve=0)
1513
+ def set_global_variable(self, name, *values):
1514
+ """Makes a variable available globally in all tests and suites.
1515
+
1516
+ Variables set with this keyword are globally available in all test
1517
+ cases and suites executed after setting them. Setting variables with
1518
+ this keyword thus has the same effect as creating from the command line
1519
+ using the options ``--variable`` or ``--variablefile``. Because this
1520
+ keyword can change variables everywhere, it should be used with care.
1521
+
1522
+ See `Set Suite Variable` for more information and examples.
1523
+ """
1524
+ name = self._get_var_name(name)
1525
+ value = self._get_var_value(name, values)
1526
+ self._variables.set_global(name, value)
1527
+ self._log_set_variable(name, value)
1528
+
1529
+ # Helpers
1530
+
1531
+ def _get_var_name(self, orig):
1532
+ name = self._resolve_possible_variable(orig)
1533
+ try:
1534
+ return self._unescape_variable_if_needed(name)
1535
+ except ValueError:
1536
+ raise RuntimeError("Invalid variable syntax '%s'." % orig)
1537
+
1538
+ def _resolve_possible_variable(self, name):
1539
+ try:
1540
+ resolved = self._variables.replace_string(name)
1541
+ return self._unescape_variable_if_needed(resolved)
1542
+ except (KeyError, ValueError, DataError):
1543
+ return name
1544
+
1545
+ def _unescape_variable_if_needed(self, name):
1546
+ if name.startswith('\\'):
1547
+ name = name[1:]
1548
+ if len(name) < 2:
1549
+ raise ValueError
1550
+ if name[0] in '$@&' and name[1] != '{':
1551
+ name = '%s{%s}' % (name[0], name[1:])
1552
+ if is_var(name):
1553
+ return name
1554
+ # Support for possible internal variables (issue 397)
1555
+ name = '%s{%s}' % (name[0], self.replace_variables(name[2:-1]))
1556
+ if is_var(name):
1557
+ return name
1558
+ raise ValueError
1559
+
1560
+ def _get_var_value(self, name, values):
1561
+ if not values:
1562
+ return self._variables[name]
1563
+ if name[0] == '$':
1564
+ # We could consider catenating values similarly as when creating
1565
+ # scalar variables in the variable table, but that would require
1566
+ # handling non-string values somehow. For details see
1567
+ # https://github.com/robotframework/robotframework/issues/1919
1568
+ if len(values) != 1 or VariableSplitter(values[0]).is_list_variable():
1569
+ raise DataError("Setting list value to scalar variable '%s' "
1570
+ "is not supported anymore. Create list "
1571
+ "variable '@%s' instead." % (name, name[1:]))
1572
+ return self._variables.replace_scalar(values[0])
1573
+ return VariableTableValue(values, name).resolve(self._variables)
1574
+
1575
+ def _log_set_variable(self, name, value):
1576
+ self.log(format_assign_message(name, value))
1577
+
1578
+
1579
+ class _RunKeyword(_BuiltInBase):
1580
+
1581
+ # If you use any of these run keyword variants from another library, you
1582
+ # should register those keywords with 'register_run_keyword' method. See
1583
+ # the documentation of that method at the end of this file. There are also
1584
+ # other run keyword variant keywords in BuiltIn which can also be seen
1585
+ # at the end of this file.
1586
+
1587
+ @run_keyword_variant(resolve=1)
1588
+ def run_keyword(self, name, *args):
1589
+ """Executes the given keyword with the given arguments.
1590
+
1591
+ Because the name of the keyword to execute is given as an argument, it
1592
+ can be a variable and thus set dynamically, e.g. from a return value of
1593
+ another keyword or from the command line.
1594
+ """
1595
+ if not is_string(name):
1596
+ raise RuntimeError('Keyword name must be a string.')
1597
+ kw = Keyword(name, args=args)
1598
+ return kw.run(self._context)
1599
+
1600
+ @run_keyword_variant(resolve=0)
1601
+ def run_keywords(self, *keywords):
1602
+ """Executes all the given keywords in a sequence.
1603
+
1604
+ This keyword is mainly useful in setups and teardowns when they need
1605
+ to take care of multiple actions and creating a new higher level user
1606
+ keyword would be an overkill.
1607
+
1608
+ By default all arguments are expected to be keywords to be executed.
1609
+
1610
+ Examples:
1611
+ | Run Keywords | Initialize database | Start servers | Clear logs |
1612
+ | Run Keywords | ${KW 1} | ${KW 2} |
1613
+ | Run Keywords | @{KEYWORDS} |
1614
+
1615
+ Starting from Robot Framework 2.7.6, keywords can also be run with
1616
+ arguments using upper case ``AND`` as a separator between keywords.
1617
+ The keywords are executed so that the first argument is the first
1618
+ keyword and proceeding arguments until the first ``AND`` are arguments
1619
+ to it. First argument after the first ``AND`` is the second keyword and
1620
+ proceeding arguments until the next ``AND`` are its arguments. And so on.
1621
+
1622
+ Examples:
1623
+ | Run Keywords | Initialize database | db1 | AND | Start servers | server1 | server2 |
1624
+ | Run Keywords | Initialize database | ${DB NAME} | AND | Start servers | @{SERVERS} | AND | Clear logs |
1625
+ | Run Keywords | ${KW} | AND | @{KW WITH ARGS} |
1626
+
1627
+ Notice that the ``AND`` control argument must be used explicitly and
1628
+ cannot itself come from a variable. If you need to use literal ``AND``
1629
+ string as argument, you can either use variables or escape it with
1630
+ a backslash like ``\\AND``.
1631
+ """
1632
+ self._run_keywords(self._split_run_keywords(list(keywords)))
1633
+
1634
+ def _run_keywords(self, iterable):
1635
+ errors = []
1636
+ for kw, args in iterable:
1637
+ try:
1638
+ self.run_keyword(kw, *args)
1639
+ except ExecutionPassed as err:
1640
+ err.set_earlier_failures(errors)
1641
+ raise err
1642
+ except ExecutionFailed as err:
1643
+ errors.extend(err.get_errors())
1644
+ if not err.can_continue(self._context.in_teardown):
1645
+ break
1646
+ if errors:
1647
+ raise ExecutionFailures(errors)
1648
+
1649
+ def _split_run_keywords(self, keywords):
1650
+ if 'AND' not in keywords:
1651
+ for name in self._variables.replace_list(keywords):
1652
+ yield name, ()
1653
+ else:
1654
+ for name, args in self._split_run_keywords_from_and(keywords):
1655
+ yield name, args
1656
+
1657
+ def _split_run_keywords_from_and(self, keywords):
1658
+ while 'AND' in keywords:
1659
+ index = keywords.index('AND')
1660
+ yield self._resolve_run_keywords_name_and_args(keywords[:index])
1661
+ keywords = keywords[index+1:]
1662
+ yield self._resolve_run_keywords_name_and_args(keywords)
1663
+
1664
+ def _resolve_run_keywords_name_and_args(self, kw_call):
1665
+ kw_call = self._variables.replace_list(kw_call, replace_until=1)
1666
+ if not kw_call:
1667
+ raise DataError('Incorrect use of AND')
1668
+ return kw_call[0], kw_call[1:]
1669
+
1670
+ @run_keyword_variant(resolve=2)
1671
+ def run_keyword_if(self, condition, name, *args):
1672
+ """Runs the given keyword with the given arguments, if ``condition`` is true.
1673
+
1674
+ The given ``condition`` is evaluated in Python as explained in
1675
+ `Evaluating expressions`, and ``name`` and ``*args`` have same
1676
+ semantics as with `Run Keyword`.
1677
+
1678
+ Example, a simple if/else construct:
1679
+ | ${status} | ${value} = | `Run Keyword And Ignore Error` | `My Keyword` |
1680
+ | `Run Keyword If` | '${status}' == 'PASS' | `Some Action` | arg |
1681
+ | `Run Keyword Unless` | '${status}' == 'PASS' | `Another Action` |
1682
+
1683
+ In this example, only either `Some Action` or `Another Action` is
1684
+ executed, based on the status of `My Keyword`. Instead of `Run Keyword
1685
+ And Ignore Error` you can also use `Run Keyword And Return Status`.
1686
+
1687
+ Variables used like ``${variable}``, as in the examples above, are
1688
+ replaced in the expression before evaluation. Variables are also
1689
+ available in the evaluation namespace and can be accessed using special
1690
+ syntax ``$variable``. This is a new feature in Robot Framework 2.9
1691
+ and it is explained more thoroughly in `Evaluating expressions`.
1692
+
1693
+ Example:
1694
+ | `Run Keyword If` | $result is None or $result == 'FAIL' | `Keyword` |
1695
+
1696
+ Starting from Robot version 2.7.4, this keyword supports also optional
1697
+ ELSE and ELSE IF branches. Both of these are defined in ``*args`` and
1698
+ must use exactly format ``ELSE`` or ``ELSE IF``, respectively. ELSE
1699
+ branches must contain first the name of the keyword to execute and then
1700
+ its possible arguments. ELSE IF branches must first contain a condition,
1701
+ like the first argument to this keyword, and then the keyword to execute
1702
+ and its possible arguments. It is possible to have ELSE branch after
1703
+ ELSE IF and to have multiple ELSE IF branches.
1704
+
1705
+ Given previous example, if/else construct can also be created like this:
1706
+ | ${status} | ${value} = | `Run Keyword And Ignore Error` | My Keyword |
1707
+ | `Run Keyword If` | '${status}' == 'PASS' | `Some Action` | arg | ELSE | `Another Action` |
1708
+
1709
+ The return value is the one of the keyword that was executed or None if
1710
+ no keyword was executed (i.e. if ``condition`` was false). Hence, it is
1711
+ recommended to use ELSE and/or ELSE IF branches to conditionally assign
1712
+ return values from keyword to variables (to conditionally assign fixed
1713
+ values to variables, see `Set Variable If`). This is illustrated by the
1714
+ example below:
1715
+
1716
+ | ${var1} = | `Run Keyword If` | ${rc} == 0 | `Some keyword returning a value` |
1717
+ | ... | ELSE IF | 0 < ${rc} < 42 | `Another keyword` |
1718
+ | ... | ELSE IF | ${rc} < 0 | `Another keyword with args` | ${rc} | arg2 |
1719
+ | ... | ELSE | `Final keyword to handle abnormal cases` | ${rc} |
1720
+ | ${var2} = | `Run Keyword If` | ${condition} | `Some keyword` |
1721
+
1722
+ In this example, ${var2} will be set to None if ${condition} is false.
1723
+
1724
+ Notice that ``ELSE`` and ``ELSE IF`` control words must be used
1725
+ explicitly and thus cannot come from variables. If you need to use
1726
+ literal ``ELSE`` and ``ELSE IF`` strings as arguments, you can escape
1727
+ them with a backslash like ``\\ELSE`` and ``\\ELSE IF``.
1728
+
1729
+ Starting from Robot Framework 2.8, Python's
1730
+ [http://docs.python.org/2/library/os.html|os] and
1731
+ [http://docs.python.org/2/library/sys.html|sys] modules are
1732
+ automatically imported when evaluating the ``condition``.
1733
+ Attributes they contain can thus be used in the condition:
1734
+
1735
+ | `Run Keyword If` | os.sep == '/' | `Unix Keyword` |
1736
+ | ... | ELSE IF | sys.platform.startswith('java') | `Jython Keyword` |
1737
+ | ... | ELSE | `Windows Keyword` |
1738
+ """
1739
+ args, branch = self._split_elif_or_else_branch(args)
1740
+ if self._is_true(condition):
1741
+ return self.run_keyword(name, *args)
1742
+ return branch()
1743
+
1744
+ def _split_elif_or_else_branch(self, args):
1745
+ if 'ELSE IF' in args:
1746
+ args, branch = self._split_branch(args, 'ELSE IF', 2,
1747
+ 'condition and keyword')
1748
+ return args, lambda: self.run_keyword_if(*branch)
1749
+ if 'ELSE' in args:
1750
+ args, branch = self._split_branch(args, 'ELSE', 1, 'keyword')
1751
+ return args, lambda: self.run_keyword(*branch)
1752
+ return args, lambda: None
1753
+
1754
+ def _split_branch(self, args, control_word, required, required_error):
1755
+ index = list(args).index(control_word)
1756
+ branch = self._variables.replace_list(args[index+1:], required)
1757
+ if len(branch) < required:
1758
+ raise DataError('%s requires %s.' % (control_word, required_error))
1759
+ return args[:index], branch
1760
+
1761
+ @run_keyword_variant(resolve=2)
1762
+ def run_keyword_unless(self, condition, name, *args):
1763
+ """Runs the given keyword with the given arguments, if ``condition`` is false.
1764
+
1765
+ See `Run Keyword If` for more information and an example.
1766
+ """
1767
+ if not self._is_true(condition):
1768
+ return self.run_keyword(name, *args)
1769
+
1770
+ @run_keyword_variant(resolve=1)
1771
+ def run_keyword_and_ignore_error(self, name, *args):
1772
+ """Runs the given keyword with the given arguments and ignores possible error.
1773
+
1774
+ This keyword returns two values, so that the first is either string
1775
+ ``PASS`` or ``FAIL``, depending on the status of the executed keyword.
1776
+ The second value is either the return value of the keyword or the
1777
+ received error message. See `Run Keyword And Return Status` If you are
1778
+ only interested in the execution status.
1779
+
1780
+ The keyword name and arguments work as in `Run Keyword`. See
1781
+ `Run Keyword If` for a usage example.
1782
+
1783
+ Errors caused by invalid syntax, timeouts, or fatal exceptions are not
1784
+ caught by this keyword. Otherwise this keyword itself never fails.
1785
+ Since Robot Framework 2.9, variable errors are caught by this keyword.
1786
+ """
1787
+ try:
1788
+ return 'PASS', self.run_keyword(name, *args)
1789
+ except ExecutionFailed as err:
1790
+ if err.dont_continue:
1791
+ raise
1792
+ return 'FAIL', unic(err)
1793
+
1794
+ @run_keyword_variant(resolve=1)
1795
+ def run_keyword_and_return_status(self, name, *args):
1796
+ """Runs the given keyword with given arguments and returns the status as a Boolean value.
1797
+
1798
+ This keyword returns Boolean ``True`` if the keyword that is executed
1799
+ succeeds and ``False`` if it fails. This is useful, for example, in
1800
+ combination with `Run Keyword If`. If you are interested in the error
1801
+ message or return value, use `Run Keyword And Ignore Error` instead.
1802
+
1803
+ The keyword name and arguments work as in `Run Keyword`.
1804
+
1805
+ Example:
1806
+ | ${passed} = | `Run Keyword And Return Status` | Keyword | args |
1807
+ | `Run Keyword If` | ${passed} | Another keyword |
1808
+
1809
+ Errors caused by invalid syntax, timeouts, or fatal exceptions are not
1810
+ caught by this keyword. Otherwise this keyword itself never fails.
1811
+
1812
+ New in Robot Framework 2.7.6.
1813
+ """
1814
+ status, _ = self.run_keyword_and_ignore_error(name, *args)
1815
+ return status == 'PASS'
1816
+
1817
+ @run_keyword_variant(resolve=1)
1818
+ def run_keyword_and_continue_on_failure(self, name, *args):
1819
+ """Runs the keyword and continues execution even if a failure occurs.
1820
+
1821
+ The keyword name and arguments work as with `Run Keyword`.
1822
+
1823
+ Example:
1824
+ | Run Keyword And Continue On Failure | Fail | This is a stupid example |
1825
+ | Log | This keyword is executed |
1826
+
1827
+ The execution is not continued if the failure is caused by invalid syntax,
1828
+ timeout, or fatal exception.
1829
+ Since Robot Framework 2.9, variable errors are caught by this keyword.
1830
+ """
1831
+ try:
1832
+ return self.run_keyword(name, *args)
1833
+ except ExecutionFailed as err:
1834
+ if not err.dont_continue:
1835
+ err.continue_on_failure = True
1836
+ raise err
1837
+
1838
+ @run_keyword_variant(resolve=2)
1839
+ def run_keyword_and_expect_error(self, expected_error, name, *args):
1840
+ """Runs the keyword and checks that the expected error occurred.
1841
+
1842
+ The expected error must be given in the same format as in
1843
+ Robot Framework reports. It can be a pattern containing
1844
+ characters ``?``, which matches to any single character and
1845
+ ``*``, which matches to any number of any characters. ``name`` and
1846
+ ``*args`` have same semantics as with `Run Keyword`.
1847
+
1848
+ If the expected error occurs, the error message is returned and it can
1849
+ be further processed/tested, if needed. If there is no error, or the
1850
+ error does not match the expected error, this keyword fails.
1851
+
1852
+ Examples:
1853
+ | Run Keyword And Expect Error | My error | Some Keyword | arg1 | arg2 |
1854
+ | ${msg} = | Run Keyword And Expect Error | * | My KW |
1855
+ | Should Start With | ${msg} | Once upon a time in |
1856
+
1857
+ Errors caused by invalid syntax, timeouts, or fatal exceptions are not
1858
+ caught by this keyword.
1859
+ Since Robot Framework 2.9, variable errors are caught by this keyword.
1860
+ """
1861
+ try:
1862
+ self.run_keyword(name, *args)
1863
+ except ExecutionFailed as err:
1864
+ if err.dont_continue:
1865
+ raise
1866
+ error = err
1867
+ else:
1868
+ raise AssertionError("Expected error '%s' did not occur."
1869
+ % expected_error)
1870
+ if not self._matches(unic(error), expected_error):
1871
+ raise AssertionError("Expected error '%s' but got '%s'."
1872
+ % (expected_error, error))
1873
+ return unic(error)
1874
+
1875
+ @run_keyword_variant(resolve=2)
1876
+ def repeat_keyword(self, repeat, name, *args):
1877
+ """Executes the specified keyword multiple times.
1878
+
1879
+ ``name`` and ``args`` define the keyword that is executed similarly as
1880
+ with `Run Keyword`. ``repeat`` specifies how many times (as a count) or
1881
+ how long time (as a timeout) the keyword should be executed.
1882
+
1883
+ If ``repeat`` is given as count, it specifies how many times the
1884
+ keyword should be executed. ``repeat`` can be given as an integer or
1885
+ as a string that can be converted to an integer. If it is a string,
1886
+ it can have postfix ``times`` or ``x`` (case and space insensitive)
1887
+ to make the expression more explicit.
1888
+
1889
+ If ``repeat`` is given as timeout, it must be in Robot Framework's
1890
+ time format (e.g. ``1 minute``, ``2 min 3 s``). Using a number alone
1891
+ (e.g. ``1`` or ``1.5``) does not work in this context.
1892
+
1893
+ If ``repeat`` is zero or negative, the keyword is not executed at
1894
+ all. This keyword fails immediately if any of the execution
1895
+ rounds fails.
1896
+
1897
+ Examples:
1898
+ | Repeat Keyword | 5 times | Go to Previous Page |
1899
+ | Repeat Keyword | ${var} | Some Keyword | arg1 | arg2 |
1900
+ | Repeat Keyword | 2 minutes | Some Keyword | arg1 | arg2 |
1901
+
1902
+ Specifying ``repeat`` as a timeout is new in Robot Framework 3.0.
1903
+ """
1904
+ try:
1905
+ count = self._get_repeat_count(repeat)
1906
+ except RuntimeError as err:
1907
+ timeout = self._get_repeat_timeout(repeat)
1908
+ if timeout is None:
1909
+ raise err
1910
+ keywords = self._keywords_repeated_by_timeout(timeout, name, args)
1911
+ else:
1912
+ keywords = self._keywords_repeated_by_count(count, name, args)
1913
+ self._run_keywords(keywords)
1914
+
1915
+ def _get_repeat_count(self, times, require_postfix=False):
1916
+ times = normalize(str(times))
1917
+ if times.endswith('times'):
1918
+ times = times[:-5]
1919
+ elif times.endswith('x'):
1920
+ times = times[:-1]
1921
+ elif require_postfix:
1922
+ raise ValueError
1923
+ return self._convert_to_integer(times)
1924
+
1925
+ def _get_repeat_timeout(self, timestr):
1926
+ try:
1927
+ float(timestr)
1928
+ except ValueError:
1929
+ pass
1930
+ else:
1931
+ return None
1932
+ try:
1933
+ return timestr_to_secs(timestr)
1934
+ except ValueError:
1935
+ return None
1936
+
1937
+ def _keywords_repeated_by_count(self, count, name, args):
1938
+ if count <= 0:
1939
+ self.log("Keyword '%s' repeated zero times." % name)
1940
+ for i in range(count):
1941
+ self.log("Repeating keyword, round %d/%d." % (i + 1, count))
1942
+ yield name, args
1943
+
1944
+ def _keywords_repeated_by_timeout(self, timeout, name, args):
1945
+ if timeout <= 0:
1946
+ self.log("Keyword '%s' repeated zero times." % name)
1947
+ repeat_round = 0
1948
+ maxtime = time.time() + timeout
1949
+ while time.time() < maxtime:
1950
+ repeat_round += 1
1951
+ self.log("Repeating keyword, round %d, %s remaining."
1952
+ % (repeat_round,
1953
+ secs_to_timestr(maxtime - time.time(), compact=True)))
1954
+ yield name, args
1955
+
1956
+ @run_keyword_variant(resolve=3)
1957
+ def wait_until_keyword_succeeds(self, retry, retry_interval, name, *args):
1958
+ """Runs the specified keyword and retries if it fails.
1959
+
1960
+ ``name`` and ``args`` define the keyword that is executed similarly
1961
+ as with `Run Keyword`. How long to retry running the keyword is
1962
+ defined using ``retry`` argument either as timeout or count.
1963
+ ``retry_interval`` is the time to wait before trying to run the
1964
+ keyword again after the previous run has failed.
1965
+
1966
+ If ``retry`` is given as timeout, it must be in Robot Framework's
1967
+ time format (e.g. ``1 minute``, ``2 min 3 s``, ``4.5``) that is
1968
+ explained in an appendix of Robot Framework User Guide. If it is
1969
+ given as count, it must have ``times`` or ``x`` postfix (e.g.
1970
+ ``5 times``, ``10 x``). ``retry_interval`` must always be given in
1971
+ Robot Framework's time format.
1972
+
1973
+ If the keyword does not succeed regardless of retries, this keyword
1974
+ fails. If the executed keyword passes, its return value is returned.
1975
+
1976
+ Examples:
1977
+ | Wait Until Keyword Succeeds | 2 min | 5 sec | My keyword | argument |
1978
+ | ${result} = | Wait Until Keyword Succeeds | 3x | 200ms | My keyword |
1979
+
1980
+ All normal failures are caught by this keyword. Errors caused by
1981
+ invalid syntax, test or keyword timeouts, or fatal exceptions (caused
1982
+ e.g. by `Fatal Error`) are not caught.
1983
+
1984
+ Running the same keyword multiple times inside this keyword can create
1985
+ lots of output and considerably increase the size of the generated
1986
+ output files. Starting from Robot Framework 2.7, it is possible to
1987
+ remove unnecessary keywords from the outputs using
1988
+ ``--RemoveKeywords WUKS`` command line option.
1989
+
1990
+ Support for specifying ``retry`` as a number of times to retry is
1991
+ a new feature in Robot Framework 2.9.
1992
+ Since Robot Framework 2.9, variable errors are caught by this keyword.
1993
+ """
1994
+ maxtime = count = -1
1995
+ try:
1996
+ count = self._get_repeat_count(retry, require_postfix=True)
1997
+ except ValueError:
1998
+ timeout = timestr_to_secs(retry)
1999
+ maxtime = time.time() + timeout
2000
+ message = 'for %s' % secs_to_timestr(timeout)
2001
+ else:
2002
+ if count <= 0:
2003
+ raise ValueError('Retry count %d is not positive.' % count)
2004
+ message = '%d time%s' % (count, s(count))
2005
+ retry_interval = timestr_to_secs(retry_interval)
2006
+ while True:
2007
+ try:
2008
+ return self.run_keyword(name, *args)
2009
+ except ExecutionFailed as err:
2010
+ if err.dont_continue:
2011
+ raise
2012
+ count -= 1
2013
+ if time.time() > maxtime > 0 or count == 0:
2014
+ raise AssertionError("Keyword '%s' failed after retrying "
2015
+ "%s. The last error was: %s"
2016
+ % (name, message, err))
2017
+ self._sleep_in_parts(retry_interval)
2018
+
2019
+ @run_keyword_variant(resolve=1)
2020
+ def set_variable_if(self, condition, *values):
2021
+ """Sets variable based on the given condition.
2022
+
2023
+ The basic usage is giving a condition and two values. The
2024
+ given condition is first evaluated the same way as with the
2025
+ `Should Be True` keyword. If the condition is true, then the
2026
+ first value is returned, and otherwise the second value is
2027
+ returned. The second value can also be omitted, in which case
2028
+ it has a default value None. This usage is illustrated in the
2029
+ examples below, where ``${rc}`` is assumed to be zero.
2030
+
2031
+ | ${var1} = | Set Variable If | ${rc} == 0 | zero | nonzero |
2032
+ | ${var2} = | Set Variable If | ${rc} > 0 | value1 | value2 |
2033
+ | ${var3} = | Set Variable If | ${rc} > 0 | whatever | |
2034
+ =>
2035
+ | ${var1} = 'zero'
2036
+ | ${var2} = 'value2'
2037
+ | ${var3} = None
2038
+
2039
+ It is also possible to have 'else if' support by replacing the
2040
+ second value with another condition, and having two new values
2041
+ after it. If the first condition is not true, the second is
2042
+ evaluated and one of the values after it is returned based on
2043
+ its truth value. This can be continued by adding more
2044
+ conditions without a limit.
2045
+
2046
+ | ${var} = | Set Variable If | ${rc} == 0 | zero |
2047
+ | ... | ${rc} > 0 | greater than zero | less then zero |
2048
+ | |
2049
+ | ${var} = | Set Variable If |
2050
+ | ... | ${rc} == 0 | zero |
2051
+ | ... | ${rc} == 1 | one |
2052
+ | ... | ${rc} == 2 | two |
2053
+ | ... | ${rc} > 2 | greater than two |
2054
+ | ... | ${rc} < 0 | less than zero |
2055
+
2056
+ Use `Get Variable Value` if you need to set variables
2057
+ dynamically based on whether a variable exist or not.
2058
+ """
2059
+ values = self._verify_values_for_set_variable_if(list(values))
2060
+ if self._is_true(condition):
2061
+ return self._variables.replace_scalar(values[0])
2062
+ values = self._verify_values_for_set_variable_if(values[1:], True)
2063
+ if len(values) == 1:
2064
+ return self._variables.replace_scalar(values[0])
2065
+ return self.run_keyword('BuiltIn.Set Variable If', *values[0:])
2066
+
2067
+ def _verify_values_for_set_variable_if(self, values, default=False):
2068
+ if not values:
2069
+ if default:
2070
+ return [None]
2071
+ raise RuntimeError('At least one value is required')
2072
+ if is_list_var(values[0]):
2073
+ values[:1] = [escape(item) for item in self._variables[values[0]]]
2074
+ return self._verify_values_for_set_variable_if(values)
2075
+ return values
2076
+
2077
+ @run_keyword_variant(resolve=1)
2078
+ def run_keyword_if_test_failed(self, name, *args):
2079
+ """Runs the given keyword with the given arguments, if the test failed.
2080
+
2081
+ This keyword can only be used in a test teardown. Trying to use it
2082
+ anywhere else results in an error.
2083
+
2084
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2085
+ documentation for more details.
2086
+
2087
+ Prior to Robot Framework 2.9 failures in test teardown itself were
2088
+ not detected by this keyword.
2089
+ """
2090
+ test = self._get_test_in_teardown('Run Keyword If Test Failed')
2091
+ if not test.passed:
2092
+ return self.run_keyword(name, *args)
2093
+
2094
+ @run_keyword_variant(resolve=1)
2095
+ def run_keyword_if_test_passed(self, name, *args):
2096
+ """Runs the given keyword with the given arguments, if the test passed.
2097
+
2098
+ This keyword can only be used in a test teardown. Trying to use it
2099
+ anywhere else results in an error.
2100
+
2101
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2102
+ documentation for more details.
2103
+
2104
+ Prior to Robot Framework 2.9 failures in test teardown itself were
2105
+ not detected by this keyword.
2106
+ """
2107
+ test = self._get_test_in_teardown('Run Keyword If Test Passed')
2108
+ if test.passed:
2109
+ return self.run_keyword(name, *args)
2110
+
2111
+ @run_keyword_variant(resolve=1)
2112
+ def run_keyword_if_timeout_occurred(self, name, *args):
2113
+ """Runs the given keyword if either a test or a keyword timeout has occurred.
2114
+
2115
+ This keyword can only be used in a test teardown. Trying to use it
2116
+ anywhere else results in an error.
2117
+
2118
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2119
+ documentation for more details.
2120
+ """
2121
+ self._get_test_in_teardown('Run Keyword If Timeout Occurred')
2122
+ if self._context.timeout_occurred:
2123
+ return self.run_keyword(name, *args)
2124
+
2125
+ def _get_test_in_teardown(self, kwname):
2126
+ ctx = self._context
2127
+ if ctx.test and ctx.in_test_teardown:
2128
+ return ctx.test
2129
+ raise RuntimeError("Keyword '%s' can only be used in test teardown."
2130
+ % kwname)
2131
+
2132
+ @run_keyword_variant(resolve=1)
2133
+ def run_keyword_if_all_critical_tests_passed(self, name, *args):
2134
+ """Runs the given keyword with the given arguments, if all critical tests passed.
2135
+
2136
+ This keyword can only be used in suite teardown. Trying to use it in
2137
+ any other place will result in an error.
2138
+
2139
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2140
+ documentation for more details.
2141
+ """
2142
+ suite = self._get_suite_in_teardown('Run Keyword If '
2143
+ 'All Critical Tests Passed')
2144
+ if suite.statistics.critical.failed == 0:
2145
+ return self.run_keyword(name, *args)
2146
+
2147
+ @run_keyword_variant(resolve=1)
2148
+ def run_keyword_if_any_critical_tests_failed(self, name, *args):
2149
+ """Runs the given keyword with the given arguments, if any critical tests failed.
2150
+
2151
+ This keyword can only be used in a suite teardown. Trying to use it
2152
+ anywhere else results in an error.
2153
+
2154
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2155
+ documentation for more details.
2156
+ """
2157
+ suite = self._get_suite_in_teardown('Run Keyword If '
2158
+ 'Any Critical Tests Failed')
2159
+ if suite.statistics.critical.failed > 0:
2160
+ return self.run_keyword(name, *args)
2161
+
2162
+ @run_keyword_variant(resolve=1)
2163
+ def run_keyword_if_all_tests_passed(self, name, *args):
2164
+ """Runs the given keyword with the given arguments, if all tests passed.
2165
+
2166
+ This keyword can only be used in a suite teardown. Trying to use it
2167
+ anywhere else results in an error.
2168
+
2169
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2170
+ documentation for more details.
2171
+ """
2172
+ suite = self._get_suite_in_teardown('Run Keyword If All Tests Passed')
2173
+ if suite.statistics.all.failed == 0:
2174
+ return self.run_keyword(name, *args)
2175
+
2176
+ @run_keyword_variant(resolve=1)
2177
+ def run_keyword_if_any_tests_failed(self, name, *args):
2178
+ """Runs the given keyword with the given arguments, if one or more tests failed.
2179
+
2180
+ This keyword can only be used in a suite teardown. Trying to use it
2181
+ anywhere else results in an error.
2182
+
2183
+ Otherwise, this keyword works exactly like `Run Keyword`, see its
2184
+ documentation for more details.
2185
+ """
2186
+ suite = self._get_suite_in_teardown('Run Keyword If Any Tests Failed')
2187
+ if suite.statistics.all.failed > 0:
2188
+ return self.run_keyword(name, *args)
2189
+
2190
+ def _get_suite_in_teardown(self, kwname):
2191
+ if not self._context.in_suite_teardown:
2192
+ raise RuntimeError("Keyword '%s' can only be used in suite teardown."
2193
+ % kwname)
2194
+ return self._context.suite
2195
+
2196
+
2197
+ class _Control(_BuiltInBase):
2198
+
2199
+ def continue_for_loop(self):
2200
+ """Skips the current for loop iteration and continues from the next.
2201
+
2202
+ Skips the remaining keywords in the current for loop iteration and
2203
+ continues from the next one. Can be used directly in a for loop or
2204
+ in a keyword that the loop uses.
2205
+
2206
+ Example:
2207
+ | :FOR | ${var} | IN | @{VALUES} |
2208
+ | | Run Keyword If | '${var}' == 'CONTINUE' | Continue For Loop |
2209
+ | | Do Something | ${var} |
2210
+
2211
+ See `Continue For Loop If` to conditionally continue a for loop without
2212
+ using `Run Keyword If` or other wrapper keywords.
2213
+
2214
+ New in Robot Framework 2.8.
2215
+ """
2216
+ self.log("Continuing for loop from the next iteration.")
2217
+ raise ContinueForLoop()
2218
+
2219
+ def continue_for_loop_if(self, condition):
2220
+ """Skips the current for loop iteration if the ``condition`` is true.
2221
+
2222
+ A wrapper for `Continue For Loop` to continue a for loop based on
2223
+ the given condition. The condition is evaluated using the same
2224
+ semantics as with `Should Be True` keyword.
2225
+
2226
+ Example:
2227
+ | :FOR | ${var} | IN | @{VALUES} |
2228
+ | | Continue For Loop If | '${var}' == 'CONTINUE' |
2229
+ | | Do Something | ${var} |
2230
+
2231
+ New in Robot Framework 2.8.
2232
+ """
2233
+ if self._is_true(condition):
2234
+ self.continue_for_loop()
2235
+
2236
+ def exit_for_loop(self):
2237
+ """Stops executing the enclosing for loop.
2238
+
2239
+ Exits the enclosing for loop and continues execution after it.
2240
+ Can be used directly in a for loop or in a keyword that the loop uses.
2241
+
2242
+ Example:
2243
+ | :FOR | ${var} | IN | @{VALUES} |
2244
+ | | Run Keyword If | '${var}' == 'EXIT' | Exit For Loop |
2245
+ | | Do Something | ${var} |
2246
+
2247
+ See `Exit For Loop If` to conditionally exit a for loop without
2248
+ using `Run Keyword If` or other wrapper keywords.
2249
+ """
2250
+ self.log("Exiting for loop altogether.")
2251
+ raise ExitForLoop()
2252
+
2253
+ def exit_for_loop_if(self, condition):
2254
+ """Stops executing the enclosing for loop if the ``condition`` is true.
2255
+
2256
+ A wrapper for `Exit For Loop` to exit a for loop based on
2257
+ the given condition. The condition is evaluated using the same
2258
+ semantics as with `Should Be True` keyword.
2259
+
2260
+ Example:
2261
+ | :FOR | ${var} | IN | @{VALUES} |
2262
+ | | Exit For Loop If | '${var}' == 'EXIT' |
2263
+ | | Do Something | ${var} |
2264
+
2265
+ New in Robot Framework 2.8.
2266
+ """
2267
+ if self._is_true(condition):
2268
+ self.exit_for_loop()
2269
+
2270
+ @run_keyword_variant(resolve=0)
2271
+ def return_from_keyword(self, *return_values):
2272
+ """Returns from the enclosing user keyword.
2273
+
2274
+ This keyword can be used to return from a user keyword with PASS status
2275
+ without executing it fully. It is also possible to return values
2276
+ similarly as with the ``[Return]`` setting. For more detailed information
2277
+ about working with the return values, see the User Guide.
2278
+
2279
+ This keyword is typically wrapped to some other keyword, such as
2280
+ `Run Keyword If` or `Run Keyword If Test Passed`, to return based
2281
+ on a condition:
2282
+
2283
+ | Run Keyword If | ${rc} < 0 | Return From Keyword |
2284
+ | Run Keyword If Test Passed | Return From Keyword |
2285
+
2286
+ It is possible to use this keyword to return from a keyword also inside
2287
+ a for loop. That, as well as returning values, is demonstrated by the
2288
+ `Find Index` keyword in the following somewhat advanced example.
2289
+ Notice that it is often a good idea to move this kind of complicated
2290
+ logic into a test library.
2291
+
2292
+ | ***** Variables *****
2293
+ | @{LIST} = foo baz
2294
+ |
2295
+ | ***** Test Cases *****
2296
+ | Example
2297
+ | ${index} = Find Index baz @{LIST}
2298
+ | Should Be Equal ${index} ${1}
2299
+ | ${index} = Find Index non existing @{LIST}
2300
+ | Should Be Equal ${index} ${-1}
2301
+ |
2302
+ | ***** Keywords *****
2303
+ | Find Index
2304
+ | [Arguments] ${element} @{items}
2305
+ | ${index} = Set Variable ${0}
2306
+ | :FOR ${item} IN @{items}
2307
+ | \\ Run Keyword If '${item}' == '${element}' Return From Keyword ${index}
2308
+ | \\ ${index} = Set Variable ${index + 1}
2309
+ | Return From Keyword ${-1} # Also [Return] would work here.
2310
+
2311
+ The most common use case, returning based on an expression, can be
2312
+ accomplished directly with `Return From Keyword If`. Both of these
2313
+ keywords are new in Robot Framework 2.8.
2314
+
2315
+ See also `Run Keyword And Return` and `Run Keyword And Return If`.
2316
+ """
2317
+ self.log('Returning from the enclosing user keyword.')
2318
+ raise ReturnFromKeyword(return_values)
2319
+
2320
+ @run_keyword_variant(resolve=1)
2321
+ def return_from_keyword_if(self, condition, *return_values):
2322
+ """Returns from the enclosing user keyword if ``condition`` is true.
2323
+
2324
+ A wrapper for `Return From Keyword` to return based on the given
2325
+ condition. The condition is evaluated using the same semantics as
2326
+ with `Should Be True` keyword.
2327
+
2328
+ Given the same example as in `Return From Keyword`, we can rewrite the
2329
+ `Find Index` keyword as follows:
2330
+
2331
+ | ***** Keywords *****
2332
+ | Find Index
2333
+ | [Arguments] ${element} @{items}
2334
+ | ${index} = Set Variable ${0}
2335
+ | :FOR ${item} IN @{items}
2336
+ | \\ Return From Keyword If '${item}' == '${element}' ${index}
2337
+ | \\ ${index} = Set Variable ${index + 1}
2338
+ | Return From Keyword ${-1} # Also [Return] would work here.
2339
+
2340
+ See also `Run Keyword And Return` and `Run Keyword And Return If`.
2341
+
2342
+ New in Robot Framework 2.8.
2343
+ """
2344
+ if self._is_true(condition):
2345
+ self.return_from_keyword(*return_values)
2346
+
2347
+ @run_keyword_variant(resolve=1)
2348
+ def run_keyword_and_return(self, name, *args):
2349
+ """Runs the specified keyword and returns from the enclosing user keyword.
2350
+
2351
+ The keyword to execute is defined with ``name`` and ``*args`` exactly
2352
+ like with `Run Keyword`. After running the keyword, returns from the
2353
+ enclosing user keyword and passes possible return value from the
2354
+ executed keyword further. Returning from a keyword has exactly same
2355
+ semantics as with `Return From Keyword`.
2356
+
2357
+ Example:
2358
+ | `Run Keyword And Return` | `My Keyword` | arg1 | arg2 |
2359
+ | # Above is equivalent to: |
2360
+ | ${result} = | `My Keyword` | arg1 | arg2 |
2361
+ | `Return From Keyword` | ${result} | | |
2362
+
2363
+ Use `Run Keyword And Return If` if you want to run keyword and return
2364
+ based on a condition.
2365
+
2366
+ New in Robot Framework 2.8.2.
2367
+ """
2368
+ ret = self.run_keyword(name, *args)
2369
+ self.return_from_keyword(escape(ret))
2370
+
2371
+ @run_keyword_variant(resolve=2)
2372
+ def run_keyword_and_return_if(self, condition, name, *args):
2373
+ """Runs the specified keyword and returns from the enclosing user keyword.
2374
+
2375
+ A wrapper for `Run Keyword And Return` to run and return based on
2376
+ the given ``condition``. The condition is evaluated using the same
2377
+ semantics as with `Should Be True` keyword.
2378
+
2379
+ Example:
2380
+ | `Run Keyword And Return If` | ${rc} > 0 | `My Keyword` | arg1 | arg2 |
2381
+ | # Above is equivalent to: |
2382
+ | `Run Keyword If` | ${rc} > 0 | `Run Keyword And Return` | `My Keyword ` | arg1 | arg2 |
2383
+
2384
+ Use `Return From Keyword If` if you want to return a certain value
2385
+ based on a condition.
2386
+
2387
+ New in Robot Framework 2.8.2.
2388
+ """
2389
+ if self._is_true(condition):
2390
+ self.run_keyword_and_return(name, *args)
2391
+
2392
+ def pass_execution(self, message, *tags):
2393
+ """Skips rest of the current test, setup, or teardown with PASS status.
2394
+
2395
+ This keyword can be used anywhere in the test data, but the place where
2396
+ used affects the behavior:
2397
+
2398
+ - When used in any setup or teardown (suite, test or keyword), passes
2399
+ that setup or teardown. Possible keyword teardowns of the started
2400
+ keywords are executed. Does not affect execution or statuses
2401
+ otherwise.
2402
+ - When used in a test outside setup or teardown, passes that particular
2403
+ test case. Possible test and keyword teardowns are executed.
2404
+
2405
+ Possible continuable failures before this keyword is used, as well as
2406
+ failures in executed teardowns, will fail the execution.
2407
+
2408
+ It is mandatory to give a message explaining why execution was passed.
2409
+ By default the message is considered plain text, but starting it with
2410
+ ``*HTML*`` allows using HTML formatting.
2411
+
2412
+ It is also possible to modify test tags passing tags after the message
2413
+ similarly as with `Fail` keyword. Tags starting with a hyphen
2414
+ (e.g. ``-regression``) are removed and others added. Tags are modified
2415
+ using `Set Tags` and `Remove Tags` internally, and the semantics
2416
+ setting and removing them are the same as with these keywords.
2417
+
2418
+ Examples:
2419
+ | Pass Execution | All features available in this version tested. |
2420
+ | Pass Execution | Deprecated test. | deprecated | -regression |
2421
+
2422
+ This keyword is typically wrapped to some other keyword, such as
2423
+ `Run Keyword If`, to pass based on a condition. The most common case
2424
+ can be handled also with `Pass Execution If`:
2425
+
2426
+ | Run Keyword If | ${rc} < 0 | Pass Execution | Negative values are cool. |
2427
+ | Pass Execution If | ${rc} < 0 | Negative values are cool. |
2428
+
2429
+ Passing execution in the middle of a test, setup or teardown should be
2430
+ used with care. In the worst case it leads to tests that skip all the
2431
+ parts that could actually uncover problems in the tested application.
2432
+ In cases where execution cannot continue do to external factors,
2433
+ it is often safer to fail the test case and make it non-critical.
2434
+
2435
+ New in Robot Framework 2.8.
2436
+ """
2437
+ message = message.strip()
2438
+ if not message:
2439
+ raise RuntimeError('Message cannot be empty.')
2440
+ self._set_and_remove_tags(tags)
2441
+ log_message, level = self._get_logged_test_message_and_level(message)
2442
+ self.log('Execution passed with message:\n%s' % log_message, level)
2443
+ raise PassExecution(message)
2444
+
2445
+ @run_keyword_variant(resolve=1)
2446
+ def pass_execution_if(self, condition, message, *tags):
2447
+ """Conditionally skips rest of the current test, setup, or teardown with PASS status.
2448
+
2449
+ A wrapper for `Pass Execution` to skip rest of the current test,
2450
+ setup or teardown based the given ``condition``. The condition is
2451
+ evaluated similarly as with `Should Be True` keyword, and ``message``
2452
+ and ``*tags`` have same semantics as with `Pass Execution`.
2453
+
2454
+ Example:
2455
+ | :FOR | ${var} | IN | @{VALUES} |
2456
+ | | Pass Execution If | '${var}' == 'EXPECTED' | Correct value was found |
2457
+ | | Do Something | ${var} |
2458
+
2459
+ New in Robot Framework 2.8.
2460
+ """
2461
+ if self._is_true(condition):
2462
+ message = self._variables.replace_string(message)
2463
+ tags = self._variables.replace_list(tags)
2464
+ self.pass_execution(message, *tags)
2465
+
2466
+
2467
+ class _Misc(_BuiltInBase):
2468
+
2469
+ def no_operation(self):
2470
+ """Does absolutely nothing."""
2471
+
2472
+ def sleep(self, time_, reason=None):
2473
+ """Pauses the test executed for the given time.
2474
+
2475
+ ``time`` may be either a number or a time string. Time strings are in
2476
+ a format such as ``1 day 2 hours 3 minutes 4 seconds 5milliseconds`` or
2477
+ ``1d 2h 3m 4s 5ms``, and they are fully explained in an appendix of
2478
+ Robot Framework User Guide. Optional `reason` can be used to explain why
2479
+ sleeping is necessary. Both the time slept and the reason are logged.
2480
+
2481
+ Examples:
2482
+ | Sleep | 42 |
2483
+ | Sleep | 1.5 |
2484
+ | Sleep | 2 minutes 10 seconds |
2485
+ | Sleep | 10s | Wait for a reply |
2486
+ """
2487
+ seconds = timestr_to_secs(time_)
2488
+ # Python hangs with negative values
2489
+ if seconds < 0:
2490
+ seconds = 0
2491
+ self._sleep_in_parts(seconds)
2492
+ self.log('Slept %s' % secs_to_timestr(seconds))
2493
+ if reason:
2494
+ self.log(reason)
2495
+
2496
+ def _sleep_in_parts(self, seconds):
2497
+ # time.sleep can't be stopped in windows
2498
+ # to ensure that we can signal stop (with timeout)
2499
+ # split sleeping to small pieces
2500
+ endtime = time.time() + float(seconds)
2501
+ while True:
2502
+ remaining = endtime - time.time()
2503
+ if remaining <= 0:
2504
+ break
2505
+ time.sleep(min(remaining, 0.01))
2506
+
2507
+ def catenate(self, *items):
2508
+ """Catenates the given items together and returns the resulted string.
2509
+
2510
+ By default, items are catenated with spaces, but if the first item
2511
+ contains the string ``SEPARATOR=<sep>``, the separator ``<sep>`` is
2512
+ used instead. Items are converted into strings when necessary.
2513
+
2514
+ Examples:
2515
+ | ${str1} = | Catenate | Hello | world | |
2516
+ | ${str2} = | Catenate | SEPARATOR=--- | Hello | world |
2517
+ | ${str3} = | Catenate | SEPARATOR= | Hello | world |
2518
+ =>
2519
+ | ${str1} = 'Hello world'
2520
+ | ${str2} = 'Hello---world'
2521
+ | ${str3} = 'Helloworld'
2522
+ """
2523
+ if not items:
2524
+ return ''
2525
+ items = [unic(item) for item in items]
2526
+ if items[0].startswith('SEPARATOR='):
2527
+ sep = items[0][len('SEPARATOR='):]
2528
+ items = items[1:]
2529
+ else:
2530
+ sep = ' '
2531
+ return sep.join(items)
2532
+
2533
+ def log(self, message, level='INFO', html=False, console=False, repr=False):
2534
+ u"""Logs the given message with the given level.
2535
+
2536
+ Valid levels are TRACE, DEBUG, INFO (default), HTML, WARN, and ERROR.
2537
+ Messages below the current active log level are ignored. See
2538
+ `Set Log Level` keyword and ``--loglevel`` command line option
2539
+ for more details about setting the level.
2540
+
2541
+ Messages logged with the WARN or ERROR levels will be automatically
2542
+ visible also in the console and in the Test Execution Errors section
2543
+ in the log file.
2544
+
2545
+ Logging can be configured using optional ``html``, ``console`` and
2546
+ ``repr`` arguments. They are off by default, but can be enabled
2547
+ by giving them a true value. See `Boolean arguments` section for more
2548
+ information about true and false values.
2549
+
2550
+ If the ``html`` argument is given a true value, the message will be
2551
+ considered HTML and special characters such as ``<`` in it are not
2552
+ escaped. For example, logging ``<img src="image.png">`` creates an
2553
+ image when ``html`` is true, but otherwise the message is that exact
2554
+ string. An alternative to using the ``html`` argument is using the HTML
2555
+ pseudo log level. It logs the message as HTML using the INFO level.
2556
+
2557
+ If the ``console`` argument is true, the message will be written to
2558
+ the console where test execution was started from in addition to
2559
+ the log file. This keyword always uses the standard output stream
2560
+ and adds a newline after the written message. Use `Log To Console`
2561
+ instead if either of these is undesirable,
2562
+
2563
+ If the ``repr`` argument is true, the given item will be passed through
2564
+ a custom version of Python's ``pprint.pformat()`` function before
2565
+ logging it. This is useful, for example, when working with strings or
2566
+ bytes containing invisible characters, or when working with nested data
2567
+ structures. The custom version differs from the standard one so that it
2568
+ omits the ``u`` prefix from Unicode strings and adds ``b`` prefix to
2569
+ byte strings.
2570
+
2571
+ Examples:
2572
+ | Log | Hello, world! | | | # Normal INFO message. |
2573
+ | Log | Warning, world! | WARN | | # Warning. |
2574
+ | Log | <b>Hello</b>, world! | html=yes | | # INFO message as HTML. |
2575
+ | Log | <b>Hello</b>, world! | HTML | | # Same as above. |
2576
+ | Log | <b>Hello</b>, world! | DEBUG | html=true | # DEBUG as HTML. |
2577
+ | Log | Hello, console! | console=yes | | # Log also to the console. |
2578
+ | Log | Hyv\xe4 \\x00 | repr=yes | | # Log ``'Hyv\\xe4 \\x00'``. |
2579
+
2580
+ See `Log Many` if you want to log multiple messages in one go, and
2581
+ `Log To Console` if you only want to write to the console.
2582
+
2583
+ Arguments ``html``, ``console``, and ``repr`` are new in Robot Framework
2584
+ 2.8.2.
2585
+
2586
+ Pprint support when ``repr`` is used is new in Robot Framework 2.8.6,
2587
+ and it was changed to drop the ``u`` prefix and add the ``b`` prefix
2588
+ in Robot Framework 2.9.
2589
+ """
2590
+ if is_truthy(repr):
2591
+ message = prepr(message, width=80)
2592
+ logger.write(message, level, is_truthy(html))
2593
+ if is_truthy(console):
2594
+ logger.console(message)
2595
+
2596
+ @run_keyword_variant(resolve=0)
2597
+ def log_many(self, *messages):
2598
+ """Logs the given messages as separate entries using the INFO level.
2599
+
2600
+ Supports also logging list and dictionary variable items individually.
2601
+
2602
+ Examples:
2603
+ | Log Many | Hello | ${var} |
2604
+ | Log Many | @{list} | &{dict} |
2605
+
2606
+ See `Log` and `Log To Console` keywords if you want to use alternative
2607
+ log levels, use HTML, or log to the console.
2608
+ """
2609
+ for msg in self._yield_logged_messages(messages):
2610
+ self.log(msg)
2611
+
2612
+ def _yield_logged_messages(self, messages):
2613
+ for msg in messages:
2614
+ var = VariableSplitter(msg)
2615
+ value = self._variables.replace_scalar(msg)
2616
+ if var.is_list_variable():
2617
+ for item in value:
2618
+ yield item
2619
+ elif var.is_dict_variable():
2620
+ for name, value in value.items():
2621
+ yield '%s=%s' % (name, value)
2622
+ else:
2623
+ yield value
2624
+
2625
+ def log_to_console(self, message, stream='STDOUT', no_newline=False):
2626
+ """Logs the given message to the console.
2627
+
2628
+ By default uses the standard output stream. Using the standard error
2629
+ stream is possibly by giving the ``stream`` argument value ``STDERR``
2630
+ (case-insensitive).
2631
+
2632
+ By default appends a newline to the logged message. This can be
2633
+ disabled by giving the ``no_newline`` argument a true value (see
2634
+ `Boolean arguments`).
2635
+
2636
+ Examples:
2637
+ | Log To Console | Hello, console! | |
2638
+ | Log To Console | Hello, stderr! | STDERR |
2639
+ | Log To Console | Message starts here and is | no_newline=true |
2640
+ | Log To Console | continued without newline. | |
2641
+
2642
+ This keyword does not log the message to the normal log file. Use
2643
+ `Log` keyword, possibly with argument ``console``, if that is desired.
2644
+
2645
+ New in Robot Framework 2.8.2.
2646
+ """
2647
+ logger.console(message, newline=is_falsy(no_newline), stream=stream)
2648
+
2649
+ @run_keyword_variant(resolve=0)
2650
+ def comment(self, *messages):
2651
+ """Displays the given messages in the log file as keyword arguments.
2652
+
2653
+ This keyword does nothing with the arguments it receives, but as they
2654
+ are visible in the log, this keyword can be used to display simple
2655
+ messages. Given arguments are ignored so thoroughly that they can even
2656
+ contain non-existing variables. If you are interested about variable
2657
+ values, you can use the `Log` or `Log Many` keywords.
2658
+ """
2659
+ pass
2660
+
2661
+ def set_log_level(self, level):
2662
+ """Sets the log threshold to the specified level and returns the old level.
2663
+
2664
+ Messages below the level will not logged. The default logging level is
2665
+ INFO, but it can be overridden with the command line option
2666
+ ``--loglevel``.
2667
+
2668
+ The available levels: TRACE, DEBUG, INFO (default), WARN, ERROR and NONE (no
2669
+ logging).
2670
+ """
2671
+ try:
2672
+ old = self._context.output.set_log_level(level)
2673
+ except DataError as err:
2674
+ raise RuntimeError(unic(err))
2675
+ self._namespace.variables.set_global('${LOG_LEVEL}', level.upper())
2676
+ self.log('Log level changed from %s to %s.' % (old, level.upper()))
2677
+ return old
2678
+
2679
+ def reload_library(self, name_or_instance):
2680
+ """Rechecks what keywords the specified library provides.
2681
+
2682
+ Can be called explicitly in the test data or by a library itself
2683
+ when keywords it provides have changed.
2684
+
2685
+ The library can be specified by its name or as the active instance of
2686
+ the library. The latter is especially useful if the library itself
2687
+ calls this keyword as a method.
2688
+
2689
+ New in Robot Framework 2.9.
2690
+ """
2691
+ library = self._namespace.reload_library(name_or_instance)
2692
+ self.log('Reloaded library %s with %s keywords.' % (library.name,
2693
+ len(library)))
2694
+
2695
+ @run_keyword_variant(resolve=0)
2696
+ def import_library(self, name, *args):
2697
+ """Imports a library with the given name and optional arguments.
2698
+
2699
+ This functionality allows dynamic importing of libraries while tests
2700
+ are running. That may be necessary, if the library itself is dynamic
2701
+ and not yet available when test data is processed. In a normal case,
2702
+ libraries should be imported using the Library setting in the Setting
2703
+ table.
2704
+
2705
+ This keyword supports importing libraries both using library
2706
+ names and physical paths. When paths are used, they must be
2707
+ given in absolute format or found from
2708
+ [http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#pythonpath-jythonpath-and-ironpythonpath|
2709
+ search path]. Forward slashes can be used as path separators in all
2710
+ operating systems.
2711
+
2712
+ It is possible to pass arguments to the imported library and also
2713
+ named argument syntax works if the library supports it. ``WITH NAME``
2714
+ syntax can be used to give a custom name to the imported library.
2715
+
2716
+ Examples:
2717
+ | Import Library | MyLibrary |
2718
+ | Import Library | ${CURDIR}/../Library.py | arg1 | named=arg2 |
2719
+ | Import Library | ${LIBRARIES}/Lib.java | arg | WITH NAME | JavaLib |
2720
+ """
2721
+ try:
2722
+ self._namespace.import_library(name, list(args))
2723
+ except DataError as err:
2724
+ raise RuntimeError(unic(err))
2725
+
2726
+ @run_keyword_variant(resolve=0)
2727
+ def import_variables(self, path, *args):
2728
+ """Imports a variable file with the given path and optional arguments.
2729
+
2730
+ Variables imported with this keyword are set into the test suite scope
2731
+ similarly when importing them in the Setting table using the Variables
2732
+ setting. These variables override possible existing variables with
2733
+ the same names. This functionality can thus be used to import new
2734
+ variables, for example, for each test in a test suite.
2735
+
2736
+ The given path must be absolute or found from
2737
+ [http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#pythonpath-jythonpath-and-ironpythonpath|
2738
+ search path]. Forward slashes can be used as path separator regardless
2739
+ the operating system.
2740
+
2741
+ Examples:
2742
+ | Import Variables | ${CURDIR}/variables.py | | |
2743
+ | Import Variables | ${CURDIR}/../vars/env.py | arg1 | arg2 |
2744
+ | Import Variables | file_from_pythonpath.py | | |
2745
+ """
2746
+ try:
2747
+ self._namespace.import_variables(path, list(args), overwrite=True)
2748
+ except DataError as err:
2749
+ raise RuntimeError(unic(err))
2750
+
2751
+ @run_keyword_variant(resolve=0)
2752
+ def import_resource(self, path):
2753
+ """Imports a resource file with the given path.
2754
+
2755
+ Resources imported with this keyword are set into the test suite scope
2756
+ similarly when importing them in the Setting table using the Resource
2757
+ setting.
2758
+
2759
+ The given path must be absolute or found from
2760
+ [http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#pythonpath-jythonpath-and-ironpythonpath|
2761
+ search path]. Forward slashes can be used as path separator regardless
2762
+ the operating system.
2763
+
2764
+ Examples:
2765
+ | Import Resource | ${CURDIR}/resource.txt |
2766
+ | Import Resource | ${CURDIR}/../resources/resource.html |
2767
+ | Import Resource | found_from_pythonpath.robot |
2768
+ """
2769
+ try:
2770
+ self._namespace.import_resource(path)
2771
+ except DataError as err:
2772
+ raise RuntimeError(unic(err))
2773
+
2774
+ def set_library_search_order(self, *search_order):
2775
+ """Sets the resolution order to use when a name matches multiple keywords.
2776
+
2777
+ The library search order is used to resolve conflicts when a keyword
2778
+ name in the test data matches multiple keywords. The first library
2779
+ (or resource, see below) containing the keyword is selected and that
2780
+ keyword implementation used. If the keyword is not found from any library
2781
+ (or resource), test executing fails the same way as when the search
2782
+ order is not set.
2783
+
2784
+ When this keyword is used, there is no need to use the long
2785
+ ``LibraryName.Keyword Name`` notation. For example, instead of
2786
+ having
2787
+
2788
+ | MyLibrary.Keyword | arg |
2789
+ | MyLibrary.Another Keyword |
2790
+ | MyLibrary.Keyword | xxx |
2791
+
2792
+ you can have
2793
+
2794
+ | Set Library Search Order | MyLibrary |
2795
+ | Keyword | arg |
2796
+ | Another Keyword |
2797
+ | Keyword | xxx |
2798
+
2799
+ This keyword can be used also to set the order of keywords in different
2800
+ resource files. In this case resource names must be given without paths
2801
+ or extensions like:
2802
+
2803
+ | Set Library Search Order | resource | another_resource |
2804
+
2805
+ *NOTE:*
2806
+ - The search order is valid only in the suite where this keywords is used.
2807
+ - Keywords in resources always have higher priority than
2808
+ keywords in libraries regardless the search order.
2809
+ - The old order is returned and can be used to reset the search order later.
2810
+ - Library and resource names in the search order are both case and space
2811
+ insensitive.
2812
+ """
2813
+ return self._namespace.set_search_order(search_order)
2814
+
2815
+ def keyword_should_exist(self, name, msg=None):
2816
+ """Fails unless the given keyword exists in the current scope.
2817
+
2818
+ Fails also if there are more than one keywords with the same name.
2819
+ Works both with the short name (e.g. ``Log``) and the full name
2820
+ (e.g. ``BuiltIn.Log``).
2821
+
2822
+ The default error message can be overridden with the ``msg`` argument.
2823
+
2824
+ See also `Variable Should Exist`.
2825
+ """
2826
+ try:
2827
+ runner = self._namespace.get_runner(name)
2828
+ except DataError as err:
2829
+ raise AssertionError(msg or unic(err))
2830
+ if isinstance(runner, UserErrorHandler):
2831
+ raise AssertionError(msg or runner.error)
2832
+
2833
+ def get_time(self, format='timestamp', time_='NOW'):
2834
+ """Returns the given time in the requested format.
2835
+
2836
+ *NOTE:* DateTime library added in Robot Framework 2.8.5 contains
2837
+ much more flexible keywords for getting the current date and time
2838
+ and for date and time handling in general.
2839
+
2840
+ How time is returned is determined based on the given ``format``
2841
+ string as follows. Note that all checks are case-insensitive.
2842
+
2843
+ 1) If ``format`` contains the word ``epoch``, the time is returned
2844
+ in seconds after the UNIX epoch (1970-01-01 00:00:00 UTC).
2845
+ The return value is always an integer.
2846
+
2847
+ 2) If ``format`` contains any of the words ``year``, ``month``,
2848
+ ``day``, ``hour``, ``min``, or ``sec``, only the selected parts are
2849
+ returned. The order of the returned parts is always the one
2850
+ in the previous sentence and the order of words in ``format``
2851
+ is not significant. The parts are returned as zero-padded
2852
+ strings (e.g. May -> ``05``).
2853
+
2854
+ 3) Otherwise (and by default) the time is returned as a
2855
+ timestamp string in the format ``2006-02-24 15:08:31``.
2856
+
2857
+ By default this keyword returns the current local time, but
2858
+ that can be altered using ``time`` argument as explained below.
2859
+ Note that all checks involving strings are case-insensitive.
2860
+
2861
+ 1) If ``time`` is a number, or a string that can be converted to
2862
+ a number, it is interpreted as seconds since the UNIX epoch.
2863
+ This documentation was originally written about 1177654467
2864
+ seconds after the epoch.
2865
+
2866
+ 2) If ``time`` is a timestamp, that time will be used. Valid
2867
+ timestamp formats are ``YYYY-MM-DD hh:mm:ss`` and
2868
+ ``YYYYMMDD hhmmss``.
2869
+
2870
+ 3) If ``time`` is equal to ``NOW`` (default), the current local
2871
+ time is used. This time is got using Python's ``time.time()``
2872
+ function.
2873
+
2874
+ 4) If ``time`` is equal to ``UTC``, the current time in
2875
+ [http://en.wikipedia.org/wiki/Coordinated_Universal_Time|UTC]
2876
+ is used. This time is got using ``time.time() + time.altzone``
2877
+ in Python.
2878
+
2879
+ 5) If ``time`` is in the format like ``NOW - 1 day`` or ``UTC + 1 hour
2880
+ 30 min``, the current local/UTC time plus/minus the time
2881
+ specified with the time string is used. The time string format
2882
+ is described in an appendix of Robot Framework User Guide.
2883
+
2884
+ Examples (expecting the current local time is 2006-03-29 15:06:21):
2885
+ | ${time} = | Get Time | | | |
2886
+ | ${secs} = | Get Time | epoch | | |
2887
+ | ${year} = | Get Time | return year | | |
2888
+ | ${yyyy} | ${mm} | ${dd} = | Get Time | year,month,day |
2889
+ | @{time} = | Get Time | year month day hour min sec | | |
2890
+ | ${y} | ${s} = | Get Time | seconds and year | |
2891
+ =>
2892
+ | ${time} = '2006-03-29 15:06:21'
2893
+ | ${secs} = 1143637581
2894
+ | ${year} = '2006'
2895
+ | ${yyyy} = '2006', ${mm} = '03', ${dd} = '29'
2896
+ | @{time} = ['2006', '03', '29', '15', '06', '21']
2897
+ | ${y} = '2006'
2898
+ | ${s} = '21'
2899
+
2900
+ Examples (expecting the current local time is 2006-03-29 15:06:21 and
2901
+ UTC time is 2006-03-29 12:06:21):
2902
+ | ${time} = | Get Time | | 1177654467 | # Time given as epoch seconds |
2903
+ | ${secs} = | Get Time | sec | 2007-04-27 09:14:27 | # Time given as a timestamp |
2904
+ | ${year} = | Get Time | year | NOW | # The local time of execution |
2905
+ | @{time} = | Get Time | hour min sec | NOW + 1h 2min 3s | # 1h 2min 3s added to the local time |
2906
+ | @{utc} = | Get Time | hour min sec | UTC | # The UTC time of execution |
2907
+ | ${hour} = | Get Time | hour | UTC - 1 hour | # 1h subtracted from the UTC time |
2908
+ =>
2909
+ | ${time} = '2007-04-27 09:14:27'
2910
+ | ${secs} = 27
2911
+ | ${year} = '2006'
2912
+ | @{time} = ['16', '08', '24']
2913
+ | @{utc} = ['12', '06', '21']
2914
+ | ${hour} = '11'
2915
+
2916
+ Support for UTC time was added in Robot Framework 2.7.5 but it did not
2917
+ work correctly until 2.7.7.
2918
+ """
2919
+ return get_time(format, parse_time(time_))
2920
+
2921
+ def evaluate(self, expression, modules=None, namespace=None):
2922
+ """Evaluates the given expression in Python and returns the results.
2923
+
2924
+ ``expression`` is evaluated in Python as explained in `Evaluating
2925
+ expressions`.
2926
+
2927
+ ``modules`` argument can be used to specify a comma separated
2928
+ list of Python modules to be imported and added to the evaluation
2929
+ namespace.
2930
+
2931
+ ``namespace`` argument can be used to pass a custom evaluation
2932
+ namespace as a dictionary. Possible ``modules`` are added to this
2933
+ namespace. This is a new feature in Robot Framework 2.8.4.
2934
+
2935
+ Variables used like ``${variable}`` are replaced in the expression
2936
+ before evaluation. Variables are also available in the evaluation
2937
+ namespace and can be accessed using special syntax ``$variable``.
2938
+ This is a new feature in Robot Framework 2.9 and it is explained more
2939
+ thoroughly in `Evaluating expressions`.
2940
+
2941
+ Examples (expecting ``${result}`` is 3.14):
2942
+ | ${status} = | Evaluate | 0 < ${result} < 10 | # Would also work with string '3.14' |
2943
+ | ${status} = | Evaluate | 0 < $result < 10 | # Using variable itself, not string representation |
2944
+ | ${random} = | Evaluate | random.randint(0, sys.maxint) | modules=random, sys |
2945
+ | ${ns} = | Create Dictionary | x=${4} | y=${2} |
2946
+ | ${result} = | Evaluate | x*10 + y | namespace=${ns} |
2947
+ =>
2948
+ | ${status} = True
2949
+ | ${random} = <random integer>
2950
+ | ${result} = 42
2951
+ """
2952
+ if is_string(expression) and '$' in expression:
2953
+ expression, variables = self._handle_variables_in_expression(expression)
2954
+ else:
2955
+ variables = {}
2956
+ namespace = self._create_evaluation_namespace(namespace, modules)
2957
+ try:
2958
+ if not is_string(expression):
2959
+ raise TypeError("Expression must be string, got %s."
2960
+ % type_name(expression))
2961
+ if not expression:
2962
+ raise ValueError("Expression cannot be empty.")
2963
+ return eval(expression, namespace, variables)
2964
+ except:
2965
+ raise RuntimeError("Evaluating expression '%s' failed: %s"
2966
+ % (expression, get_error_message()))
2967
+
2968
+ def _handle_variables_in_expression(self, expression):
2969
+ variables = None
2970
+ variable_started = False
2971
+ tokens = []
2972
+ generated = generate_tokens(StringIO(expression).readline)
2973
+ for toknum, tokval, _, _, _ in generated:
2974
+ if variable_started:
2975
+ if toknum == token.NAME:
2976
+ if variables is None:
2977
+ variables = self._variables.as_dict(decoration=False)
2978
+ if tokval not in variables:
2979
+ variable_not_found('$%s' % tokval, variables,
2980
+ deco_braces=False)
2981
+ tokval = 'RF_VAR_' + tokval
2982
+ else:
2983
+ tokens.append((token.ERRORTOKEN, '$'))
2984
+ variable_started = False
2985
+ if toknum == token.ERRORTOKEN and tokval == '$':
2986
+ variable_started = True
2987
+ else:
2988
+ tokens.append((toknum, tokval))
2989
+ if variables is None:
2990
+ return expression, {}
2991
+ decorated = [('RF_VAR_' + name, variables[name]) for name in variables]
2992
+ return untokenize(tokens).strip(), NormalizedDict(decorated, ignore='_')
2993
+
2994
+ def _create_evaluation_namespace(self, namespace, modules):
2995
+ namespace = dict(namespace or {})
2996
+ modules = modules.replace(' ', '').split(',') if modules else []
2997
+ namespace.update((m, __import__(m)) for m in modules if m)
2998
+ return namespace
2999
+
3000
+ def call_method(self, object, method_name, *args, **kwargs):
3001
+ """Calls the named method of the given object with the provided arguments.
3002
+
3003
+ The possible return value from the method is returned and can be
3004
+ assigned to a variable. Keyword fails both if the object does not have
3005
+ a method with the given name or if executing the method raises an
3006
+ exception.
3007
+
3008
+ Support for ``**kwargs`` is new in Robot Framework 2.9. Since that
3009
+ possible equal signs in other arguments must be escaped with a
3010
+ backslash like ``\\=``.
3011
+
3012
+ Examples:
3013
+ | Call Method | ${hashtable} | put | myname | myvalue |
3014
+ | ${isempty} = | Call Method | ${hashtable} | isEmpty | |
3015
+ | Should Not Be True | ${isempty} | | | |
3016
+ | ${value} = | Call Method | ${hashtable} | get | myname |
3017
+ | Should Be Equal | ${value} | myvalue | | |
3018
+ | Call Method | ${object} | kwargs | name=value | foo=bar |
3019
+ | Call Method | ${object} | positional | escaped\\=equals |
3020
+ """
3021
+ try:
3022
+ method = getattr(object, method_name)
3023
+ except AttributeError:
3024
+ raise RuntimeError("Object '%s' does not have method '%s'."
3025
+ % (object, method_name))
3026
+ try:
3027
+ return method(*args, **kwargs)
3028
+ except:
3029
+ raise RuntimeError("Calling method '%s' failed: %s"
3030
+ % (method_name, get_error_message()))
3031
+
3032
+ def regexp_escape(self, *patterns):
3033
+ """Returns each argument string escaped for use as a regular expression.
3034
+
3035
+ This keyword can be used to escape strings to be used with
3036
+ `Should Match Regexp` and `Should Not Match Regexp` keywords.
3037
+
3038
+ Escaping is done with Python's ``re.escape()`` function.
3039
+
3040
+ Examples:
3041
+ | ${escaped} = | Regexp Escape | ${original} |
3042
+ | @{strings} = | Regexp Escape | @{strings} |
3043
+ """
3044
+ if len(patterns) == 0:
3045
+ return ''
3046
+ if len(patterns) == 1:
3047
+ return re.escape(patterns[0])
3048
+ return [re.escape(p) for p in patterns]
3049
+
3050
+ def set_test_message(self, message, append=False):
3051
+ """Sets message for the current test case.
3052
+
3053
+ If the optional ``append`` argument is given a true value (see `Boolean
3054
+ arguments`), the given ``message`` is added after the possible earlier
3055
+ message by joining the messages with a space.
3056
+
3057
+ In test teardown this keyword can alter the possible failure message,
3058
+ but otherwise failures override messages set by this keyword. Notice
3059
+ that in teardown the message is available as a built-in variable
3060
+ ``${TEST MESSAGE}``.
3061
+
3062
+ It is possible to use HTML format in the message by starting the message
3063
+ with ``*HTML*``.
3064
+
3065
+ Examples:
3066
+ | Set Test Message | My message | |
3067
+ | Set Test Message | is continued. | append=yes |
3068
+ | Should Be Equal | ${TEST MESSAGE} | My message is continued. |
3069
+ | Set Test Message | `*`HTML`*` <b>Hello!</b> | |
3070
+
3071
+ This keyword can not be used in suite setup or suite teardown.
3072
+
3073
+ Support for ``append`` was added in Robot Framework 2.7.7 and support
3074
+ for HTML format in 2.8.
3075
+ """
3076
+ test = self._context.test
3077
+ if not test:
3078
+ raise RuntimeError("'Set Test Message' keyword cannot be used in "
3079
+ "suite setup or teardown.")
3080
+ test.message = self._get_possibly_appended_value(test.message, message,
3081
+ append)
3082
+ if self._context.in_test_teardown:
3083
+ self._variables.set_test("${TEST_MESSAGE}", test.message)
3084
+ message, level = self._get_logged_test_message_and_level(test.message)
3085
+ self.log('Set test message to:\n%s' % message, level)
3086
+
3087
+ def _get_possibly_appended_value(self, initial, new, append):
3088
+ if not is_unicode(new):
3089
+ new = unic(new)
3090
+ if is_truthy(append) and initial:
3091
+ return '%s %s' % (initial, new)
3092
+ return new
3093
+
3094
+ def _get_logged_test_message_and_level(self, message):
3095
+ if message.startswith('*HTML*'):
3096
+ return message[6:].lstrip(), 'HTML'
3097
+ return message, 'INFO'
3098
+
3099
+ def set_test_documentation(self, doc, append=False):
3100
+ """Sets documentation for the current test case.
3101
+
3102
+ By default the possible existing documentation is overwritten, but
3103
+ this can be changed using the optional ``append`` argument similarly
3104
+ as with `Set Test Message` keyword.
3105
+
3106
+ The current test documentation is available as a built-in variable
3107
+ ``${TEST DOCUMENTATION}``. This keyword can not be used in suite
3108
+ setup or suite teardown.
3109
+
3110
+ New in Robot Framework 2.7. Support for ``append`` was added in 2.7.7.
3111
+ """
3112
+ test = self._context.test
3113
+ if not test:
3114
+ raise RuntimeError("'Set Test Documentation' keyword cannot be "
3115
+ "used in suite setup or teardown.")
3116
+ test.doc = self._get_possibly_appended_value(test.doc, doc, append)
3117
+ self._variables.set_test('${TEST_DOCUMENTATION}', test.doc)
3118
+ self.log('Set test documentation to:\n%s' % test.doc)
3119
+
3120
+ def set_suite_documentation(self, doc, append=False, top=False):
3121
+ """Sets documentation for the current test suite.
3122
+
3123
+ By default the possible existing documentation is overwritten, but
3124
+ this can be changed using the optional ``append`` argument similarly
3125
+ as with `Set Test Message` keyword.
3126
+
3127
+ This keyword sets the documentation of the current suite by default.
3128
+ If the optional ``top`` argument is given a true value (see `Boolean
3129
+ arguments`), the documentation of the top level suite is altered
3130
+ instead.
3131
+
3132
+ The documentation of the current suite is available as a built-in
3133
+ variable ``${SUITE DOCUMENTATION}``.
3134
+
3135
+ New in Robot Framework 2.7. Support for ``append`` and ``top`` were
3136
+ added in 2.7.7.
3137
+ """
3138
+ top = is_truthy(top)
3139
+ suite = self._get_context(top).suite
3140
+ suite.doc = self._get_possibly_appended_value(suite.doc, doc, append)
3141
+ self._variables.set_suite('${SUITE_DOCUMENTATION}', suite.doc, top)
3142
+ self.log('Set suite documentation to:\n%s' % suite.doc)
3143
+
3144
+ def set_suite_metadata(self, name, value, append=False, top=False):
3145
+ """Sets metadata for the current test suite.
3146
+
3147
+ By default possible existing metadata values are overwritten, but
3148
+ this can be changed using the optional ``append`` argument similarly
3149
+ as with `Set Test Message` keyword.
3150
+
3151
+ This keyword sets the metadata of the current suite by default.
3152
+ If the optional ``top`` argument is given a true value (see `Boolean
3153
+ arguments`), the metadata of the top level suite is altered instead.
3154
+
3155
+ The metadata of the current suite is available as a built-in variable
3156
+ ``${SUITE METADATA}`` in a Python dictionary. Notice that modifying this
3157
+ variable directly has no effect on the actual metadata the suite has.
3158
+
3159
+ New in Robot Framework 2.7.4. Support for ``append`` and ``top`` were
3160
+ added in 2.7.7.
3161
+ """
3162
+ top = is_truthy(top)
3163
+ if not is_unicode(name):
3164
+ name = unic(name)
3165
+ metadata = self._get_context(top).suite.metadata
3166
+ original = metadata.get(name, '')
3167
+ metadata[name] = self._get_possibly_appended_value(original, value, append)
3168
+ self._variables.set_suite('${SUITE_METADATA}', metadata.copy(), top)
3169
+ self.log("Set suite metadata '%s' to value '%s'." % (name, metadata[name]))
3170
+
3171
+ def set_tags(self, *tags):
3172
+ """Adds given ``tags`` for the current test or all tests in a suite.
3173
+
3174
+ When this keyword is used inside a test case, that test gets
3175
+ the specified tags and other tests are not affected.
3176
+
3177
+ If this keyword is used in a suite setup, all test cases in
3178
+ that suite, recursively, gets the given tags. It is a failure
3179
+ to use this keyword in a suite teardown.
3180
+
3181
+ The current tags are available as a built-in variable ``@{TEST TAGS}``.
3182
+
3183
+ See `Remove Tags` if you want to remove certain tags and `Fail` if
3184
+ you want to fail the test case after setting and/or removing tags.
3185
+ """
3186
+ ctx = self._context
3187
+ if ctx.test:
3188
+ ctx.test.tags.add(tags)
3189
+ ctx.variables.set_test('@{TEST_TAGS}', list(ctx.test.tags))
3190
+ elif not ctx.in_suite_teardown:
3191
+ ctx.suite.set_tags(tags, persist=True)
3192
+ else:
3193
+ raise RuntimeError("'Set Tags' cannot be used in suite teardown.")
3194
+ self.log('Set tag%s %s.' % (s(tags), seq2str(tags)))
3195
+
3196
+ def remove_tags(self, *tags):
3197
+ """Removes given ``tags`` from the current test or all tests in a suite.
3198
+
3199
+ Tags can be given exactly or using a pattern where ``*`` matches
3200
+ anything and ``?`` matches one character.
3201
+
3202
+ This keyword can affect either one test case or all test cases in a
3203
+ test suite similarly as `Set Tags` keyword.
3204
+
3205
+ The current tags are available as a built-in variable ``@{TEST TAGS}``.
3206
+
3207
+ Example:
3208
+ | Remove Tags | mytag | something-* | ?ython |
3209
+
3210
+ See `Set Tags` if you want to add certain tags and `Fail` if you want
3211
+ to fail the test case after setting and/or removing tags.
3212
+ """
3213
+ ctx = self._context
3214
+ if ctx.test:
3215
+ ctx.test.tags.remove(tags)
3216
+ ctx.variables.set_test('@{TEST_TAGS}', list(ctx.test.tags))
3217
+ elif not ctx.in_suite_teardown:
3218
+ ctx.suite.set_tags(remove=tags, persist=True)
3219
+ else:
3220
+ raise RuntimeError("'Remove Tags' cannot be used in suite teardown.")
3221
+ self.log('Removed tag%s %s.' % (s(tags), seq2str(tags)))
3222
+
3223
+ def get_library_instance(self, name=None, all=False):
3224
+ """Returns the currently active instance of the specified test library.
3225
+
3226
+ This keyword makes it easy for test libraries to interact with
3227
+ other test libraries that have state. This is illustrated by
3228
+ the Python example below:
3229
+
3230
+ | from robot.libraries.BuiltIn import BuiltIn
3231
+ |
3232
+ | def title_should_start_with(expected):
3233
+ | seleniumlib = BuiltIn().get_library_instance('SeleniumLibrary')
3234
+ | title = seleniumlib.get_title()
3235
+ | if not title.startswith(expected):
3236
+ | raise AssertionError("Title '%s' did not start with '%s'"
3237
+ | % (title, expected))
3238
+
3239
+ It is also possible to use this keyword in the test data and
3240
+ pass the returned library instance to another keyword. If a
3241
+ library is imported with a custom name, the ``name`` used to get
3242
+ the instance must be that name and not the original library name.
3243
+
3244
+ If the optional argument ``all`` is given a true value, then a
3245
+ dictionary mapping all library names to instances will be returned.
3246
+ This feature is new in Robot Framework 2.9.2.
3247
+
3248
+ Example:
3249
+ | &{all libs} = | Get library instance | all=True |
3250
+ """
3251
+ if is_truthy(all):
3252
+ return self._namespace.get_library_instances()
3253
+ try:
3254
+ return self._namespace.get_library_instance(name)
3255
+ except DataError as err:
3256
+ raise RuntimeError(unic(err))
3257
+
3258
+
3259
+ class BuiltIn(_Verify, _Converter, _Variables, _RunKeyword, _Control, _Misc):
3260
+ """An always available standard library with often needed keywords.
3261
+
3262
+ ``BuiltIn`` is Robot Framework's standard library that provides a set
3263
+ of generic keywords needed often. It is imported automatically and
3264
+ thus always available. The provided keywords can be used, for example,
3265
+ for verifications (e.g. `Should Be Equal`, `Should Contain`),
3266
+ conversions (e.g. `Convert To Integer`) and for various other purposes
3267
+ (e.g. `Log`, `Sleep`, `Run Keyword If`, `Set Global Variable`).
3268
+
3269
+ == Table of contents ==
3270
+
3271
+ - `HTML error messages`
3272
+ - `Evaluating expressions`
3273
+ - `Boolean arguments`
3274
+ - `Multiline string comparisons`
3275
+ - `Shortcuts`
3276
+ - `Keywords`
3277
+
3278
+ = HTML error messages =
3279
+
3280
+ Many of the keywords accept an optional error message to use if the keyword
3281
+ fails. Starting from Robot Framework 2.8, it is possible to use HTML in
3282
+ these messages by prefixing them with ``*HTML*``. See `Fail` keyword for
3283
+ a usage example. Notice that using HTML in messages is not limited to
3284
+ BuiltIn library but works with any error message.
3285
+
3286
+ = Evaluating expressions =
3287
+
3288
+ Many keywords, such as `Evaluate`, `Run Keyword If` and `Should Be True`,
3289
+ accept an expression that is evaluated in Python. These expressions are
3290
+ evaluated using Python's
3291
+ [https://docs.python.org/2/library/functions.html#eval|eval] function so
3292
+ that all Python built-ins like ``len()`` and ``int()`` are available.
3293
+ `Evaluate` allows configuring the execution namespace with custom modules,
3294
+ and other keywords have [https://docs.python.org/2/library/os.html|os]
3295
+ and [https://docs.python.org/2/library/sys.html|sys] modules available
3296
+ automatically.
3297
+
3298
+ Examples:
3299
+ | `Run Keyword If` | os.sep == '/' | Log | Not on Windows |
3300
+ | ${random int} = | `Evaluate` | random.randint(0, 5) | modules=random |
3301
+
3302
+ When a variable is used in the expressing using the normal ``${variable}``
3303
+ syntax, its value is replaces before the expression is evaluated. This
3304
+ means that the value used in the expression will be the string
3305
+ representation of the variable value, not the variable value itself.
3306
+ This is not a problem with numbers and other objects that have a string
3307
+ representation that can be evaluated directly, but with other objects
3308
+ the behavior depends on the string representation. Most importantly,
3309
+ strings must always be quoted, and if they can contain newlines, they must
3310
+ be triple quoted.
3311
+
3312
+ Examples:
3313
+ | `Should Be True` | ${rc} < 10 | Return code greater than 10 |
3314
+ | `Run Keyword If` | '${status}' == 'PASS' | Log | Passed |
3315
+ | `Run Keyword If` | 'FAIL' in '''${output}''' | Log | Output contains FAIL |
3316
+
3317
+ Starting from Robot Framework 2.9, variables themselves are automatically
3318
+ available in the evaluation namespace. They can be accessed using special
3319
+ variable syntax without the curly braces like ``$variable``. These
3320
+ variables should never be quoted, and in fact they are not even replaced
3321
+ inside strings.
3322
+
3323
+ Examples:
3324
+ | `Should Be True` | $rc < 10 | Return code greater than 10 |
3325
+ | `Run Keyword If` | $status == 'PASS' | `Log` | Passed |
3326
+ | `Run Keyword If` | 'FAIL' in $output | `Log` | Output contains FAIL |
3327
+ | `Should Be True` | len($result) > 1 and $result[1] == 'OK' |
3328
+
3329
+ Using the ``$variable`` syntax slows down expression evaluation a little.
3330
+ This should not typically matter, but should be taken into account if
3331
+ complex expressions are evaluated often and there are strict time
3332
+ constrains.
3333
+
3334
+ Notice that instead of creating complicated expressions, it is often better
3335
+ to move the logic into a test library. That eases maintenance and can also
3336
+ enhance execution speed.
3337
+
3338
+ = Boolean arguments =
3339
+
3340
+ Some keywords accept arguments that are handled as Boolean values true or
3341
+ false. If such an argument is given as a string, it is considered false if
3342
+ it is either empty or case-insensitively equal to ``false`` or ``no``.
3343
+ Keywords verifying something that allow dropping actual and expected values
3344
+ from the possible error message also consider string ``no values`` as false.
3345
+ Other strings are considered true regardless their value, and other
3346
+ argument types are tested using same
3347
+ [http://docs.python.org/2/library/stdtypes.html#truth-value-testing|rules
3348
+ as in Python].
3349
+
3350
+ True examples:
3351
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=True | # Strings are generally true. |
3352
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=yes | # Same as the above. |
3353
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=${TRUE} | # Python ``True`` is true. |
3354
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=${42} | # Numbers other than 0 are true. |
3355
+
3356
+ False examples:
3357
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=False | # String ``false`` is false. |
3358
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=no | # Also string ``no`` is false. |
3359
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=${EMPTY} | # Empty string is false. |
3360
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=${FALSE} | # Python ``False`` is false. |
3361
+ | `Should Be Equal` | ${x} | ${y} | Custom error | values=no values | # ``no values`` works with ``values`` argument |
3362
+
3363
+ Note that prior to Robot Framework 2.9 some keywords considered all
3364
+ non-empty strings, including ``false`` and ``no``, to be true.
3365
+
3366
+ = Multiline string comparisons =
3367
+
3368
+ `Should Be Equal` and `Should Be Equal As Strings` report the failures using
3369
+ [https://en.wikipedia.org/wiki/Diff_utility#Unified_format|unified diff
3370
+ format] if both strings have more than two lines. New in Robot Framework
3371
+ 2.9.1.
3372
+
3373
+ Example:
3374
+ | ${first} = | `Catenate` | SEPARATOR=\\n | Not in second | Same | Differs | Same |
3375
+ | ${second} = | `Catenate` | SEPARATOR=\\n | Same | Differs2 | Same | Not in first |
3376
+ | `Should Be Equal` | ${first} | ${second} |
3377
+
3378
+ Results in the following error message:
3379
+
3380
+ | Multiline strings are different:
3381
+ | --- first
3382
+ | +++ second
3383
+ | @@ -1,4 +1,4 @@
3384
+ | -Not in second
3385
+ | Same
3386
+ | -Differs
3387
+ | +Differs2
3388
+ | Same
3389
+ | +Not in first
3390
+
3391
+ """
3392
+ ROBOT_LIBRARY_SCOPE = 'GLOBAL'
3393
+ ROBOT_LIBRARY_VERSION = get_version()
3394
+
3395
+
3396
+ class RobotNotRunningError(AttributeError):
3397
+ """Used when something cannot be done because Robot is not running.
3398
+
3399
+ Based on AttributeError to be backwards compatible with RF < 2.8.5.
3400
+ May later be based directly on Exception, so new code should except
3401
+ this exception explicitly.
3402
+ """
3403
+ pass
3404
+
3405
+
3406
+ def register_run_keyword(library, keyword, args_to_process=None,
3407
+ deprecation_warning=True):
3408
+ """Registers 'run keyword' so that its arguments can be handled correctly.
3409
+
3410
+ *NOTE:* This API will change in RF 3.1. For more information see
3411
+ https://github.com/robotframework/robotframework/issues/2190. Use with
3412
+ `deprecation_warning=False` to avoid related deprecation warnings.
3413
+
3414
+ 1) Why is this method needed
3415
+
3416
+ Keywords running other keywords internally (normally using `Run Keyword`
3417
+ or some variants of it in BuiltIn) must have the arguments meant to the
3418
+ internally executed keyword handled specially to prevent processing them
3419
+ twice. This is done ONLY for keywords registered using this method.
3420
+
3421
+ If the register keyword has same name as any keyword from Robot Framework
3422
+ standard libraries, it can be used without getting warnings. Normally
3423
+ there is a warning in such cases unless the keyword is used in long
3424
+ format (e.g. MyLib.Keyword).
3425
+
3426
+ Keywords executed by registered run keywords can be tested in dry-run mode
3427
+ if they have 'name' argument which takes the name of the executed keyword.
3428
+
3429
+ 2) How to use this method
3430
+
3431
+ `library` is the name of the library where the registered keyword is
3432
+ implemented.
3433
+
3434
+ `keyword` can be either a function or method implementing the
3435
+ keyword, or name of the implemented keyword as a string.
3436
+
3437
+ `args_to_process` is needed when `keyword` is given as a string, and it
3438
+ defines how many of the arguments to the registered keyword must be
3439
+ processed normally. When `keyword` is a method or function, this
3440
+ information is got directly from it so that varargs (those specified with
3441
+ syntax '*args') are not processed but others are.
3442
+
3443
+ 3) Examples
3444
+
3445
+ from robot.libraries.BuiltIn import BuiltIn, register_run_keyword
3446
+
3447
+ def my_run_keyword(name, *args):
3448
+ # do something
3449
+ return BuiltIn().run_keyword(name, *args)
3450
+
3451
+ # Either one of these works
3452
+ register_run_keyword(__name__, my_run_keyword)
3453
+ register_run_keyword(__name__, 'My Run Keyword', 1)
3454
+
3455
+ -------------
3456
+
3457
+ from robot.libraries.BuiltIn import BuiltIn, register_run_keyword
3458
+
3459
+ class MyLibrary:
3460
+ def my_run_keyword_if(self, expression, name, *args):
3461
+ # do something
3462
+ return BuiltIn().run_keyword_if(expression, name, *args)
3463
+
3464
+ # Either one of these works
3465
+ register_run_keyword('MyLibrary', MyLibrary.my_run_keyword_if)
3466
+ register_run_keyword('MyLibrary', 'my_run_keyword_if', 2)
3467
+ """
3468
+ RUN_KW_REGISTER.register_run_keyword(library, keyword, args_to_process,
3469
+ deprecation_warning)