dwaite-cucumber 0.3.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +1067 -0
- data/License.txt +22 -0
- data/Manifest.txt +453 -0
- data/README.txt +4 -0
- data/Rakefile +9 -0
- data/bin/cucumber +17 -0
- data/config/hoe.rb +78 -0
- data/config/requirements.rb +15 -0
- data/cucumber.yml +2 -0
- data/examples/cs/README.textile +1 -0
- data/examples/cs/Rakefile +12 -0
- data/examples/cs/compile.bat +1 -0
- data/examples/cs/features/addition.feature +16 -0
- data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
- data/examples/cs/src/demo/Calculator.cs +20 -0
- data/examples/dos_line_endings/Rakefile +6 -0
- data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
- data/examples/i18n/README.textile +18 -0
- data/examples/i18n/Rakefile +32 -0
- data/examples/i18n/ar/Rakefile +6 -0
- data/examples/i18n/ar/features/addition.feature +17 -0
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/ar/lib/calculator.rb +11 -0
- data/examples/i18n/bg/Rakefile +6 -0
- data/examples/i18n/bg/features/addition.feature +12 -0
- data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
- data/examples/i18n/bg/features/division.feature +17 -0
- data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/bg/features/support/env.rb +6 -0
- data/examples/i18n/bg/features/support/world.rb +8 -0
- data/examples/i18n/bg/lib/calculator.rb +24 -0
- data/examples/i18n/cat/Rakefile +6 -0
- data/examples/i18n/cat/features/step_definitons/calculator_steps.rb +21 -0
- data/examples/i18n/cat/features/suma.feature +17 -0
- data/examples/i18n/cat/lib/calculadora.rb +16 -0
- data/examples/i18n/da/Rakefile +6 -0
- data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +24 -0
- data/examples/i18n/da/features/summering.feature +18 -0
- data/examples/i18n/da/lib/kalkulator.rb +11 -0
- data/examples/i18n/de/Rakefile +6 -0
- data/examples/i18n/de/features/addition.feature +17 -0
- data/examples/i18n/de/features/division.feature +10 -0
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/de/lib/calculator.rb +14 -0
- data/examples/i18n/en/Rakefile +6 -0
- data/examples/i18n/en/features/addition.feature +17 -0
- data/examples/i18n/en/features/division.feature +10 -0
- data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/en/lib/calculator.rb +14 -0
- data/examples/i18n/en-lol/Rakefile +6 -0
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
- data/examples/i18n/en-lol/features/stuffing.feature +8 -0
- data/examples/i18n/en-lol/features/support/env.rb +8 -0
- data/examples/i18n/en-lol/lib/basket.rb +12 -0
- data/examples/i18n/en-lol/lib/belly.rb +11 -0
- data/examples/i18n/es/Rakefile +6 -0
- data/examples/i18n/es/features/adicion.feature +17 -0
- data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
- data/examples/i18n/es/lib/calculador.rb +14 -0
- data/examples/i18n/et/Rakefile +6 -0
- data/examples/i18n/et/features/jagamine.feature +10 -0
- data/examples/i18n/et/features/liitmine.feature +17 -0
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
- data/examples/i18n/et/lib/kalkulaator.rb +14 -0
- data/examples/i18n/fi/Rakefile +6 -0
- data/examples/i18n/fi/features/jakolasku.feature +10 -0
- data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
- data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
- data/examples/i18n/fi/lib/laskin.rb +14 -0
- data/examples/i18n/fr/Rakefile +6 -0
- data/examples/i18n/fr/features/addition.feature +18 -0
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +25 -0
- data/examples/i18n/fr/lib/calculatrice.rb +10 -0
- data/examples/i18n/he/Rakefile +6 -0
- data/examples/i18n/he/features/addition.feature +17 -0
- data/examples/i18n/he/features/division.feature +10 -0
- data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/he/lib/calculator.rb +14 -0
- data/examples/i18n/hu/Rakefile +6 -0
- data/examples/i18n/hu/features/addition.feature +17 -0
- data/examples/i18n/hu/features/division.feature +10 -0
- data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
- data/examples/i18n/hu/lib/calculator.rb +14 -0
- data/examples/i18n/id/Rakefile +6 -0
- data/examples/i18n/id/features/addition.feature +17 -0
- data/examples/i18n/id/features/division.feature +10 -0
- data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/id/lib/calculator.rb +14 -0
- data/examples/i18n/it/Rakefile +6 -0
- data/examples/i18n/it/features/somma.feature +11 -0
- data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
- data/examples/i18n/it/lib/calcolatrice.rb +11 -0
- data/examples/i18n/ja/Rakefile +6 -0
- data/examples/i18n/ja/features/addition.feature +17 -0
- data/examples/i18n/ja/features/division.feature +10 -0
- data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/ja/lib/calculator.rb +14 -0
- data/examples/i18n/ko/Rakefile +6 -0
- data/examples/i18n/ko/features/addition.feature +17 -0
- data/examples/i18n/ko/features/division.feature +11 -0
- data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/ko/lib/calculator.rb +14 -0
- data/examples/i18n/lt/Rakefile +6 -0
- data/examples/i18n/lt/features/addition.feature +17 -0
- data/examples/i18n/lt/features/division.feature +10 -0
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/lt/lib/calculator.rb +14 -0
- data/examples/i18n/lv/Rakefile +6 -0
- data/examples/i18n/lv/features/addition.feature +17 -0
- data/examples/i18n/lv/features/division.feature +10 -0
- data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/lv/lib/calculator.rb +14 -0
- data/examples/i18n/no/Rakefile +6 -0
- data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
- data/examples/i18n/no/features/summering.feature +19 -0
- data/examples/i18n/no/features/support/env.rb +6 -0
- data/examples/i18n/no/lib/kalkulator.rb +11 -0
- data/examples/i18n/pl/Rakefile +6 -0
- data/examples/i18n/pl/features/addition.feature +17 -0
- data/examples/i18n/pl/features/division.feature +10 -0
- data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/pl/features/support/env.rb +6 -0
- data/examples/i18n/pl/lib/calculator.rb +14 -0
- data/examples/i18n/pt/Rakefile +6 -0
- data/examples/i18n/pt/features/adicao.feature +11 -0
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
- data/examples/i18n/pt/features/support/env.rb +6 -0
- data/examples/i18n/pt/lib/calculadora.rb +10 -0
- data/examples/i18n/ro/Rakefile +6 -0
- data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/ro/features/suma.feature +11 -0
- data/examples/i18n/ro/lib/calculator.rb +11 -0
- data/examples/i18n/ru/Rakefile +6 -0
- data/examples/i18n/ru/features/addition.feature +11 -0
- data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
- data/examples/i18n/ru/features/division.feature +16 -0
- data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
- data/examples/i18n/ru/features/support/env.rb +6 -0
- data/examples/i18n/ru/features/support/world.rb +8 -0
- data/examples/i18n/ru/lib/calculator.rb +24 -0
- data/examples/i18n/se/Rakefile +6 -0
- data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +24 -0
- data/examples/i18n/se/features/summering.feature +18 -0
- data/examples/i18n/se/lib/kalkulator.rb +11 -0
- data/examples/i18n/sk/Rakefile +6 -0
- data/examples/i18n/sk/features/addition.feature +17 -0
- data/examples/i18n/sk/features/division.feature +10 -0
- data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/sk/lib/calculator.rb +14 -0
- data/examples/i18n/uz/Rakefile +6 -0
- data/examples/i18n/uz/features/addition.feature +10 -0
- data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
- data/examples/i18n/uz/features/division.feature +17 -0
- data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
- data/examples/i18n/uz/features/support/env.rb +6 -0
- data/examples/i18n/uz/features/support/world.rb +8 -0
- data/examples/i18n/uz/lib/calculator.rb +24 -0
- data/examples/i18n/zh-CN/Rakefile +6 -0
- data/examples/i18n/zh-CN/features/addition.feature +18 -0
- data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
- data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
- data/examples/i18n/zh-TW/Rakefile +6 -0
- data/examples/i18n/zh-TW/features/addition.feature +17 -0
- data/examples/i18n/zh-TW/features/division.feature +11 -0
- data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
- data/examples/java/README.textile +18 -0
- data/examples/java/build.xml +33 -0
- data/examples/java/features/hello.feature +11 -0
- data/examples/java/features/step_definitons/hello_steps.rb +23 -0
- data/examples/java/features/step_definitons/tree_steps.rb +14 -0
- data/examples/java/features/tree.feature +9 -0
- data/examples/java/src/cucumber/demo/Hello.java +16 -0
- data/examples/junit/features/one_passing_one_failing.feature +8 -0
- data/examples/junit/features/pending.feature +5 -0
- data/examples/junit/features/step_definitions/steps.rb +11 -0
- data/examples/pure_java/README.textile +5 -0
- data/examples/python/features/fibonacci.feature +19 -0
- data/examples/python/features/step_definitions/fib_steps.py +3 -0
- data/examples/python/features/step_definitions/fib_steps.rb +7 -0
- data/examples/python/features/support/env.rb +21 -0
- data/examples/python/lib/fib.py +7 -0
- data/examples/selenium/Rakefile +6 -0
- data/examples/selenium/features/search.feature +9 -0
- data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium/features/support/env.rb +19 -0
- data/examples/selenium_webrat/Rakefile +6 -0
- data/examples/selenium_webrat/config.ru +0 -0
- data/examples/selenium_webrat/features/search.feature +9 -0
- data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium_webrat/features/support/env.rb +45 -0
- data/examples/self_test/README.textile +6 -0
- data/examples/self_test/Rakefile +6 -0
- data/examples/self_test/features/background/background_tagged_before_on_outline.feature +12 -0
- data/examples/self_test/features/background/background_with_name.feature +7 -0
- data/examples/self_test/features/background/failing_background.feature +12 -0
- data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
- data/examples/self_test/features/background/multiline_args_background.feature +32 -0
- data/examples/self_test/features/background/passing_background.feature +10 -0
- data/examples/self_test/features/background/pending_background.feature +10 -0
- data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
- data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
- data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
- data/examples/self_test/features/failing_expectation.feature +4 -0
- data/examples/self_test/features/lots_of_undefined.feature +8 -0
- data/examples/self_test/features/multiline_name.feature +27 -0
- data/examples/self_test/features/outline_sample.feature +15 -0
- data/examples/self_test/features/sample.feature +21 -0
- data/examples/self_test/features/search_sample.feature +32 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +93 -0
- data/examples/self_test/features/support/env.rb +24 -0
- data/examples/self_test/features/tags_sample.feature +17 -0
- data/examples/self_test/features/tons_of_cukes.feature +52 -0
- data/examples/self_test/features/transform_sample.feature +10 -0
- data/examples/self_test/features/undefined_multiline_args.feature +12 -0
- data/examples/self_test/list-of-features.txt +1 -0
- data/examples/sinatra/README.textile +13 -0
- data/examples/sinatra/Rakefile +6 -0
- data/examples/sinatra/app.rb +14 -0
- data/examples/sinatra/features/add.feature +11 -0
- data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
- data/examples/sinatra/features/support/env.rb +32 -0
- data/examples/sinatra/views/add.erb +5 -0
- data/examples/sinatra/views/layout.erb +8 -0
- data/examples/steps_library/features/step_definitions/steps_lib1.rb +8 -0
- data/examples/steps_library/features/step_definitions/steps_lib2.rb +8 -0
- data/examples/test_unit/Rakefile +6 -0
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
- data/examples/test_unit/features/test_unit.feature +9 -0
- data/examples/tickets/Rakefile +16 -0
- data/examples/tickets/features/172.feature +28 -0
- data/examples/tickets/features/177/1.feature +29 -0
- data/examples/tickets/features/177/2.feature +21 -0
- data/examples/tickets/features/177/3.feature +18 -0
- data/examples/tickets/features/180.feature +7 -0
- data/examples/tickets/features/229/tagged_hooks.feature +8 -0
- data/examples/tickets/features/229/tagged_hooks.rb +14 -0
- data/examples/tickets/features/236.feature +13 -0
- data/examples/tickets/features/241.feature +13 -0
- data/examples/tickets/features/246.feature +4 -0
- data/examples/tickets/features/248.feature +11 -0
- data/examples/tickets/features/270/back.feature +14 -0
- data/examples/tickets/features/270/back.steps.rb +14 -0
- data/examples/tickets/features/272/hooks.feature +26 -0
- data/examples/tickets/features/272/hooks_steps.rb +53 -0
- data/examples/tickets/features/279/py_string_indent.feature +25 -0
- data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
- data/examples/tickets/features/279/wrong.feature_ +11 -0
- data/examples/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
- data/examples/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
- data/examples/tickets/features/306/only_background.feature +4 -0
- data/examples/tickets/features/lib/eatting_machine.rb +18 -0
- data/examples/tickets/features/lib/pantry.rb +20 -0
- data/examples/tickets/features/scenario_outline.feature +95 -0
- data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
- data/examples/tickets/features/step_definitons/248_steps.rb +15 -0
- data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +81 -0
- data/examples/tickets/features/table_diffing.feature +13 -0
- data/examples/tickets/features/tickets.feature +28 -0
- data/examples/watir/README.textile +16 -0
- data/examples/watir/Rakefile +6 -0
- data/examples/watir/features/search.feature +12 -0
- data/examples/watir/features/step_definitons/search_steps.rb +26 -0
- data/examples/watir/features/support/env.rb +32 -0
- data/features/background.feature +311 -0
- data/features/bug_371.feature +32 -0
- data/features/cucumber_cli.feature +667 -0
- data/features/cucumber_cli_diff_disabled.feature +54 -0
- data/features/cucumber_cli_outlines.feature +109 -0
- data/features/custom_formatter.feature +11 -0
- data/features/drb_server_integration.feature +173 -0
- data/features/exception_in_after_block.feature +102 -0
- data/features/exception_in_after_step_block.feature +104 -0
- data/features/exception_in_before_block.feature +47 -0
- data/features/exclude_files.feature +20 -0
- data/features/expand.feature +49 -0
- data/features/html_formatter/a.html +183 -0
- data/features/html_formatter.feature +7 -0
- data/features/junit_formatter.feature +89 -0
- data/features/language_from_header.feature +30 -0
- data/features/multiline_names.feature +43 -0
- data/features/post_configuration_hook.feature +37 -0
- data/features/profiles.feature +112 -0
- data/features/rake_task.feature +178 -0
- data/features/report_called_undefined_steps.feature +35 -0
- data/features/snippet.feature +22 -0
- data/features/step_definitions/cucumber_steps.rb +154 -0
- data/features/step_definitions/extra_steps.rb +2 -0
- data/features/steps_formatter.feature +25 -0
- data/features/support/env.rb +139 -0
- data/features/table_diffing.feature +45 -0
- data/features/transform.feature +24 -0
- data/features/unicode_table.feature +35 -0
- data/features/usage.feature +132 -0
- data/features/work_in_progress.feature +158 -0
- data/gem_tasks/contributors.rake +12 -0
- data/gem_tasks/deployment.rake +11 -0
- data/gem_tasks/environment.rake +7 -0
- data/gem_tasks/features.rake +11 -0
- data/gem_tasks/fix_cr_lf.rake +10 -0
- data/gem_tasks/flog.rake +4 -0
- data/gem_tasks/gemspec.rake +10 -0
- data/gem_tasks/rspec.rake +45 -0
- data/gem_tasks/sass.rake +4 -0
- data/gem_tasks/sdoc.rake +7 -0
- data/lib/README.rdoc +12 -0
- data/lib/autotest/cucumber.rb +6 -0
- data/lib/autotest/cucumber_mixin.rb +125 -0
- data/lib/autotest/cucumber_rails.rb +6 -0
- data/lib/autotest/cucumber_rails_rspec.rb +6 -0
- data/lib/autotest/cucumber_rspec.rb +6 -0
- data/lib/autotest/discover.rb +9 -0
- data/lib/cucumber/ast/background.rb +63 -0
- data/lib/cucumber/ast/comment.rb +31 -0
- data/lib/cucumber/ast/examples.rb +32 -0
- data/lib/cucumber/ast/feature.rb +81 -0
- data/lib/cucumber/ast/feature_element.rb +61 -0
- data/lib/cucumber/ast/features.rb +40 -0
- data/lib/cucumber/ast/outline_table.rb +146 -0
- data/lib/cucumber/ast/py_string.rb +57 -0
- data/lib/cucumber/ast/scenario.rb +108 -0
- data/lib/cucumber/ast/scenario_outline.rb +96 -0
- data/lib/cucumber/ast/step.rb +116 -0
- data/lib/cucumber/ast/step_collection.rb +76 -0
- data/lib/cucumber/ast/step_invocation.rb +166 -0
- data/lib/cucumber/ast/table.rb +626 -0
- data/lib/cucumber/ast/tags.rb +44 -0
- data/lib/cucumber/ast/visitor.rb +115 -0
- data/lib/cucumber/ast.rb +29 -0
- data/lib/cucumber/broadcaster.rb +13 -0
- data/lib/cucumber/cli/configuration.rb +190 -0
- data/lib/cucumber/cli/drb_client.rb +26 -0
- data/lib/cucumber/cli/language_help_formatter.rb +61 -0
- data/lib/cucumber/cli/main.rb +116 -0
- data/lib/cucumber/cli/options.rb +394 -0
- data/lib/cucumber/cli/profile_loader.rb +70 -0
- data/lib/cucumber/constantize.rb +28 -0
- data/lib/cucumber/core_ext/instance_exec.rb +93 -0
- data/lib/cucumber/core_ext/proc.rb +29 -0
- data/lib/cucumber/core_ext/string.rb +48 -0
- data/lib/cucumber/feature_file.rb +54 -0
- data/lib/cucumber/filter.rb +52 -0
- data/lib/cucumber/formatter/ansicolor.rb +143 -0
- data/lib/cucumber/formatter/color_io.rb +23 -0
- data/lib/cucumber/formatter/console.rb +185 -0
- data/lib/cucumber/formatter/cucumber.css +132 -0
- data/lib/cucumber/formatter/cucumber.sass +139 -0
- data/lib/cucumber/formatter/duration.rb +13 -0
- data/lib/cucumber/formatter/html.rb +261 -0
- data/lib/cucumber/formatter/junit.rb +121 -0
- data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
- data/lib/cucumber/formatter/pdf.rb +217 -0
- data/lib/cucumber/formatter/pretty.rb +222 -0
- data/lib/cucumber/formatter/profile.rb +78 -0
- data/lib/cucumber/formatter/progress.rb +67 -0
- data/lib/cucumber/formatter/rerun.rb +46 -0
- data/lib/cucumber/formatter/steps.rb +50 -0
- data/lib/cucumber/formatter/tag_cloud.rb +29 -0
- data/lib/cucumber/formatter/unicode.rb +35 -0
- data/lib/cucumber/formatter/usage.rb +86 -0
- data/lib/cucumber/formatters/unicode.rb +7 -0
- data/lib/cucumber/language_support/language_methods.rb +75 -0
- data/lib/cucumber/language_support/step_definition_methods.rb +46 -0
- data/lib/cucumber/language_support.rb +30 -0
- data/lib/cucumber/languages.yml +561 -0
- data/lib/cucumber/parser/feature.rb +1838 -0
- data/lib/cucumber/parser/feature.tt +351 -0
- data/lib/cucumber/parser/i18n.tt +42 -0
- data/lib/cucumber/parser/natural_language.rb +72 -0
- data/lib/cucumber/parser/table.rb +417 -0
- data/lib/cucumber/parser/table.tt +71 -0
- data/lib/cucumber/parser/treetop_ext.rb +53 -0
- data/lib/cucumber/parser.rb +6 -0
- data/lib/cucumber/platform.rb +27 -0
- data/lib/cucumber/py_support/py_dsl.py +8 -0
- data/lib/cucumber/py_support/py_language.py +2 -0
- data/lib/cucumber/py_support/py_language.rb +68 -0
- data/lib/cucumber/rails/rspec.rb +10 -0
- data/lib/cucumber/rails/world.rb +100 -0
- data/lib/cucumber/rake/task.rb +241 -0
- data/lib/cucumber/rb_support/rb_dsl.rb +100 -0
- data/lib/cucumber/rb_support/rb_hook.rb +18 -0
- data/lib/cucumber/rb_support/rb_language.rb +153 -0
- data/lib/cucumber/rb_support/rb_step_definition.rb +60 -0
- data/lib/cucumber/rb_support/rb_world.rb +93 -0
- data/lib/cucumber/rspec_neuter.rb +23 -0
- data/lib/cucumber/step_match.rb +61 -0
- data/lib/cucumber/step_mother.rb +307 -0
- data/lib/cucumber/version.rb +10 -0
- data/lib/cucumber/webrat/element_locator.rb +87 -0
- data/lib/cucumber/webrat/table_locator.rb +1 -0
- data/lib/cucumber.rb +10 -0
- data/rails_generators/cucumber/USAGE +11 -0
- data/rails_generators/cucumber/cucumber_generator.rb +70 -0
- data/rails_generators/cucumber/templates/cucumber +9 -0
- data/rails_generators/cucumber/templates/cucumber.rake +36 -0
- data/rails_generators/cucumber/templates/cucumber_environment.rb +26 -0
- data/rails_generators/cucumber/templates/env.rb +27 -0
- data/rails_generators/cucumber/templates/paths.rb +27 -0
- data/rails_generators/cucumber/templates/spork_env.rb +35 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +236 -0
- data/rails_generators/feature/USAGE +12 -0
- data/rails_generators/feature/feature_generator.rb +40 -0
- data/rails_generators/feature/templates/feature.erb +31 -0
- data/rails_generators/feature/templates/steps.erb +14 -0
- data/spec/cucumber/ast/background_spec.rb +60 -0
- data/spec/cucumber/ast/feature_element_spec.rb +40 -0
- data/spec/cucumber/ast/feature_factory.rb +62 -0
- data/spec/cucumber/ast/feature_spec.rb +44 -0
- data/spec/cucumber/ast/py_string_spec.rb +51 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +72 -0
- data/spec/cucumber/ast/scenario_spec.rb +43 -0
- data/spec/cucumber/ast/step_collection_spec.rb +17 -0
- data/spec/cucumber/ast/step_spec.rb +66 -0
- data/spec/cucumber/ast/table_spec.rb +394 -0
- data/spec/cucumber/broadcaster_spec.rb +15 -0
- data/spec/cucumber/cli/configuration_spec.rb +396 -0
- data/spec/cucumber/cli/drb_client_spec.rb +77 -0
- data/spec/cucumber/cli/main_spec.rb +172 -0
- data/spec/cucumber/cli/options_spec.rb +331 -0
- data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
- data/spec/cucumber/core_ext/proc_spec.rb +68 -0
- data/spec/cucumber/core_ext/string_spec.rb +43 -0
- data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
- data/spec/cucumber/formatter/color_io_spec.rb +27 -0
- data/spec/cucumber/formatter/duration_spec.rb +22 -0
- data/spec/cucumber/formatter/html_spec.rb +18 -0
- data/spec/cucumber/formatter/progress_spec.rb +33 -0
- data/spec/cucumber/parser/feature_parser_spec.rb +396 -0
- data/spec/cucumber/parser/table_parser_spec.rb +52 -0
- data/spec/cucumber/rails/stubs/mini_rails.rb +18 -0
- data/spec/cucumber/rails/stubs/test_help.rb +1 -0
- data/spec/cucumber/rails/world_spec.rb +16 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +123 -0
- data/spec/cucumber/sell_cucumbers.feature +19 -0
- data/spec/cucumber/step_mother_spec.rb +282 -0
- data/spec/cucumber/treetop_parser/empty_feature.feature +4 -0
- data/spec/cucumber/treetop_parser/empty_scenario.feature +9 -0
- data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
- data/spec/cucumber/treetop_parser/fit_scenario.feature +8 -0
- data/spec/cucumber/treetop_parser/given_scenario.feature +9 -0
- data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
- data/spec/cucumber/treetop_parser/multiline_steps.feature +17 -0
- data/spec/cucumber/treetop_parser/multiple_tables.feature +27 -0
- data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
- data/spec/cucumber/treetop_parser/spaces.feature +12 -0
- data/spec/cucumber/treetop_parser/test_dos.feature +25 -0
- data/spec/cucumber/treetop_parser/with_comments.feature +23 -0
- data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
- data/spec/cucumber/world/pending_spec.rb +46 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +18 -0
- metadata +561 -0
@@ -0,0 +1,100 @@
|
|
1
|
+
# Based on code from Brian Takita, Yurii Rashkovskii and Ben Mabey
|
2
|
+
# Adapted by Aslak Hellesøy
|
3
|
+
|
4
|
+
if defined?(ActiveRecord::Base)
|
5
|
+
require 'test_help'
|
6
|
+
else
|
7
|
+
require 'action_controller/test_process'
|
8
|
+
require 'action_controller/integration'
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'test/unit/testresult'
|
13
|
+
rescue LoadError => e
|
14
|
+
e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
|
15
|
+
e.message << "\nAlso make sure you have rack 1.0.0 or higher."
|
16
|
+
raise e
|
17
|
+
end
|
18
|
+
|
19
|
+
# So that Test::Unit doesn't launch at the end - makes it think it has already been run.
|
20
|
+
Test::Unit.run = true if Test::Unit.respond_to?(:run=)
|
21
|
+
|
22
|
+
$__cucumber_toplevel = self
|
23
|
+
|
24
|
+
module Cucumber #:nodoc:
|
25
|
+
module Rails
|
26
|
+
# All scenarios will execute in the context of a new instance of Cucumber::Rails:World if this file
|
27
|
+
# is loaded. This gives Step Definitions access to all the methods from Rails' ActionController::IntegrationTest
|
28
|
+
class World < ActionController::IntegrationTest
|
29
|
+
if defined?(ActiveRecord::Base)
|
30
|
+
self.use_transactional_fixtures = false
|
31
|
+
else
|
32
|
+
def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize #:nodoc:
|
36
|
+
@_result = Test::Unit::TestResult.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.use_transactional_fixtures
|
41
|
+
|
42
|
+
unless ::Rails.configuration.cache_classes
|
43
|
+
warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/test.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
|
44
|
+
end
|
45
|
+
|
46
|
+
World.use_transactional_fixtures = true
|
47
|
+
if defined?(ActiveRecord::Base)
|
48
|
+
$__cucumber_toplevel.Before do
|
49
|
+
@__cucumber_ar_connection = ActiveRecord::Base.connection
|
50
|
+
if @__cucumber_ar_connection.respond_to?(:increment_open_transactions)
|
51
|
+
@__cucumber_ar_connection.increment_open_transactions
|
52
|
+
else
|
53
|
+
ActiveRecord::Base.__send__(:increment_open_transactions)
|
54
|
+
end
|
55
|
+
@__cucumber_ar_connection.begin_db_transaction
|
56
|
+
ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
|
57
|
+
end
|
58
|
+
|
59
|
+
$__cucumber_toplevel.After do
|
60
|
+
@__cucumber_ar_connection.rollback_db_transaction
|
61
|
+
if @__cucumber_ar_connection.respond_to?(:decrement_open_transactions)
|
62
|
+
@__cucumber_ar_connection.decrement_open_transactions
|
63
|
+
else
|
64
|
+
ActiveRecord::Base.__send__(:decrement_open_transactions)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.bypass_rescue
|
71
|
+
ActionController::Base.class_eval do
|
72
|
+
alias_method :rescue_action_without_bypass, :rescue_action
|
73
|
+
|
74
|
+
def rescue_action(exception)
|
75
|
+
raise exception
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
begin
|
80
|
+
ActionController::Failsafe.class_eval do
|
81
|
+
alias_method :failsafe_response_without_bypass, :failsafe_response
|
82
|
+
|
83
|
+
def failsafe_response(exception)
|
84
|
+
raise exception
|
85
|
+
end
|
86
|
+
end
|
87
|
+
rescue NameError # Failsafe was introduced in Rails 2.3.2
|
88
|
+
ActionController::Dispatcher.class_eval do
|
89
|
+
def self.failsafe_response(output, status, exception = nil)
|
90
|
+
raise exception
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
World do
|
99
|
+
Cucumber::Rails::World.new
|
100
|
+
end
|
@@ -0,0 +1,241 @@
|
|
1
|
+
require 'cucumber/platform'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module Rake
|
5
|
+
# Defines a Rake task for running features.
|
6
|
+
#
|
7
|
+
# The simplest use of it goes something like:
|
8
|
+
#
|
9
|
+
# Cucumber::Rake::Task.new
|
10
|
+
#
|
11
|
+
# This will define a task named <tt>cucumber</tt> described as 'Run Cucumber features'.
|
12
|
+
# It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
|
13
|
+
#
|
14
|
+
# To further configure the task, you can pass a block:
|
15
|
+
#
|
16
|
+
# Cucumber::Rake::Task.new do |t|
|
17
|
+
# t.cucumber_opts = %w{--format progress}
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# This task can also be configured to be run with RCov:
|
21
|
+
#
|
22
|
+
# Cucumber::Rake::Task.new do |t|
|
23
|
+
# t.rcov = true
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# See the attributes for additional configuration possibilities.
|
27
|
+
class Task
|
28
|
+
class InProcessCucumberRunner #:nodoc:
|
29
|
+
attr_reader :args
|
30
|
+
|
31
|
+
def initialize(libs, cucumber_opts, feature_files)
|
32
|
+
raise "libs must be an Array when running in-process" unless Array === libs
|
33
|
+
libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
|
34
|
+
@args = (
|
35
|
+
cucumber_opts +
|
36
|
+
feature_files
|
37
|
+
).flatten.compact
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
require 'cucumber/cli/main'
|
42
|
+
failure = Cucumber::Cli::Main.execute(args)
|
43
|
+
raise "Cucumber failed" if failure
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class ForkedCucumberRunner #:nodoc:
|
48
|
+
attr_reader :args
|
49
|
+
|
50
|
+
def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
|
51
|
+
@args = (
|
52
|
+
['-I'] + load_path(libs) +
|
53
|
+
quoted_binary(cucumber_bin) +
|
54
|
+
cucumber_opts +
|
55
|
+
feature_files
|
56
|
+
).flatten
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_path(libs)
|
60
|
+
['"%s"' % libs.join(File::PATH_SEPARATOR)]
|
61
|
+
end
|
62
|
+
|
63
|
+
def quoted_binary(cucumber_bin)
|
64
|
+
['"%s"' % cucumber_bin]
|
65
|
+
end
|
66
|
+
|
67
|
+
def run
|
68
|
+
ruby(args.join(" ")) # ruby(*args) is broken on Windows
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
|
73
|
+
def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
|
74
|
+
@args = (
|
75
|
+
['-I'] + load_path(libs) +
|
76
|
+
['-S', 'rcov'] + rcov_opts +
|
77
|
+
quoted_binary(cucumber_bin) +
|
78
|
+
['--'] +
|
79
|
+
cucumber_opts +
|
80
|
+
feature_files
|
81
|
+
).flatten
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
LIB = File.expand_path(File.dirname(__FILE__) + '/../..') #:nodoc:
|
86
|
+
|
87
|
+
# TODO: remove depreated accessors for 0.4.0
|
88
|
+
def self.deprecate_accessor(attribute) #:nodoc:
|
89
|
+
attr_reader attribute
|
90
|
+
class_eval <<-EOF, __FILE__, __LINE__ + 1
|
91
|
+
def #{attribute}=(value)
|
92
|
+
@#{attribute} = value
|
93
|
+
warn("\nWARNING: Cucumber::Rake::Task##{attribute} is deprecated and will be removed in 0.4.0. Please use profiles for complex settings: http://wiki.github.com/aslakhellesoy/cucumber/using-rake#profiles\n")
|
94
|
+
end
|
95
|
+
EOF
|
96
|
+
end
|
97
|
+
|
98
|
+
# Directories to add to the Ruby $LOAD_PATH
|
99
|
+
attr_accessor :libs
|
100
|
+
|
101
|
+
# Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
|
102
|
+
attr_accessor :binary
|
103
|
+
|
104
|
+
# Array of paths to specific step definition files to use
|
105
|
+
deprecate_accessor :step_list
|
106
|
+
|
107
|
+
# File pattern for finding step definitions. Defaults to
|
108
|
+
# 'features/**/*.rb'.
|
109
|
+
deprecate_accessor :step_pattern
|
110
|
+
|
111
|
+
# Array of paths to specific features to run.
|
112
|
+
deprecate_accessor :feature_list
|
113
|
+
|
114
|
+
# File pattern for finding features to run. Defaults to
|
115
|
+
# 'features/**/*.feature'. Can be overridden by the FEATURE environment variable.
|
116
|
+
deprecate_accessor :feature_pattern
|
117
|
+
|
118
|
+
# Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
|
119
|
+
# It's recommended to pass an Array, but if it's a String it will be #split by ' '.
|
120
|
+
attr_accessor :cucumber_opts
|
121
|
+
def cucumber_opts=(opts) #:nodoc:
|
122
|
+
@cucumber_opts = String === opts ? opts.split(' ') : opts
|
123
|
+
end
|
124
|
+
|
125
|
+
# Run cucumber with RCov? Defaults to false. If you set this to
|
126
|
+
# true, +fork+ is implicit.
|
127
|
+
attr_accessor :rcov
|
128
|
+
|
129
|
+
# Extra options to pass to rcov.
|
130
|
+
# It's recommended to pass an Array, but if it's a String it will be #split by ' '.
|
131
|
+
attr_accessor :rcov_opts
|
132
|
+
def rcov_opts=(opts) #:nodoc:
|
133
|
+
@rcov_opts = String === opts ? opts.split(' ') : opts
|
134
|
+
end
|
135
|
+
|
136
|
+
# Whether or not to fork a new ruby interpreter. Defaults to true. You may gain
|
137
|
+
# some startup speed if you set it to false, but this may also cause issues with
|
138
|
+
# your load path and gems.
|
139
|
+
attr_accessor :fork
|
140
|
+
|
141
|
+
# Define what profile to be used. When used with cucumber_opts it is simply appended to it. Will be ignored when CUCUMBER_OPTS is used.
|
142
|
+
attr_accessor :profile
|
143
|
+
def profile=(profile) #:nodoc:
|
144
|
+
@profile = profile
|
145
|
+
unless feature_list
|
146
|
+
# TODO: remove once we completely remove these from the rake task.
|
147
|
+
@step_list = []
|
148
|
+
@feature_list = [] # Don't use accessor to avoid deprecation warning.
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Define Cucumber Rake task
|
153
|
+
def initialize(task_name = "cucumber", desc = "Run Cucumber features")
|
154
|
+
@task_name, @desc = task_name, desc
|
155
|
+
@fork = true
|
156
|
+
@libs = ['lib']
|
157
|
+
@rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
|
158
|
+
|
159
|
+
yield self if block_given?
|
160
|
+
|
161
|
+
@feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
|
162
|
+
@step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
|
163
|
+
|
164
|
+
@binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
|
165
|
+
@libs.insert(0, LIB) if binary == Cucumber::BINARY
|
166
|
+
|
167
|
+
define_task
|
168
|
+
end
|
169
|
+
|
170
|
+
def define_task #:nodoc:
|
171
|
+
desc @desc
|
172
|
+
task @task_name do
|
173
|
+
runner.run
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def runner(task_args = nil) #:nodoc:
|
178
|
+
cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
|
179
|
+
if(@rcov)
|
180
|
+
RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args), rcov_opts)
|
181
|
+
elsif(@fork)
|
182
|
+
ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args))
|
183
|
+
else
|
184
|
+
InProcessCucumberRunner.new(libs, cucumber_opts, feature_files(task_args))
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def cucumber_opts_with_profile #:nodoc:
|
189
|
+
@profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
|
190
|
+
end
|
191
|
+
|
192
|
+
def feature_files(task_args = nil) #:nodoc:
|
193
|
+
if ENV['FEATURE']
|
194
|
+
FileList[ ENV['FEATURE'] ]
|
195
|
+
else
|
196
|
+
result = []
|
197
|
+
result += feature_list.to_a if feature_list
|
198
|
+
result += FileList[feature_pattern].to_a if feature_pattern
|
199
|
+
result = make_command_line_safe(result)
|
200
|
+
FileList[result]
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def step_files(task_args = nil) #:nodoc:
|
205
|
+
if ENV['STEPS']
|
206
|
+
FileList[ ENV['STEPS'] ]
|
207
|
+
else
|
208
|
+
result = []
|
209
|
+
result += Array(step_list) if step_list
|
210
|
+
result += Array(FileList[step_pattern]) if step_pattern
|
211
|
+
FileList[result]
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
private
|
216
|
+
def make_command_line_safe(list)
|
217
|
+
list.map{|string| string.gsub(' ', '\ ')}
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
class FeatureTask < Task
|
222
|
+
|
223
|
+
def initialize(task_name = "feature", desc = "Run a specified feature with Cucumber. #{task_name}[feature_name]")
|
224
|
+
super(task_name, desc)
|
225
|
+
end
|
226
|
+
|
227
|
+
def define_task #:nodoc:
|
228
|
+
desc @desc
|
229
|
+
task @task_name, :feature_name do |t, args|
|
230
|
+
runner(args).run
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
def feature_files(task_arguments) #:nodoc:
|
235
|
+
FileList[File.join("features", "**", "#{task_arguments[:feature_name]}.feature")]
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'cucumber/rb_support/rb_hook'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module RbSupport
|
5
|
+
# This module defines the methods you can use to define pure Ruby
|
6
|
+
# Step Definitions and Hooks. This module is mixed into the toplevel
|
7
|
+
# object.
|
8
|
+
module RbDsl
|
9
|
+
class << self
|
10
|
+
attr_writer :rb_language
|
11
|
+
|
12
|
+
def alias_adverb(adverb)
|
13
|
+
alias_method adverb, :register_rb_step_definition
|
14
|
+
end
|
15
|
+
|
16
|
+
def build_rb_world_factory(world_modules, proc)
|
17
|
+
@rb_language.build_rb_world_factory(world_modules, proc)
|
18
|
+
end
|
19
|
+
|
20
|
+
def register_rb_hook(phase, tag_names, proc)
|
21
|
+
@rb_language.register_rb_hook(phase, tag_names, proc)
|
22
|
+
end
|
23
|
+
|
24
|
+
def register_rb_step_definition(regexp, proc)
|
25
|
+
@rb_language.register_rb_step_definition(regexp, proc)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Registers any number of +world_modules+ (Ruby Modules) and/or a Proc.
|
30
|
+
# The +proc+ will be executed once before each scenario to create an
|
31
|
+
# Object that the scenario's steps will run within. Any +world_modules+
|
32
|
+
# will be mixed into this Object (via Object#extend).
|
33
|
+
#
|
34
|
+
# This method is typically called from one or more Ruby scripts under
|
35
|
+
# <tt>features/support</tt>. You can call this method as many times as you
|
36
|
+
# like (to register more modules), but if you try to register more than
|
37
|
+
# one Proc you will get an error.
|
38
|
+
#
|
39
|
+
# Cucumber will not yield anything to the +proc+. Examples:
|
40
|
+
#
|
41
|
+
# World do
|
42
|
+
# MyClass.new
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# World(MyModule)
|
46
|
+
#
|
47
|
+
def World(*world_modules, &proc)
|
48
|
+
RbDsl.build_rb_world_factory(world_modules, proc)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Registers a proc that will run before each Scenario. You can register as
|
52
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
53
|
+
def Before(*tag_names, &proc)
|
54
|
+
RbDsl.register_rb_hook('before', tag_names, proc)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Registers a proc that will run after each Scenario. You can register as
|
58
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
59
|
+
def After(*tag_names, &proc)
|
60
|
+
RbDsl.register_rb_hook('after', tag_names, proc)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Registers a proc that will run after each Step. You can register as
|
64
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
65
|
+
def AfterStep(*tag_names, &proc)
|
66
|
+
RbDsl.register_rb_hook('after_step', tag_names, proc)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Registers a proc that will be called with a step definition argument if it
|
70
|
+
# matches the pattern passed as the first argument to Transform. Alternatively, if
|
71
|
+
# the pattern contains captures then they will be yielded as arguments to the
|
72
|
+
# provided proc. The return value of the proc is consequently yielded to the
|
73
|
+
# step definition.
|
74
|
+
def Transform(*args, &proc)
|
75
|
+
StepMother.register_transform(*args, &proc)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Registers a proc that will run after Cucumber is configured. You can register as
|
79
|
+
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
80
|
+
def AfterConfiguration(&proc)
|
81
|
+
RbDsl.register_rb_hook('after_configuration', [], proc)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Registers a new Ruby StepDefinition. This method is aliased
|
85
|
+
# to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>, and
|
86
|
+
# also to the i18n translations whenever a feature of a
|
87
|
+
# new language is loaded.
|
88
|
+
#
|
89
|
+
# The +&proc+ gets executed in the context of a <tt>World</tt>
|
90
|
+
# object, which is defined by #World. A new <tt>World</tt>
|
91
|
+
# object is created for each scenario and is shared across
|
92
|
+
# step definitions within that scenario.
|
93
|
+
def register_rb_step_definition(regexp, &proc)
|
94
|
+
RbDsl.register_rb_step_definition(regexp, proc)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
extend(Cucumber::RbSupport::RbDsl)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module RbSupport
|
3
|
+
# Wrapper for Before, After and AfterStep hooks
|
4
|
+
class RbHook
|
5
|
+
attr_reader :tag_names
|
6
|
+
|
7
|
+
def initialize(rb_language, tag_names, proc)
|
8
|
+
@rb_language = rb_language
|
9
|
+
@tag_names = tag_names
|
10
|
+
@proc = proc
|
11
|
+
end
|
12
|
+
|
13
|
+
def invoke(location, argument)
|
14
|
+
@rb_language.current_world.cucumber_instance_exec(false, location, argument, &@proc)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'cucumber/rb_support/rb_dsl'
|
2
|
+
require 'cucumber/rb_support/rb_world'
|
3
|
+
require 'cucumber/rb_support/rb_step_definition'
|
4
|
+
|
5
|
+
module Cucumber
|
6
|
+
module RbSupport
|
7
|
+
# Raised if a World block returns Nil.
|
8
|
+
class NilWorld < StandardError
|
9
|
+
def initialize
|
10
|
+
super("World procs should never return nil")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Raised if there are 2 or more World blocks.
|
15
|
+
class MultipleWorld < StandardError
|
16
|
+
def initialize(first_proc, second_proc)
|
17
|
+
message = "You can only pass a proc to #World once, but it's happening\n"
|
18
|
+
message << "in 2 places:\n\n"
|
19
|
+
message << first_proc.backtrace_line('World') << "\n"
|
20
|
+
message << second_proc.backtrace_line('World') << "\n\n"
|
21
|
+
message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
|
22
|
+
message << "or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.\n\n"
|
23
|
+
super(message)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# The Ruby implementation of the programming language API.
|
28
|
+
class RbLanguage
|
29
|
+
include LanguageSupport::LanguageMethods
|
30
|
+
attr_reader :current_world
|
31
|
+
|
32
|
+
def initialize(step_mother)
|
33
|
+
@step_mother = step_mother
|
34
|
+
RbDsl.rb_language = self
|
35
|
+
end
|
36
|
+
|
37
|
+
def alias_adverbs(adverbs)
|
38
|
+
adverbs.each do |adverb|
|
39
|
+
RbDsl.alias_adverb(adverb)
|
40
|
+
RbWorld.alias_adverb(adverb)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def step_definitions_for(code_file)
|
45
|
+
begin
|
46
|
+
load_code_file(code_file)
|
47
|
+
step_definitions
|
48
|
+
rescue LoadError => e
|
49
|
+
e.message << "\nFailed to load #{code_file}"
|
50
|
+
raise e
|
51
|
+
ensure
|
52
|
+
@step_definitions = nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def snippet_text(step_keyword, step_name, multiline_arg_class = nil)
|
57
|
+
escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
|
58
|
+
escaped = escaped.gsub(PARAM_PATTERN, ESCAPED_PARAM_PATTERN)
|
59
|
+
|
60
|
+
n = 0
|
61
|
+
block_args = escaped.scan(ESCAPED_PARAM_PATTERN).map do |a|
|
62
|
+
n += 1
|
63
|
+
"arg#{n}"
|
64
|
+
end
|
65
|
+
block_args << multiline_arg_class.default_arg_name unless multiline_arg_class.nil?
|
66
|
+
block_arg_string = block_args.empty? ? "" : " |#{block_args.join(", ")}|"
|
67
|
+
multiline_class_comment = ""
|
68
|
+
if(multiline_arg_class == Ast::Table)
|
69
|
+
multiline_class_comment = "# #{multiline_arg_class.default_arg_name} is a #{multiline_arg_class.to_s}\n "
|
70
|
+
end
|
71
|
+
|
72
|
+
"#{step_keyword} /^#{escaped}$/ do#{block_arg_string}\n #{multiline_class_comment}pending\nend"
|
73
|
+
end
|
74
|
+
|
75
|
+
def begin_rb_scenario
|
76
|
+
create_world
|
77
|
+
extend_world
|
78
|
+
connect_world
|
79
|
+
end
|
80
|
+
|
81
|
+
def register_rb_hook(phase, tag_names, proc)
|
82
|
+
add_hook(phase, RbHook.new(self, tag_names, proc))
|
83
|
+
end
|
84
|
+
|
85
|
+
def register_rb_step_definition(regexp, proc)
|
86
|
+
add_step_definition(RbStepDefinition.new(self, regexp, proc))
|
87
|
+
end
|
88
|
+
|
89
|
+
def build_rb_world_factory(world_modules, proc)
|
90
|
+
if(proc)
|
91
|
+
raise MultipleWorld.new(@world_proc, proc) if @world_proc
|
92
|
+
@world_proc = proc
|
93
|
+
end
|
94
|
+
@world_modules ||= []
|
95
|
+
@world_modules += world_modules
|
96
|
+
end
|
97
|
+
|
98
|
+
protected
|
99
|
+
|
100
|
+
def load_code_file(code_file)
|
101
|
+
require code_file # This will cause self.add_step_definition and self.add_hook to be called from RbDsl
|
102
|
+
end
|
103
|
+
|
104
|
+
def begin_scenario
|
105
|
+
begin_rb_scenario
|
106
|
+
end
|
107
|
+
|
108
|
+
def end_scenario
|
109
|
+
@current_world = nil
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
PARAM_PATTERN = /"([^\"]*)"/
|
115
|
+
ESCAPED_PARAM_PATTERN = '"([^\\"]*)"'
|
116
|
+
|
117
|
+
def create_world
|
118
|
+
if(@world_proc)
|
119
|
+
@current_world = @world_proc.call
|
120
|
+
check_nil(@current_world, @world_proc)
|
121
|
+
else
|
122
|
+
@current_world = Object.new
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def extend_world
|
127
|
+
@current_world.extend(RbWorld)
|
128
|
+
@current_world.extend(::Spec::Matchers) if defined?(::Spec::Matchers)
|
129
|
+
(@world_modules || []).each do |mod|
|
130
|
+
@current_world.extend(mod)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def connect_world
|
135
|
+
@current_world.__cucumber_step_mother = @step_mother
|
136
|
+
end
|
137
|
+
|
138
|
+
def check_nil(o, proc)
|
139
|
+
if o.nil?
|
140
|
+
begin
|
141
|
+
raise NilWorld.new
|
142
|
+
rescue NilWorld => e
|
143
|
+
e.backtrace.clear
|
144
|
+
e.backtrace.push(proc.backtrace_line("World"))
|
145
|
+
raise e
|
146
|
+
end
|
147
|
+
else
|
148
|
+
o
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'cucumber/step_match'
|
2
|
+
require 'cucumber/core_ext/string'
|
3
|
+
require 'cucumber/core_ext/proc'
|
4
|
+
|
5
|
+
module Cucumber
|
6
|
+
module RbSupport
|
7
|
+
# A Ruby Step Definition holds a Regexp and a Proc, and is created
|
8
|
+
# by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
|
9
|
+
# in the <tt>step_definitions</tt> ruby files. See also RbDsl.
|
10
|
+
#
|
11
|
+
# Example:
|
12
|
+
#
|
13
|
+
# Given /I have (\d+) cucumbers in my belly/ do
|
14
|
+
# # some code here
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
class RbStepDefinition
|
18
|
+
include LanguageSupport::StepDefinitionMethods
|
19
|
+
|
20
|
+
class MissingProc < StandardError
|
21
|
+
def message
|
22
|
+
"Step definitions must always have a proc"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :proc
|
27
|
+
|
28
|
+
def initialize(rb_language, pattern, proc)
|
29
|
+
raise MissingProc if proc.nil?
|
30
|
+
if String === pattern
|
31
|
+
p = pattern.gsub(/\$\w+/, '(.*)') # Replace $var with (.*)
|
32
|
+
pattern = Regexp.new("^#{p}$")
|
33
|
+
end
|
34
|
+
@rb_language, @regexp, @proc = rb_language, pattern, proc
|
35
|
+
end
|
36
|
+
|
37
|
+
def regexp
|
38
|
+
@regexp
|
39
|
+
end
|
40
|
+
|
41
|
+
def invoke(args)
|
42
|
+
args = args.map{|arg| Ast::PyString === arg ? arg.to_s : arg}
|
43
|
+
begin
|
44
|
+
@rb_language.current_world.cucumber_instance_exec(true, regexp.inspect, *args, &@proc)
|
45
|
+
rescue Cucumber::ArityMismatchError => e
|
46
|
+
e.backtrace.unshift(self.backtrace_line)
|
47
|
+
raise e
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def file_colon_line
|
52
|
+
@proc.file_colon_line
|
53
|
+
end
|
54
|
+
|
55
|
+
def file
|
56
|
+
@file ||= file_colon_line.split(':')[0]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|