cucumber 0.1.10 → 0.2.0
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 +223 -5
- data/License.txt +1 -1
- data/Manifest.txt +174 -85
- data/README.txt +2 -39
- data/Rakefile +1 -2
- data/bin/cucumber +2 -2
- data/config/hoe.rb +9 -3
- data/examples/cs/README.textile +1 -22
- data/examples/cs/Rakefile +1 -1
- 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/i18n/README.textile +1 -1
- data/examples/i18n/Rakefile +20 -4
- data/examples/i18n/ar/features/addition.feature +10 -11
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +4 -12
- data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +4 -2
- data/examples/i18n/de/features/addition.feature +10 -11
- data/examples/i18n/de/features/division.feature +0 -1
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +5 -11
- data/examples/i18n/en/features/addition.feature +10 -11
- data/examples/i18n/en/features/division.feature +0 -1
- data/examples/i18n/en/features/step_definitons/calculator_steps.rb +5 -12
- 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/features/adicion.feature +11 -12
- data/examples/i18n/es/features/step_definitons/calculador_steps.rb +10 -11
- data/examples/i18n/es/lib/calculador.rb +4 -1
- data/examples/i18n/et/features/jagamine.feature +9 -0
- data/examples/i18n/et/features/liitmine.feature +10 -11
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +7 -9
- data/examples/i18n/et/lib/kalkulaator.rb +5 -1
- data/examples/i18n/fi/Rakefile +6 -0
- data/examples/i18n/fi/features/jakolasku.feature +9 -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/features/addition.feature +16 -12
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +14 -11
- data/examples/i18n/fr/lib/calculatrice.rb +1 -1
- data/examples/i18n/id/features/addition.feature +10 -11
- data/examples/i18n/id/features/division.feature +0 -1
- data/examples/i18n/id/features/step_definitons/calculator_steps.rb +5 -12
- data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +4 -2
- data/examples/i18n/ja/features/addition.feature +10 -11
- data/examples/i18n/ja/features/division.feature +2 -3
- data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +6 -12
- data/examples/i18n/ko/Rakefile +6 -0
- data/examples/i18n/ko/features/addition.feature +16 -0
- data/examples/i18n/ko/features/division.feature +10 -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/features/addition.feature +11 -11
- data/examples/i18n/lt/features/division.feature +0 -1
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +5 -12
- data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +4 -9
- data/examples/i18n/no/features/summering.feature +1 -0
- data/examples/i18n/no/features/support/env.rb +6 -0
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +4 -2
- data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +4 -2
- data/examples/i18n/ru/Rakefile +6 -0
- data/examples/i18n/ru/features/addition.feature +10 -0
- data/examples/i18n/ru/features/consecutive_calculations.feature +16 -0
- data/examples/i18n/ru/features/division.feature +15 -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 +7 -0
- data/examples/i18n/ru/lib/calculator.rb +24 -0
- data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +4 -2
- data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +5 -3
- data/examples/i18n/zh-TW/Rakefile +6 -0
- data/examples/i18n/zh-TW/features/addition.feature +16 -0
- data/examples/i18n/zh-TW/features/division.feature +10 -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/features/step_definitons/hello_steps.rb +1 -1
- data/examples/java/features/step_definitons/tree_steps.rb +1 -1
- data/examples/jbehave/README.textile +20 -0
- data/examples/jbehave/features/support/env.rb +7 -0
- data/examples/jbehave/features/trading.feature +28 -0
- data/examples/jbehave/pom.xml +53 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +70 -0
- data/examples/selenium/features/search.feature +1 -1
- data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium/features/support/env.rb +19 -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 +41 -0
- data/examples/self_test/README.textile +6 -0
- data/examples/self_test/Rakefile +6 -0
- data/examples/self_test/features/background/failing_background.feature +11 -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/outline_sample.feature +15 -0
- data/examples/self_test/features/sample.feature +19 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +64 -0
- data/examples/self_test/features/support/env.rb +1 -0
- data/examples/self_test/features/support/tag_count_formatter.rb +25 -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 +20 -0
- data/examples/sinatra/views/add.erb +5 -0
- data/examples/sinatra/views/layout.erb +8 -0
- data/examples/tickets/Rakefile +13 -8
- data/examples/tickets/cucumber.yml +2 -1
- 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/236.feature +13 -0
- data/examples/tickets/features/241.feature +13 -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/scenario_outline_steps.rb +42 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +46 -5
- data/examples/tickets/features/tickets.feature +5 -1
- data/examples/watir/README.textile +16 -0
- data/examples/watir/features/step_definitons/search_steps.rb +24 -0
- data/examples/watir/features/support/env.rb +32 -0
- data/features/background.feature +221 -0
- data/features/cucumber_cli.feature +389 -0
- data/features/cucumber_cli_diff_disabled.feature +45 -0
- data/features/cucumber_cli_outlines.feature +81 -0
- data/features/custom_formatter.feature +11 -0
- data/features/report_called_undefined_steps.feature +34 -0
- data/features/step_definitions/cucumber_steps.rb +30 -0
- data/features/step_definitions/extra_steps.rb +2 -0
- data/features/support/env.rb +8 -0
- data/gem_tasks/deployment.rake +0 -23
- data/gem_tasks/features.rake +1 -1
- data/gem_tasks/fix_cr_lf.rake +1 -1
- data/gem_tasks/flog.rake +1 -1
- data/gem_tasks/gemspec.rake +4 -0
- data/gem_tasks/jar.rake +67 -0
- data/gem_tasks/rspec.rake +31 -15
- data/gem_tasks/yard.rake +8 -0
- data/lib/autotest/cucumber_mixin.rb +41 -25
- data/lib/cucumber/ast/background.rb +50 -0
- data/lib/cucumber/ast/comment.rb +26 -0
- data/lib/cucumber/ast/examples.rb +38 -0
- data/lib/cucumber/ast/feature.rb +62 -0
- data/lib/cucumber/ast/feature_element.rb +46 -0
- data/lib/cucumber/ast/features.rb +20 -0
- data/lib/cucumber/ast/outline_table.rb +81 -0
- data/lib/cucumber/ast/py_string.rb +58 -0
- data/lib/cucumber/ast/scenario.rb +64 -0
- data/lib/cucumber/ast/scenario_outline.rb +90 -0
- data/lib/cucumber/ast/step.rb +122 -0
- data/lib/cucumber/ast/step_collection.rb +66 -0
- data/lib/cucumber/ast/step_invocation.rb +110 -0
- data/lib/cucumber/ast/table.rb +318 -0
- data/lib/cucumber/ast/tags.rb +33 -0
- data/lib/cucumber/ast/visitor.rb +125 -0
- data/lib/cucumber/ast.rb +29 -0
- data/lib/cucumber/broadcaster.rb +2 -9
- data/lib/cucumber/cli/configuration.rb +364 -0
- data/lib/cucumber/cli/language_help_formatter.rb +59 -0
- data/lib/cucumber/cli/main.rb +109 -0
- data/lib/cucumber/core_ext/exception.rb +53 -0
- data/lib/cucumber/core_ext/instance_exec.rb +54 -0
- data/lib/cucumber/core_ext/proc.rb +29 -65
- data/lib/cucumber/core_ext/string.rb +26 -0
- data/lib/cucumber/formatter/ansicolor.rb +102 -0
- data/lib/cucumber/formatter/color_io.rb +23 -0
- data/lib/cucumber/formatter/console.rb +109 -0
- data/lib/cucumber/formatter/cucumber.css +55 -0
- data/lib/cucumber/formatter/cucumber.sass +49 -0
- data/lib/cucumber/formatter/html.rb +133 -0
- data/lib/cucumber/formatter/pretty.rb +179 -0
- data/lib/cucumber/formatter/profile.rb +77 -0
- data/lib/cucumber/formatter/progress.rb +60 -0
- data/lib/cucumber/formatter/rerun.rb +35 -0
- data/lib/cucumber/formatter/unicode.rb +35 -0
- data/lib/cucumber/formatter.rb +1 -0
- data/lib/cucumber/formatters/unicode.rb +2 -0
- data/lib/cucumber/jbehave.rb +97 -0
- data/lib/cucumber/languages.yml +214 -72
- data/lib/cucumber/parser/basic.rb +0 -0
- data/lib/cucumber/parser/feature.rb +1487 -0
- data/lib/cucumber/parser/feature.tt +193 -0
- data/lib/cucumber/parser/i18n.tt +31 -0
- data/lib/cucumber/parser/table.rb +402 -0
- data/lib/cucumber/parser/table.tt +59 -0
- data/lib/cucumber/parser/treetop_ext.rb +75 -0
- data/lib/cucumber/parser.rb +43 -0
- data/lib/cucumber/platform.rb +13 -8
- data/lib/cucumber/rails/rspec.rb +6 -10
- data/lib/cucumber/rails/world.rb +8 -8
- data/lib/cucumber/rake/task.rb +46 -9
- data/lib/cucumber/step_definition.rb +103 -0
- data/lib/cucumber/step_match.rb +49 -0
- data/lib/cucumber/step_mother.rb +184 -65
- data/lib/cucumber/version.rb +4 -3
- data/lib/cucumber/world.rb +53 -0
- data/lib/cucumber.rb +45 -21
- data/rails_generators/cucumber/cucumber_generator.rb +23 -3
- data/rails_generators/cucumber/templates/cucumber +2 -1
- data/rails_generators/cucumber/templates/cucumber.rake +13 -5
- data/rails_generators/cucumber/templates/env.rb +11 -2
- data/rails_generators/cucumber/templates/paths.rb +19 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +60 -40
- data/rails_generators/feature/feature_generator.rb +26 -2
- data/rails_generators/feature/templates/feature.erb +15 -12
- data/rails_generators/feature/templates/steps.erb +14 -16
- data/spec/cucumber/ast/background_spec.rb +49 -0
- data/spec/cucumber/ast/feature_factory.rb +63 -0
- data/spec/cucumber/ast/feature_spec.rb +37 -0
- data/spec/cucumber/ast/py_string_spec.rb +47 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
- data/spec/cucumber/ast/scenario_spec.rb +65 -0
- data/spec/cucumber/ast/step_collection_spec.rb +8 -0
- data/spec/cucumber/ast/step_spec.rb +66 -0
- data/spec/cucumber/ast/table_spec.rb +149 -0
- data/spec/cucumber/ast/tags_spec.rb +19 -0
- data/spec/cucumber/broadcaster_spec.rb +6 -18
- data/spec/cucumber/cli/configuration_spec.rb +275 -0
- data/spec/cucumber/cli/main_spec.rb +203 -0
- data/spec/cucumber/core_ext/proc_spec.rb +27 -35
- data/spec/cucumber/core_ext/string_spec.rb +8 -0
- data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
- data/spec/cucumber/formatter/color_io_spec.rb +26 -0
- data/spec/cucumber/formatter/html/cucumber.css +37 -0
- data/spec/cucumber/formatter/html/cucumber.js +13 -0
- data/spec/cucumber/formatter/html/index.html +45 -0
- data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
- data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
- data/spec/cucumber/formatters/profile_formatter_spec.rb +22 -16
- data/spec/cucumber/parser/feature_parser_spec.rb +282 -0
- data/spec/cucumber/parser/table_parser_spec.rb +48 -0
- data/spec/cucumber/rails/stubs/mini_rails.rb +4 -3
- data/spec/cucumber/step_definition_spec.rb +81 -0
- data/spec/cucumber/step_mother_spec.rb +50 -51
- data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
- data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
- data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
- data/spec/cucumber/treetop_parser/multiple_tables.feature +6 -8
- data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
- data/spec/cucumber/treetop_parser/spaces.feature +3 -1
- data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
- data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
- data/spec/cucumber/world/pending_spec.rb +47 -0
- data/spec/spec_helper.rb +4 -3
- metadata +192 -95
- data/TODO.txt +0 -26
- data/examples/calculator_ruby_features/features/addition.rb +0 -23
- data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
- data/examples/cs/features/hello.feature +0 -11
- data/examples/cs/features/step_definitons/hello_steps.rb +0 -25
- data/examples/cs/features/step_definitons/tree_steps.rb +0 -14
- data/examples/cs/features/tree.feature +0 -9
- data/examples/cs/src/Hello.cs +0 -18
- data/examples/i18n/ja/README.txt +0 -5
- data/examples/selenium/features/step_definitons/stories_steps.rb +0 -41
- data/examples/watir/features/step_definitons/stories_steps.rb +0 -51
- data/features/see_features.feature +0 -8
- data/features/steps/features_steps.rb +0 -9
- data/gem_tasks/treetop.rake +0 -41
- data/lib/cucumber/cli.rb +0 -279
- data/lib/cucumber/executor.rb +0 -190
- data/lib/cucumber/formatters/ansicolor.rb +0 -109
- data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
- data/lib/cucumber/formatters/cucumber.css +0 -132
- data/lib/cucumber/formatters/cucumber.js +0 -11
- data/lib/cucumber/formatters/html_formatter.rb +0 -128
- data/lib/cucumber/formatters/jquery.js +0 -32
- data/lib/cucumber/formatters/pretty_formatter.rb +0 -234
- data/lib/cucumber/formatters/profile_formatter.rb +0 -92
- data/lib/cucumber/formatters/progress_formatter.rb +0 -58
- data/lib/cucumber/formatters.rb +0 -1
- data/lib/cucumber/model/table.rb +0 -28
- data/lib/cucumber/model.rb +0 -1
- data/lib/cucumber/step_methods.rb +0 -49
- data/lib/cucumber/tree/feature.rb +0 -63
- data/lib/cucumber/tree/features.rb +0 -21
- data/lib/cucumber/tree/given_scenario.rb +0 -13
- data/lib/cucumber/tree/scenario.rb +0 -174
- data/lib/cucumber/tree/step.rb +0 -134
- data/lib/cucumber/tree/table.rb +0 -26
- data/lib/cucumber/tree/top_down_visitor.rb +0 -23
- data/lib/cucumber/tree.rb +0 -18
- data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -206
- data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_da.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_de.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_en.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_es.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_et.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_id.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_it.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_no.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_parser.rb +0 -34
- data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_se.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1591
- data/script/console +0 -10
- data/script/console.cmd +0 -1
- data/script/destroy +0 -14
- data/script/destroy.cmd +0 -1
- data/script/generate +0 -14
- data/script/generate.cmd +0 -1
- data/script/txt2html +0 -74
- data/script/txt2html.cmd +0 -1
- data/setup.rb +0 -1585
- data/spec/cucumber/cli_spec.rb +0 -274
- data/spec/cucumber/executor_spec.rb +0 -298
- data/spec/cucumber/formatters/ansicolor_spec.rb +0 -35
- data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
- data/spec/cucumber/formatters/features.html +0 -269
- data/spec/cucumber/formatters/html_formatter_spec.rb +0 -74
- data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -204
- data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -65
- data/spec/cucumber/model/table_spec.rb +0 -20
- data/spec/cucumber/tree/feature_spec.rb +0 -43
- data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
- data/spec/cucumber/tree/scenario_spec.rb +0 -76
- data/spec/cucumber/tree/step_spec.rb +0 -50
- data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -98
- /data/examples/{calculator_ruby_features → selenium_webrat}/Rakefile +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
功能: 加法
|
|
2
|
+
為了避免愚蠢的錯誤
|
|
3
|
+
作為一個數學白痴
|
|
4
|
+
我希望有人能告訴我兩個數相加的結果
|
|
5
|
+
|
|
6
|
+
場景大綱: 將兩個數相加
|
|
7
|
+
假設我已經在計算機上輸入 <數值_1>
|
|
8
|
+
而且我已經在計算機上輸入 <數值_2>
|
|
9
|
+
當我按下 <按鈕>
|
|
10
|
+
那麼螢幕上應該顯示 <結果>
|
|
11
|
+
|
|
12
|
+
例子:
|
|
13
|
+
| 數值_1 | 數值_2 | 按鈕 | 結果 |
|
|
14
|
+
| 20 | 30 | add | 50 |
|
|
15
|
+
| 2 | 5 | add | 7 |
|
|
16
|
+
| 0 | 40 | add | 40 |
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'spec/expectations'
|
|
3
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib') # This line is not needed in your own project
|
|
4
|
+
require 'cucumber/formatters/unicode'
|
|
5
|
+
require 'calculator'
|
|
6
|
+
|
|
7
|
+
Before do
|
|
8
|
+
@calc = Calculator.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
After do
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
Given /我已經在計算機上輸入 (\d+)/ do |n|
|
|
15
|
+
@calc.push n.to_i
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
When /我按下 (\w+)/ do |op|
|
|
19
|
+
@result = @calc.send op
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
Then /螢幕上應該顯示 (.*)/ do |result|
|
|
23
|
+
@result.should == result.to_f
|
|
24
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'spec' # so we can call .should
|
|
1
|
+
require 'spec/expectations' # so we can call .should
|
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../src') # so the jar is found
|
|
3
3
|
require 'cucumber_demo' # puts the jar on the classpath
|
|
4
4
|
include_class 'cucumber.demo.Hello'
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
h1. Cucumber and JBehave
|
|
2
|
+
|
|
3
|
+
Look ma - no Ruby!
|
|
4
|
+
|
|
5
|
+
h2. Running the example
|
|
6
|
+
|
|
7
|
+
First, compile the java code (and JBehave steps)
|
|
8
|
+
|
|
9
|
+
<code>mvn compile jar:jar</code>
|
|
10
|
+
|
|
11
|
+
Second, set your CLASSPATH
|
|
12
|
+
<code>export CLASSPATH=~/.m2/repository/cucumber/cucumber-support/0.2/cucumber-support-0.2.jar:~/.m2/repository/org/jbehave/jbehave-core/2.1.1/jbehave-core-2.1.1.jar:~/.m2/repository/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar:~/.m2/repository/junit/junit/4.4/junit-4.4.jar</code>
|
|
13
|
+
|
|
14
|
+
Third, run Cucumber:
|
|
15
|
+
|
|
16
|
+
<code>jruby -S cucumber features</code>
|
|
17
|
+
|
|
18
|
+
Or if you got the source with Git:
|
|
19
|
+
|
|
20
|
+
<code>jruby ../../bin/cucumber features</code>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Feature: Trading
|
|
2
|
+
In order to avoid lost trades
|
|
3
|
+
Traders should be alerted about stocks
|
|
4
|
+
|
|
5
|
+
Scenario: Status alert can be activated
|
|
6
|
+
Given a stock of prices 0.5,1.0 and a threshold of 10.0
|
|
7
|
+
When the stock is traded at 5.0
|
|
8
|
+
Then the alert status should be OFF
|
|
9
|
+
When the stock is traded at 11.0
|
|
10
|
+
Then the alert status should be ON
|
|
11
|
+
|
|
12
|
+
Scenario: Status alert is never activated
|
|
13
|
+
Given a stock of prices 0.5,1.0 and a threshold of 15.0
|
|
14
|
+
When the stock is traded at 5.0
|
|
15
|
+
Then the alert status should be OFF
|
|
16
|
+
When the stock is traded at 11.0
|
|
17
|
+
Then the alert status should be OFF
|
|
18
|
+
|
|
19
|
+
Scenario: Trader sells all stocks
|
|
20
|
+
# Given the following table
|
|
21
|
+
# | a | b |
|
|
22
|
+
# | 1 | 2 |
|
|
23
|
+
# | 3 | 4 |
|
|
24
|
+
Given a trader of name Mauro
|
|
25
|
+
Given a stock of prices 0.5,1.0 and a threshold of 1.5
|
|
26
|
+
When the stock is traded at 2.0
|
|
27
|
+
Then the trader sells all stocks
|
|
28
|
+
And the trader gets a bonus
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
2
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
3
|
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
|
4
|
+
http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
5
|
+
<modelVersion>4.0.0</modelVersion>
|
|
6
|
+
<groupId>cukes</groupId>
|
|
7
|
+
<artifactId>jbehave-example</artifactId>
|
|
8
|
+
<packaging>jar</packaging>
|
|
9
|
+
<version>0.2-SNAPSHOT</version>
|
|
10
|
+
<name>Cucumber JBehave Example</name>
|
|
11
|
+
<url>http://cukes.info/</url>
|
|
12
|
+
|
|
13
|
+
<repositories>
|
|
14
|
+
<repository>
|
|
15
|
+
<id>codehaus</id>
|
|
16
|
+
<url>http://repository.codehaus.org</url>
|
|
17
|
+
</repository>
|
|
18
|
+
</repositories>
|
|
19
|
+
|
|
20
|
+
<dependencies>
|
|
21
|
+
<dependency>
|
|
22
|
+
<groupId>cucumber</groupId>
|
|
23
|
+
<artifactId>cucumber-support</artifactId>
|
|
24
|
+
<version>0.2</version>
|
|
25
|
+
</dependency>
|
|
26
|
+
<dependency>
|
|
27
|
+
<groupId>org.jbehave</groupId>
|
|
28
|
+
<artifactId>jbehave-core</artifactId>
|
|
29
|
+
<version>2.1.1</version>
|
|
30
|
+
</dependency>
|
|
31
|
+
<dependency>
|
|
32
|
+
<groupId>junit</groupId>
|
|
33
|
+
<artifactId>junit</artifactId>
|
|
34
|
+
<version>4.4</version>
|
|
35
|
+
</dependency>
|
|
36
|
+
</dependencies>
|
|
37
|
+
|
|
38
|
+
<build>
|
|
39
|
+
<pluginManagement>
|
|
40
|
+
<plugins>
|
|
41
|
+
<plugin>
|
|
42
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
43
|
+
<artifactId>maven-compiler-plugin</artifactId>
|
|
44
|
+
<version>2.0.2</version>
|
|
45
|
+
<configuration>
|
|
46
|
+
<source>1.5</source>
|
|
47
|
+
<target>1.5</target>
|
|
48
|
+
</configuration>
|
|
49
|
+
</plugin>
|
|
50
|
+
</plugins>
|
|
51
|
+
</pluginManagement>
|
|
52
|
+
</build>
|
|
53
|
+
</project>
|
data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package cukes.jbehave.examples.trader.converters;
|
|
2
|
+
|
|
3
|
+
import java.lang.reflect.Type;
|
|
4
|
+
|
|
5
|
+
import cukes.jbehave.examples.trader.model.Trader;
|
|
6
|
+
import cukes.jbehave.examples.trader.persistence.TraderPersister;
|
|
7
|
+
import org.jbehave.scenario.steps.ParameterConverters.InvalidParameterException;
|
|
8
|
+
import org.jbehave.scenario.steps.ParameterConverters.ParameterConverter;
|
|
9
|
+
|
|
10
|
+
public class TraderConverter implements ParameterConverter {
|
|
11
|
+
private TraderPersister persister;
|
|
12
|
+
|
|
13
|
+
public TraderConverter(TraderPersister persister) {
|
|
14
|
+
this.persister = persister;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public boolean accept(Type type) {
|
|
18
|
+
if (type instanceof Class) {
|
|
19
|
+
return Trader.class.isAssignableFrom((Class<?>) type);
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public Object convertValue(String value, Type type) {
|
|
25
|
+
Trader trader = persister.retrieveTrader(value);
|
|
26
|
+
if (trader == null) {
|
|
27
|
+
throw new InvalidParameterException("Trader not found for name " + value, null);
|
|
28
|
+
}
|
|
29
|
+
return trader;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package cukes.jbehave.examples.trader.model;
|
|
2
|
+
|
|
3
|
+
import static cukes.jbehave.examples.trader.model.Stock.AlertStatus.OFF;
|
|
4
|
+
import static cukes.jbehave.examples.trader.model.Stock.AlertStatus.ON;
|
|
5
|
+
|
|
6
|
+
import java.util.List;
|
|
7
|
+
|
|
8
|
+
public class Stock {
|
|
9
|
+
|
|
10
|
+
public enum AlertStatus {
|
|
11
|
+
ON, OFF
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
private List<Double> prices;
|
|
15
|
+
private double alertPrice;
|
|
16
|
+
private AlertStatus status = OFF;
|
|
17
|
+
|
|
18
|
+
public Stock(List<Double> prices, double alertPrice) {
|
|
19
|
+
this.prices = prices;
|
|
20
|
+
this.alertPrice = alertPrice;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public List<Double> getPrices() {
|
|
24
|
+
return prices;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public void tradeAt(double price) {
|
|
28
|
+
this.prices.add(price);
|
|
29
|
+
if (price > alertPrice) {
|
|
30
|
+
status = ON;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public void resetAlert() {
|
|
35
|
+
status = OFF;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public AlertStatus getStatus() {
|
|
39
|
+
return status;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package cukes.jbehave.examples.trader.model;
|
|
2
|
+
|
|
3
|
+
import static java.util.Arrays.asList;
|
|
4
|
+
|
|
5
|
+
import java.util.List;
|
|
6
|
+
|
|
7
|
+
public class Trader {
|
|
8
|
+
|
|
9
|
+
private final String name;
|
|
10
|
+
private List<Stock> stocks;
|
|
11
|
+
|
|
12
|
+
public Trader(String name, List<Stock> stocks) {
|
|
13
|
+
this.name = name;
|
|
14
|
+
this.stocks = stocks;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public String getName() {
|
|
18
|
+
return name;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public List<Stock> getStocks() {
|
|
22
|
+
return stocks;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public void sellAllStocks(){
|
|
26
|
+
this.stocks = asList(new Stock[]{});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
}
|
data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
package cukes.jbehave.examples.trader.persistence;
|
|
2
|
+
|
|
3
|
+
import cukes.jbehave.examples.trader.model.Trader;
|
|
4
|
+
|
|
5
|
+
public class TraderPersister {
|
|
6
|
+
|
|
7
|
+
private Trader[] traders;
|
|
8
|
+
|
|
9
|
+
public TraderPersister(Trader... traders) {
|
|
10
|
+
this.traders = traders;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public Trader retrieveTrader(String name) {
|
|
14
|
+
for (Trader trader : traders) {
|
|
15
|
+
if (trader.getName().equals(name)) {
|
|
16
|
+
return trader;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
package cukes.jbehave.examples.trader.scenarios;
|
|
2
|
+
|
|
3
|
+
import static java.util.Arrays.asList;
|
|
4
|
+
import static org.hamcrest.CoreMatchers.equalTo;
|
|
5
|
+
import static org.jbehave.Ensure.ensureThat;
|
|
6
|
+
|
|
7
|
+
import java.util.List;
|
|
8
|
+
|
|
9
|
+
import cukes.jbehave.examples.trader.converters.TraderConverter;
|
|
10
|
+
import cukes.jbehave.examples.trader.model.Stock;
|
|
11
|
+
import cukes.jbehave.examples.trader.model.Trader;
|
|
12
|
+
import cukes.jbehave.examples.trader.persistence.TraderPersister;
|
|
13
|
+
import org.jbehave.scenario.annotations.Given;
|
|
14
|
+
import org.jbehave.scenario.annotations.Then;
|
|
15
|
+
import org.jbehave.scenario.annotations.When;
|
|
16
|
+
import org.jbehave.scenario.parser.PrefixCapturingPatternBuilder;
|
|
17
|
+
import org.jbehave.scenario.steps.ParameterConverters;
|
|
18
|
+
import org.jbehave.scenario.steps.SilentStepMonitor;
|
|
19
|
+
import org.jbehave.scenario.steps.Steps;
|
|
20
|
+
import org.jbehave.scenario.steps.StepsConfiguration;
|
|
21
|
+
import cucumber.ast.Table;
|
|
22
|
+
|
|
23
|
+
public class TraderSteps extends Steps {
|
|
24
|
+
|
|
25
|
+
private static final StepsConfiguration configuration = new StepsConfiguration();
|
|
26
|
+
private Stock stock;
|
|
27
|
+
private Trader trader;
|
|
28
|
+
|
|
29
|
+
public TraderSteps() {
|
|
30
|
+
super(configuration);
|
|
31
|
+
configuration.useParameterConverters(new ParameterConverters(
|
|
32
|
+
new SilentStepMonitor(), new TraderConverter(mockTradePersister())));
|
|
33
|
+
configuration.usePatternBuilder(new PrefixCapturingPatternBuilder("%"));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private TraderPersister mockTradePersister() {
|
|
37
|
+
return new TraderPersister(new Trader("Mauro", asList(new Stock(asList(1.0d), 10.d))));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@Given("a trader of name %trader")
|
|
41
|
+
public void aTrader(Trader trader) {
|
|
42
|
+
this.trader = trader;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@Given("a stock of prices %prices and a threshold of %threshold")
|
|
46
|
+
public void aStockOfPrice(List<Double> prices, double threshold) {
|
|
47
|
+
stock = new Stock(prices, threshold);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Given("the following table")
|
|
51
|
+
public void theFollowingTable(Table table) {
|
|
52
|
+
System.out.println("My table:" + table);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@When("the stock is traded at %price")
|
|
56
|
+
public void theStockIsTradedAt(double price) {
|
|
57
|
+
stock.tradeAt(price);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Then("the alert status should be %status")
|
|
61
|
+
public void theAlertStatusShouldBe(String status) {
|
|
62
|
+
ensureThat(stock.getStatus().name(), equalTo(status));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@Then("the trader sells all stocks")
|
|
66
|
+
public void theTraderSellsAllStocks() {
|
|
67
|
+
trader.sellAllStocks();
|
|
68
|
+
ensureThat(trader.getStocks().size(), equalTo(0));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Given 'I am on the Google search page' do
|
|
2
|
+
@browser.open('http://www.google.com/')
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
When /I search for "(.*)"/ do |query|
|
|
6
|
+
@browser.type('q', query)
|
|
7
|
+
@browser.click 'btnG'
|
|
8
|
+
@browser.wait_for_page_to_load
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Then /I should see a link to (.*)/ do |expected_url|
|
|
12
|
+
@browser.is_element_present("css=a[href='#{expected_url}']").should be_true
|
|
13
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'spec/expectations'
|
|
2
|
+
require 'selenium'
|
|
3
|
+
|
|
4
|
+
# "before all"
|
|
5
|
+
browser = Selenium::SeleniumDriver.new("localhost", 4444, "*chrome", "http://localhost", 15000)
|
|
6
|
+
|
|
7
|
+
Before do
|
|
8
|
+
@browser = browser
|
|
9
|
+
@browser.start
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
After do
|
|
13
|
+
@browser.stop
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# "after all"
|
|
17
|
+
at_exit do
|
|
18
|
+
browser.close rescue nil
|
|
19
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Given 'I am on the Google search page' do
|
|
2
|
+
visit('http://www.google.com/')
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
When /I search for "(.*)"/ do |query|
|
|
6
|
+
fill_in('q', :with => query)
|
|
7
|
+
click_button('btnG')
|
|
8
|
+
selenium.wait_for_page_to_load
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Then /I should see a link to (.*)/ do |expected_url|
|
|
12
|
+
click_link(expected_url)
|
|
13
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'spec/expectations'
|
|
2
|
+
|
|
3
|
+
# START HACK
|
|
4
|
+
# Webrat's Selenium wrongly assumes Rails in available. # We'll just fool it...
|
|
5
|
+
module ActionController
|
|
6
|
+
class IntegrationTest
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def silence_stream(*args)
|
|
11
|
+
yield if block_given?
|
|
12
|
+
end
|
|
13
|
+
# END HACK
|
|
14
|
+
|
|
15
|
+
# RSpec
|
|
16
|
+
require 'spec/expectations'
|
|
17
|
+
|
|
18
|
+
# Webrat
|
|
19
|
+
require 'webrat'
|
|
20
|
+
Webrat.configure do |config|
|
|
21
|
+
config.mode = :selenium
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
World do
|
|
25
|
+
session = Webrat::SeleniumSession.new
|
|
26
|
+
session.extend(Webrat::Methods)
|
|
27
|
+
session.extend(Webrat::Selenium::Methods)
|
|
28
|
+
session.extend(Webrat::Selenium::Matchers)
|
|
29
|
+
session
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# START HACK
|
|
33
|
+
# Disable Rails-specific code
|
|
34
|
+
module Webrat
|
|
35
|
+
def self.start_app_server
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.stop_app_server
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
# END HACK
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Feature: Failing background after previously successful background sample
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given passing without a table
|
|
5
|
+
And '10' global cukes
|
|
6
|
+
|
|
7
|
+
Scenario: passing background
|
|
8
|
+
Then I should have '10' global cukes
|
|
9
|
+
|
|
10
|
+
Scenario: failing background
|
|
11
|
+
Then I should have '10' global cukes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Feature: Passing background with multiline args
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given table
|
|
5
|
+
|a|b|
|
|
6
|
+
|c|d|
|
|
7
|
+
And multiline string
|
|
8
|
+
"""
|
|
9
|
+
I'm a cucumber and I'm okay.
|
|
10
|
+
I sleep all night and I test all day
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
Scenario: passing background
|
|
14
|
+
Then the table should be
|
|
15
|
+
|a|b|
|
|
16
|
+
|c|d|
|
|
17
|
+
Then the multiline string should be
|
|
18
|
+
"""
|
|
19
|
+
I'm a cucumber and I'm okay.
|
|
20
|
+
I sleep all night and I test all day
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
Scenario: another passing background
|
|
24
|
+
Then the table should be
|
|
25
|
+
|a|b|
|
|
26
|
+
|c|d|
|
|
27
|
+
Then the multiline string should be
|
|
28
|
+
"""
|
|
29
|
+
I'm a cucumber and I'm okay.
|
|
30
|
+
I sleep all night and I test all day
|
|
31
|
+
"""
|
|
32
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Feature: Failing background with scenario outlines sample
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given failing without a table
|
|
5
|
+
|
|
6
|
+
Scenario Outline: failing background
|
|
7
|
+
Then I should have '<count>' cukes
|
|
8
|
+
Examples:
|
|
9
|
+
|count|
|
|
10
|
+
| 10 |
|
|
11
|
+
|
|
12
|
+
Scenario Outline: another failing background
|
|
13
|
+
Then I should have '<count>' cukes
|
|
14
|
+
Examples:
|
|
15
|
+
|count|
|
|
16
|
+
| 10 |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Feature: Passing background with scenario outlines sample
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given '10' cukes
|
|
5
|
+
|
|
6
|
+
Scenario Outline: passing background
|
|
7
|
+
Then I should have '<count>' cukes
|
|
8
|
+
Examples:
|
|
9
|
+
|count|
|
|
10
|
+
| 10 |
|
|
11
|
+
|
|
12
|
+
Scenario Outline: another passing background
|
|
13
|
+
Then I should have '<count>' cukes
|
|
14
|
+
Examples:
|
|
15
|
+
|count|
|
|
16
|
+
| 10 |
|