squirrel-cucumber 0.3.12
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 +79 -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 +503 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module Parser
|
3
|
+
# TIP: When you hack on the grammar, just delete feature.rb in this directory.
|
4
|
+
# Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
|
5
|
+
# github gems).
|
6
|
+
#
|
7
|
+
# Treetop will then generate the parser in-memory. When you're happy, just generate
|
8
|
+
# the rb file with tt feature.tt
|
9
|
+
grammar Table
|
10
|
+
|
11
|
+
rule table
|
12
|
+
table_row+ {
|
13
|
+
def at_line?(line)
|
14
|
+
elements.detect{|table_row| table_row.at_line?(line)}
|
15
|
+
end
|
16
|
+
|
17
|
+
def build(filter=nil)
|
18
|
+
Ast::Table.new(raw)
|
19
|
+
end
|
20
|
+
|
21
|
+
def raw(filter=nil, scenario_outline=nil)
|
22
|
+
elements.map do |table_row|
|
23
|
+
if(filter.nil? || table_row == elements[0] || filter.at_line?(table_row) || (scenario_outline && filter.outline_at_line?(scenario_outline)))
|
24
|
+
table_row.build
|
25
|
+
end
|
26
|
+
end.compact
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
rule table_row
|
32
|
+
space* '|' cells:(cell '|')+ space* (eol+ / eof) {
|
33
|
+
def at_line?(line)
|
34
|
+
cells.line == line
|
35
|
+
end
|
36
|
+
|
37
|
+
def build
|
38
|
+
row = cells.elements.map do |elt|
|
39
|
+
value = elt.cell.text_value.strip
|
40
|
+
value.empty? ? nil : value
|
41
|
+
end
|
42
|
+
|
43
|
+
class << row
|
44
|
+
attr_accessor :line
|
45
|
+
end
|
46
|
+
row.line = cells.line
|
47
|
+
|
48
|
+
row
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
rule cell
|
54
|
+
(!('|' / eol) .)*
|
55
|
+
end
|
56
|
+
|
57
|
+
rule space
|
58
|
+
[ \t]
|
59
|
+
end
|
60
|
+
|
61
|
+
rule eol
|
62
|
+
"\n" / ("\r" "\n"?)
|
63
|
+
end
|
64
|
+
|
65
|
+
rule eof
|
66
|
+
!.
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
begin
|
2
|
+
require 'treetop'
|
3
|
+
require 'treetop/runtime'
|
4
|
+
require 'treetop/ruby_extensions'
|
5
|
+
rescue LoadError
|
6
|
+
require "rubygems"
|
7
|
+
gem "treetop"
|
8
|
+
require 'treetop'
|
9
|
+
require 'treetop/runtime'
|
10
|
+
require 'treetop/ruby_extensions'
|
11
|
+
end
|
12
|
+
|
13
|
+
module Cucumber
|
14
|
+
module Parser
|
15
|
+
class SyntaxError < StandardError
|
16
|
+
def initialize(parser, file, line_offset)
|
17
|
+
tf = parser.terminal_failures
|
18
|
+
expected = tf.size == 1 ? tf[0].expected_string.inspect : "one of #{tf.map{|f| f.expected_string.inspect}.uniq*', '}"
|
19
|
+
line = parser.failure_line + line_offset
|
20
|
+
message = "#{file}:#{line}:#{parser.failure_column}: Parse error, expected #{expected}."
|
21
|
+
super(message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module TreetopExt
|
26
|
+
def parse_or_fail(source, file=nil, filter=nil, line_offset=0)
|
27
|
+
parse_tree = parse(source)
|
28
|
+
if parse_tree.nil?
|
29
|
+
raise Cucumber::Parser::SyntaxError.new(self, file, line_offset)
|
30
|
+
else
|
31
|
+
ast = parse_tree.build(filter) # may return nil if it doesn't match filter.
|
32
|
+
ast.file = file unless ast.nil?
|
33
|
+
ast
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
module Treetop
|
41
|
+
module Runtime
|
42
|
+
class SyntaxNode
|
43
|
+
def line
|
44
|
+
input.line_of(interval.first)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class CompiledParser
|
49
|
+
include Cucumber::Parser::TreetopExt
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Detect the platform we're running on so we can tweak behaviour
|
2
|
+
# in various places.
|
3
|
+
require 'rbconfig'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module Cucumber
|
7
|
+
# TODO: Move these constants and the file to Language. Update wiki
|
8
|
+
LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/languages.yml')
|
9
|
+
LANGUAGES = YAML.load_file(LANGUAGE_FILE)
|
10
|
+
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
|
11
|
+
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
12
|
+
JRUBY = defined?(JRUBY_VERSION)
|
13
|
+
IRONRUBY = Config::CONFIG['sitedir'] =~ /IronRuby/
|
14
|
+
WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
|
15
|
+
WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
|
16
|
+
RAILS = defined?(Rails)
|
17
|
+
RUBY_BINARY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
18
|
+
RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
|
19
|
+
|
20
|
+
def self.file_mode(m)
|
21
|
+
RUBY_1_9 ? "#{m}:UTF-8" : m
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'cucumber/rails/world'
|
2
|
+
require 'spec/expectations'
|
3
|
+
require 'spec/rails/matchers'
|
4
|
+
|
5
|
+
[Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
|
6
|
+
klass.class_eval do
|
7
|
+
include Spec::Matchers
|
8
|
+
include Spec::Rails::Matchers
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# Based on code from Brian Takita, Yurii Rashkovskii and Ben Mabey
|
2
|
+
# Adapted by Aslak Hellesøy
|
3
|
+
|
4
|
+
if defined?(ActiveRecord::Base)
|
5
|
+
require 'test_help'
|
6
|
+
else
|
7
|
+
require 'action_controller/test_process'
|
8
|
+
require 'action_controller/integration'
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'test/unit/testresult'
|
13
|
+
rescue LoadError => e
|
14
|
+
e.message << "\nYou must gem install test-unit. For more info see https://rspec.lighthouseapp.com/projects/16211/tickets/292"
|
15
|
+
e.message << "\nAlso make sure you have rack 1.0.0 or higher."
|
16
|
+
raise e
|
17
|
+
end
|
18
|
+
|
19
|
+
# So that Test::Unit doesn't launch at the end - makes it think it has already been run.
|
20
|
+
Test::Unit.run = true if Test::Unit.respond_to?(:run=)
|
21
|
+
|
22
|
+
$__cucumber_toplevel = self
|
23
|
+
|
24
|
+
module Cucumber #:nodoc:
|
25
|
+
module Rails
|
26
|
+
# All scenarios will execute in the context of a new instance of World.
|
27
|
+
class World < ActionController::IntegrationTest
|
28
|
+
if defined?(ActiveRecord::Base)
|
29
|
+
self.use_transactional_fixtures = false
|
30
|
+
else
|
31
|
+
def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize #:nodoc:
|
35
|
+
@_result = Test::Unit::TestResult.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.use_transactional_fixtures
|
40
|
+
|
41
|
+
unless ::Rails.configuration.cache_classes
|
42
|
+
warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/test.rb). This setting is known to break Cucumber's use_transactional_fixtures method. Set config.cache_classes to true if you want to use transactional fixtures. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
|
43
|
+
end
|
44
|
+
|
45
|
+
World.use_transactional_fixtures = true
|
46
|
+
if defined?(ActiveRecord::Base)
|
47
|
+
$__cucumber_toplevel.Before do
|
48
|
+
@__cucumber_ar_connection = ActiveRecord::Base.connection
|
49
|
+
if @__cucumber_ar_connection.respond_to?(:increment_open_transactions)
|
50
|
+
@__cucumber_ar_connection.increment_open_transactions
|
51
|
+
else
|
52
|
+
ActiveRecord::Base.__send__(:increment_open_transactions)
|
53
|
+
end
|
54
|
+
@__cucumber_ar_connection.begin_db_transaction
|
55
|
+
ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
|
56
|
+
end
|
57
|
+
|
58
|
+
$__cucumber_toplevel.After do
|
59
|
+
@__cucumber_ar_connection.rollback_db_transaction
|
60
|
+
if @__cucumber_ar_connection.respond_to?(:decrement_open_transactions)
|
61
|
+
@__cucumber_ar_connection.decrement_open_transactions
|
62
|
+
else
|
63
|
+
ActiveRecord::Base.__send__(:decrement_open_transactions)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.bypass_rescue
|
70
|
+
ActionController::Base.class_eval do
|
71
|
+
alias_method :rescue_action_without_bypass, :rescue_action
|
72
|
+
|
73
|
+
def rescue_action(exception)
|
74
|
+
raise exception
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
begin
|
79
|
+
ActionController::Failsafe.class_eval do
|
80
|
+
alias_method :failsafe_response_without_bypass, :failsafe_response
|
81
|
+
|
82
|
+
def failsafe_response(exception)
|
83
|
+
raise exception
|
84
|
+
end
|
85
|
+
end
|
86
|
+
rescue NameError # Failsafe was introduced in Rails 2.3.2
|
87
|
+
ActionController::Dispatcher.class_eval do
|
88
|
+
def self.failsafe_response(output, status, exception = nil)
|
89
|
+
raise exception
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
World do
|
98
|
+
Cucumber::Rails::World.new
|
99
|
+
end
|
@@ -0,0 +1,233 @@
|
|
1
|
+
require 'cucumber/platform'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
module Rake
|
5
|
+
# Defines a Rake task for running features.
|
6
|
+
#
|
7
|
+
# The simplest use of it goes something like:
|
8
|
+
#
|
9
|
+
# Cucumber::Rake::Task.new
|
10
|
+
#
|
11
|
+
# This will create a task named 'features' described as 'Run Features with
|
12
|
+
# Cucumber'. It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
|
13
|
+
#
|
14
|
+
# To further configure the task, you can pass a block:
|
15
|
+
#
|
16
|
+
# Cucumber::Rake::Task.new do |t|
|
17
|
+
# t.cucumber_opts = %w{--format progress}
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# This task can also be configured to be run with RCov:
|
21
|
+
#
|
22
|
+
# Cucumber::Rake::Task.new do |t|
|
23
|
+
# t.rcov = true
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# See the attributes for additional configuration possibilities.
|
27
|
+
class Task
|
28
|
+
class InProcessCucumberRunner #:nodoc:
|
29
|
+
attr_reader :args
|
30
|
+
|
31
|
+
def initialize(libs, cucumber_opts, feature_files)
|
32
|
+
raise "libs must be an Array when running in-process" unless Array === libs
|
33
|
+
libs.reverse.each{|lib| $LOAD_PATH.unshift(lib)}
|
34
|
+
@args = (
|
35
|
+
cucumber_opts +
|
36
|
+
feature_files
|
37
|
+
).flatten.compact
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
require 'cucumber/cli/main'
|
42
|
+
failure = Cucumber::Cli::Main.execute(args)
|
43
|
+
raise "Cucumber failed" if failure
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class ForkedCucumberRunner #:nodoc:
|
48
|
+
attr_reader :args
|
49
|
+
|
50
|
+
def initialize(libs, cucumber_bin, cucumber_opts, feature_files)
|
51
|
+
@args = (
|
52
|
+
['-I'] + load_path(libs) +
|
53
|
+
quoted_binary(cucumber_bin) +
|
54
|
+
cucumber_opts +
|
55
|
+
feature_files
|
56
|
+
).flatten
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_path(libs)
|
60
|
+
['"%s"' % libs.join(File::PATH_SEPARATOR)]
|
61
|
+
end
|
62
|
+
|
63
|
+
def quoted_binary(cucumber_bin)
|
64
|
+
['"%s"' % cucumber_bin]
|
65
|
+
end
|
66
|
+
|
67
|
+
def run
|
68
|
+
ruby(args.join(" ")) # ruby(*args) is broken on Windows
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class RCovCucumberRunner < ForkedCucumberRunner #:nodoc:
|
73
|
+
def initialize(libs, cucumber_bin, cucumber_opts, feature_files, rcov_opts)
|
74
|
+
@args = (
|
75
|
+
['-I'] + load_path(libs) +
|
76
|
+
['-S', 'rcov'] + rcov_opts +
|
77
|
+
quoted_binary(cucumber_bin) +
|
78
|
+
['--'] +
|
79
|
+
cucumber_opts +
|
80
|
+
feature_files
|
81
|
+
).flatten
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
LIB = File.expand_path(File.dirname(__FILE__) + '/../..') # :nodoc:
|
86
|
+
|
87
|
+
# TODO: remove depreated accessors for 0.4.0
|
88
|
+
def self.deprecate_accessor(attribute) # :nodoc:
|
89
|
+
attr_reader attribute
|
90
|
+
class_eval <<-EOF, __FILE__, __LINE__ + 1
|
91
|
+
def #{attribute}=(value)
|
92
|
+
@#{attribute} = value
|
93
|
+
warn("\nWARNING: Cucumber::Rake::Task##{attribute} is deprecated and will be removed in 0.4.0. Please use profiles for complex settings: http://wiki.github.com/aslakhellesoy/cucumber/using-rake#profiles\n")
|
94
|
+
end
|
95
|
+
EOF
|
96
|
+
end
|
97
|
+
|
98
|
+
# Directories to add to the Ruby $LOAD_PATH
|
99
|
+
attr_accessor :libs
|
100
|
+
|
101
|
+
# Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
|
102
|
+
attr_accessor :binary
|
103
|
+
|
104
|
+
# Array of paths to specific step definition files to use
|
105
|
+
deprecate_accessor :step_list
|
106
|
+
|
107
|
+
# File pattern for finding step definitions. Defaults to
|
108
|
+
# 'features/**/*.rb'.
|
109
|
+
deprecate_accessor :step_pattern
|
110
|
+
|
111
|
+
# Array of paths to specific features to run.
|
112
|
+
deprecate_accessor :feature_list
|
113
|
+
|
114
|
+
# File pattern for finding features to run. Defaults to
|
115
|
+
# 'features/**/*.feature'. Can be overridden by the FEATURE environment variable.
|
116
|
+
deprecate_accessor :feature_pattern
|
117
|
+
|
118
|
+
# Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
|
119
|
+
# It's recommended to pass an Array, but if it's a String it will be #split by ' '.
|
120
|
+
attr_accessor :cucumber_opts
|
121
|
+
def cucumber_opts=(opts) #:nodoc:
|
122
|
+
@cucumber_opts = String === opts ? opts.split(' ') : opts
|
123
|
+
end
|
124
|
+
|
125
|
+
# Run cucumber with RCov? Defaults to false. If you set this to
|
126
|
+
# true, +fork+ is implicit.
|
127
|
+
attr_accessor :rcov
|
128
|
+
|
129
|
+
# Extra options to pass to rcov.
|
130
|
+
# It's recommended to pass an Array, but if it's a String it will be #split by ' '.
|
131
|
+
attr_accessor :rcov_opts
|
132
|
+
def rcov_opts=(opts) #:nodoc:
|
133
|
+
@rcov_opts = String === opts ? opts.split(' ') : opts
|
134
|
+
end
|
135
|
+
|
136
|
+
# Whether or not to fork a new ruby interpreter. Defaults to true.
|
137
|
+
attr_accessor :fork
|
138
|
+
|
139
|
+
# Define what profile to be used. When used with cucumber_opts it is simply appended to it. Will be ignored when CUCUMBER_OPTS is used.
|
140
|
+
attr_accessor :profile
|
141
|
+
def profile=(profile) #:nodoc:
|
142
|
+
@profile = profile
|
143
|
+
unless feature_list
|
144
|
+
# TODO: remove once we completely remove these from the rake task.
|
145
|
+
@step_list = []
|
146
|
+
@feature_list = [] # Don't use accessor to avoid deprecation warning.
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# Define Cucumber Rake task
|
151
|
+
def initialize(task_name = "features", desc = "Run Features with Cucumber")
|
152
|
+
@task_name, @desc = task_name, desc
|
153
|
+
@fork = true
|
154
|
+
@libs = ['lib']
|
155
|
+
@rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
|
156
|
+
|
157
|
+
yield self if block_given?
|
158
|
+
|
159
|
+
@feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
|
160
|
+
@step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
|
161
|
+
|
162
|
+
@binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
|
163
|
+
@libs.insert(0, LIB) if binary == Cucumber::BINARY
|
164
|
+
|
165
|
+
define_task
|
166
|
+
end
|
167
|
+
|
168
|
+
def define_task # :nodoc:
|
169
|
+
desc @desc
|
170
|
+
task @task_name do
|
171
|
+
runner.run
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def runner(task_args = nil) # :nodoc:
|
176
|
+
cucumber_opts = [(ENV['CUCUMBER_OPTS'] ? ENV['CUCUMBER_OPTS'].split(/\s+/) : nil) || cucumber_opts_with_profile]
|
177
|
+
if(@rcov)
|
178
|
+
RCovCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args), rcov_opts)
|
179
|
+
elsif(@fork)
|
180
|
+
ForkedCucumberRunner.new(libs, binary, cucumber_opts, feature_files(task_args))
|
181
|
+
else
|
182
|
+
InProcessCucumberRunner.new(libs, cucumber_opts, feature_files(task_args))
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def cucumber_opts_with_profile # :nodoc:
|
187
|
+
@profile ? [cucumber_opts, '--profile', @profile] : cucumber_opts
|
188
|
+
end
|
189
|
+
|
190
|
+
def feature_files(task_args = nil) # :nodoc:
|
191
|
+
if ENV['FEATURE']
|
192
|
+
FileList[ ENV['FEATURE'] ]
|
193
|
+
else
|
194
|
+
result = []
|
195
|
+
result += feature_list.to_a if feature_list
|
196
|
+
result += FileList[feature_pattern].to_a if feature_pattern
|
197
|
+
FileList[result]
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def step_files(task_args = nil) # :nodoc:
|
202
|
+
if ENV['STEPS']
|
203
|
+
FileList[ ENV['STEPS'] ]
|
204
|
+
else
|
205
|
+
result = []
|
206
|
+
result += Array(step_list) if step_list
|
207
|
+
result += Array(FileList[step_pattern]) if step_pattern
|
208
|
+
FileList[result]
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
class FeatureTask < Task
|
214
|
+
|
215
|
+
def initialize(task_name = "feature", desc = "Run a specified feature with Cucumber. #{task_name}[feature_name]")
|
216
|
+
super(task_name, desc)
|
217
|
+
end
|
218
|
+
|
219
|
+
def define_task # :nodoc:
|
220
|
+
desc @desc
|
221
|
+
task @task_name, :feature_name do |t, args|
|
222
|
+
runner(args).run
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def feature_files(task_arguments) # :nodoc:
|
227
|
+
FileList[File.join("features", "**", "#{task_arguments[:feature_name]}.feature")]
|
228
|
+
end
|
229
|
+
|
230
|
+
end
|
231
|
+
|
232
|
+
end
|
233
|
+
end
|