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,15 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
describe Broadcaster do
|
5
|
+
before do
|
6
|
+
@receiver = mock('receiver')
|
7
|
+
@broadcaster = Broadcaster.new([@receiver])
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should broadcast methods to registered objects" do
|
11
|
+
@receiver.should_receive(:konbanwa).with('good evening')
|
12
|
+
@broadcaster.konbanwa('good evening')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,396 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Cucumber
|
5
|
+
module Cli
|
6
|
+
describe Configuration do
|
7
|
+
|
8
|
+
def given_cucumber_yml_defined_as(hash_or_string)
|
9
|
+
File.stub!(:exist?).and_return(true)
|
10
|
+
cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
|
11
|
+
IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
|
12
|
+
end
|
13
|
+
|
14
|
+
def given_the_following_files(*files)
|
15
|
+
File.stub!(:directory?).and_return(true)
|
16
|
+
File.stub!(:file?).and_return(true)
|
17
|
+
Dir.stub!(:[]).and_return(files)
|
18
|
+
end
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
File.stub!(:exist?).and_return(false) # Meaning, no cucumber.yml exists
|
22
|
+
Kernel.stub!(:exit).and_return(nil)
|
23
|
+
end
|
24
|
+
|
25
|
+
def config
|
26
|
+
@config ||= Configuration.new(@out = StringIO.new, @error = StringIO.new)
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset_config
|
30
|
+
@config = nil
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :out, :error
|
34
|
+
|
35
|
+
it "should require env.rb files first" do
|
36
|
+
given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
|
37
|
+
|
38
|
+
config.parse!(%w{--require /features})
|
39
|
+
|
40
|
+
config.support_to_load.should == [
|
41
|
+
"/features/support/env.rb",
|
42
|
+
"/features/support/a_file.rb"
|
43
|
+
]
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should not require env.rb files when --dry-run" do
|
47
|
+
given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
|
48
|
+
|
49
|
+
config.parse!(%w{--require /features --dry-run})
|
50
|
+
|
51
|
+
config.support_to_load.should == [
|
52
|
+
"/features/support/a_file.rb"
|
53
|
+
]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should require files in vendor/{plugins,gems}/*/cucumber/*.rb" do
|
57
|
+
given_the_following_files("/vendor/plugins/plugin_a/cucumber/foo.rb",
|
58
|
+
"/vendor/gems/gem_a/cucumber/bar.rb")
|
59
|
+
|
60
|
+
config.parse!(%w{--require /features})
|
61
|
+
|
62
|
+
config.step_defs_to_load.should == [
|
63
|
+
"/vendor/plugins/plugin_a/cucumber/foo.rb",
|
64
|
+
"/vendor/gems/gem_a/cucumber/bar.rb"
|
65
|
+
]
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "--exclude" do
|
69
|
+
|
70
|
+
it "excludes a ruby file from requiring when the name matches exactly" do
|
71
|
+
given_the_following_files("/features/support/a_file.rb","/features/support/env.rb")
|
72
|
+
|
73
|
+
config.parse!(%w{--require /features --exclude a_file.rb})
|
74
|
+
|
75
|
+
config.all_files_to_load.should == [
|
76
|
+
"/features/support/env.rb"
|
77
|
+
]
|
78
|
+
end
|
79
|
+
|
80
|
+
it "excludes all ruby files that match the provided patterns from requiring" do
|
81
|
+
given_the_following_files("/features/support/foof.rb","/features/support/bar.rb",
|
82
|
+
"/features/support/food.rb","/features/blah.rb",
|
83
|
+
"/features/support/fooz.rb")
|
84
|
+
|
85
|
+
config.parse!(%w{--require /features --exclude foo[df] --exclude blah})
|
86
|
+
|
87
|
+
config.all_files_to_load.should == [
|
88
|
+
"/features/support/bar.rb",
|
89
|
+
"/features/support/fooz.rb"
|
90
|
+
]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe '#drb?' do
|
95
|
+
it "indicates whether the --drb flag was passed in or not" do
|
96
|
+
config.parse!(%w{features})
|
97
|
+
config.should_not be_drb
|
98
|
+
|
99
|
+
|
100
|
+
config.parse!(%w{features --drb})
|
101
|
+
config.should be_drb
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "#drb_port" do
|
106
|
+
it "is nil when not configured" do
|
107
|
+
config.parse!([])
|
108
|
+
config.drb_port.should be_nil
|
109
|
+
end
|
110
|
+
|
111
|
+
it "is numeric when configured" do
|
112
|
+
config.parse!(%w{features --port 1000})
|
113
|
+
config.drb_port.should == 1000
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
it "uses the default profile when no profile is defined" do
|
120
|
+
given_cucumber_yml_defined_as({'default' => '--require some_file'})
|
121
|
+
|
122
|
+
config.parse!(%w{--format progress})
|
123
|
+
config.options[:require].should include('some_file')
|
124
|
+
end
|
125
|
+
|
126
|
+
context '--profile' do
|
127
|
+
|
128
|
+
it "expands args from profiles in the cucumber.yml file" do
|
129
|
+
given_cucumber_yml_defined_as({'bongo' => '--require from/yml'})
|
130
|
+
|
131
|
+
config.parse!(%w{--format progress --profile bongo})
|
132
|
+
config.options[:formats].should == [['progress', out]]
|
133
|
+
config.options[:require].should == ['from/yml']
|
134
|
+
end
|
135
|
+
|
136
|
+
it "expands args from the default profile when no flags are provided" do
|
137
|
+
given_cucumber_yml_defined_as({'default' => '--require from/yml'})
|
138
|
+
|
139
|
+
config.parse!([])
|
140
|
+
config.options[:require].should == ['from/yml']
|
141
|
+
end
|
142
|
+
|
143
|
+
it "parses ERB syntax in the cucumber.yml file" do
|
144
|
+
given_cucumber_yml_defined_as({'default' => '<%="--require some_file"%>'})
|
145
|
+
|
146
|
+
config.parse!([])
|
147
|
+
config.options[:require].should include('some_file')
|
148
|
+
end
|
149
|
+
|
150
|
+
it "provides a helpful error message when a specified profile does not exists in cucumber.yml" do
|
151
|
+
given_cucumber_yml_defined_as({'default' => '--require from/yml', 'html_report' => '--format html'})
|
152
|
+
|
153
|
+
expected_message = <<-END_OF_MESSAGE
|
154
|
+
Could not find profile: 'i_do_not_exist'
|
155
|
+
|
156
|
+
Defined profiles in cucumber.yml:
|
157
|
+
* default
|
158
|
+
* html_report
|
159
|
+
END_OF_MESSAGE
|
160
|
+
|
161
|
+
lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(ProfileNotFound, expected_message)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "allows profiles to be defined in arrays" do
|
165
|
+
given_cucumber_yml_defined_as({'foo' => ['-f','progress']})
|
166
|
+
|
167
|
+
config.parse!(%w{--profile foo})
|
168
|
+
config.options[:formats].should == [['progress', out]]
|
169
|
+
end
|
170
|
+
|
171
|
+
it "disregards default STDOUT formatter defined in profile when another is passed in (via cmd line)" do
|
172
|
+
given_cucumber_yml_defined_as({'foo' => %w[--format pretty]})
|
173
|
+
config.parse!(%w{--format progress --profile foo})
|
174
|
+
config.options[:formats].should == [['progress', out]]#, ['pretty', 'pretty.txt']]
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
["--no-profile", "-P"].each do |flag|
|
180
|
+
context 'when none is specified with #{flag}' do
|
181
|
+
it "disables profiles" do
|
182
|
+
given_cucumber_yml_defined_as({'default' => '-v --require file_specified_in_default_profile.rb'})
|
183
|
+
|
184
|
+
config.parse!("#{flag} --require some_file.rb".split(" "))
|
185
|
+
config.options[:require].should == ['some_file.rb']
|
186
|
+
end
|
187
|
+
|
188
|
+
it "notifies the user that the profiles are being disabled" do
|
189
|
+
given_cucumber_yml_defined_as({'default' => '-v'})
|
190
|
+
|
191
|
+
config.parse!("#{flag} --require some_file.rb".split(" "))
|
192
|
+
out.string.should =~ /Disabling profiles.../
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
it "issues a helpful error message when a specified profile exists but is nil or blank" do
|
198
|
+
[nil, ' '].each do |bad_input|
|
199
|
+
given_cucumber_yml_defined_as({'foo' => bad_input})
|
200
|
+
|
201
|
+
expected_error = /The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./
|
202
|
+
lambda{config.parse!(%w{--profile foo})}.should raise_error(expected_error)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
it "issues a helpful error message when no YAML file exists and a profile is specified" do
|
207
|
+
File.should_receive(:exist?).with('cucumber.yml').and_return(false)
|
208
|
+
|
209
|
+
expected_error = /cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml./
|
210
|
+
lambda{config.parse!(%w{--profile i_do_not_exist})}.should raise_error(expected_error)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "issues a helpful error message when cucumber.yml is blank or malformed" do
|
214
|
+
expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage./
|
215
|
+
|
216
|
+
['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
|
217
|
+
given_cucumber_yml_defined_as(bad_input)
|
218
|
+
lambda{config.parse!([])}.should raise_error(expected_error_message)
|
219
|
+
reset_config
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
it "issues a helpful error message when cucumber.yml can not be parsed" do
|
224
|
+
expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage./
|
225
|
+
|
226
|
+
given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
|
227
|
+
YAML.should_receive(:load).and_raise ArgumentError
|
228
|
+
|
229
|
+
lambda{config.parse!([])}.should raise_error(expected_error_message)
|
230
|
+
end
|
231
|
+
|
232
|
+
it "issues a helpful error message when cucumber.yml can not be parsed by ERB" do
|
233
|
+
expected_error_message = /cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage./
|
234
|
+
given_cucumber_yml_defined_as("<% this_fails %>")
|
235
|
+
|
236
|
+
lambda{config.parse!([])}.should raise_error(expected_error_message)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
|
241
|
+
it "should accept --dry-run option" do
|
242
|
+
config.parse!(%w{--dry-run})
|
243
|
+
config.options[:dry_run].should be_true
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should accept --no-source option" do
|
247
|
+
config.parse!(%w{--no-source})
|
248
|
+
|
249
|
+
config.options[:source].should be_false
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should accept --no-snippets option" do
|
253
|
+
config.parse!(%w{--no-snippets})
|
254
|
+
|
255
|
+
config.options[:snippets].should be_false
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should set snippets and source to false with --quiet option" do
|
259
|
+
config.parse!(%w{--quiet})
|
260
|
+
|
261
|
+
config.options[:snippets].should be_false
|
262
|
+
config.options[:source].should be_false
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should accept --verbose option" do
|
266
|
+
config.parse!(%w{--verbose})
|
267
|
+
|
268
|
+
config.options[:verbose].should be_true
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should accept --out option" do
|
272
|
+
config.parse!(%w{--out jalla.txt})
|
273
|
+
config.options[:formats].should == [['pretty', 'jalla.txt']]
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should accept multiple --out options" do
|
277
|
+
config.parse!(%w{--format progress --out file1 --out file2})
|
278
|
+
config.options[:formats].should == [['progress', 'file2']]
|
279
|
+
end
|
280
|
+
|
281
|
+
it "should accept multiple --format options and put the STDOUT one first so progress is seen" do
|
282
|
+
config.parse!(%w{--format pretty --out pretty.txt --format progress})
|
283
|
+
config.options[:formats].should == [['progress', out], ['pretty', 'pretty.txt']]
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should not accept multiple --format options when both use implicit STDOUT" do
|
287
|
+
lambda do
|
288
|
+
config.parse!(%w{--format pretty --format progress})
|
289
|
+
end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
|
290
|
+
end
|
291
|
+
|
292
|
+
it "should not accept multiple --out streams pointing to the same place" do
|
293
|
+
lambda do
|
294
|
+
config.parse!(%w{--format pretty --out file1 --format progress --out file1})
|
295
|
+
end.should raise_error("All but one formatter must use --out, only one can print to each stream (or STDOUT)")
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should associate --out to previous --format" do
|
299
|
+
config.parse!(%w{--format progress --out file1 --format profile --out file2})
|
300
|
+
config.options[:formats].should == [["progress", "file1"], ["profile" ,"file2"]]
|
301
|
+
end
|
302
|
+
|
303
|
+
it "should accept --color option" do
|
304
|
+
Term::ANSIColor.should_receive(:coloring=).with(true)
|
305
|
+
config.parse!(['--color'])
|
306
|
+
end
|
307
|
+
|
308
|
+
it "should accept --no-color option" do
|
309
|
+
Term::ANSIColor.should_receive(:coloring=).with(false)
|
310
|
+
config = Configuration.new(StringIO.new)
|
311
|
+
config.parse!(['--no-color'])
|
312
|
+
end
|
313
|
+
|
314
|
+
describe "--backtrace" do
|
315
|
+
before do
|
316
|
+
Cucumber.use_full_backtrace = false
|
317
|
+
end
|
318
|
+
|
319
|
+
it "should show full backtrace when --backtrace is present" do
|
320
|
+
config = Main.new(['--backtrace'])
|
321
|
+
begin
|
322
|
+
"x".should == "y"
|
323
|
+
rescue => e
|
324
|
+
e.backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
after do
|
329
|
+
Cucumber.use_full_backtrace = false
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
describe "diff output" do
|
334
|
+
|
335
|
+
it "is enabled by default" do
|
336
|
+
config.diff_enabled?.should be_true
|
337
|
+
end
|
338
|
+
|
339
|
+
it "is disabled when the --no-diff option is supplied" do
|
340
|
+
config.parse!(%w{--no-diff})
|
341
|
+
|
342
|
+
config.diff_enabled?.should be_false
|
343
|
+
end
|
344
|
+
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should accept multiple --name options" do
|
348
|
+
config.parse!(['--name', "User logs in", '--name', "User signs up"])
|
349
|
+
|
350
|
+
config.options[:name_regexps].should include(/User logs in/)
|
351
|
+
config.options[:name_regexps].should include(/User signs up/)
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should accept multiple -n options" do
|
355
|
+
config.parse!(['-n', "User logs in", '-n', "User signs up"])
|
356
|
+
|
357
|
+
config.options[:name_regexps].should include(/User logs in/)
|
358
|
+
config.options[:name_regexps].should include(/User signs up/)
|
359
|
+
end
|
360
|
+
|
361
|
+
it "should search for all features in the specified directory" do
|
362
|
+
File.stub!(:directory?).and_return(true)
|
363
|
+
Dir.should_receive(:[]).with("feature_directory/**/*.feature").
|
364
|
+
any_number_of_times.and_return(["cucumber.feature"])
|
365
|
+
|
366
|
+
config.parse!(%w{feature_directory/})
|
367
|
+
|
368
|
+
config.feature_files.should == ["cucumber.feature"]
|
369
|
+
end
|
370
|
+
|
371
|
+
it "defaults to the features directory when no feature file are provided" do
|
372
|
+
File.stub!(:directory?).and_return(true)
|
373
|
+
Dir.should_receive(:[]).with("features/**/*.feature").
|
374
|
+
any_number_of_times.and_return(["cucumber.feature"])
|
375
|
+
|
376
|
+
config.parse!(%w{})
|
377
|
+
|
378
|
+
config.feature_files.should == ["cucumber.feature"]
|
379
|
+
end
|
380
|
+
|
381
|
+
it "should allow specifying environment variables on the command line" do
|
382
|
+
config.parse!(["foo=bar"])
|
383
|
+
ENV["foo"].should == "bar"
|
384
|
+
config.feature_files.should_not include('foo=bar')
|
385
|
+
end
|
386
|
+
|
387
|
+
it "should allow specifying environment variables in profiles" do
|
388
|
+
given_cucumber_yml_defined_as({'selenium' => 'RAILS_ENV=selenium'})
|
389
|
+
config.parse!(["--profile", "selenium"])
|
390
|
+
ENV["RAILS_ENV"].should == "selenium"
|
391
|
+
config.feature_files.should_not include('RAILS_ENV=selenium')
|
392
|
+
end
|
393
|
+
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
module Cucumber
|
5
|
+
module Cli
|
6
|
+
describe DRbClient do
|
7
|
+
before(:each) do
|
8
|
+
@args = ['features']
|
9
|
+
@error_stream = StringIO.new
|
10
|
+
@out_stream = StringIO.new
|
11
|
+
|
12
|
+
@drb_object = mock('DRbObject', :run => true)
|
13
|
+
DRbObject.stub!(:new_with_uri).and_return(@drb_object)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "starts up a druby service" do
|
17
|
+
DRb.should_receive(:start_service).with("druby://localhost:0")
|
18
|
+
DRbClient.run(@args, @error_stream, @out_stream)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "connects to the DRb server" do
|
22
|
+
DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8990")
|
23
|
+
DRbClient.run(@args, @error_stream, @out_stream)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "runs the features on the DRb server" do
|
27
|
+
@drb_object.should_receive(:run).with(@args, @error_stream, @out_stream)
|
28
|
+
DRbClient.run(@args, @error_stream, @out_stream)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns raises an error when it can't connect to the server" do
|
32
|
+
DRbObject.stub!(:new_with_uri).and_raise(DRb::DRbConnError)
|
33
|
+
running { DRbClient.run(@args, @error_stream, @out_stream) }.should raise_error(DRbClientError, "No DRb server is running.")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns the result from the DRb server call" do
|
37
|
+
@drb_object.should_receive(:run).and_return('foo')
|
38
|
+
DRbClient.run(@args, @error_stream, @out_stream).should == 'foo'
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with $CUCUMBER_DRB set" do
|
42
|
+
before do
|
43
|
+
@original_env = ENV['CUCUMBER_DRB']
|
44
|
+
ENV['CUCUMBER_DRB'] = '90000'
|
45
|
+
end
|
46
|
+
after do
|
47
|
+
ENV['CUCUMBER_DRB'] = @original_env
|
48
|
+
end
|
49
|
+
it "connects to specified DRb server" do
|
50
|
+
DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:90000")
|
51
|
+
DRbClient.run(@args, @error_stream, @out_stream)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "with provided drb_port" do
|
56
|
+
before do
|
57
|
+
@args = @args + ['--port', '8000']
|
58
|
+
end
|
59
|
+
it "connects to specified drb port" do
|
60
|
+
DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
|
61
|
+
DRbClient.run(@args, @error_stream, @out_stream, 8000)
|
62
|
+
end
|
63
|
+
it "prefers configuration to environment" do
|
64
|
+
original = ENV['CUCUMBER_DRB'] = original
|
65
|
+
begin
|
66
|
+
ENV['CUCUMBER_DRB'] = "4000"
|
67
|
+
DRbObject.should_receive(:new_with_uri).with("druby://127.0.0.1:8000")
|
68
|
+
DRbClient.run(@args, @error_stream, @out_stream, 8000)
|
69
|
+
ensure
|
70
|
+
ENV['CUCUMBER_DRB'] = original
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
begin
|
4
|
+
require 'spec/runner/differs/default' # RSpec >=1.2.4
|
5
|
+
rescue ::LoadError
|
6
|
+
require 'spec/expectations/differs/default' # RSpec <=1.2.3
|
7
|
+
end
|
8
|
+
|
9
|
+
module Cucumber
|
10
|
+
module Cli
|
11
|
+
describe Main do
|
12
|
+
before(:each) do
|
13
|
+
@out = StringIO.new
|
14
|
+
@err = StringIO.new
|
15
|
+
Kernel.stub!(:exit).and_return(nil)
|
16
|
+
File.stub!(:exist?).and_return(false) # When Configuration checks for cucumber.yml
|
17
|
+
Dir.stub!(:[]).and_return([]) # to prevent cucumber's features dir to being laoded
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "verbose mode" do
|
21
|
+
|
22
|
+
before(:each) do
|
23
|
+
@empty_feature = Ast::Feature.new(nil, Ast::Comment.new(''), Ast::Tags.new(2, []), "Feature", [])
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should show feature files parsed" do
|
27
|
+
@cli = Main.new(%w{--verbose example.feature}, @out)
|
28
|
+
@cli.stub!(:require)
|
29
|
+
|
30
|
+
FeatureFile.stub!(:new).and_return(mock("feature file", :parse => @empty_feature))
|
31
|
+
|
32
|
+
@cli.execute!(StepMother.new)
|
33
|
+
|
34
|
+
@out.string.should include('example.feature')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "diffing" do
|
40
|
+
|
41
|
+
before :each do
|
42
|
+
@configuration = mock('Configuration', :null_object => true, :drb? => false)
|
43
|
+
Configuration.should_receive(:new).and_return(@configuration)
|
44
|
+
|
45
|
+
@step_mother = mock('StepMother', :null_object => true)
|
46
|
+
|
47
|
+
@cli = Main.new(nil, @out)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "uses Spec Differ::Default when diff is enabled" do
|
51
|
+
@configuration.should_receive(:diff_enabled?).and_return(true)
|
52
|
+
|
53
|
+
::Spec::Expectations::Differs::Default.should_receive(:new)
|
54
|
+
|
55
|
+
@cli.execute!(@step_mother)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "does not use Spec Differ::Default when diff is disabled" do
|
59
|
+
@configuration.should_receive(:diff_enabled?).and_return(false)
|
60
|
+
|
61
|
+
::Spec::Expectations::Differs::Default.should_not_receive(:new)
|
62
|
+
|
63
|
+
@cli.execute!(@step_mother)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "--format with class" do
|
69
|
+
|
70
|
+
describe "in module" do
|
71
|
+
|
72
|
+
it "should resolve each module until it gets Formatter class" do
|
73
|
+
cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass}, nil)
|
74
|
+
mock_module = mock('module')
|
75
|
+
Object.stub!(:const_defined?).and_return(true)
|
76
|
+
mock_module.stub!(:const_defined?).and_return(true)
|
77
|
+
|
78
|
+
f = stub('formatter', :null_object => true)
|
79
|
+
|
80
|
+
Object.should_receive(:const_get).with('ZooModule').and_return(mock_module)
|
81
|
+
mock_module.should_receive(:const_get).with('MonkeyFormatterClass').and_return(mock('formatter class', :new => f))
|
82
|
+
|
83
|
+
cli.execute!(StepMother.new)
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "setup step sequence" do
|
90
|
+
|
91
|
+
it "should load files and execute hooks in order" do
|
92
|
+
Configuration.stub!(:new).and_return(configuration = mock('configuration', :null_object => true))
|
93
|
+
step_mother = mock('step mother', :null_object => true)
|
94
|
+
configuration.stub!(:drb?).and_return false
|
95
|
+
cli = Main.new(%w{--verbose example.feature}, @out)
|
96
|
+
cli.stub!(:require)
|
97
|
+
|
98
|
+
configuration.stub!(:support_to_load).and_return(['support'])
|
99
|
+
configuration.stub!(:step_defs_to_load).and_return(['step defs'])
|
100
|
+
|
101
|
+
# Support must be loaded first to ensure post configuration hook can
|
102
|
+
# run before anything else.
|
103
|
+
step_mother.should_receive(:load_code_files).with(['support']).ordered
|
104
|
+
# The post configuration hook/s (if any) need to be run next to enable
|
105
|
+
# extensions to do their thing before features are loaded
|
106
|
+
step_mother.should_receive(:after_configuration).with(configuration).ordered
|
107
|
+
# Feature files must be loaded before step definitions are required.
|
108
|
+
# This is because i18n step methods are only aliased when
|
109
|
+
# features are loaded. If we swap the order, the requires
|
110
|
+
# will fail.
|
111
|
+
step_mother.should_receive(:load_plain_text_features).ordered
|
112
|
+
step_mother.should_receive(:load_code_files).with(['step defs']).ordered
|
113
|
+
|
114
|
+
cli.execute!(step_mother)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
[ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass|
|
120
|
+
|
121
|
+
it "rescues #{exception_klass}, prints the message to the error stream and returns true" do
|
122
|
+
Configuration.stub!(:new).and_return(configuration = mock('configuration'))
|
123
|
+
configuration.stub!(:parse!).and_raise(exception_klass.new("error message"))
|
124
|
+
|
125
|
+
main = Main.new('', out = StringIO.new, error = StringIO.new)
|
126
|
+
main.execute!(StepMother.new).should be_true
|
127
|
+
error.string.should == "error message\n"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
context "--drb" do
|
133
|
+
before(:each) do
|
134
|
+
@configuration = mock('Configuration', :drb? => true, :null_object => true)
|
135
|
+
Configuration.stub!(:new).and_return(@configuration)
|
136
|
+
|
137
|
+
@args = ['features']
|
138
|
+
|
139
|
+
@cli = Main.new(@args, @out, @err)
|
140
|
+
@step_mother = mock('StepMother', :null_object => true)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "delegates the execution to the DRB client passing the args and streams" do
|
144
|
+
@configuration.stub :drb_port => 1450
|
145
|
+
DRbClient.should_receive(:run).with(@args, @err, @out, 1450).and_return(true)
|
146
|
+
@cli.execute!(@step_mother)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "returns the result from the DRbClient" do
|
150
|
+
DRbClient.stub!(:run).and_return('foo')
|
151
|
+
@cli.execute!(@step_mother).should == 'foo'
|
152
|
+
end
|
153
|
+
|
154
|
+
it "ceases execution if the DrbClient is able to perform the execution" do
|
155
|
+
DRbClient.stub!(:run).and_return(true)
|
156
|
+
@configuration.should_not_receive(:build_formatter_broadcaster)
|
157
|
+
@cli.execute!(@step_mother)
|
158
|
+
end
|
159
|
+
|
160
|
+
context "when the DrbClient is unable to perfrom the execution" do
|
161
|
+
before { DRbClient.stub!(:run).and_raise(DRbClientError.new('error message.')) }
|
162
|
+
|
163
|
+
it "alerts the user that execution will be performed locally" do
|
164
|
+
@cli.execute!(@step_mother)
|
165
|
+
@err.string.should include("WARNING: error message. Running features locally:")
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|