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,93 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module RbSupport
|
3
|
+
# All steps are run in the context of an object that extends this module.
|
4
|
+
module RbWorld
|
5
|
+
class << self
|
6
|
+
def alias_adverb(adverb)
|
7
|
+
alias_method adverb, :__cucumber_invoke
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_writer :__cucumber_step_mother
|
12
|
+
|
13
|
+
# Call a step from within a step definition. This method is aliased to
|
14
|
+
# the same i18n as RbDsl.
|
15
|
+
def __cucumber_invoke(name, multiline_argument=nil) #:nodoc:
|
16
|
+
begin
|
17
|
+
step_match = @__cucumber_step_mother.step_match(name)
|
18
|
+
step_match.invoke(multiline_argument)
|
19
|
+
rescue Exception => e
|
20
|
+
e.nested! if Undefined === e
|
21
|
+
raise e
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns a Cucumber::Ast::Table for +text_or_table+, which can either
|
26
|
+
# be a String:
|
27
|
+
#
|
28
|
+
# table(%{
|
29
|
+
# | account | description | amount |
|
30
|
+
# | INT-100 | Taxi | 114 |
|
31
|
+
# | CUC-101 | Peeler | 22 |
|
32
|
+
# })
|
33
|
+
#
|
34
|
+
# or a 2D Array:
|
35
|
+
#
|
36
|
+
# table([
|
37
|
+
# %w{ account description amount },
|
38
|
+
# %w{ INT-100 Taxi 114 },
|
39
|
+
# %w{ CUC-101 Peeler 22 }
|
40
|
+
# ])
|
41
|
+
#
|
42
|
+
def table(text_or_table, file=nil, line_offset=0)
|
43
|
+
if Array === text_or_table
|
44
|
+
Ast::Table.new(text_or_table)
|
45
|
+
else
|
46
|
+
@table_parser ||= Parser::TableParser.new
|
47
|
+
@table_parser.parse_or_fail(text_or_table.strip, file, line_offset)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Output +announcement+ alongside the formatted output.
|
52
|
+
# This is an alternative to using Kernel#puts - it will display
|
53
|
+
# nicer, and in all outputs (in case you use several formatters)
|
54
|
+
#
|
55
|
+
# Beware that the output will be printed *before* the corresponding
|
56
|
+
# step. This is because the step itself will not be printed until
|
57
|
+
# after it has run, so it can be coloured according to its status.
|
58
|
+
def announce(announcement)
|
59
|
+
@__cucumber_step_mother.announce(announcement)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Mark the matched step as pending.
|
63
|
+
def pending(message = "TODO")
|
64
|
+
if block_given?
|
65
|
+
begin
|
66
|
+
yield
|
67
|
+
rescue Exception => e
|
68
|
+
raise Pending.new(message)
|
69
|
+
end
|
70
|
+
raise Pending.new("Expected pending '#{message}' to fail. No Error was raised. No longer pending?")
|
71
|
+
else
|
72
|
+
raise Pending.new(message)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# The default implementation of Object#inspect recursively
|
77
|
+
# traverses all instance variables and invokes inspect.
|
78
|
+
# This can be time consuming if the object graph is large.
|
79
|
+
#
|
80
|
+
# This can cause unnecessary delays when certain exceptions
|
81
|
+
# occur. For example, MRI internally invokes #inspect on an
|
82
|
+
# object that raises a NoMethodError. (JRuby does not do this).
|
83
|
+
#
|
84
|
+
# A World object can have many references created by the user
|
85
|
+
# or frameworks (Rails), so to avoid long waiting times on
|
86
|
+
# such errors in World we define it to just return a simple String.
|
87
|
+
#
|
88
|
+
def inspect #:nodoc:
|
89
|
+
sprintf("#<%s:0x%x>", self.class, self.object_id)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Spec #:nodoc:
|
4
|
+
module Runner #:nodoc:
|
5
|
+
# Neuters RSpec's option parser.
|
6
|
+
# (RSpec's option parser tries to parse ARGV, which
|
7
|
+
# will fail when running cucumber)
|
8
|
+
class OptionParser < ::OptionParser #:nodoc:
|
9
|
+
NEUTERED_RSPEC = Object.new
|
10
|
+
def NEUTERED_RSPEC.method_missing(m, *args); self; end
|
11
|
+
|
12
|
+
def self.method_added(m)
|
13
|
+
unless @__neutering_rspec
|
14
|
+
@__neutering_rspec = true
|
15
|
+
define_method(m) do |*a|
|
16
|
+
NEUTERED_RSPEC
|
17
|
+
end
|
18
|
+
@__neutering_rspec = false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Cucumber
|
2
|
+
class StepMatch #:nodoc:
|
3
|
+
attr_reader :step_definition, :args
|
4
|
+
|
5
|
+
def initialize(step_definition, step_name, formatted_step_name, args)
|
6
|
+
@step_definition, @step_name, @formatted_step_name, @args = step_definition, step_name, formatted_step_name, args
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
@formatted_step_name
|
11
|
+
end
|
12
|
+
|
13
|
+
def invoke(multiline_arg)
|
14
|
+
all_args = @args.dup
|
15
|
+
all_args << multiline_arg if multiline_arg
|
16
|
+
@step_definition.invoke(all_args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def format_args(format = lambda{|a| a})
|
20
|
+
@formatted_step_name || @step_definition.format_args(@step_name, format)
|
21
|
+
end
|
22
|
+
|
23
|
+
def file_colon_line
|
24
|
+
@step_definition.file_colon_line
|
25
|
+
end
|
26
|
+
|
27
|
+
def backtrace_line
|
28
|
+
@step_definition.backtrace_line
|
29
|
+
end
|
30
|
+
|
31
|
+
def text_length
|
32
|
+
@step_definition.text_length
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class NoStepMatch #:nodoc:
|
37
|
+
attr_reader :step_definition, :name
|
38
|
+
|
39
|
+
def initialize(step, name)
|
40
|
+
@step = step
|
41
|
+
@name = name
|
42
|
+
end
|
43
|
+
|
44
|
+
def format_args(format)
|
45
|
+
@name
|
46
|
+
end
|
47
|
+
|
48
|
+
def file_colon_line
|
49
|
+
raise "No file:line for #{@step}" unless @step.file_colon_line
|
50
|
+
@step.file_colon_line
|
51
|
+
end
|
52
|
+
|
53
|
+
def backtrace_line
|
54
|
+
@step.backtrace_line
|
55
|
+
end
|
56
|
+
|
57
|
+
def text_length
|
58
|
+
@step.text_length
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
require 'cucumber/constantize'
|
2
|
+
require 'cucumber/core_ext/instance_exec'
|
3
|
+
require 'cucumber/parser/natural_language'
|
4
|
+
require 'cucumber/language_support/language_methods'
|
5
|
+
require 'cucumber/language_support/step_definition_methods'
|
6
|
+
|
7
|
+
module Cucumber
|
8
|
+
# Raised when there is no matching StepDefinition for a step.
|
9
|
+
class Undefined < StandardError
|
10
|
+
attr_reader :step_name
|
11
|
+
|
12
|
+
def initialize(step_name)
|
13
|
+
super %{Undefined step: "#{step_name}"}
|
14
|
+
@step_name = step_name
|
15
|
+
end
|
16
|
+
|
17
|
+
def nested!
|
18
|
+
@nested = true
|
19
|
+
end
|
20
|
+
|
21
|
+
def nested?
|
22
|
+
@nested
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Raised when a StepDefinition's block invokes World#pending
|
27
|
+
class Pending < StandardError
|
28
|
+
end
|
29
|
+
|
30
|
+
# Raised when a step matches 2 or more StepDefinitions
|
31
|
+
class Ambiguous < StandardError
|
32
|
+
def initialize(step_name, step_definitions, used_guess)
|
33
|
+
message = "Ambiguous match of \"#{step_name}\":\n\n"
|
34
|
+
message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
|
35
|
+
message << "\n\n"
|
36
|
+
message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
|
37
|
+
super(message)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Raised when 2 or more StepDefinition have the same Regexp
|
42
|
+
class Redundant < StandardError
|
43
|
+
def initialize(step_def_1, step_def_2)
|
44
|
+
message = "Multiple step definitions have the same Regexp:\n\n"
|
45
|
+
message << step_def_1.backtrace_line << "\n"
|
46
|
+
message << step_def_2.backtrace_line << "\n\n"
|
47
|
+
super(message)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# This is the meaty part of Cucumber that ties everything together.
|
52
|
+
class StepMother
|
53
|
+
include Constantize
|
54
|
+
@@transforms = []
|
55
|
+
StepArgumentTransform = Struct.new(:pattern, :transformer)
|
56
|
+
attr_writer :options, :visitor, :log
|
57
|
+
|
58
|
+
def initialize
|
59
|
+
@unsupported_programming_languages = []
|
60
|
+
@programming_languages = []
|
61
|
+
@language_map = {}
|
62
|
+
load_natural_language('en')
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.register_transform(pattern, &transformer)
|
66
|
+
raise Cucumber::ArityMismatchError.new('Transform must be registered with at least a one-argument block') if !block_given? || transformer.arity < 1
|
67
|
+
@@transforms.unshift StepArgumentTransform.new(Regexp.new(pattern), transformer.to_proc)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.transform_arguments(step_args)
|
71
|
+
matched = nil
|
72
|
+
step_args.map do |step_arg|
|
73
|
+
if transform = @@transforms.detect {|t| matched = t.pattern.match(step_arg) if step_arg.is_a?(String) }
|
74
|
+
if matched.captures.empty?
|
75
|
+
unless transform.transformer.arity == 1
|
76
|
+
raise Cucumber::ArityMismatchError.new("Transforms without Regexp captures only accept a single argument (the step argument)")
|
77
|
+
end
|
78
|
+
transform.transformer.call(step_arg)
|
79
|
+
else
|
80
|
+
if transform.transformer.arity != matched.captures.size
|
81
|
+
raise Cucumber::ArityMismatchError.new("Number of arguments in Transform (#{transform.transformer.arity}) does not match number of Regexp captures (#{matched.captures.size})")
|
82
|
+
end
|
83
|
+
transform.transformer.call(*matched.captures)
|
84
|
+
end
|
85
|
+
else
|
86
|
+
step_arg
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def load_plain_text_features(feature_files)
|
92
|
+
features = Ast::Features.new
|
93
|
+
|
94
|
+
log.debug("Features:\n")
|
95
|
+
feature_files.each do |f|
|
96
|
+
feature_file = FeatureFile.new(f)
|
97
|
+
feature = feature_file.parse(self, options)
|
98
|
+
if feature
|
99
|
+
features.add_feature(feature)
|
100
|
+
log.debug(" * #{f}\n")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
log.debug("\n")
|
104
|
+
features
|
105
|
+
end
|
106
|
+
|
107
|
+
def load_code_files(step_def_files)
|
108
|
+
log.debug("Code:\n")
|
109
|
+
step_def_files.each do |step_def_file|
|
110
|
+
load_code_file(step_def_file)
|
111
|
+
end
|
112
|
+
log.debug("\n")
|
113
|
+
end
|
114
|
+
|
115
|
+
def load_code_file(step_def_file)
|
116
|
+
if programming_language = programming_language_for(step_def_file)
|
117
|
+
log.debug(" * #{step_def_file}\n")
|
118
|
+
step_definitions = programming_language.step_definitions_for(step_def_file)
|
119
|
+
register_step_definitions(step_definitions)
|
120
|
+
else
|
121
|
+
log.debug(" * #{step_def_file} [NOT SUPPORTED]\n")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def register_step_definitions(step_definitions)
|
126
|
+
step_definitions.each{|step_definition| register_step_definition(step_definition)}
|
127
|
+
end
|
128
|
+
|
129
|
+
# Loads and registers programming language implementation.
|
130
|
+
# Instances are cached, so calling with the same argument
|
131
|
+
# twice will return the same instance.
|
132
|
+
#
|
133
|
+
def load_programming_language(ext)
|
134
|
+
return @language_map[ext] if @language_map[ext]
|
135
|
+
programming_language_class = constantize("Cucumber::#{ext.capitalize}Support::#{ext.capitalize}Language")
|
136
|
+
programming_language = programming_language_class.new(self)
|
137
|
+
programming_language.alias_adverbs(@adverbs || [])
|
138
|
+
@programming_languages << programming_language
|
139
|
+
@language_map[ext] = programming_language
|
140
|
+
programming_language
|
141
|
+
end
|
142
|
+
|
143
|
+
# Loads a natural language. This has the effect of aliasing
|
144
|
+
# Step Definition keywords for all of the registered programming
|
145
|
+
# languages (if they support aliasing). See #load_programming_language
|
146
|
+
#
|
147
|
+
def load_natural_language(lang)
|
148
|
+
Parser::NaturalLanguage.get(self, lang)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Returns the options passed on the command line.
|
152
|
+
def options
|
153
|
+
@options ||= {}
|
154
|
+
end
|
155
|
+
|
156
|
+
def step_visited(step) #:nodoc:
|
157
|
+
steps << step unless steps.index(step)
|
158
|
+
end
|
159
|
+
|
160
|
+
def steps(status = nil) #:nodoc:
|
161
|
+
@steps ||= []
|
162
|
+
if(status)
|
163
|
+
@steps.select{|step| step.status == status}
|
164
|
+
else
|
165
|
+
@steps
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def announce(msg) #:nodoc:
|
170
|
+
@visitor.announce(msg)
|
171
|
+
end
|
172
|
+
|
173
|
+
def scenarios(status = nil) #:nodoc:
|
174
|
+
@scenarios ||= []
|
175
|
+
if(status)
|
176
|
+
@scenarios.select{|scenario| scenario.status == status}
|
177
|
+
else
|
178
|
+
@scenarios
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def step_match(step_name, formatted_step_name=nil) #:nodoc:
|
183
|
+
matches = step_definitions.map { |d| d.step_match(step_name, formatted_step_name) }.compact
|
184
|
+
raise Undefined.new(step_name) if matches.empty?
|
185
|
+
matches = best_matches(step_name, matches) if matches.size > 1 && options[:guess]
|
186
|
+
raise Ambiguous.new(step_name, matches, options[:guess]) if matches.size > 1
|
187
|
+
matches[0]
|
188
|
+
end
|
189
|
+
|
190
|
+
def best_matches(step_name, step_matches) #:nodoc:
|
191
|
+
no_groups = step_matches.select {|step_match| step_match.args.length == 0}
|
192
|
+
max_arg_length = step_matches.map {|step_match| step_match.args.length }.max
|
193
|
+
top_groups = step_matches.select {|step_match| step_match.args.length == max_arg_length }
|
194
|
+
|
195
|
+
if no_groups.any?
|
196
|
+
longest_regexp_length = no_groups.map {|step_match| step_match.text_length }.max
|
197
|
+
no_groups.select {|step_match| step_match.text_length == longest_regexp_length }
|
198
|
+
elsif top_groups.any?
|
199
|
+
shortest_capture_length = top_groups.map {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } }.min
|
200
|
+
top_groups.select {|step_match| step_match.args.inject(0) {|sum, c| sum + c.length } == shortest_capture_length }
|
201
|
+
else
|
202
|
+
top_groups
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def clear! #:nodoc:
|
207
|
+
step_definitions.clear
|
208
|
+
hooks.clear
|
209
|
+
steps.clear
|
210
|
+
scenarios.clear
|
211
|
+
end
|
212
|
+
|
213
|
+
def step_definitions #:nodoc:
|
214
|
+
@step_definitions ||= []
|
215
|
+
end
|
216
|
+
|
217
|
+
def snippet_text(step_keyword, step_name, multiline_arg_class) #:nodoc:
|
218
|
+
@programming_languages.map do |programming_language|
|
219
|
+
programming_language.snippet_text(step_keyword, step_name, multiline_arg_class)
|
220
|
+
end.join("\n")
|
221
|
+
end
|
222
|
+
|
223
|
+
def before_and_after(scenario, skip_hooks=false) #:nodoc:
|
224
|
+
before(scenario) unless skip_hooks
|
225
|
+
yield scenario
|
226
|
+
after(scenario) unless skip_hooks
|
227
|
+
scenario_visited(scenario)
|
228
|
+
end
|
229
|
+
|
230
|
+
def register_adverbs(adverbs) #:nodoc:
|
231
|
+
@adverbs ||= []
|
232
|
+
@adverbs += adverbs
|
233
|
+
@adverbs.uniq!
|
234
|
+
@programming_languages.each do |programming_language|
|
235
|
+
programming_language.alias_adverbs(@adverbs)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def before(scenario) #:nodoc:
|
240
|
+
return if options[:dry_run] || @current_scenario
|
241
|
+
@current_scenario = scenario
|
242
|
+
@programming_languages.each do |programming_language|
|
243
|
+
programming_language.before(scenario)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def after(scenario) #:nodoc:
|
248
|
+
@current_scenario = nil
|
249
|
+
return if options[:dry_run]
|
250
|
+
@programming_languages.each do |programming_language|
|
251
|
+
programming_language.after(scenario)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def after_step #:nodoc:
|
256
|
+
return if options[:dry_run]
|
257
|
+
@programming_languages.each do |programming_language|
|
258
|
+
programming_language.execute_after_step(@current_scenario)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
def after_configuration(configuration) #:nodoc
|
263
|
+
@programming_languages.each do |programming_language|
|
264
|
+
programming_language.after_configuration(configuration)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
private
|
269
|
+
|
270
|
+
# Registers a StepDefinition. This can be a Ruby StepDefintion,
|
271
|
+
# or any other kind of object that implements the StepDefintion
|
272
|
+
# contract (API).
|
273
|
+
def register_step_definition(step_definition)
|
274
|
+
step_definitions.each do |already|
|
275
|
+
raise Redundant.new(already, step_definition) if already.same_regexp?(step_definition.regexp)
|
276
|
+
end
|
277
|
+
step_definitions << step_definition
|
278
|
+
step_definition
|
279
|
+
end
|
280
|
+
|
281
|
+
def programming_language_for(step_def_file) #:nodoc:
|
282
|
+
if ext = File.extname(step_def_file)[1..-1]
|
283
|
+
return nil if @unsupported_programming_languages.index(ext)
|
284
|
+
begin
|
285
|
+
load_programming_language(ext)
|
286
|
+
rescue LoadError
|
287
|
+
@unsupported_programming_languages << ext
|
288
|
+
nil
|
289
|
+
end
|
290
|
+
else
|
291
|
+
nil
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
def max_step_definition_length #:nodoc:
|
296
|
+
@max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
|
297
|
+
end
|
298
|
+
|
299
|
+
def scenario_visited(scenario) #:nodoc:
|
300
|
+
scenarios << scenario unless scenarios.index(scenario)
|
301
|
+
end
|
302
|
+
|
303
|
+
def log
|
304
|
+
@log ||= Logger.new(STDOUT)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Webrat
|
2
|
+
class Element
|
3
|
+
# Returns an Array of Array of String where each String is a
|
4
|
+
# "cell" in the table-like structure represented by this Element.
|
5
|
+
#
|
6
|
+
# Supported elements are table, dl, ol and ul. Different conversion
|
7
|
+
# strategies are used depending on the kind of element:
|
8
|
+
#
|
9
|
+
# * table : Each tr becomes a row. The innerHTML of each td or th inside becomes a cell. The number
|
10
|
+
# of columns is determined by the number of cells in the first row.
|
11
|
+
# * dl : Each dt becomes a row with 2 cells. The innerHTML of the dt itself and the next dd become cells.
|
12
|
+
# * ul or ol : Each li becomes a row with one cell, the innerHTML of the li.
|
13
|
+
#
|
14
|
+
def to_table
|
15
|
+
case element.name
|
16
|
+
when 'table'
|
17
|
+
table_from_table
|
18
|
+
when 'dl'
|
19
|
+
table_from_dl
|
20
|
+
when /ul|ol/
|
21
|
+
table_from_list
|
22
|
+
else
|
23
|
+
raise "#to_table not supported for #{element.name} elements"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def table_from_table #:nodoc:
|
28
|
+
col_count = nil
|
29
|
+
Webrat::XML.css_search(element, 'tr').map do |row|
|
30
|
+
cols = Webrat::XML.css_search(row, 'th,td')
|
31
|
+
col_count ||= cols.length
|
32
|
+
cols[0...col_count].map do |col|
|
33
|
+
col.inner_html
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def table_from_dl #:nodoc:
|
39
|
+
Webrat::XML.css_search(@element, 'dt').map do |dt|
|
40
|
+
next_node = dt.next_sibling
|
41
|
+
while next_node.name != 'dd'
|
42
|
+
next_node = next_node.next_sibling
|
43
|
+
end
|
44
|
+
[dt.inner_html, next_node.inner_html]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def table_from_list #:nodoc:
|
49
|
+
Webrat::XML.css_search(@element, 'li').map do |li|
|
50
|
+
[li.inner_html]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
alias to_a to_table # Backwards compatibility with Cucumber
|
55
|
+
end
|
56
|
+
|
57
|
+
module Locators
|
58
|
+
class ElementLocator < Locator #:nodoc:
|
59
|
+
def locate
|
60
|
+
Element.load(@session, table_element)
|
61
|
+
end
|
62
|
+
|
63
|
+
def table_element
|
64
|
+
Webrat::XML.css_search(@dom, @value)[0]
|
65
|
+
end
|
66
|
+
|
67
|
+
def error_message
|
68
|
+
"Could not find anything matching '#{@value}'"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns a Webrat DOM element located by +css_selector+.
|
73
|
+
def element_at(css_selector)
|
74
|
+
ElementLocator.new(@session, dom, css_selector).locate!
|
75
|
+
end
|
76
|
+
|
77
|
+
alias table_at element_at # Backwards compatibility with Cucumber
|
78
|
+
end
|
79
|
+
|
80
|
+
module Methods #:nodoc:
|
81
|
+
delegate_to_session :element_at, :table_at
|
82
|
+
end
|
83
|
+
|
84
|
+
class Session #:nodoc:
|
85
|
+
def_delegators :current_scope, :element_at, :table_at
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'cucumber/webrat/element_locator'
|
data/lib/cucumber.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'cucumber/platform'
|
6
|
+
require 'cucumber/parser'
|
7
|
+
require 'cucumber/version'
|
8
|
+
require 'cucumber/step_mother'
|
9
|
+
require 'cucumber/cli/main'
|
10
|
+
require 'cucumber/broadcaster'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Description:
|
2
|
+
Sets up Cucumber in your Rails project. After running this generator you will
|
3
|
+
get a new rake task called features.
|
4
|
+
|
5
|
+
This also generates the necessary files in the features directory.
|
6
|
+
|
7
|
+
Also see the feature generator, which you can use to generate skeletons
|
8
|
+
for new features.
|
9
|
+
|
10
|
+
Examples:
|
11
|
+
`./script/generate cucumber`
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require 'cucumber/version'
|
3
|
+
|
4
|
+
# This generator bootstraps a Rails project for use with Cucumber
|
5
|
+
class CucumberGenerator < Rails::Generator::Base
|
6
|
+
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
7
|
+
Config::CONFIG['ruby_install_name'])
|
8
|
+
|
9
|
+
attr_accessor :framework
|
10
|
+
|
11
|
+
def manifest
|
12
|
+
record do |m|
|
13
|
+
m.directory 'features/step_definitions'
|
14
|
+
m.template 'webrat_steps.rb', 'features/step_definitions/webrat_steps.rb'
|
15
|
+
m.template 'cucumber_environment.rb', 'config/environments/cucumber.rb',
|
16
|
+
:assigns => { :cucumber_version => ::Cucumber::VERSION::STRING }
|
17
|
+
|
18
|
+
m.gsub_file 'config/database.yml', /test:.*\n/, "test: &TEST\n"
|
19
|
+
m.gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *TEST"
|
20
|
+
|
21
|
+
m.directory 'features/support'
|
22
|
+
|
23
|
+
if spork?
|
24
|
+
m.template 'spork_env.rb', 'features/support/env.rb'
|
25
|
+
else
|
26
|
+
m.template 'env.rb', 'features/support/env.rb'
|
27
|
+
end
|
28
|
+
|
29
|
+
m.file 'paths.rb', 'features/support/paths.rb'
|
30
|
+
|
31
|
+
m.directory 'lib/tasks'
|
32
|
+
m.template 'cucumber.rake', 'lib/tasks/cucumber.rake'
|
33
|
+
|
34
|
+
m.file 'cucumber', 'script/cucumber', {
|
35
|
+
:chmod => 0755, :shebang => options[:shebang] == DEFAULT_SHEBANG ? nil : options[:shebang]
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def framework
|
41
|
+
options[:framework] || :rspec
|
42
|
+
end
|
43
|
+
|
44
|
+
def spork?
|
45
|
+
options[:spork]
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
def banner
|
51
|
+
"Usage: #{$0} cucumber"
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_options!(opt)
|
55
|
+
opt.separator ''
|
56
|
+
opt.separator 'Options:'
|
57
|
+
opt.on('--rspec', 'Setup cucumber for use with RSpec (default)') do |value|
|
58
|
+
options[:framework] = :rspec
|
59
|
+
end
|
60
|
+
|
61
|
+
opt.on('--testunit', 'Setup cucumber for use with test/unit') do |value|
|
62
|
+
options[:framework] = :testunit
|
63
|
+
end
|
64
|
+
|
65
|
+
opt.on('--spork', 'Setup cucumber for use with Spork') do |value|
|
66
|
+
options[:spork] = true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|