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,178 @@
|
|
1
|
+
Feature: Rake task
|
2
|
+
In order to ease the development process
|
3
|
+
As a developer and CI server administrator
|
4
|
+
Cucumber features should be executable via Rake
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a standard Cucumber project directory structure
|
8
|
+
And a file named "features/missing_step_definitions.feature" with:
|
9
|
+
"""
|
10
|
+
Feature: Sample
|
11
|
+
|
12
|
+
Scenario: Wanted
|
13
|
+
Given I want to run this
|
14
|
+
|
15
|
+
Scenario: Unwanted
|
16
|
+
Given I don't want this ran
|
17
|
+
"""
|
18
|
+
|
19
|
+
|
20
|
+
Scenario: rake task with a defined profile
|
21
|
+
Given the following profile is defined:
|
22
|
+
"""
|
23
|
+
foo: --quiet --no-color features/missing_step_definitions.feature:3
|
24
|
+
"""
|
25
|
+
And a file named "Rakefile" with:
|
26
|
+
"""
|
27
|
+
$LOAD_PATH.unshift(CUCUMBER_LIB)
|
28
|
+
require 'cucumber/rake/task'
|
29
|
+
|
30
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
31
|
+
t.profile = "foo"
|
32
|
+
end
|
33
|
+
"""
|
34
|
+
When I run rake features
|
35
|
+
Then it should pass
|
36
|
+
And the output should contain
|
37
|
+
"""
|
38
|
+
Feature: Sample
|
39
|
+
|
40
|
+
Scenario: Wanted
|
41
|
+
Given I want to run this
|
42
|
+
|
43
|
+
1 scenario (1 undefined)
|
44
|
+
1 step (1 undefined)
|
45
|
+
"""
|
46
|
+
|
47
|
+
Scenario: rake task with a defined profile and cucumber_opts
|
48
|
+
Given the following profile is defined:
|
49
|
+
"""
|
50
|
+
bar: ['features/missing_step_definitions.feature:3']
|
51
|
+
"""
|
52
|
+
And a file named "Rakefile" with:
|
53
|
+
"""
|
54
|
+
$LOAD_PATH.unshift(CUCUMBER_LIB)
|
55
|
+
require 'cucumber/rake/task'
|
56
|
+
|
57
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
58
|
+
t.profile = "bar"
|
59
|
+
t.cucumber_opts = %w{--quiet --no-color}
|
60
|
+
end
|
61
|
+
"""
|
62
|
+
When I run rake features
|
63
|
+
Then it should pass
|
64
|
+
And the output should contain
|
65
|
+
"""
|
66
|
+
Feature: Sample
|
67
|
+
|
68
|
+
Scenario: Wanted
|
69
|
+
Given I want to run this
|
70
|
+
|
71
|
+
1 scenario (1 undefined)
|
72
|
+
1 step (1 undefined)
|
73
|
+
"""
|
74
|
+
|
75
|
+
Scenario: rake task with a defined profile and feature list
|
76
|
+
Given a file named "features/the_one_i_want_to_run.feature" with:
|
77
|
+
"""
|
78
|
+
Feature: Desired
|
79
|
+
|
80
|
+
Scenario: Something
|
81
|
+
Given this is missing
|
82
|
+
"""
|
83
|
+
Given the following profile is defined:
|
84
|
+
"""
|
85
|
+
baz: ['--quiet', '--no-color']
|
86
|
+
"""
|
87
|
+
And a file named "Rakefile" with:
|
88
|
+
"""
|
89
|
+
$LOAD_PATH.unshift(CUCUMBER_LIB)
|
90
|
+
require 'cucumber/rake/task'
|
91
|
+
|
92
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
93
|
+
t.profile = "baz"
|
94
|
+
t.feature_list = ['features/the_one_i_want_to_run.feature']
|
95
|
+
end
|
96
|
+
"""
|
97
|
+
When I run rake features
|
98
|
+
Then it should pass
|
99
|
+
And the output should contain
|
100
|
+
"""
|
101
|
+
Feature: Desired
|
102
|
+
|
103
|
+
Scenario: Something
|
104
|
+
Given this is missing
|
105
|
+
|
106
|
+
1 scenario (1 undefined)
|
107
|
+
1 step (1 undefined)
|
108
|
+
"""
|
109
|
+
|
110
|
+
Scenario: deprecation warnings
|
111
|
+
Given a file named "Rakefile" with:
|
112
|
+
"""
|
113
|
+
$LOAD_PATH.unshift(CUCUMBER_LIB)
|
114
|
+
require 'cucumber/rake/task'
|
115
|
+
|
116
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
117
|
+
t.feature_list = ['features/missing_step_definitions.feature']
|
118
|
+
end
|
119
|
+
"""
|
120
|
+
When I run rake features
|
121
|
+
Then it should pass
|
122
|
+
And STDERR should match
|
123
|
+
"""
|
124
|
+
Cucumber::Rake::Task#feature_list 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
|
125
|
+
"""
|
126
|
+
|
127
|
+
Scenario: respect requires
|
128
|
+
Given a file named "features/support/env.rb"
|
129
|
+
And a file named "features/support/dont_require_me.rb"
|
130
|
+
And the following profile is defined:
|
131
|
+
"""
|
132
|
+
no_bomb: features/missing_step_definitions.feature:3 --require features/support/env.rb --verbose
|
133
|
+
"""
|
134
|
+
And a file named "Rakefile" with:
|
135
|
+
"""
|
136
|
+
$LOAD_PATH.unshift(CUCUMBER_LIB)
|
137
|
+
require 'cucumber/rake/task'
|
138
|
+
|
139
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
140
|
+
t.profile = "no_bomb"
|
141
|
+
t.cucumber_opts = %w{--quiet --no-color}
|
142
|
+
end
|
143
|
+
"""
|
144
|
+
|
145
|
+
When I run rake features
|
146
|
+
Then it should pass
|
147
|
+
And the output should not contain
|
148
|
+
"""
|
149
|
+
* features/support/dont_require_me.rb
|
150
|
+
"""
|
151
|
+
|
152
|
+
Scenario: feature files with spaces
|
153
|
+
Given a file named "features/spaces are nasty.feature" with:
|
154
|
+
"""
|
155
|
+
Feature: The futures green
|
156
|
+
|
157
|
+
Scenario: Orange
|
158
|
+
Given this is missing
|
159
|
+
"""
|
160
|
+
And a file named "Rakefile" with:
|
161
|
+
"""
|
162
|
+
$LOAD_PATH.unshift(CUCUMBER_LIB)
|
163
|
+
require 'cucumber/rake/task'
|
164
|
+
|
165
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
166
|
+
t.cucumber_opts = %w{--quiet --no-color}
|
167
|
+
end
|
168
|
+
"""
|
169
|
+
When I run rake features
|
170
|
+
Then it should pass
|
171
|
+
And the output should contain
|
172
|
+
"""
|
173
|
+
Feature: The futures green
|
174
|
+
|
175
|
+
Scenario: Orange
|
176
|
+
Given this is missing
|
177
|
+
|
178
|
+
"""
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Feature: Cucumber command line
|
2
|
+
In order to find out what step definitions need to be implemented
|
3
|
+
Developers should always see what step definition is missing
|
4
|
+
|
5
|
+
@mri186
|
6
|
+
Scenario: Get info at arbitrary levels of nesting
|
7
|
+
When I run cucumber features/call_undefined_step_from_step_def.feature
|
8
|
+
Then it should pass with
|
9
|
+
"""
|
10
|
+
Feature: Calling undefined step
|
11
|
+
|
12
|
+
Scenario: Call directly # features/call_undefined_step_from_step_def.feature:3
|
13
|
+
Given a step definition that calls an undefined step # features/step_definitions/sample_steps.rb:19
|
14
|
+
Undefined step: "this does not exist" (Cucumber::Undefined)
|
15
|
+
./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
|
16
|
+
features/call_undefined_step_from_step_def.feature:4:in `Given a step definition that calls an undefined step'
|
17
|
+
|
18
|
+
Scenario: Call via another # features/call_undefined_step_from_step_def.feature:6
|
19
|
+
Given call step "a step definition that calls an undefined step" # features/step_definitions/sample_steps.rb:23
|
20
|
+
Undefined step: "this does not exist" (Cucumber::Undefined)
|
21
|
+
./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
|
22
|
+
features/call_undefined_step_from_step_def.feature:7:in `Given call step "a step definition that calls an undefined step"'
|
23
|
+
|
24
|
+
2 scenarios (2 undefined)
|
25
|
+
2 steps (2 undefined)
|
26
|
+
|
27
|
+
You can implement step definitions for undefined steps with these snippets:
|
28
|
+
|
29
|
+
Given /^this does not exist$/ do
|
30
|
+
pending
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
"""
|
35
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Feature: Snippets
|
2
|
+
In order to help speed up writing step definitions
|
3
|
+
As a feature editor
|
4
|
+
I want snippet suggestions for undefined step definitions
|
5
|
+
|
6
|
+
Scenario: Snippet for undefined step with a pystring
|
7
|
+
When I run cucumber features/undefined_multiline_args.feature:3 -s
|
8
|
+
Then the output should contain
|
9
|
+
"""
|
10
|
+
Given /^a pystring$/ do |string|
|
11
|
+
pending
|
12
|
+
end
|
13
|
+
"""
|
14
|
+
Scenario: Snippet for undefined step with a step table
|
15
|
+
When I run cucumber features/undefined_multiline_args.feature:9 -s
|
16
|
+
Then the output should contain
|
17
|
+
"""
|
18
|
+
Given /^a table$/ do |table|
|
19
|
+
# table is a Cucumber::Ast::Table
|
20
|
+
pending
|
21
|
+
end
|
22
|
+
"""
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
Given /^I am in (.*)$/ do |example_dir_relative_path|
|
4
|
+
@current_dir = examples_dir(example_dir_relative_path)
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^a standard Cucumber project directory structure$/ do
|
8
|
+
@current_dir = working_dir
|
9
|
+
in_current_dir do
|
10
|
+
FileUtils.mkdir_p 'features/support'
|
11
|
+
FileUtils.mkdir 'features/step_definitions'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Given /^the (.*) directory is empty$/ do |directory|
|
16
|
+
in_current_dir do
|
17
|
+
FileUtils.remove_dir(directory) rescue nil
|
18
|
+
FileUtils.mkdir 'tmp'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Given /^a file named "([^\"]*)"$/ do |file_name|
|
23
|
+
create_file(file_name, '')
|
24
|
+
end
|
25
|
+
|
26
|
+
Given /^a file named "([^\"]*)" with:$/ do |file_name, file_content|
|
27
|
+
create_file(file_name, file_content)
|
28
|
+
end
|
29
|
+
|
30
|
+
Given /^the following profiles? (?:are|is) defined:$/ do |profiles|
|
31
|
+
create_file('cucumber.yml', profiles)
|
32
|
+
end
|
33
|
+
|
34
|
+
Given /^I am running spork in the background$/ do
|
35
|
+
run_spork_in_background
|
36
|
+
end
|
37
|
+
|
38
|
+
Given /^I am running spork in the background on port (\d+)$/ do |port|
|
39
|
+
run_spork_in_background(port.to_i)
|
40
|
+
end
|
41
|
+
|
42
|
+
Given /^I am not running (?:.*) in the background$/ do
|
43
|
+
# no-op
|
44
|
+
end
|
45
|
+
|
46
|
+
Given /^I have environment variable (\w+) set to "([^\"]*)"$/ do |variable, value|
|
47
|
+
set_env_var(variable, value)
|
48
|
+
end
|
49
|
+
|
50
|
+
When /^I run cucumber (.*)$/ do |cucumber_opts|
|
51
|
+
run "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cucumber_opts}"
|
52
|
+
end
|
53
|
+
|
54
|
+
When /^I run rake (.*)$/ do |rake_opts|
|
55
|
+
run "rake #{rake_opts} --trace"
|
56
|
+
end
|
57
|
+
|
58
|
+
Then /^it should (fail|pass)$/ do |success|
|
59
|
+
if success == 'fail'
|
60
|
+
last_exit_status.should_not == 0
|
61
|
+
else
|
62
|
+
if last_exit_status != 0
|
63
|
+
raise "Failed with exit status #{last_exit_status}\nSTDOUT:\n#{last_stdout}\nSTDERR:\n#{last_stderr}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Then /^it should (fail|pass) with$/ do |success, output|
|
69
|
+
last_stdout.should == output
|
70
|
+
Then("it should #{success}")
|
71
|
+
end
|
72
|
+
|
73
|
+
Then /^the output should contain$/ do |text|
|
74
|
+
last_stdout.should include(text)
|
75
|
+
end
|
76
|
+
|
77
|
+
Then /^the output should not contain$/ do |text|
|
78
|
+
last_stdout.should_not include(text)
|
79
|
+
end
|
80
|
+
|
81
|
+
Then /^the output should be$/ do |text|
|
82
|
+
last_stdout.should == text
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
Then /^"([^\"]*)" should contain$/ do |file, text|
|
87
|
+
strip_duration(IO.read(file)).should == text
|
88
|
+
end
|
89
|
+
|
90
|
+
Then /^"([^\"]*)" with junit duration "([^\"]*)" should contain$/ do |actual_file, duration_replacement, text|
|
91
|
+
actual = IO.read(actual_file)
|
92
|
+
actual = replace_junit_duration(actual, duration_replacement)
|
93
|
+
actual = strip_ruby186_extra_trace(actual)
|
94
|
+
actual.should == text
|
95
|
+
end
|
96
|
+
|
97
|
+
Then /^"([^\"]*)" should match "([^\"]*)"$/ do |file, text|
|
98
|
+
IO.read(file).should =~ Regexp.new(text)
|
99
|
+
end
|
100
|
+
|
101
|
+
Then /^"([^\"]*)" should have the same contents as "([^\"]*)"$/ do |actual_file, expected_file|
|
102
|
+
actual = IO.read(actual_file)
|
103
|
+
actual = replace_duration(actual, '0m30.005s')
|
104
|
+
# Comment out to replace expected file. Use with care!
|
105
|
+
File.open(expected_file, "w") {|io| io.write(actual)}
|
106
|
+
actual.should == IO.read(expected_file)
|
107
|
+
end
|
108
|
+
|
109
|
+
Then /^STDERR should match$/ do |text|
|
110
|
+
last_stderr.should =~ /#{text}/
|
111
|
+
end
|
112
|
+
|
113
|
+
Then /^STDERR should not match$/ do |text|
|
114
|
+
last_stderr.should_not =~ /#{text}/
|
115
|
+
end
|
116
|
+
|
117
|
+
Then /^STDERR should be$/ do |text|
|
118
|
+
last_stderr.should == text
|
119
|
+
end
|
120
|
+
|
121
|
+
Then /^STDERR should be empty$/ do
|
122
|
+
last_stderr.should == ""
|
123
|
+
end
|
124
|
+
|
125
|
+
Then /^"([^\"]*)" should exist$/ do |file|
|
126
|
+
File.exists?(file).should be_true
|
127
|
+
FileUtils.rm(file)
|
128
|
+
end
|
129
|
+
|
130
|
+
Then /^"([^\"]*)" should not be required$/ do |file_name|
|
131
|
+
last_stdout.should_not include("* #{file_name}")
|
132
|
+
end
|
133
|
+
|
134
|
+
Then /^"([^\"]*)" should be required$/ do |file_name|
|
135
|
+
last_stdout.should include("* #{file_name}")
|
136
|
+
end
|
137
|
+
|
138
|
+
Then /^exactly these files should be loaded:\s*(.*)$/ do |files|
|
139
|
+
last_stdout.scan(/^ \* (.*\.rb)$/).flatten.should == files.split(/,\s+/)
|
140
|
+
end
|
141
|
+
|
142
|
+
Then /^exactly these features should be ran:\s*(.*)$/ do |files|
|
143
|
+
last_stdout.scan(/^ \* (.*\.feature)$/).flatten.should == files.split(/,\s+/)
|
144
|
+
end
|
145
|
+
|
146
|
+
Then /^the (.*) profile should be used$/ do |profile|
|
147
|
+
last_stdout.should =~ /Using the #{profile} profile/
|
148
|
+
end
|
149
|
+
|
150
|
+
Then /^print output$/ do
|
151
|
+
puts last_stdout
|
152
|
+
end
|
153
|
+
|
154
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Feature: --formatter steps option - Steps Formatter
|
2
|
+
In order to easily see which steps are already defined,
|
3
|
+
specially when using 3rd party steps libraries,
|
4
|
+
Cucumber should show the available steps in a user-friendly format
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I am in steps_library
|
8
|
+
|
9
|
+
Scenario: Printing steps
|
10
|
+
When I run cucumber -f steps features
|
11
|
+
Then it should pass with
|
12
|
+
"""
|
13
|
+
features/step_definitions/steps_lib1.rb
|
14
|
+
/^I defined a first step$/ # features/step_definitions/steps_lib1.rb:1
|
15
|
+
/^I define a second step$/ # features/step_definitions/steps_lib1.rb:4
|
16
|
+
/^I should also have a third step$/ # features/step_definitions/steps_lib1.rb:7
|
17
|
+
|
18
|
+
features/step_definitions/steps_lib2.rb
|
19
|
+
/^I defined a step 4$/ # features/step_definitions/steps_lib2.rb:1
|
20
|
+
/^I create a step 5$/ # features/step_definitions/steps_lib2.rb:4
|
21
|
+
/^I should be too tired for step 6$/ # features/step_definitions/steps_lib2.rb:7
|
22
|
+
|
23
|
+
6 step definition(s) in 2 source file(s).
|
24
|
+
|
25
|
+
"""
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'spec/expectations'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'forwardable'
|
6
|
+
begin
|
7
|
+
require 'spork'
|
8
|
+
rescue Gem::LoadError => ex
|
9
|
+
gem 'spork', '>= 0.5.9' # Ensure correct spork version number to avoid false-negatives.
|
10
|
+
end
|
11
|
+
|
12
|
+
class CucumberWorld
|
13
|
+
extend Forwardable
|
14
|
+
def_delegators CucumberWorld, :examples_dir, :self_test_dir, :working_dir, :cucumber_lib_dir
|
15
|
+
|
16
|
+
def self.examples_dir(subdir=nil)
|
17
|
+
@examples_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '../../examples'))
|
18
|
+
subdir ? File.join(@examples_dir, subdir) : @examples_dir
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.self_test_dir
|
22
|
+
@self_test_dir ||= examples_dir('self_test')
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.working_dir
|
26
|
+
@working_dir ||= examples_dir('self_test/tmp')
|
27
|
+
end
|
28
|
+
|
29
|
+
def cucumber_lib_dir
|
30
|
+
@cucumber_lib_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize
|
34
|
+
@current_dir = self_test_dir
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
attr_reader :last_exit_status, :last_stderr
|
39
|
+
|
40
|
+
# The last standard out, with the duration line taken out (unpredictable)
|
41
|
+
def last_stdout
|
42
|
+
strip_duration(@last_stdout)
|
43
|
+
end
|
44
|
+
|
45
|
+
def strip_duration(s)
|
46
|
+
s.gsub(/^\d+m\d+\.\d+s\n/m, "")
|
47
|
+
end
|
48
|
+
|
49
|
+
def replace_duration(s, replacement)
|
50
|
+
s.gsub(/\d+m\d+\.\d+s/m, replacement)
|
51
|
+
end
|
52
|
+
|
53
|
+
def replace_junit_duration(s, replacement)
|
54
|
+
s.gsub(/\d+\.\d\d+/m, replacement)
|
55
|
+
end
|
56
|
+
|
57
|
+
def strip_ruby186_extra_trace(s)
|
58
|
+
s.gsub(/^.*\.\/features\/step_definitions(.*)\n/, "")
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_file(file_name, file_content)
|
62
|
+
file_content.gsub!("CUCUMBER_LIB", "'#{cucumber_lib_dir}'") # Some files, such as Rakefiles need to use the lib dir
|
63
|
+
in_current_dir do
|
64
|
+
File.open(file_name, 'w') { |f| f << file_content }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_env_var(variable, value)
|
69
|
+
@original_env_vars ||= {}
|
70
|
+
@original_env_vars[variable] = ENV[variable]
|
71
|
+
ENV[variable] = value
|
72
|
+
end
|
73
|
+
|
74
|
+
def background_jobs
|
75
|
+
@background_jobs ||= []
|
76
|
+
end
|
77
|
+
|
78
|
+
def in_current_dir(&block)
|
79
|
+
Dir.chdir(@current_dir, &block)
|
80
|
+
end
|
81
|
+
|
82
|
+
def run(command)
|
83
|
+
stderr_file = Tempfile.new('cucumber')
|
84
|
+
stderr_file.close
|
85
|
+
in_current_dir do
|
86
|
+
@last_stdout = `#{command} 2> #{stderr_file.path}`
|
87
|
+
mode = Cucumber::RUBY_1_9 ? {:external_encoding=>"UTF-8"} : 'r'
|
88
|
+
IO.popen("#{command} 2> #{stderr_file.path}", mode) do |io|
|
89
|
+
@last_stdout = io.read
|
90
|
+
end
|
91
|
+
|
92
|
+
@last_exit_status = $?.exitstatus
|
93
|
+
end
|
94
|
+
@last_stderr = IO.read(stderr_file.path)
|
95
|
+
end
|
96
|
+
|
97
|
+
def run_spork_in_background(port = nil)
|
98
|
+
pid = fork
|
99
|
+
in_current_dir do
|
100
|
+
if pid
|
101
|
+
background_jobs << pid
|
102
|
+
else
|
103
|
+
# STDOUT.close
|
104
|
+
# STDERR.close
|
105
|
+
port_arg = port ? "-p #{port}" : ''
|
106
|
+
cmd = "#{Cucumber::RUBY_BINARY} -I #{Cucumber::LIBDIR} #{Spork::BINARY} cuc #{port_arg}"
|
107
|
+
exec cmd
|
108
|
+
end
|
109
|
+
end
|
110
|
+
sleep 0.2
|
111
|
+
end
|
112
|
+
|
113
|
+
def terminate_background_jobs
|
114
|
+
if @background_jobs
|
115
|
+
@background_jobs.each do |pid|
|
116
|
+
Process.kill(Signal.list['TERM'], pid)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def restore_original_env_vars
|
122
|
+
@original_env_vars.each { |variable, value| ENV[variable] = value } if @original_env_vars
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
World do
|
128
|
+
CucumberWorld.new
|
129
|
+
end
|
130
|
+
|
131
|
+
Before do
|
132
|
+
FileUtils.rm_rf CucumberWorld.working_dir
|
133
|
+
FileUtils.mkdir CucumberWorld.working_dir
|
134
|
+
end
|
135
|
+
|
136
|
+
After do
|
137
|
+
terminate_background_jobs
|
138
|
+
restore_original_env_vars
|
139
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Feature: Table diffing
|
2
|
+
In order to more easily compare data in tables
|
3
|
+
step definition writers should be able to diff
|
4
|
+
a table with expected data and see the diff inline
|
5
|
+
|
6
|
+
Scenario: Extra row
|
7
|
+
Given a standard Cucumber project directory structure
|
8
|
+
And a file named "features/tables.feature" with:
|
9
|
+
"""
|
10
|
+
Feature: Tables
|
11
|
+
Scenario: Extra row
|
12
|
+
Then the table should be:
|
13
|
+
| x | y |
|
14
|
+
| a | b |
|
15
|
+
"""
|
16
|
+
And a file named "features/step_definitions/table_steps.rb" with:
|
17
|
+
"""
|
18
|
+
Then /the table should be:/ do |expected|
|
19
|
+
expected.diff!(table(%{
|
20
|
+
| x | y |
|
21
|
+
| a | c |
|
22
|
+
}))
|
23
|
+
end
|
24
|
+
"""
|
25
|
+
When I run cucumber -i features/tables.feature
|
26
|
+
Then it should fail with
|
27
|
+
"""
|
28
|
+
Feature: Tables
|
29
|
+
|
30
|
+
Scenario: Extra row # features/tables.feature:2
|
31
|
+
Then the table should be: # features/step_definitions/table_steps.rb:1
|
32
|
+
| x | y |
|
33
|
+
| a | b |
|
34
|
+
| a | c |
|
35
|
+
Tables were not identical (RuntimeError)
|
36
|
+
./features/step_definitions/table_steps.rb:2:in `/the table should be:/'
|
37
|
+
features/tables.feature:3:in `Then the table should be:'
|
38
|
+
|
39
|
+
Failing Scenarios:
|
40
|
+
cucumber features/tables.feature:2 # Scenario: Extra row
|
41
|
+
|
42
|
+
1 scenario (1 failed)
|
43
|
+
1 step (1 failed)
|
44
|
+
|
45
|
+
"""
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: transform
|
2
|
+
In order to maintain modularity within step definitions
|
3
|
+
As a step definition editor
|
4
|
+
I want to register a regex to capture and tranform step definition arguments.
|
5
|
+
|
6
|
+
Scenario: run a specific scenario with a registered transform
|
7
|
+
When I run cucumber -q features/transform_sample.feature --require features
|
8
|
+
Then it should pass with
|
9
|
+
"""
|
10
|
+
Feature: Step argument transformations
|
11
|
+
|
12
|
+
Scenario: transform with matches
|
13
|
+
Then I should transform '10' to an Integer
|
14
|
+
|
15
|
+
Scenario: transform with matches that capture
|
16
|
+
Then I should transform 'abc' to a Symbol
|
17
|
+
|
18
|
+
Scenario: transform without matches
|
19
|
+
Then I should not transform '10' to an Integer
|
20
|
+
|
21
|
+
3 scenarios (3 passed)
|
22
|
+
3 steps (3 passed)
|
23
|
+
|
24
|
+
"""
|
@@ -0,0 +1,35 @@
|
|
1
|
+
Feature: Unicode in tables
|
2
|
+
In order to please the whole world,
|
3
|
+
unicode characters in tables should be
|
4
|
+
properly aligned
|
5
|
+
|
6
|
+
Scenario: All sorts of weird stuff
|
7
|
+
Given a standard Cucumber project directory structure
|
8
|
+
And a file named "features/unicode.feature" with:
|
9
|
+
"""
|
10
|
+
Feature: Featuring unicode
|
11
|
+
|
12
|
+
Scenario: So what, whatever
|
13
|
+
Given passing
|
14
|
+
| Brüno | abc |
|
15
|
+
| Bruno | æøå |
|
16
|
+
"""
|
17
|
+
And a file named "features/env.rb" with:
|
18
|
+
"""
|
19
|
+
$KCODE='u'
|
20
|
+
"""
|
21
|
+
When I run cucumber -q --dry-run features/unicode.feature
|
22
|
+
Then it should pass with
|
23
|
+
"""
|
24
|
+
Feature: Featuring unicode
|
25
|
+
|
26
|
+
Scenario: So what, whatever
|
27
|
+
Given passing
|
28
|
+
| Brüno | abc |
|
29
|
+
| Bruno | æøå |
|
30
|
+
|
31
|
+
1 scenario (1 undefined)
|
32
|
+
1 step (1 undefined)
|
33
|
+
|
34
|
+
"""
|
35
|
+
|