square-cucumber 0.3.12.2
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 +830 -0
- data/License.txt +20 -0
- data/Manifest.txt +410 -0
- data/README.txt +4 -0
- data/Rakefile +9 -0
- data/bin/cucumber +17 -0
- data/config/hoe.rb +76 -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 +30 -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-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/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/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 +16 -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/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/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 +81 -0
- data/examples/self_test/features/support/env.rb +17 -0
- data/examples/self_test/features/tons_of_cukes.feature +52 -0
- data/examples/self_test/features/undefined_multiline_args.feature +12 -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 +28 -0
- data/examples/sinatra/views/add.erb +5 -0
- data/examples/sinatra/views/layout.erb +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 +66 -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 +22 -0
- data/examples/watir/features/support/env.rb +32 -0
- data/features/after_block_exceptions.feature +102 -0
- data/features/after_step_block_exceptions.feature +104 -0
- data/features/background.feature +311 -0
- data/features/bug_371.feature +32 -0
- data/features/cucumber_cli.feature +549 -0
- data/features/cucumber_cli_diff_disabled.feature +53 -0
- data/features/cucumber_cli_outlines.feature +109 -0
- data/features/custom_formatter.feature +11 -0
- data/features/drb_server_integration.feature +115 -0
- data/features/exclude_files.feature +20 -0
- data/features/expand.feature +49 -0
- data/features/html_formatter.feature +7 -0
- data/features/html_formatter/a.html +185 -0
- data/features/junit_formatter.feature +71 -0
- data/features/language_from_header.feature +30 -0
- data/features/multiline_names.feature +43 -0
- data/features/rake_task.feature +150 -0
- data/features/report_called_undefined_steps.feature +35 -0
- data/features/snippet.feature +22 -0
- data/features/step_definitions/cucumber_steps.rb +130 -0
- data/features/step_definitions/extra_steps.rb +2 -0
- data/features/support/env.rb +120 -0
- data/features/usage.feature +126 -0
- data/features/work_in_progress.feature +151 -0
- data/gem_tasks/deployment.rake +11 -0
- data/gem_tasks/environment.rake +7 -0
- data/gem_tasks/features.rake +10 -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/yard.rake +8 -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.rb +11 -0
- data/lib/cucumber/ast.rb +29 -0
- data/lib/cucumber/ast/background.rb +62 -0
- data/lib/cucumber/ast/comment.rb +30 -0
- data/lib/cucumber/ast/examples.rb +26 -0
- data/lib/cucumber/ast/feature.rb +58 -0
- data/lib/cucumber/ast/feature_element.rb +57 -0
- data/lib/cucumber/ast/features.rb +30 -0
- data/lib/cucumber/ast/outline_table.rb +143 -0
- data/lib/cucumber/ast/py_string.rb +57 -0
- data/lib/cucumber/ast/scenario.rb +83 -0
- data/lib/cucumber/ast/scenario_outline.rb +93 -0
- data/lib/cucumber/ast/step.rb +112 -0
- data/lib/cucumber/ast/step_collection.rb +75 -0
- data/lib/cucumber/ast/step_invocation.rb +136 -0
- data/lib/cucumber/ast/table.rb +334 -0
- data/lib/cucumber/ast/tags.rb +33 -0
- data/lib/cucumber/ast/visitor.rb +116 -0
- data/lib/cucumber/broadcaster.rb +13 -0
- data/lib/cucumber/cli/configuration.rb +425 -0
- data/lib/cucumber/cli/drb_client.rb +20 -0
- data/lib/cucumber/cli/language_help_formatter.rb +59 -0
- data/lib/cucumber/cli/main.rb +136 -0
- data/lib/cucumber/core_ext/exception.rb +53 -0
- data/lib/cucumber/core_ext/instance_exec.rb +67 -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 +47 -0
- data/lib/cucumber/filter.rb +50 -0
- data/lib/cucumber/formatter/ansicolor.rb +110 -0
- data/lib/cucumber/formatter/color_io.rb +23 -0
- data/lib/cucumber/formatter/console.rb +149 -0
- data/lib/cucumber/formatter/cucumber.css +132 -0
- data/lib/cucumber/formatter/cucumber.sass +139 -0
- data/lib/cucumber/formatter/duration.rb +10 -0
- data/lib/cucumber/formatter/html.rb +258 -0
- data/lib/cucumber/formatter/junit.rb +75 -0
- data/lib/cucumber/formatter/pretty.rb +188 -0
- data/lib/cucumber/formatter/profile.rb +77 -0
- data/lib/cucumber/formatter/progress.rb +60 -0
- data/lib/cucumber/formatter/rerun.rb +44 -0
- data/lib/cucumber/formatter/tag_cloud.rb +28 -0
- data/lib/cucumber/formatter/unicode.rb +35 -0
- data/lib/cucumber/formatter/usage.rb +85 -0
- data/lib/cucumber/formatters/unicode.rb +7 -0
- data/lib/cucumber/languages.yml +532 -0
- data/lib/cucumber/parser.rb +6 -0
- data/lib/cucumber/parser/feature.rb +1787 -0
- data/lib/cucumber/parser/feature.tt +324 -0
- data/lib/cucumber/parser/i18n.tt +42 -0
- data/lib/cucumber/parser/i18n/language.rb +80 -0
- data/lib/cucumber/parser/table.rb +414 -0
- data/lib/cucumber/parser/table.tt +71 -0
- data/lib/cucumber/parser/treetop_ext.rb +52 -0
- data/lib/cucumber/platform.rb +23 -0
- data/lib/cucumber/rails/rspec.rb +10 -0
- data/lib/cucumber/rails/world.rb +99 -0
- data/lib/cucumber/rake/task.rb +233 -0
- data/lib/cucumber/rspec_neuter.rb +23 -0
- data/lib/cucumber/step_definition.rb +122 -0
- data/lib/cucumber/step_match.rb +61 -0
- data/lib/cucumber/step_mother.rb +362 -0
- data/lib/cucumber/version.rb +10 -0
- data/lib/cucumber/webrat/mechanize_world.rb +82 -0
- data/lib/cucumber/world.rb +53 -0
- data/rails_generators/cucumber/USAGE +11 -0
- data/rails_generators/cucumber/cucumber_generator.rb +66 -0
- data/rails_generators/cucumber/templates/cucumber +8 -0
- data/rails_generators/cucumber/templates/cucumber.rake +20 -0
- data/rails_generators/cucumber/templates/cucumber_environment.rb +23 -0
- data/rails_generators/cucumber/templates/env.rb +26 -0
- data/rails_generators/cucumber/templates/paths.rb +27 -0
- data/rails_generators/cucumber/templates/spork_env.rb +36 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +147 -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 +20 -0
- data/spec/cucumber/ast/background_spec.rb +50 -0
- data/spec/cucumber/ast/feature_element_spec.rb +40 -0
- data/spec/cucumber/ast/feature_factory.rb +63 -0
- data/spec/cucumber/ast/feature_spec.rb +38 -0
- data/spec/cucumber/ast/py_string_spec.rb +51 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
- data/spec/cucumber/ast/scenario_spec.rb +38 -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 +186 -0
- data/spec/cucumber/ast/visitor_spec.rb +27 -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 +43 -0
- data/spec/cucumber/cli/main_spec.rb +140 -0
- data/spec/cucumber/core_ext/proc_spec.rb +54 -0
- data/spec/cucumber/core_ext/string_spec.rb +42 -0
- data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
- data/spec/cucumber/formatter/color_io_spec.rb +27 -0
- data/spec/cucumber/formatter/duration_spec.rb +22 -0
- data/spec/cucumber/formatter/progress_spec.rb +36 -0
- data/spec/cucumber/parser/feature_parser_spec.rb +387 -0
- data/spec/cucumber/parser/table_parser_spec.rb +48 -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 +11 -0
- data/spec/cucumber/sell_cucumbers.feature +19 -0
- data/spec/cucumber/step_definition_spec.rb +101 -0
- data/spec/cucumber/step_mother_spec.rb +155 -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 +10 -0
- data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
- data/spec/cucumber/world/pending_spec.rb +47 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +13 -0
- metadata +504 -0
|
@@ -0,0 +1,43 @@
|
|
|
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 fearures 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
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "verbose mode" do
|
|
19
|
+
|
|
20
|
+
before(:each) do
|
|
21
|
+
@empty_feature = Ast::Feature.new(nil, Ast::Comment.new(''), Ast::Tags.new(2, []), "Feature", [])
|
|
22
|
+
Dir.stub!(:[])
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should show ruby files required" do
|
|
26
|
+
@cli = Main.new(%w{--verbose --require example.rb}, @out)
|
|
27
|
+
@cli.stub!(:require)
|
|
28
|
+
|
|
29
|
+
@cli.execute!(Object.new.extend(StepMother))
|
|
30
|
+
|
|
31
|
+
@out.string.should include('example.rb')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should show feature files parsed" do
|
|
35
|
+
@cli = Main.new(%w{--verbose example.feature}, @out)
|
|
36
|
+
@cli.stub!(:require)
|
|
37
|
+
|
|
38
|
+
FeatureFile.stub!(:new).and_return(mock("feature file", :parse => @empty_feature))
|
|
39
|
+
|
|
40
|
+
@cli.execute!(Object.new.extend(StepMother))
|
|
41
|
+
|
|
42
|
+
@out.string.should include('example.feature')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "diffing" do
|
|
48
|
+
|
|
49
|
+
before :each do
|
|
50
|
+
@configuration = mock('Configuration', :null_object => true, :drb? => false)
|
|
51
|
+
Configuration.should_receive(:new).and_return(@configuration)
|
|
52
|
+
|
|
53
|
+
@step_mother = mock('StepMother', :null_object => true)
|
|
54
|
+
|
|
55
|
+
@cli = Main.new(nil, @out)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "uses Spec Differ::Default when diff is enabled" do
|
|
59
|
+
@configuration.should_receive(:diff_enabled?).and_return(true)
|
|
60
|
+
|
|
61
|
+
::Spec::Expectations::Differs::Default.should_receive(:new)
|
|
62
|
+
|
|
63
|
+
@cli.execute!(@step_mother)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "does not use Spec Differ::Default when diff is disabled" do
|
|
67
|
+
@configuration.should_receive(:diff_enabled?).and_return(false)
|
|
68
|
+
|
|
69
|
+
::Spec::Expectations::Differs::Default.should_not_receive(:new)
|
|
70
|
+
|
|
71
|
+
@cli.execute!(@step_mother)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "--format with class" do
|
|
77
|
+
|
|
78
|
+
describe "in module" do
|
|
79
|
+
|
|
80
|
+
it "should resolve each module until it gets Formatter class" do
|
|
81
|
+
cli = Main.new(%w{--format ZooModule::MonkeyFormatterClass}, nil)
|
|
82
|
+
mock_module = mock('module')
|
|
83
|
+
Object.stub!(:const_defined?).and_return(true)
|
|
84
|
+
mock_module.stub!(:const_defined?).and_return(true)
|
|
85
|
+
|
|
86
|
+
f = stub('formatter', :null_object => true)
|
|
87
|
+
|
|
88
|
+
Object.should_receive(:const_get).with('ZooModule').and_return(mock_module)
|
|
89
|
+
mock_module.should_receive(:const_get).with('MonkeyFormatterClass').and_return(mock('formatter class', :new => f))
|
|
90
|
+
|
|
91
|
+
cli.execute!(Object.new.extend(StepMother))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "--drb" do
|
|
98
|
+
before(:each) do
|
|
99
|
+
@configuration = mock('Configuration', :drb? => true, :null_object => true)
|
|
100
|
+
Configuration.stub!(:new).and_return(@configuration)
|
|
101
|
+
|
|
102
|
+
@args = ['features']
|
|
103
|
+
|
|
104
|
+
@cli = Main.new(@args, @out, @err)
|
|
105
|
+
@step_mother = mock('StepMother', :null_object => true)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "delegates the execution to the DRB client passing the args and streams" do
|
|
109
|
+
DRbClient.should_receive(:run).with(@args, @err, @out).and_return(true)
|
|
110
|
+
@cli.execute!(@step_mother)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "returns the result from the DRbClient" do
|
|
114
|
+
DRbClient.stub!(:run).and_return('foo')
|
|
115
|
+
@cli.execute!(@step_mother).should == 'foo'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "ceases execution if the DrbClient is able to perform the execution" do
|
|
119
|
+
DRbClient.stub!(:run).and_return(true)
|
|
120
|
+
@configuration.should_not_receive(:build_formatter_broadcaster)
|
|
121
|
+
@cli.execute!(@step_mother)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context "when the DrbClient is unable to perfrom the execution" do
|
|
125
|
+
before { DRbClient.stub!(:run).and_raise(DRbClientError.new('error message.')) }
|
|
126
|
+
|
|
127
|
+
it "alerts the user that execution will be performed locally" do
|
|
128
|
+
@cli.execute!(@step_mother)
|
|
129
|
+
@err.string.should include("WARNING: error message. Running features locally:")
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it "reparses the configuration since the --drb flag causes the initial parsing to short circuit" do
|
|
133
|
+
@configuration.should_receive(:parse!).exactly(:twice)
|
|
134
|
+
@cli.execute!(@step_mother)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/core_ext/instance_exec'
|
|
3
|
+
|
|
4
|
+
describe Proc do
|
|
5
|
+
it "should remove extraneous path info for file" do
|
|
6
|
+
proc = lambda {|a,b|}
|
|
7
|
+
proc.file_colon_line.should =~ /^spec\/cucumber\/core_ext\/proc_spec\.rb:6/
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "should raise ArityMismatchError for too many args (expecting 0)" do
|
|
11
|
+
lambda {
|
|
12
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do
|
|
13
|
+
end
|
|
14
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should raise ArityMismatchError for too many args (expecting 1)" do
|
|
18
|
+
lambda {
|
|
19
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1,2) do |a|
|
|
20
|
+
end
|
|
21
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 2 arguments.")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should raise ArityMismatchError for too few args (expecting 1)" do
|
|
25
|
+
lambda {
|
|
26
|
+
Object.new.cucumber_instance_exec(true, 'foo') do |a|
|
|
27
|
+
end
|
|
28
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 1 argument, but the Regexp matched 0 arguments.")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should raise ArityMismatchError for too few args (expecting 2)" do
|
|
32
|
+
lambda {
|
|
33
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do |a,b|
|
|
34
|
+
end
|
|
35
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 2 arguments, but the Regexp matched 1 argument.")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if Cucumber::RUBY_1_9
|
|
39
|
+
it "should allow varargs" do
|
|
40
|
+
lambda {
|
|
41
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
|
|
42
|
+
end
|
|
43
|
+
}.should_not raise_error(Cucumber::ArityMismatchError)
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
# Ruby 1.8
|
|
47
|
+
it "should not allow varargs because Ruby 1.8 reports same arity as with no args, so we can't really tell the difference." do
|
|
48
|
+
lambda {
|
|
49
|
+
Object.new.cucumber_instance_exec(true, 'foo', 1) do |*args|
|
|
50
|
+
end
|
|
51
|
+
}.should raise_error(Cucumber::ArityMismatchError, "Your block takes 0 arguments, but the Regexp matched 1 argument.")
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../lib/cucumber/core_ext/string'
|
|
2
|
+
|
|
3
|
+
describe String, "#gzub" do
|
|
4
|
+
it "should format groups with format string" do
|
|
5
|
+
"I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, "<span>%s</span>").should ==
|
|
6
|
+
"I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should format groups with format string when there are dupes" do
|
|
10
|
+
"I bob 1 bo this bobs".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, "<span>%s</span>").should ==
|
|
11
|
+
"I <span>bob</span> <span>1</span> <span>bo</span> this <span>bobs</span>"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should format groups with block" do
|
|
15
|
+
f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/) do |m|
|
|
16
|
+
"<span>#{m}</span>"
|
|
17
|
+
end
|
|
18
|
+
f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should format groups with proc object" do
|
|
22
|
+
proc = lambda do |m|
|
|
23
|
+
"<span>#{m}</span>"
|
|
24
|
+
end
|
|
25
|
+
f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/, proc)
|
|
26
|
+
f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should format groups with block with not all placeholders having a value" do
|
|
30
|
+
f = "another member named Bob joins the group".gzub(/(a|another) (user|member) named ([^ ]+)( who is not logged in)?/) do |m|
|
|
31
|
+
"<span>#{m}</span>"
|
|
32
|
+
end
|
|
33
|
+
f.should == "<span>another</span> <span>member</span> named <span>Bob</span> joins the group"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should format match groups in a textile table row" do
|
|
37
|
+
f = "I ate 1 egg this morning".gzub(/I (\w+) (\d+) (\w+) this (\w+)/) do |m|
|
|
38
|
+
"<span>#{m}</span>"
|
|
39
|
+
end
|
|
40
|
+
f.should == "I <span>ate</span> <span>1</span> <span>egg</span> this <span>morning</span>"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/formatter/ansicolor'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Formatter
|
|
6
|
+
describe ANSIColor do
|
|
7
|
+
include ANSIColor
|
|
8
|
+
|
|
9
|
+
after do
|
|
10
|
+
::Term::ANSIColor.coloring = true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should wrap passed_param with bold green and reset to green" do
|
|
14
|
+
passed_param("foo").should == "\e[32m\e[1mfoo\e[0m\e[0m\e[32m"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should wrap passed in green" do
|
|
18
|
+
passed("foo").should == "\e[32mfoo\e[0m"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should not reset passed if there are no arguments" do
|
|
22
|
+
passed.should == "\e[32m"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should wrap comments in grey" do
|
|
26
|
+
comment("foo").should == "\e[90mfoo\e[0m"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should not generate ansi codes when colors are disabled" do
|
|
30
|
+
::Term::ANSIColor.coloring = false
|
|
31
|
+
passed("foo").should == "foo"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/formatter/color_io'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Formatter
|
|
6
|
+
describe ColorIO do
|
|
7
|
+
describe "<<" do
|
|
8
|
+
it "should convert to a print using kernel" do
|
|
9
|
+
color_io = ColorIO.new
|
|
10
|
+
|
|
11
|
+
Kernel.should_receive(:print).with("monkeys")
|
|
12
|
+
|
|
13
|
+
color_io << "monkeys"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should allow chained <<" do
|
|
17
|
+
color_io = ColorIO.new
|
|
18
|
+
|
|
19
|
+
Kernel.should_receive(:print).with("monkeys")
|
|
20
|
+
Kernel.should_receive(:print).with(" are tasty")
|
|
21
|
+
|
|
22
|
+
color_io << "monkeys" << " are tasty"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/formatter/duration'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Formatter
|
|
6
|
+
describe Duration do
|
|
7
|
+
include Duration
|
|
8
|
+
|
|
9
|
+
it "should format ms" do
|
|
10
|
+
format_duration(0.002103).should == '0m0.002s'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should format m" do
|
|
14
|
+
format_duration(61.002503).should == '1m1.003s'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should format h" do
|
|
18
|
+
format_duration(3661.002503).should == '61m1.003s'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/formatter/progress'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Formatter
|
|
6
|
+
describe Progress do
|
|
7
|
+
|
|
8
|
+
before(:all) do
|
|
9
|
+
Term::ANSIColor.coloring = false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
before(:each) do
|
|
13
|
+
@out = StringIO.new
|
|
14
|
+
@progress = Progress.new(mock("step mother"), @out, {})
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "visiting a table cell value without a status" do
|
|
18
|
+
it "should take the status from the last run step" do
|
|
19
|
+
@progress.visit_step_result('', '', nil, :failed, nil, 10, nil)
|
|
20
|
+
@progress.visit_table_cell_value('value', 10, nil)
|
|
21
|
+
|
|
22
|
+
@out.string.should == "FF"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "visiting a table cell which is a table header" do
|
|
27
|
+
it "should not output anything" do
|
|
28
|
+
@progress.visit_table_cell_value('value', 10, :skipped_param)
|
|
29
|
+
|
|
30
|
+
@out.string.should == ""
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
require 'cucumber/parser/i18n/language'
|
|
3
|
+
|
|
4
|
+
module Cucumber
|
|
5
|
+
module Parser
|
|
6
|
+
describe Feature do
|
|
7
|
+
before do
|
|
8
|
+
@parser = I18n::Language['en'].parser
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def parse(text)
|
|
12
|
+
feature = @parser.parse_or_fail(text)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def parse_file(file)
|
|
16
|
+
FeatureFile.new(File.dirname(__FILE__) + "/../treetop_parser/" + file).parse
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def parse_example_file(file)
|
|
20
|
+
FeatureFile.new(File.dirname(__FILE__) + "/../../../examples/" + file).parse
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "Comments" do
|
|
24
|
+
it "should parse a file with only a one line comment" do
|
|
25
|
+
parse(%{# My comment
|
|
26
|
+
Feature: hi
|
|
27
|
+
}).to_sexp.should ==
|
|
28
|
+
[:feature, nil, "Feature: hi",
|
|
29
|
+
[:comment, "# My comment\n"]]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should parse a file with only a multiline comment" do
|
|
33
|
+
parse(%{# Hello
|
|
34
|
+
# World
|
|
35
|
+
Feature: hi
|
|
36
|
+
}).to_sexp.should ==
|
|
37
|
+
[:feature, nil, "Feature: hi",
|
|
38
|
+
[:comment, "# Hello\n# World\n"]]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should parse a file with no comments" do
|
|
42
|
+
parse("Feature: hi\n").to_sexp.should ==
|
|
43
|
+
[:feature, nil, "Feature: hi"]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should parse a file with only a multiline comment with newlines" do
|
|
47
|
+
parse("# Hello\n\n# World\n").to_sexp.should ==
|
|
48
|
+
[:feature, nil, "",
|
|
49
|
+
[:comment, "# Hello\n\n# World\n"]]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should not consume comments as part of a multiline name" do
|
|
53
|
+
parse("Feature: hi\n Scenario: test\n\n#hello\n Scenario: another").to_sexp.should ==
|
|
54
|
+
[:feature, nil, "Feature: hi",
|
|
55
|
+
[:scenario, 2, "Scenario:", "test"],
|
|
56
|
+
[:scenario, 5, "Scenario:", "another",
|
|
57
|
+
[:comment, "#hello\n "]]]
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe "Tags" do
|
|
62
|
+
it "should parse a file with tags on a feature" do
|
|
63
|
+
parse("# My comment\n@hello @world Feature: hi\n").to_sexp.should ==
|
|
64
|
+
[:feature, nil, "Feature: hi",
|
|
65
|
+
[:comment, "# My comment\n"],
|
|
66
|
+
[:tag, "hello"],
|
|
67
|
+
[:tag, "world"]]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should not take the tags as part of a multiline name feature element" do
|
|
71
|
+
parse("Feature: hi\n Scenario: test\n\n@hello Scenario: another").to_sexp.should ==
|
|
72
|
+
[:feature, nil, "Feature: hi",
|
|
73
|
+
[:scenario, 2, "Scenario:", "test"],
|
|
74
|
+
[:scenario, 4, "Scenario:", "another",
|
|
75
|
+
[:tag, "hello"]]]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should parse a file with tags on a scenario" do
|
|
79
|
+
parse(%{# FC
|
|
80
|
+
@ft
|
|
81
|
+
Feature: hi
|
|
82
|
+
|
|
83
|
+
@st1 @st2
|
|
84
|
+
Scenario: First
|
|
85
|
+
Given Pepper
|
|
86
|
+
|
|
87
|
+
@st3
|
|
88
|
+
@st4 @ST5 @#^%&ST6**!
|
|
89
|
+
Scenario: Second}).to_sexp.should ==
|
|
90
|
+
[:feature, nil, "Feature: hi",
|
|
91
|
+
[:comment, "# FC\n "],
|
|
92
|
+
[:tag, "ft"],
|
|
93
|
+
[:scenario, 6, 'Scenario:', 'First',
|
|
94
|
+
[:tag, "st1"], [:tag, "st2"],
|
|
95
|
+
[:step_invocation, 7, "Given", "Pepper"]
|
|
96
|
+
],
|
|
97
|
+
[:scenario, 11, 'Scenario:', 'Second',
|
|
98
|
+
[:tag, "st3"], [:tag, "st4"], [:tag, "ST5"], [:tag, "#^%&ST6**!"]]]
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe "Background" do
|
|
103
|
+
it "should have steps" do
|
|
104
|
+
parse("Feature: Hi\nBackground:\nGiven I am a step\n").to_sexp.should ==
|
|
105
|
+
[:feature, nil, "Feature: Hi",
|
|
106
|
+
[:background, 2, "Background:",
|
|
107
|
+
[:step, 3, "Given", "I am a step"]]]
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should allow multiline names" do
|
|
111
|
+
parse(%{Feature: Hi
|
|
112
|
+
Background: It is my ambition to say
|
|
113
|
+
in ten sentences
|
|
114
|
+
what others say
|
|
115
|
+
in a whole book.
|
|
116
|
+
Given I am a step}).to_sexp.should ==
|
|
117
|
+
[:feature, nil, "Feature: Hi",
|
|
118
|
+
[:background, 2, "Background:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
|
|
119
|
+
[:step, 6, "Given", "I am a step"]]]
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
describe "Scenarios" do
|
|
124
|
+
it "can be empty" do
|
|
125
|
+
parse("Feature: Hi\n\nScenario: Hello\n").to_sexp.should ==
|
|
126
|
+
[:feature, nil, "Feature: Hi",
|
|
127
|
+
[:scenario, 3, "Scenario:", "Hello"]]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "should allow whitespace lines after the Scenario line" do
|
|
131
|
+
parse(%{Feature: Foo
|
|
132
|
+
|
|
133
|
+
Scenario: bar
|
|
134
|
+
|
|
135
|
+
Given baz})
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "should have steps" do
|
|
139
|
+
parse("Feature: Hi\nScenario: Hello\nGiven I am a step\n").to_sexp.should ==
|
|
140
|
+
[:feature, nil, "Feature: Hi",
|
|
141
|
+
[:scenario, 2, "Scenario:", "Hello",
|
|
142
|
+
[:step_invocation, 3, "Given", "I am a step"]]]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "should have steps with inline table" do
|
|
146
|
+
parse(%{Feature: Hi
|
|
147
|
+
Scenario: Hello
|
|
148
|
+
Given I have a table
|
|
149
|
+
|a|b|
|
|
150
|
+
}).to_sexp.should ==
|
|
151
|
+
[:feature, nil, "Feature: Hi",
|
|
152
|
+
[:scenario, 2, "Scenario:", "Hello",
|
|
153
|
+
[:step_invocation, 3, "Given", "I have a table",
|
|
154
|
+
[:table,
|
|
155
|
+
[:row, 4,
|
|
156
|
+
[:cell, "a"],
|
|
157
|
+
[:cell, "b"]]]]]]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "should have steps with inline py_string" do
|
|
161
|
+
parse(%{Feature: Hi
|
|
162
|
+
Scenario: Hello
|
|
163
|
+
Given I have a string
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
"""
|
|
167
|
+
hello
|
|
168
|
+
world
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
}).to_sexp.should ==
|
|
172
|
+
[:feature, nil, "Feature: Hi",
|
|
173
|
+
[:scenario, 2, "Scenario:", "Hello",
|
|
174
|
+
[:step_invocation, 3, "Given", "I have a string",
|
|
175
|
+
[:py_string, "hello\nworld"]]]]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "should allow multiline names" do
|
|
179
|
+
parse(%{Feature: Hi
|
|
180
|
+
Scenario: It is my ambition to say
|
|
181
|
+
in ten sentences
|
|
182
|
+
what others say
|
|
183
|
+
in a whole book.
|
|
184
|
+
Given I am a step
|
|
185
|
+
|
|
186
|
+
}).to_sexp.should ==
|
|
187
|
+
[:feature, nil, "Feature: Hi",
|
|
188
|
+
[:scenario, 2, "Scenario:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
|
|
189
|
+
[:step_invocation, 6, "Given", "I am a step"]]]
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "should ignore gherkin keywords which are parts of other words in the name" do
|
|
193
|
+
parse(%{Feature: Parser bug
|
|
194
|
+
Scenario: I have a Button
|
|
195
|
+
Buttons are great
|
|
196
|
+
Given I have it
|
|
197
|
+
}).to_sexp.should ==
|
|
198
|
+
[:feature, nil, "Feature: Parser bug",
|
|
199
|
+
[:scenario, 2, "Scenario:", "I have a Button\nButtons are great",
|
|
200
|
+
[:step_invocation, 4, "Given", "I have it"]]]
|
|
201
|
+
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
describe "Scenario Outlines" do
|
|
206
|
+
it "can be empty" do
|
|
207
|
+
parse(%{Feature: Hi
|
|
208
|
+
Scenario Outline: Hello
|
|
209
|
+
Given a <what> cucumber
|
|
210
|
+
Examples:
|
|
211
|
+
|what|
|
|
212
|
+
|green|
|
|
213
|
+
}).to_sexp.should ==
|
|
214
|
+
[:feature, nil, "Feature: Hi",
|
|
215
|
+
[:scenario_outline, "Scenario Outline:", "Hello",
|
|
216
|
+
[:step, 3, "Given", "a <what> cucumber"],
|
|
217
|
+
[:examples, "Examples:", "",
|
|
218
|
+
[:table,
|
|
219
|
+
[:row, 5,
|
|
220
|
+
[:cell, "what"]],
|
|
221
|
+
[:row, 6,
|
|
222
|
+
[:cell, "green"]]]]]]
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
it "should have line numbered steps with inline table" do
|
|
226
|
+
parse(%{Feature: Hi
|
|
227
|
+
Scenario Outline: Hello
|
|
228
|
+
|
|
229
|
+
Given I have a table
|
|
230
|
+
|
|
231
|
+
|<a>|<b>|
|
|
232
|
+
Examples:
|
|
233
|
+
|a|b|
|
|
234
|
+
|c|d|
|
|
235
|
+
}).to_sexp.should ==
|
|
236
|
+
[:feature, nil, "Feature: Hi",
|
|
237
|
+
[:scenario_outline, "Scenario Outline:", "Hello",
|
|
238
|
+
[:step, 4, "Given", "I have a table",
|
|
239
|
+
[:table,
|
|
240
|
+
[:row, 6,
|
|
241
|
+
[:cell, "<a>"],
|
|
242
|
+
[:cell, "<b>"]]]],
|
|
243
|
+
[:examples, "Examples:", "",
|
|
244
|
+
[:table,
|
|
245
|
+
[:row, 8,
|
|
246
|
+
[:cell, "a"],
|
|
247
|
+
[:cell, "b"]],
|
|
248
|
+
[:row, 9,
|
|
249
|
+
[:cell, "c"],
|
|
250
|
+
[:cell, "d"]]]]]]
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
it "should have examples" do
|
|
254
|
+
parse("Feature: Hi
|
|
255
|
+
|
|
256
|
+
Scenario Outline: Hello
|
|
257
|
+
|
|
258
|
+
Given I have a table
|
|
259
|
+
|1|2|
|
|
260
|
+
|
|
261
|
+
Examples:
|
|
262
|
+
|x|y|
|
|
263
|
+
|5|6|
|
|
264
|
+
|
|
265
|
+
").to_sexp.should ==
|
|
266
|
+
[:feature, nil, "Feature: Hi",
|
|
267
|
+
[:scenario_outline, "Scenario Outline:", "Hello",
|
|
268
|
+
[:step, 5, "Given", "I have a table",
|
|
269
|
+
[:table,
|
|
270
|
+
[:row, 6,
|
|
271
|
+
[:cell, "1"],
|
|
272
|
+
[:cell, "2"]]]],
|
|
273
|
+
[:examples, "Examples:", "",
|
|
274
|
+
[:table,
|
|
275
|
+
[:row, 9,
|
|
276
|
+
[:cell, "x"],
|
|
277
|
+
[:cell, "y"]],
|
|
278
|
+
[:row, 10,
|
|
279
|
+
[:cell, "5"],
|
|
280
|
+
[:cell, "6"]]]]]]
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "should allow multiline names" do
|
|
284
|
+
parse(%{Feature: Hi
|
|
285
|
+
Scenario Outline: It is my ambition to say
|
|
286
|
+
in ten sentences
|
|
287
|
+
what others say
|
|
288
|
+
in a whole book.
|
|
289
|
+
Given I am a step
|
|
290
|
+
|
|
291
|
+
}).to_sexp.should ==
|
|
292
|
+
[:feature, nil, "Feature: Hi",
|
|
293
|
+
[:scenario_outline, "Scenario Outline:", "It is my ambition to say\nin ten sentences\nwhat others say\nin a whole book.",
|
|
294
|
+
[:step, 6, "Given", "I am a step"]]]
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it "should allow Examples to have multiline names" do
|
|
298
|
+
parse(%{Feature: Hi
|
|
299
|
+
Scenario Outline: name
|
|
300
|
+
Given I am a step
|
|
301
|
+
|
|
302
|
+
Examples: I'm a multiline name
|
|
303
|
+
and I'm ok
|
|
304
|
+
|x|
|
|
305
|
+
|5|
|
|
306
|
+
|
|
307
|
+
}).to_sexp.should ==
|
|
308
|
+
[:feature, nil, "Feature: Hi",
|
|
309
|
+
[:scenario_outline, "Scenario Outline:", "name",
|
|
310
|
+
[:step, 3, "Given", "I am a step"],
|
|
311
|
+
[:examples, "Examples:", "I'm a multiline name\nand I'm ok",
|
|
312
|
+
[:table,
|
|
313
|
+
[:row, 7,
|
|
314
|
+
[:cell, "x"]],
|
|
315
|
+
[:row, 8,
|
|
316
|
+
[:cell, "5"]]]]]]
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
it "should allow Examples to have multiline names" do
|
|
320
|
+
parse(%{Feature: Hi
|
|
321
|
+
Scenario: When I have when in scenario
|
|
322
|
+
I should be fine
|
|
323
|
+
Given I am a step
|
|
324
|
+
}).to_sexp.should ==
|
|
325
|
+
[:feature, nil, "Feature: Hi",
|
|
326
|
+
[:scenario, 2, "Scenario:", "When I have when in scenario\nI should be fine",
|
|
327
|
+
[:step_invocation, 4, "Given", "I am a step"]]]
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
describe "Syntax" do
|
|
332
|
+
it "should parse empty_feature" do
|
|
333
|
+
parse_file("empty_feature.feature")
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
it "should parse empty_scenario" do
|
|
337
|
+
parse_file("empty_scenario.feature")
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
it "should parse empty_scenario_outline" do
|
|
341
|
+
parse_file("empty_scenario_outline.feature")
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
it "should parse fit_scenario" do
|
|
345
|
+
parse_file("multiline_steps.feature")
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
it "should parse scenario_outline" do
|
|
349
|
+
parse_file("scenario_outline.feature")
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
describe "Filtering" do
|
|
354
|
+
it "should filter outline tables" do
|
|
355
|
+
ff = FeatureFile.new(
|
|
356
|
+
File.dirname(__FILE__) + '/../../../examples/self_test/features/outline_sample.feature:12')
|
|
357
|
+
f = ff.parse({:lang => 'en'})
|
|
358
|
+
f.to_sexp.should ==
|
|
359
|
+
[:feature,
|
|
360
|
+
"./spec/cucumber/parser/../../../examples/self_test/features/outline_sample.feature",
|
|
361
|
+
"Feature: Outline Sample",
|
|
362
|
+
[:scenario_outline,
|
|
363
|
+
"Scenario Outline:",
|
|
364
|
+
"Test state",
|
|
365
|
+
[:step, 6, "Given", "<state> without a table"],
|
|
366
|
+
[:step, 7, "Given", "<other_state> without a table"],
|
|
367
|
+
[:examples,
|
|
368
|
+
"Examples:",
|
|
369
|
+
"Rainbow colours",
|
|
370
|
+
[:table,
|
|
371
|
+
[:row, 9, [:cell, "state"], [:cell, "other_state"]],
|
|
372
|
+
# [:row, 10, [:cell, "missing"], [:cell, "passing"]],
|
|
373
|
+
# [:row, 11, [:cell, "passing"], [:cell, "passing"]],
|
|
374
|
+
[:row, 12, [:cell, "failing"], [:cell, "passing"]]]]
|
|
375
|
+
# ,
|
|
376
|
+
# [:examples,
|
|
377
|
+
# "Examples:",
|
|
378
|
+
# "Only passing",
|
|
379
|
+
# [:table,
|
|
380
|
+
# [:row, 14, [:cell, "state"], [:cell, "other_state"]],
|
|
381
|
+
# [:row, 15, [:cell, "passing"], [:cell, "passing"]]]]]
|
|
382
|
+
]]
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
end
|