| @@ -0,0 +1,3 @@ | |||
| .github | |||
| /examples | |||
| /spec | |||
| @@ -0,0 +1,32 @@ | |||
| # Set the default behavior, in case people don't have core.autocrlf set. | |||
| * text eol=lf | |||
| # Explicitly declare text files to always be normalized and converted | |||
| # to native line endings on checkout. | |||
| *.css text eol=lf | |||
| *.feature text eol=lf | |||
| *.gemspec text eol=lf | |||
| *.js text eol=lf | |||
| *.md text eol=lf | |||
| *.rake text eol=lf | |||
| *.rb text eol=lf | |||
| *.sass text eol=lf | |||
| *.tcl text eol=lf | |||
| *.textile text eol=lf | |||
| *.txt text eol=lf | |||
| *.xml text eol=lf | |||
| *.yml text eol=lf | |||
| Gemfile text eol=lf | |||
| LICENSE text eol=lf | |||
| Rakefile text eol=lf | |||
| .cucumberproignore text eol=lf | |||
| .gitignore text eol=lf | |||
| .rspec text eol=lf | |||
| .ruby-gemset text eol=lf | |||
| .yardopts text eol=lf | |||
| scripts/* text eol=lf | |||
| # Denote all files that are truly binary and should not be modified. | |||
| # These patterns are here as an example; we have 0 of these. | |||
| *.png binary | |||
| *.jpg binary | |||
| @@ -0,0 +1,37 @@ | |||
| .bundle | |||
| nbproject | |||
| coverage | |||
| pkg | |||
| doc | |||
| tmp | |||
| .yardoc | |||
| *.log | |||
| *.pid | |||
| .eprj | |||
| .tmtags | |||
| *~ | |||
| .DS_Store | |||
| *.swp | |||
| *.swo | |||
| target | |||
| *.tmproj | |||
| .#* | |||
| .idea | |||
| .vscode | |||
| *.pyc | |||
| *.rbc | |||
| rerun.txt | |||
| ._* | |||
| .rvmrc | |||
| .sass-cache | |||
| doc/ | |||
| *.tgz | |||
| tags | |||
| .ruby-version | |||
| .project | |||
| Gemfile.local | |||
| Gemfile.local.lock | |||
| .envrc | |||
| Gemfile.lock | |||
| bin/json-formatter | |||
| acceptance/* | |||
| @@ -0,0 +1,2 @@ | |||
| --color | |||
| --tag "~cck" | |||
| @@ -0,0 +1,158 @@ | |||
| inherit_from: .rubocop_todo.yml | |||
| require: | |||
| - rubocop-packaging | |||
| AllCops: | |||
| NewCops: disable | |||
| # Keep this inline with the lowest ruby-* version in circleci/config.yml and | |||
| # the version in the gemspec | |||
| TargetRubyVersion: 2.6 | |||
| # Cop names are not displayed in offense messages by default. Change behavior | |||
| # by overriding DisplayCopNames, or by giving the `-D/--display-cop-names` | |||
| # option. | |||
| DisplayCopNames: true | |||
| # Style guide URLs are not displayed in offense messages by default. Change | |||
| # behavior by overriding `DisplayStyleGuide`, or by giving the | |||
| # `-S/--display-style-guide` option. | |||
| DisplayStyleGuide: true | |||
| Exclude: | |||
| - 'bin/*' | |||
| - 'tmp/**/*' | |||
| - 'vendor/**/*' | |||
| - 'temp_app/**/*' | |||
| - 'cck/features/**/*' | |||
| Layout/EndOfLine: | |||
| EnforcedStyle: lf | |||
| # Disabling this cop until the minimum Ruby version is >= 2.3 as squiggly | |||
| # heredocs '<<~' were introduced then. The files below are the current ones | |||
| # with offenses | |||
| Layout/HeredocIndentation: | |||
| Exclude: | |||
| - 'features/lib/support/feature_factory.rb' | |||
| - 'lib/cucumber/cli/options.rb' | |||
| - 'lib/cucumber/cli/profile_loader.rb' | |||
| - 'spec/cucumber/cli/configuration_spec.rb' | |||
| - 'spec/cucumber/cli/profile_loader_spec.rb' | |||
| - 'spec/cucumber/formatter/pretty_spec.rb' | |||
| # Reviewed: Formatters put trailing spaces after things like 'Feature: ' | |||
| # In pretty_spec.rb, progress_spec.rb offences look false, | |||
| # as the trailing spaces are in multiline string literals | |||
| Layout/TrailingWhitespace: | |||
| Exclude: | |||
| - 'spec/cucumber/formatter/pretty_spec.rb' | |||
| - 'spec/cucumber/formatter/progress_spec.rb' | |||
| # Reviewed: please see PR-1022 for details on why this cop is disabled: | |||
| # https://github.com/cucumber/cucumber-ruby/pull/1022 | |||
| Lint/AmbiguousOperator: | |||
| Enabled: false | |||
| # We exclude proto_world for documentation (rdoc) purpose | |||
| Lint/UselessMethodDefinition: | |||
| Enabled: true | |||
| Exclude: | |||
| - 'lib/cucumber/glue/proto_world.rb' | |||
| Metrics/AbcSize: | |||
| Max: 45 | |||
| Metrics/BlockLength: | |||
| CountComments: false | |||
| Exclude: | |||
| - './cucumber.gemspec' | |||
| - './spec/**/*' | |||
| - 'cck/spec/**/*' | |||
| Metrics/ClassLength: | |||
| Max: 375 | |||
| Exclude: | |||
| - 'lib/cucumber/cli/options.rb' | |||
| Metrics/CyclomaticComplexity: | |||
| Max: 12 | |||
| # A line length of 200 covers most violations in the repo while still being | |||
| # a more up to date length given today's screen sizes | |||
| Layout/LineLength: | |||
| Max: 200 | |||
| Metrics/ModuleLength: | |||
| Max: 150 | |||
| Exclude: | |||
| - './spec/**/*' | |||
| - 'cck/spec/**/*' | |||
| Metrics/MethodLength: | |||
| Max: 30 | |||
| Metrics/PerceivedComplexity: | |||
| Max: 13 | |||
| # Rubocop doesn't like method names in other languages but as Cucumber supports | |||
| # languages, this cop needs to be disabled. | |||
| Naming/AsciiIdentifiers: | |||
| Enabled: false | |||
| # For the most part, the project is solid on naming. There are though, a few | |||
| # cases where the cop doesn't need to catch. | |||
| Naming/MethodName: | |||
| EnforcedStyle: snake_case | |||
| Enabled: true | |||
| Exclude: | |||
| - 'examples/i18n/ar/lib/calculator.rb' | |||
| - 'examples/i18n/he/lib/calculator.rb' | |||
| - 'examples/i18n/he/lib/calculator.rb' | |||
| - 'examples/i18n/tr/lib/hesap_makinesi.rb' | |||
| - 'lib/cucumber/glue/dsl.rb' | |||
| # In most cases, being descriptive with parameter names helps a reader understand | |||
| # what the variable is for. In some cases, shorter names are sufficient. | |||
| Naming/MethodParameterName: | |||
| AllowedNames: _, e, n, v, id, io, gh, pr | |||
| # Reviewed: these offenses look false as the variables are in cyrillic | |||
| Naming/VariableName: | |||
| Exclude: | |||
| - 'examples/i18n/ru/features/step_definitions/calculator_steps.rb' | |||
| - 'examples/i18n/uk/features/step_definitions/calculator_steps.rb' | |||
| - 'examples/i18n/uz/features/step_definitions/calculator_steps.rb' | |||
| # Rubocop doesn't handle some international words well for this cop | |||
| Naming/VariableNumber: | |||
| EnforcedStyle: normalcase | |||
| Exclude: | |||
| - 'examples/i18n/**/*' | |||
| # This cop throws errors when parsing a lot of the repo's code, possibly due | |||
| # to splat issues? | |||
| Style/AccessModifierDeclarations: | |||
| Enabled: false | |||
| Style/ClassAndModuleChildren: | |||
| Enabled: false | |||
| Style/ClassEqualityComparison: | |||
| Enabled: true | |||
| Style/Documentation: | |||
| Enabled: false | |||
| Style/FormatStringToken: | |||
| EnforcedStyle: annotated | |||
| Style/FloatDivision: | |||
| Enabled: false | |||
| Style/StderrPuts: | |||
| Enabled: false | |||
| Style/RegexpLiteral: | |||
| EnforcedStyle: slashes | |||
| AllowInnerSlashes: true | |||
| Style/YodaCondition: | |||
| Enabled: true | |||
| @@ -0,0 +1,89 @@ | |||
| # This configuration was generated by | |||
| # `rubocop --auto-gen-config` | |||
| # on 2020-08-23 16:54:14 UTC using RuboCop version 0.89.1. | |||
| # The point is for the user to remove these configuration records | |||
| # one by one as the offenses are removed from the code base. | |||
| # Note that changes in the inspected code, or installation of new | |||
| # versions of RuboCop, may require this file to be generated again. | |||
| # Offense count: 38 | |||
| # Cop supports --auto-correct. | |||
| # Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle. | |||
| # SupportedHashRocketStyles: key, separator, table | |||
| # SupportedColonStyles: key, separator, table | |||
| # SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit | |||
| Layout/HashAlignment: | |||
| Exclude: | |||
| - 'cucumber.gemspec' | |||
| - 'lib/cucumber/cli/options.rb' | |||
| - 'lib/cucumber/formatter/ansicolor.rb' | |||
| - 'lib/cucumber/gherkin/formatter/ansi_escapes.rb' | |||
| # Offense count: 5 | |||
| # Cop supports --auto-correct. | |||
| Lint/RedundantCopDisableDirective: | |||
| Exclude: | |||
| - 'lib/cucumber/errors.rb' | |||
| - 'lib/cucumber/glue/proto_world.rb' | |||
| - 'lib/cucumber/glue/registry_and_more.rb' | |||
| - 'lib/cucumber/glue/snippet.rb' | |||
| # Offense count: 1 | |||
| # Configuration parameters: AllowComments. | |||
| Lint/SuppressedException: | |||
| Exclude: | |||
| - 'lib/cucumber/rake/task.rb' | |||
| # Offense count: 1 | |||
| # Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms. | |||
| # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS | |||
| Naming/FileName: | |||
| Exclude: | |||
| - 'features/lib/step_definitions/iso-8859-1_steps.rb' | |||
| # Offense count: 197 | |||
| # Cop supports --auto-correct. | |||
| # Configuration parameters: EnforcedStyle. | |||
| # SupportedStyles: always, always_true, never | |||
| Style/FrozenStringLiteralComment: | |||
| Enabled: false | |||
| # Offense count: 5 | |||
| # Cop supports --auto-correct. | |||
| # Configuration parameters: EnforcedStyle. | |||
| # SupportedStyles: literals, strict | |||
| Style/MutableConstant: | |||
| Exclude: | |||
| - 'lib/cucumber/cli/options.rb' | |||
| - 'lib/cucumber/file_specs.rb' | |||
| - 'lib/cucumber/runtime.rb' | |||
| - 'lib/cucumber/term/ansicolor.rb' | |||
| # Offense count: 5 | |||
| # Cop supports --auto-correct. | |||
| # Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods. | |||
| # SupportedStyles: predicate, comparison | |||
| Style/NumericPredicate: | |||
| Exclude: | |||
| - 'spec/**/*' | |||
| - 'lib/cucumber/formatter/console.rb' | |||
| - 'lib/cucumber/formatter/console_counts.rb' | |||
| - 'lib/cucumber/glue/invoke_in_world.rb' | |||
| - 'lib/cucumber/runtime.rb' | |||
| # Offense count: 10 | |||
| # Cop supports --auto-correct. | |||
| Style/RedundantFreeze: | |||
| Exclude: | |||
| - 'lib/cucumber/cli/options.rb' | |||
| - 'lib/cucumber/formatter/unicode.rb' | |||
| - 'spec/cucumber/step_match_spec.rb' | |||
| # Offense count: 2 | |||
| # Cop supports --auto-correct. | |||
| # Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods. | |||
| # AllowedMethods: present?, blank?, presence, try, try! | |||
| Style/SafeNavigation: | |||
| Exclude: | |||
| - 'lib/cucumber/formatter/ansicolor.rb' | |||
| - 'lib/cucumber/gherkin/formatter/ansi_escapes.rb' | |||
| @@ -0,0 +1 @@ | |||
| cucumber | |||
| @@ -0,0 +1,246 @@ | |||
| # Contributing to Cucumber | |||
| Thank you for considering contributing to Cucumber! | |||
| This document will first introduce different ways to get involved before | |||
| focusing on how to contribute to the code. | |||
| ## Code of Conduct | |||
| Everyone interacting in this codebase and issue tracker is expected to follow | |||
| the Cucumber [code of conduct](https://cucumber.io/conduct). | |||
| ## How can I contribute? | |||
| If you're reading this, you are certainly looking to contribute to the code. Cucumber | |||
| is not this single repository. It is made up of several packages around several | |||
| repositories. So before going further with the code, you may consider the | |||
| following first, in order to get your bearings. | |||
| If you just want to know how to contribute to the code, go to | |||
| [Contribute to the code](#contribute-to-the-code). | |||
| If you want to report an issue, or suggest an enhancement, go to | |||
| [Report bugs and submit feature requests](#report-bugs-and-submit-feature-requests). | |||
| ### Meet the community, the maintainers, and other Cucumber developers | |||
| Smartbear hosts a [community message board]. | |||
| This is a good place to meet users, the community, and to ask questions. | |||
| You can also join the Cucumber Community Slack: | |||
| [register for an account][register-slack] then head over to [#intro][slack-intro]. | |||
| This is the place to be to meet other contributors and find a mentor to help you | |||
| get started. | |||
| ### Test Cucumber | |||
| Testing Cucumber, especially new features, is a great way to contribute. We | |||
| cannot put a price on (early) feedback. | |||
| Keep an eye on our CHANGELOGS to discover new features. Test and experiment, and | |||
| submit your feedback through [issues](#report-bugs-and-submit-feature-requests), | |||
| the [community message board], or [Slack][community-slack]. | |||
| ### Contribute to the documentation | |||
| [The documentation][cucumber-docs] is an important part of Cucumber. It is | |||
| essential that it remains simple and accurate. You can contribute to it via | |||
| [github.com/cucumber/docs](https://github.com/cucumber/docs). | |||
| ### Promote Cucumber | |||
| You don't know how to contribute but would like to help? Telling other people | |||
| about Cucumber on the Internet - social media, reviews, blogs - but also in real | |||
| life is already a big help! Join us on [Slack][community-slack] to share your | |||
| publication and to discover new ones. | |||
| ## Report bugs and submit feature requests | |||
| The short version is: | |||
| - Find the appropriate repository | |||
| - Try to check there is not already an issue or pull request that deals with | |||
| your bug or request | |||
| - Explain your issue and include as much details as possible to help other | |||
| people reproduce your problem or understand your request | |||
| - Consider submitting a pull request if you feel confident enough | |||
| You can find more details for each of these steps in the following sections. | |||
| ### Find the appropriate repository | |||
| The current repository, `cucumber-ruby`, is actually the tip of the iceberg. It | |||
| provides a user interface through a CLI, some built-in formatters, and the | |||
| execution environment you may know as the `World` object. | |||
| An important repository is [cucumber/common]. It is a mono-repo | |||
| with a lot of libraries. You will find there what is related to: | |||
| - parsing Gherkin documents - aka `.feature` files | |||
| - parsing tag expressions - the options you use to filter an execution with tags | |||
| - parsing Cucumber expressions - the expressions that link a Gherkin step to a | |||
| step definition | |||
| - everyting related to the HTML formatter | |||
| `cucumber-ruby` is also composed of [cucumber-ruby-core]: this is the engine that | |||
| will execute the test cases computed from a parsed Gherkin document | |||
| Last but not least, there is also a repository for [cucumber-rails], the gem | |||
| that brings Cucumber to Rails 5.x and 6.x. | |||
| In any case, if your are not sure, best places to open an issue are the current | |||
| repository - `cucumber-ruby` - and the mono-repo at [cucumber/common]. | |||
| ### Look for existing issues and pull requests | |||
| Search in [the current repository][cucumber-ruby-issues], in the | |||
| [mono-repo][cucumber/common-issues], but also in the | |||
| [whole cucumber organization][cucumber-issues] if the problem or feature has already | |||
| been reported. If you find an issue or pull request which is still open, add | |||
| comments to it instead of opening a new one. | |||
| If you're not sure, don't hesitate to just open a new issue. We can always merge | |||
| and de-duplicate later. | |||
| ### Submitting a pull request | |||
| When submitting a pull request: | |||
| - create a [draft pull request][how-to-create-a-draft-pr] | |||
| - try to follow the instructions in the [template](.github/PULL_REQUEST_TEMPLATE.md) | |||
| - if possible, [sign your commits] | |||
| - update CHANGELOG.md with your changes | |||
| - once the PR is ready, request for reviews | |||
| More info on [how to contribute to the code](#contribute-to-the-code) can be | |||
| found below. | |||
| ### Opening a new issue | |||
| To open a good issue, be clear and precise. | |||
| If you report a problem, the reader must be able to reproduce it easily. | |||
| Please do your best to create a [minimal, reproducible example][minimal-reproducible-example]. | |||
| Consider submitting a pull request. Even if you think you cannot fix it by | |||
| yourself, a pull request with a failing test is always welcome. | |||
| If you request is for an enhancement - a new feature - try to be specific and | |||
| support your request with referenced facts and include examples to illustrate | |||
| your proposal. | |||
| ## Contribute to the code | |||
| ### Development environment | |||
| Development environment for `cucumber-ruby` is a simple Ruby environment with | |||
| Bundler. Use a [supported Ruby version](./README.md#supported-platforms), make | |||
| sure [Bundler] is set-up, and voilà! | |||
| You can then [fork][how-to-fork] and clone the repository. If your environment | |||
| is set-up properly, the following commands should install the dependencies and | |||
| execute all the tests successfully. | |||
| ```shell | |||
| bundle install | |||
| bundle exec rake | |||
| ``` | |||
| You can now create a branch for your changes and [submit a pull request](#submitting-a-pull-request)! | |||
| If you want to check the code coverage during your development, execute | |||
| `bundle exec rake cov`. | |||
| ### Cucumber-ruby-core | |||
| As seen here: [Find the appropriate repository](#find-the-appropriate-repository), | |||
| you may need to work with other repositories in order to accomplish your | |||
| development. Beside the mono-repo in [cucumber/common], [cucumber-ruby-core] is | |||
| also a big piece of `cucumber-ruby`. | |||
| ### Using a local Gemfile | |||
| A local Gemfile allows you to use your prefer set of gems for your own | |||
| development workflow, like gems dedicated to debugging. Such gems are not part | |||
| of `cucumber-ruby` standard `Gemfile`. | |||
| `Gemfile.local`, `Gemfile.local.lock` and `.bundle` have been added to | |||
| `.gitignore` so local changes cannot be accidentaly commited and pushed to the | |||
| repository. | |||
| A `Gemfile.local` may look like this: | |||
| ```ruby | |||
| # Gemfile.local | |||
| # Include the regular Gemfile | |||
| eval File.read('Gemfile') | |||
| # Include your favorites development gems | |||
| group :development do | |||
| gem 'byebug' | |||
| gem 'pry' | |||
| gem 'pry-byebug' | |||
| gem 'debase', require: false | |||
| gem 'ruby-debug-ide', require: false | |||
| end | |||
| ``` | |||
| Then you can execute bundler with the `--gemfile` flag: | |||
| `bundle install --gemfile Gemfile.local`, or with an environment variable: | |||
| `BUNDLE_GEMFILE=Gemfile.local bundle [COMMAND]`. | |||
| To use your local Gemfile per default, you can also execute | |||
| `bundle config set --local gemfile Gemfile.local`. | |||
| ### First timer? Welcome! | |||
| Looking for something simple to begin with? Look at issues with the label | |||
| '[good first issue](https://github.com/cucumber/cucumber-ruby/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)'. | |||
| Remember: Cucumber is more than `cucumber-ruby`. You can look for good first | |||
| issues in [other cucumber reporistories](#find-the-appropriate-repository). | |||
| ### Having trouble getting started with the code? We're here to help! | |||
| If you have trouble setting-up your development environment, or getting started | |||
| with the code, you can join us on [Slack][community-slack]. You will find there | |||
| a lot of contributors. | |||
| Full-time maintainers are also available. We would be please to have 1:1 pairing | |||
| sessions to help you getting started. Look for | |||
| [Matt Wynne](https://cucumberbdd.slack.com/team/U590XDLF3) or | |||
| [Aurélien Reeves](https://cucumberbdd.slack.com/team/U011BB95MC7) on | |||
| [Slack][community-slack]. | |||
| ### Additional documentation and notice | |||
| You can find additional documentation in the [docs](./docs) directory such as | |||
| (non-exhaustive list): | |||
| - [How to release cucumber-ruby](./docs/RELEASE_PROCESS.md) (for maintainers) | |||
| - [How to set-up a launch.json configuration for Visual Studio Code](./docs/vscode-example-launch-configuration.md) | |||
| <!-- Links --> | |||
| [community message board]: https://community.smartbear.com/t5/Cucumber-Open/bd-p/CucumberOS | |||
| [register-slack]: https://cucumberbdd-slack-invite.herokuapp.com/ | |||
| [slack-intro]: https://cucumberbdd.slack.com/messages/C5WD8SA21/ | |||
| [community-slack]: https://cucumberbdd.slack.com/ | |||
| [cucumber-docs]: https://cucumber.io/docs/cucumber | |||
| [cucumber/common]: https://github.com/cucumber/common | |||
| [cucumber-ruby-core]: https://github.com/cucumber/cucumber-ruby-core | |||
| [cucumber-rails]: https://github.com/cucumber/cucumber-rails | |||
| [cucumber-ruby-issues]: https://github.com/cucumber/cucumber-ruby/search?q=is%3Aissue | |||
| [cucumber/common-issues]: https://github.com/cucumber/common/search?q=is%3Aissue | |||
| [cucumber-issues]: https://github.com/search?q=is%3Aissue+user%3Acucumber | |||
| [how-to-create-a-draft-pr]: https://docs.github.com/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests#draft-pull-requests | |||
| [how-to-fork]: https://docs.github.com/github/collaborating-with-pull-requests/working-with-forks/about-forks | |||
| [sign your commits]: https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification/signing-commits | |||
| [minimal-reproducible-example]: https://stackoverflow.com/help/minimal-reproducible-example | |||
| [RVM]: https://rvm.io/ | |||
| [rbenv]: https://github.com/rbenv/rbenv | |||
| [Bundler]: https://bundler.io/ | |||
| @@ -0,0 +1,15 @@ | |||
| source 'https://rubygems.org' | |||
| git_source(:github) { |repo| "https://github.com/#{repo}.git" } | |||
| gemspec | |||
| gem 'rubocop', '1.43.0' | |||
| gem 'rubocop-packaging', '0.5.2' | |||
| # To hack on Cucumber together with any of these libraries, uncomment the line below: | |||
| # gem 'cucumber-core', path: '../cucumber-ruby-core' | |||
| # gem 'cucumber-cucumber-expressions', path: '../cucumber-expressions/ruby' | |||
| # gem 'cucumber-gherkin', path: '../common/gherkin/ruby' | |||
| # gem 'cucumber-html-formatter', path: '../html-formatter/ruby' | |||
| # gem 'cucumber-messages', path: '../common/messages/ruby' | |||
| @@ -0,0 +1,22 @@ | |||
| The MIT License | |||
| Copyright (c) Aslak Hellesøy | |||
| Permission is hereby granted, free of charge, to any person obtaining | |||
| a copy of this software and associated documentation files (the | |||
| "Software"), to deal in the Software without restriction, including | |||
| without limitation the rights to use, copy, modify, merge, publish, | |||
| distribute, sublicense, and/or sell copies of the Software, and to | |||
| permit persons to whom the Software is furnished to do so, subject to | |||
| the following conditions: | |||
| The above copyright notice and this permission notice shall be | |||
| included in all copies or substantial portions of the Software. | |||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| @@ -0,0 +1,62 @@ | |||
| MONOREPO_PATH ?= ../../cucumber | |||
| # https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make | |||
| rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) | |||
| RUBY_FILES=$(call rwildcard,../lib ../../cucumber-ruby-core/lib/,*.rb) | |||
| FEATURES = $(sort $(wildcard features/docs/**.feature)) | |||
| GOLDEN_JSONS = $(patsubst features/docs/%.feature,acceptance/%-golden.json,$(FEATURES)) | |||
| GENERATED_JSONS = $(patsubst features/docs/%.feature,acceptance/%-generated.json,$(FEATURES)) | |||
| TESTED = $(patsubst features/docs/%.feature,acceptance/%.tested,$(FEATURES)) | |||
| OS := $(shell [[ "$$(uname)" == "Darwin" ]] && echo "darwin" || echo "linux") | |||
| # Determine if we're on 386 or amd64 (ignoring other processors as we're not building on them) | |||
| ARCH := $(shell [[ "$$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "386") | |||
| default: $(GOLDEN_JSONS) $(GENERATED_JSONS) $(TESTED) | |||
| .PHONY: default | |||
| acceptance/%.tested: acceptance/%-golden.json acceptance/%-generated.json | |||
| mkdir -p $$(dirname $@) | |||
| diff --unified $^ | |||
| .PHONY: acceptance/%.tested | |||
| acceptance/%-golden.json: features/docs/%.feature $(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json $(RUBY_FILES) | |||
| mkdir -p $$(dirname $@) | |||
| bundle exec cucumber --format=json $< | \ | |||
| jq --sort-keys "." | \ | |||
| $(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json > $@ | |||
| acceptance/%-generated.json: features/docs/%.feature $(RUBY_FILES) bin/json-formatter $(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json | |||
| mkdir -p $$(dirname $@) | |||
| bundle exec cucumber --format=message $< | \ | |||
| bin/json-formatter --format ndjson | \ | |||
| jq --sort-keys "." | \ | |||
| $(MONOREPO_PATH)/compatibility-kit/ruby/scripts/neutralize-json > $@ | |||
| bin/json-formatter: $(MONOREPO_PATH)/json-formatter/go/dist/cucumber-json-formatter-$(OS)-$(ARCH) | |||
| cp $(MONOREPO_PATH)/json-formatter/go/dist/cucumber-json-formatter-$(OS)-$(ARCH) $@ | |||
| chmod +x $@ | |||
| clean: | |||
| rm -rf acceptance/*.json bin/json-formatter | |||
| .PHONY: clean | |||
| release: | |||
| [ -d '../secrets' ] || git clone keybase://team/cucumberbdd/secrets ../secrets | |||
| git -C ../secrets pull | |||
| ../secrets/update_permissions | |||
| docker run \ | |||
| --volume "${shell pwd}":/app \ | |||
| --volume "${shell pwd}/../secrets/import-gpg-key.sh":/home/cukebot/import-gpg-key.sh \ | |||
| --volume "${shell pwd}/../secrets/codesigning.key":/home/cukebot/codesigning.key \ | |||
| --volume "${shell pwd}/../secrets/.ssh":/home/cukebot/.ssh \ | |||
| --volume "${shell pwd}/../secrets/.gem":/home/cukebot/.gem \ | |||
| --volume "${HOME}/.gitconfig":/home/cukebot/.gitconfig \ | |||
| --env CUCUMBER_USE_RELEASED_GEMS=1 \ | |||
| --env-file ../secrets/secrets.list \ | |||
| --user 1000 \ | |||
| --rm \ | |||
| -it cucumber/cucumber-build:latest \ | |||
| bash -c "rm Gemfile.lock && bundle && bundle exec rake && bundle exec rake release" | |||
| .PHONY: release | |||
| @@ -0,0 +1,162 @@ | |||
| <p align="center"> | |||
| <img src="./.github/img/cucumber-open-logo.png" alt="Cucumber Open - Supported by Smartbear" width="428" /> | |||
| </p> | |||
| # Cucumber | |||
| [](https://vshymanskyy.github.io/StandWithUkraine) | |||
| [](https://opencollective.com/cucumber) | |||
| [](https://opencollective.com/cucumber) | |||
| [](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby) | |||
| [](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby) | |||
| [](https://github.com/cucumber/cucumber-ruby/actions/workflows/cucumber-ruby.yml) | |||
| [](https://codeclimate.com/github/cucumber/cucumber-ruby) | |||
| [](https://coveralls.io/r/cucumber/cucumber-ruby?branch=main) | |||
| Cucumber is a tool for running automated tests written in plain language. Because they're | |||
| written in plain language, they can be read by anyone on your team. Because they can be | |||
| read by anyone, you can use them to help improve communication, collaboration and trust on | |||
| your team. | |||
| <p align="center"> | |||
| <img src="./.github/img/gherkin-example.png" alt="Cucumber Gherkin Example" width="728" /> | |||
| </p> | |||
| This is the Ruby implementation of Cucumber. Cucumber is also available for [JavaScript](https://github.com/cucumber/cucumber-js), | |||
| [Java](https://github.com/cucumber/cucumber-jvm), and a lot of other languages. You can find a list of implementations here: https://cucumber.io/docs/installation/. | |||
| See [CONTRIBUTING.md](CONTRIBUTING.md) for info on contributing to Cucumber (issues, PRs, etc.). | |||
| Everyone interacting in this codebase and issue tracker is expected to follow the | |||
| Cucumber [code of conduct](https://cucumber.io/conduct). | |||
| ## Installation | |||
| Cucumber for Ruby is a Ruby gem. Install it as you would install any gem: add | |||
| `cucumber` to your Gemfile: | |||
| gem 'cucumber' | |||
| then install it: | |||
| $ bundle | |||
| or install the gem directly: | |||
| $ gem install cucumber | |||
| Later in this document, bundler is considered being used so all commands are using | |||
| `bundle exec`. If this is not the case for you, execute `cucumber` directly, without | |||
| `bundle exec`. | |||
| ### Supported platforms | |||
| - Ruby 3.2 | |||
| - Ruby 3.1 | |||
| - Ruby 3.0 | |||
| - Ruby 2.7 | |||
| - Ruby 2.6 | |||
| - TruffleRuby 22.0.0+ | |||
| - JRuby (with [some limitations](https://github.com/cucumber/cucumber-ruby/blob/main/docs/jruby-limitations.md)) | |||
| - 9.3 >= 9.3.1 (there is a known issue with JRuby 9.3.0. More info can | |||
| be found in the [PR#1571](https://github.com/cucumber/cucumber-ruby/pull/1571).) | |||
| ### Ruby on Rails | |||
| Using Ruby on Rails? You can use [cucumber-rails](https://github.com/cucumber/cucumber-rails) | |||
| to bring Cucumber into your Rails project. | |||
| ## Usage | |||
| ### Initialization | |||
| If you need to, initialize your `features` directory with | |||
| $ bundle exec cucumber --init | |||
| This will create the following directories and files if they do not exist already: | |||
| features | |||
| ├── step_definitions | |||
| └── support | |||
| └── env.rb | |||
| ### Create your specification | |||
| Create a file named `rule.feature` in the `features` directory with: | |||
| ```gherkin | |||
| # features/rule.feature | |||
| Feature: Rule Sample | |||
| Rule: This is a rule | |||
| Example: A passing example | |||
| Given this will pass | |||
| When I do an action | |||
| Then some results should be there | |||
| Example: A failing example | |||
| Given this will fail | |||
| When I do an action | |||
| Then some results should be there | |||
| ``` | |||
| ### Automate your specification | |||
| And a file named `steps.rb` in `features/step_definitions` with: | |||
| ```ruby | |||
| # features/step_definitions/steps.rb | |||
| Given("this will pass") do | |||
| @this_will_pass = true | |||
| end | |||
| Given("this will fail") do | |||
| @this_will_pass = false | |||
| end | |||
| When("I do an action") do | |||
| end | |||
| Then("some results should be there") do | |||
| expect(@this_will_pass) | |||
| end | |||
| ``` | |||
| ### Run Cucumber | |||
| $ bundle exec cucumber | |||
| To execute a single feature file: | |||
| $ bundle exec cucumber features/rule.feature | |||
| To execute a single example, indicates the line of the name of the example: | |||
| $ bundle exec cucumber features/rule.feature:7 | |||
| To summarize the results on the standard output, and writte a HTML report on disk: | |||
| $ bundle exec cucumber --format summary --format html --out report.html | |||
| For more command line options | |||
| $ bundle exec cucumber --help | |||
| You can also find documentation on the command line possibilities in | |||
| [features/docs/cli](features/docs/cli). | |||
| ## Documentation and support | |||
| - Getting started, writing features, step definitions, and more: https://cucumber.io/docs | |||
| - Ruby API Documentation: http://www.rubydoc.info/github/cucumber/cucumber-ruby/ | |||
| - Community support forum: https://community.smartbear.com/t5/Cucumber-Open/bd-p/CucumberOS | |||
| - Slack: [register for an account](https://cucumberbdd-slack-invite.herokuapp.com/) then head over to [#intro](https://cucumberbdd.slack.com/messages/C5WD8SA21/) | |||
| ## Copyright | |||
| Copyright (c) Cucumber Ltd. and Contributors. See LICENSE for details. | |||
| @@ -0,0 +1,34 @@ | |||
| # Release process for cucumber-ruby | |||
| ## Prerequisites | |||
| To release `cucumber-ruby`, you'll need: | |||
| - to be a member of the core-team | |||
| - make | |||
| - docker | |||
| ## cucumber-ruby-core | |||
| If internal libraries such as `cucumber-gherkin` needs to be updated, you'll | |||
| need to update and release `cucumber-ruby-core` before releasing `cucumber-ruby`. | |||
| ## Releasing cucumber-ruby | |||
| - Upgrade gems with `scripts/update-gemspec` | |||
| - Bump the version number in `lib/cucumber/version` | |||
| - Update `CHANGELOG.md` with the upcoming version number and create a new `Unreleased` section | |||
| - Remove empty sections from `CHANGELOG.md` | |||
| - Commit the changes using a verified signature | |||
| ```shell | |||
| git commit --gpg-sign -am "Release X.Y.Z" | |||
| git push | |||
| ``` | |||
| - Now release it: push to a dedicated `release/` branch: | |||
| ```shell | |||
| git push origin main:release/vX.Y.Z | |||
| ``` | |||
| - Check the release has been successfully pushed to [rubygems](https://rubygems.org/gems/cucumber) | |||
| - Finally, update the `cucumber-ruby` version in the | |||
| [documentation project](https://cucumber.io/docs/installation/) in | |||
| [versions.yaml](https://github.com/cucumber/docs/blob/master/data/versions.yaml). | |||
| @@ -0,0 +1,22 @@ | |||
| require 'rubygems' | |||
| require 'bundler' | |||
| Bundler::GemHelper.install_tasks | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib") | |||
| Dir['gem_tasks/**/*.rake'].each { |rake| load rake } | |||
| require 'rubocop/rake_task' | |||
| RuboCop::RakeTask.new | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new | |||
| default_tasks = %i[spec cucumber cck] | |||
| default_tasks << :examples if ENV['CI'] | |||
| task default: default_tasks | |||
| require 'rake/clean' | |||
| CLEAN.include %w[**/*.{log,pyc,rbc,tgz} doc] | |||
| @@ -0,0 +1,180 @@ | |||
| # Upgrading to 8.0.0 | |||
| ## AfterConfiguration hook | |||
| `AfterConfiguration` hook has been removed in 8.0.0. | |||
| Use the `InstallPlugin` hook if you need the `configuration` parameter. | |||
| ```ruby | |||
| InstallPlugin do |configuration, registry| | |||
| # configuration is an instance of Cucumber::Configuration defined in | |||
| # lib/cucumber/configuration.rb | |||
| # | |||
| # registry is an instance of Cucumber::Glue::RegistryWrapper defined in | |||
| # lib/cucumber/glue/registry_wrapper.rb | |||
| end | |||
| ``` | |||
| Use the `BeforeAll` hook if you don't need the `configuration` parameter. | |||
| ```ruby | |||
| BeforeAll do | |||
| # snip | |||
| end | |||
| ``` | |||
| More information about hooks can be found in [features/docs/writing_support_code/hooks/README.md](./features/docs/writing_support_code/hooks/README.md). | |||
| ## The wire protocol | |||
| The built-in wire protocol has been removed. | |||
| The wire protocol is still available by explicitly using the `cucumber-wire` gem. | |||
| ### Before cucumber 8.0.0 | |||
| Before cucumber 8.0.0, the wire protocol was automatically installed with cucumber, | |||
| and automatically activated when it had detected a `.wire` file. | |||
| If you were using cucumber 7.1.0 and did not already migrate your code, you had a | |||
| deprecation message. | |||
| ### With cucumber 8.0.0 | |||
| If you are not using the wire protocol, you have nothing to do. | |||
| If you already have updated your code to remove the deprecation message shown when | |||
| using cucumber 7.1.0, you are already up-to-date. Nothing more has to be done. | |||
| If you are still using the built-in wire protocol here the step to migrate to cucumber 8.0.0: | |||
| - add the gem `cucumber-wire` to your Gemfile alongside the `cucumber` one, and install it: | |||
| ```ruby | |||
| # Gemfile | |||
| # ... | |||
| gem "cucumber" | |||
| gem "cucumber-wire" | |||
| # ... | |||
| ``` | |||
| ```shell | |||
| bundle install | |||
| ``` | |||
| - add `require 'cucumber/wire'` in your support code. If you do not have support | |||
| code yet, create a new one. For example `features/support/wire.rb`. | |||
| ```ruby | |||
| # features/support/wire.rb | |||
| require 'cucumber/wire' | |||
| ``` | |||
| ## `Cucumber::Cli::Main` former `stdin` argument | |||
| The second argument of `Cucumber::Cli::Main` - which was formerly named `stdin` - | |||
| has been removed. | |||
| ### Before cucumber 8.0.0 | |||
| You would have used `Cucumber::Cli::Main` with a dummy parameter: | |||
| ```ruby | |||
| Cucumber::Cli::Main.new( | |||
| argument_list, | |||
| nil, # <-- this is a former unused `stdin` parameter | |||
| @stdout, | |||
| @stderr, | |||
| @kernel | |||
| ).execute! | |||
| ``` | |||
| ### With cucumber 8.0.0 | |||
| The argument has been removed from the initializer so the dummy parameter is not | |||
| required anymore: | |||
| ```ruby | |||
| Cucumber::Cli::Main.new( | |||
| argument_list, | |||
| @stdout, | |||
| @stderr, | |||
| @kernel | |||
| ).execute! | |||
| ``` | |||
| ## DataTable#map_column `strict` argument | |||
| The `strict` argument for the `map_column` method has changed to a keyword argument. | |||
| ### Before 8.0.0 | |||
| ```ruby | |||
| table.map_column('column', false).do |value| | |||
| end | |||
| ``` | |||
| ### With cucumber 8.0.0 | |||
| ```ruby | |||
| table.map_column('column', strict: false).do |value| | |||
| end | |||
| ``` | |||
| # Upgrading to 7.1.0 | |||
| ## The wire protocol | |||
| Usage of built-in wire protocol with `cucumber-ruby` will be deprecated in cucumber | |||
| 7.1.0, and removed in cucumber 8.0.0. | |||
| The wire protocol will still be available by explicitly using the `cucumber-wire` | |||
| gem. | |||
| ### Before cucumber 7.1.0 | |||
| Before cucumber 7.1.0, the wire protocol was automatically installed with cucumber, | |||
| and automatically activated when it had detected a `.wire` file. | |||
| ### With cucumber 7.1.0 | |||
| The wire protocol will work as before, but you will notice a deprecation message. | |||
| To prevent the deprecation message to be shown, add the gem `cucumber-wire` to your | |||
| Gemfile alongside the `cucumber` one, and install it: | |||
| ```ruby | |||
| # Gemfile | |||
| # ... | |||
| gem "cucumber" | |||
| gem "cucumber-wire" | |||
| # ... | |||
| ``` | |||
| ```shell | |||
| bundle install | |||
| ``` | |||
| And add `require 'cucumber/wire'` in your support code. If you do not have support | |||
| code yet, create a new one. For example `features/support/wire.rb`. | |||
| ```ruby | |||
| # features/support/wire.rb | |||
| require 'cucumber/wire' | |||
| ``` | |||
| The wire protocol will be installed, and no deprecation message will be shown anymore. | |||
| ## AfterConfiguration hook | |||
| Usage of `AfterConfiguration` hook will be deprecated in 7.1.0. | |||
| Use the new `InstallPlugin` hook if you need the `configuration` parameter. | |||
| Use the new `BeforeAll` hook if you don't need the `configuration` parameter. | |||
| More information about hooks can be found in [features/docs/writing_support_code/hooks/README.md](./features/docs/writing_support_code/hooks/README.md). | |||
| @@ -0,0 +1 @@ | |||
| 8.0.0 | |||
| @@ -0,0 +1,9 @@ | |||
| #!/usr/bin/env ruby | |||
| file_name = File.dirname(__FILE__) + '/../lib' | |||
| $LOAD_PATH.unshift(file_name) unless $LOAD_PATH.include?(file_name) | |||
| require 'simplecov_setup' | |||
| require 'cucumber/rspec/disable_option_parser' | |||
| require 'cucumber/cli/main' | |||
| # The dup is to keep ARGV intact, so that tools like ruby-debug can respawn. | |||
| Cucumber::Cli::Main.new(ARGV.dup).execute! | |||
| @@ -0,0 +1,29 @@ | |||
| #!/usr/bin/env ruby | |||
| # frozen_string_literal: true | |||
| # | |||
| # This file was generated by Bundler. | |||
| # | |||
| # The application 'rspec' is installed as part of a gem, and | |||
| # this file is here to facilitate running it. | |||
| # | |||
| require "pathname" | |||
| ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile.local", | |||
| Pathname.new(__FILE__).realpath) | |||
| bundle_binstub = File.expand_path("../bundle", __FILE__) | |||
| if File.file?(bundle_binstub) | |||
| if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/ | |||
| load(bundle_binstub) | |||
| else | |||
| abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. | |||
| Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") | |||
| end | |||
| end | |||
| require "rubygems" | |||
| require "bundler/setup" | |||
| load Gem.bin_path("rspec-core", "rspec") | |||
| @@ -0,0 +1,63 @@ | |||
| Gem::Specification.new do |s| | |||
| s.name = 'cucumber' | |||
| s.version = File.read(File.expand_path('VERSION', __dir__)).strip | |||
| s.authors = ['Aslak Hellesøy', 'Matt Wynne', 'Steve Tooke'] | |||
| s.description = 'Behaviour Driven Development with elegance and joy' | |||
| s.summary = "cucumber-#{s.version}" | |||
| s.email = 'cukes@googlegroups.com' | |||
| s.license = 'MIT' | |||
| s.homepage = 'https://cucumber.io/' | |||
| s.platform = Gem::Platform::RUBY | |||
| s.metadata = { | |||
| 'bug_tracker_uri' => 'https://github.com/cucumber/cucumber-ruby/issues', | |||
| 'changelog_uri' => 'https://github.com/cucumber/cucumber-ruby/blob/main/CHANGELOG.md', | |||
| 'documentation_uri' => 'https://www.rubydoc.info/github/cucumber/cucumber-ruby/', | |||
| 'mailing_list_uri' => 'https://groups.google.com/forum/#!forum/cukes', | |||
| 'source_code_uri' => 'https://github.com/cucumber/cucumber-ruby' | |||
| } | |||
| # Keep in sync with .circleci/config.yml & .rubocop.yml | |||
| s.required_ruby_version = '>= 2.6' | |||
| s.add_dependency 'builder', '~> 3.2', '>= 3.2.4' | |||
| s.add_dependency 'cucumber-ci-environment', '~> 9.0', '>= 9.0.4' | |||
| s.add_dependency 'cucumber-core', '~> 11.0', '>= 11.0.0' | |||
| s.add_dependency 'cucumber-cucumber-expressions', '>= 15.1.1', '< 17.0' | |||
| s.add_dependency 'cucumber-gherkin', '>= 23.0.1', '< 26.0.4' | |||
| s.add_dependency 'cucumber-html-formatter', '>= 19.1', '< 21.0' | |||
| s.add_dependency 'cucumber-messages', '>= 18', '< 22' | |||
| s.add_dependency 'diff-lcs', '~> 1.5', '>= 1.5.0' | |||
| s.add_dependency 'mini_mime', '~> 1.0' | |||
| s.add_dependency 'multi_test', '~> 1.1', '>= 1.1.0' | |||
| s.add_dependency 'sys-uname', '~> 1.2', '>= 1.2.2' | |||
| s.add_development_dependency 'cucumber-compatibility-kit', '~> 9.2', '>= 9.2.1' | |||
| s.add_development_dependency 'nokogiri', '~> 1.13', '>= 1.13.6' | |||
| s.add_development_dependency 'pry', '~> 0.14', '>= 0.14.1' | |||
| s.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6' | |||
| s.add_development_dependency 'rspec', '~> 3.11', '>= 3.11.0' | |||
| s.add_development_dependency 'simplecov', '~> 0.21', '>= 0.21.2' | |||
| s.add_development_dependency 'syntax', '~> 1.2', '>= 1.2.2' | |||
| s.add_development_dependency 'test-unit', '~> 3.5', '>= 3.5.3' | |||
| s.add_development_dependency 'webrick', '~> 1.7', '>= 1.7.0' | |||
| # For maintainer scripts | |||
| s.add_development_dependency 'octokit', '~> 4.22', '>= 4.22.0' | |||
| # Needed for examples (rake examples) | |||
| s.add_development_dependency 'capybara', '~> 3.36', '>= 3.36.0', '< 3.37' | |||
| s.add_development_dependency 'rack-test', '>= 1.1.0', '~> 2.0' | |||
| s.add_development_dependency 'sinatra', '>= 2.2.0', '~> 3.0' | |||
| s.required_rubygems_version = '>= 1.6.1' | |||
| s.files = Dir[ | |||
| 'CHANGELOG.md', | |||
| 'CONTRIBUTING.md', | |||
| 'README.md', | |||
| 'LICENSE', | |||
| 'lib/**/*' | |||
| ] | |||
| s.executables = ['cucumber'] | |||
| s.rdoc_options = ['--charset=UTF-8'] | |||
| s.require_path = 'lib' | |||
| end | |||
| @@ -0,0 +1,18 @@ | |||
| <% | |||
| std_opts = "--format progress features -r features --strict --publish-quiet".dup | |||
| std_opts << " --tags 'not @wip'" | |||
| std_opts << " --tags 'not @wip-jruby'" if defined?(JRUBY_VERSION) | |||
| wip_opts = "--color -r features".dup | |||
| if defined?(JRUBY_VERSION) | |||
| wip_opts << " --tags '@wip or @wip-jruby'" | |||
| else | |||
| wip_opts << " --tags @wip" | |||
| end | |||
| %> | |||
| default: <%= std_opts %> --tags "not @jruby" | |||
| jruby: <%= std_opts %> | |||
| jruby_win: <%= std_opts %> CUCUMBER_FORWARD_SLASH_PATHS=true | |||
| windows_mri: <%= std_opts %> --tags "not @jruby" --tags "not @needs-many-fonts" --tags "not @todo-windows" CUCUMBER_FORWARD_SLASH_PATHS=true | |||
| wip: --wip <%= wip_opts %> features | |||
| none: --format pretty | |||
| @@ -0,0 +1,40 @@ | |||
| # Cucumber and JRuby limitations | |||
| `cucumber` can be executed on `JRuby` (tested with `9.2`), although some of the features | |||
| are not available on this platform. | |||
| ## Defining steps with native languages | |||
| There are currently three languages (Russian, Ukrainian and Uzbek) for which the step definition | |||
| can not be written in native language. | |||
| That means, for example, that you can not write the following code: | |||
| ```ruby | |||
| Допустим('я ввожу число {int}') do |число| | |||
| calc.push число | |||
| end | |||
| ``` | |||
| Instead, you have to write: | |||
| ```ruby | |||
| Given('я ввожу число {int}') do |number| | |||
| calc.push number | |||
| end | |||
| ``` | |||
| Of course, you can still write your feature files in a native language, for example, the following | |||
| feature file can be executed on JRuby: | |||
| ```gherkin | |||
| # language: ru | |||
| Функционал: Сложение чисел | |||
| Чтобы не складывать в уме | |||
| Все, у кого с этим туго | |||
| Хотят автоматическое сложение целых чисел | |||
| Сценарий: Сложение двух целых чисел | |||
| Допустим я ввожу число 50 | |||
| И затем ввожу число 70 | |||
| Если я нажимаю "+" | |||
| То результатом должно быть число 120 | |||
| ``` | |||
| @@ -0,0 +1,94 @@ | |||
| ## Pre-requisites | |||
| ### Ruby Extension | |||
| Install and configure the | |||
| [ruby extension](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby) | |||
| ### Use `debase` and `ruby-debug-ide` gems locally | |||
| Make sure to use a `Gemfile.local` file with `debase` and `ruby-debug-ide` gems. | |||
| ~~~ruby | |||
| # Include the regular Gemfile | |||
| eval File.read('Gemfile') | |||
| group :development do | |||
| gem 'debase', require: false | |||
| gem 'ruby-debug-ide', require: false | |||
| end | |||
| ~~~ | |||
| Execute `bundle config set --local gemfile Gemfile.local` to use it per default, | |||
| then `bundle install`. | |||
| ## Sample launch.json | |||
| The following `launch.json` - to be placed in the `.vscode` folder - allows to use | |||
| VSCode debugging features like **breakpoints** and **watches**. | |||
| ```json | |||
| { | |||
| "version": "0.2.0", | |||
| "configurations": [ | |||
| { | |||
| "name": "Cucumber", | |||
| "type": "Ruby", | |||
| "request": "launch", | |||
| "useBundler": true, | |||
| "cwd": "${workspaceRoot}", | |||
| "program": "${workspaceRoot}/bin/cucumber", | |||
| "internalConsoleOptions": "openOnSessionStart" | |||
| }, | |||
| { | |||
| "name": "Cucumber current feature file", | |||
| "type": "Ruby", | |||
| "request": "launch", | |||
| "useBundler": true, | |||
| "cwd": "${workspaceRoot}", | |||
| "program": "${workspaceRoot}/bin/cucumber", | |||
| "args": ["${file}"], | |||
| "internalConsoleOptions": "openOnSessionStart" | |||
| }, | |||
| { | |||
| "name": "Cucumber scenario under cursor", | |||
| "type": "Ruby", | |||
| "request": "launch", | |||
| "useBundler": true, | |||
| "cwd": "${workspaceRoot}", | |||
| "program": "${workspaceRoot}/bin/cucumber", | |||
| "args": ["${file}:${lineNumber}"], | |||
| "internalConsoleOptions": "openOnSessionStart" | |||
| }, | |||
| { | |||
| "name": "Rspec", | |||
| "type": "Ruby", | |||
| "request": "launch", | |||
| "useBundler": true, | |||
| "cwd": "${workspaceRoot}", | |||
| "program": "${workspaceRoot}/bin/rspec", | |||
| "internalConsoleOptions": "openOnSessionStart" | |||
| }, | |||
| { | |||
| "name": "Rspec current file", | |||
| "type": "Ruby", | |||
| "request": "launch", | |||
| "useBundler": true, | |||
| "cwd": "${workspaceRoot}", | |||
| "program": "${workspaceRoot}/bin/rspec", | |||
| "args": ["${file}"], | |||
| "internalConsoleOptions": "openOnSessionStart" | |||
| }, | |||
| { | |||
| "name": "Rspec current line", | |||
| "type": "Ruby", | |||
| "request": "launch", | |||
| "useBundler": true, | |||
| "cwd": "${workspaceRoot}", | |||
| "program": "${workspaceRoot}/bin/rspec", | |||
| "args": ["${file}:${lineNumber}"], | |||
| "internalConsoleOptions": "openOnSessionStart" | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| @@ -0,0 +1,3 @@ | |||
| h1. Internationalisation (i18n) examples | |||
| Visit the "wiki":https://github.com/cucumber/cucumber/wiki/Spoken-languages for instructions on how to use Cucumber on different languages. | |||
| @@ -0,0 +1,50 @@ | |||
| desc 'Run features for all languages' | |||
| task :cucumber do | |||
| dir = File.dirname(__FILE__) | |||
| Dir["#{dir}/*"].sort.each do |f| | |||
| next unless File.directory?(f) | |||
| lang = f[dir.length + 1..] | |||
| message = examples_disabled?(lang) | |||
| unless message.nil? | |||
| $stderr.puts(message) | |||
| next | |||
| end | |||
| Dir.chdir(f) do | |||
| puts "DIR: #{f}" | |||
| rake('cucumber') | |||
| end | |||
| end | |||
| end | |||
| task default: :cucumber | |||
| def examples_disabled?(lang) | |||
| return make_warning("SKIPPING #{lang} (The examples are out of date - please help update them)") unless examples_working?(lang) | |||
| return make_warning("SKIPPING #{lang}: examples have been disabled for JRuby.") if jruby_disabled_examples?(lang) | |||
| end | |||
| def jruby_disabled_examples?(lang) | |||
| return unless RUBY_PLATFORM == 'java' | |||
| %w[ru uk uz].include?(lang) | |||
| end | |||
| def examples_working?(lang) | |||
| !%w[ar].index(lang) | |||
| end | |||
| def make_warning(msg) | |||
| %( | |||
| !!!!! | |||
| !!!!! | |||
| !!!!! #{msg} | |||
| !!!!! | |||
| !!!!! | |||
| ) | |||
| end | |||
| def rake(args) | |||
| ruby($PROGRAM_NAME, args) | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: ar | |||
| خاصية: الجمع | |||
| من اجل تجنب الأخطاء السخيفة | |||
| كشخص غبي في الرياضيات | |||
| اريد معرفة ناتج جمع عددين | |||
| سيناريو مخطط: جمع عددين | |||
| بفرض كتابة <input_1> في الآلة الحاسبة | |||
| و كتابة <input_2> في الآلة الحاسبة | |||
| متى يتم الضغط على <button> | |||
| اذاً يظهر <output> على الشاشة | |||
| امثلة: | |||
| | input_1 | input_2 | button | output | | |||
| | 20 | 30 | جمع | 50 | | |||
| | 2 | 5 | جمع | 7 | | |||
| | 0 | 40 | جمع | 40 | | |||
| @@ -0,0 +1,21 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| Before do | |||
| @calc = Calculator.new | |||
| end | |||
| After do | |||
| end | |||
| Given 'كتابة $n في الآلة الحاسبة' do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| When(/يتم الضغط على (.+)/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Then(/يظهر (.*) على الشاشة/) do |result| | |||
| expect(@result).to eq(result) | |||
| end | |||
| @@ -0,0 +1,10 @@ | |||
| class Calculator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def جمع | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,12 @@ | |||
| # language: bg | |||
| Функционалност: Събиране на числа | |||
| За да не го правят наум | |||
| Потребителите | |||
| Трябва да могат да събират числа с калкулатора | |||
| Сценарий: Събиране на две цели числа | |||
| Дадено е че съм въвел 50 | |||
| И съм въвел 70 | |||
| Когато натисна "+" | |||
| То резултата трябва да е равен на 120 | |||
| @@ -0,0 +1,19 @@ | |||
| # language: bg | |||
| Функционалност: Последователни изчисления | |||
| За да не го правят наум | |||
| Потребителите | |||
| Трябва да могат да извършват последователни изчисления с калкулатора | |||
| Предистория: | |||
| Дадено е че съм събрал 3 и 5 | |||
| Сценарий: събиране с резултата от последната операция | |||
| Когато въведа 4 | |||
| И натисна "+" | |||
| То резултата трябва да е равен на 12 | |||
| Сценарий: делене с резултата от последната операция | |||
| Когато въведа 2 | |||
| И натисна "/" | |||
| То резултата трябва да е равен на 4 | |||
| @@ -0,0 +1,17 @@ | |||
| # language: bg | |||
| Функционалност: Делене на числа | |||
| За да не го правят наум | |||
| Потребителите | |||
| Трябва да могат да разделят числа с калкулатора | |||
| Рамка на сценарий: Делене на цели числа | |||
| Дадено е че съм въвел <делимо> | |||
| И е че съм въвел <делител> | |||
| Когато натисна "/" | |||
| То резултата трябва да е равен на <частно> | |||
| Примери: | |||
| | делимо | делител | частно | | |||
| | 100 | 2 | 50 | | |||
| | 28 | 7 | 4 | | |||
| | 0 | 5 | 0 | | |||
| @@ -0,0 +1,25 @@ | |||
| Дадено('е че съм въвел {int}') do |int| | |||
| calc.push int | |||
| end | |||
| Дадено('съм въвел {int}') do |int| | |||
| calc.push int | |||
| end | |||
| Дадено('е че съм събрал {int} и {int}') do |int1, int2| | |||
| calc.push int1 | |||
| calc.push int2 | |||
| calc.send '+' | |||
| end | |||
| Когато('въведа {int}') do |int| | |||
| calc.push int | |||
| end | |||
| Когато('натисна {string}') do |op| | |||
| calc.send op | |||
| end | |||
| То('резултата трябва да е равен на {int}') do |int| | |||
| expect(calc.result).to eq(int) | |||
| end | |||
| @@ -0,0 +1,9 @@ | |||
| begin | |||
| require 'rspec/expectations' | |||
| rescue LoadError | |||
| require 'spec/expectations' | |||
| end | |||
| require 'cucumber/formatter/unicode' | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| @@ -0,0 +1,7 @@ | |||
| module LazyCalc | |||
| def calc | |||
| @calc ||= Calculator.new | |||
| end | |||
| end | |||
| World(LazyCalc) | |||
| @@ -0,0 +1,27 @@ | |||
| class Calculator | |||
| def initialize | |||
| @stack = [] | |||
| end | |||
| def push(arg) | |||
| @stack.push arg | |||
| end | |||
| def result | |||
| @stack.last | |||
| end | |||
| def + | |||
| number_1 = @stack.pop | |||
| number_2 = @stack.pop | |||
| @stack.push number_1 + number_2 | |||
| end | |||
| def / | |||
| divisor = @stack.pop | |||
| dividend = @stack.pop | |||
| @stack.push dividend / divisor | |||
| end | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,18 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculadora' | |||
| Before do | |||
| @calc = Calculadora.new | |||
| end | |||
| Donat(/que he introduït (\d+) a la calculadora/) do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| Quan(/premo el (\w+)/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Aleshores(/el resultat ha de ser (\d+) a la pantalla/) do |result| | |||
| expect(@result).to eq(result) | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: ca | |||
| Característica: Suma | |||
| Per evitar fer errors tontos | |||
| Com un matemàtic idiota | |||
| Vull saber la suma dels números | |||
| Esquema de l'escenari: Sumar dos números | |||
| Donat que he introduït <entrada_1> a la calculadora | |||
| I que he introduït <entrada_2> a la calculadora | |||
| Quan premo el <botó> | |||
| Aleshores el resultat ha de ser <resultat> a la pantalla | |||
| Exemples: | |||
| | entrada_1 | entrada_2 | botó | resultat | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculadora | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| features.html | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: cs | |||
| Požadavek: Sčítání | |||
| Jako matematický idiot | |||
| Abych se vyhnul hloupým chybám | |||
| Chci vědět jak sečíst dvě čísla | |||
| Náčrt Scénáře: Sčítaní dvou čísel | |||
| Pokud Zadám číslo <vstup_1> do kalkulačky | |||
| A Zadám číslo <vstup_2> do kalkulačky | |||
| Když stisknu <tlačítko> | |||
| Pak výsledek by měl být <výstup> | |||
| Příklady: | |||
| | vstup_1 | vstup_2 | tlačítko | výstup | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,11 @@ | |||
| # language: cs | |||
| Požadavek: Dělení | |||
| Jako matematický idiot | |||
| Abych se vyhnul hloupým chybám | |||
| Chci vědět jak vydělit dvě čísla | |||
| Scénář: Přirozená čísla | |||
| Pokud Zadám číslo 3 do kalkulačky | |||
| A Zadám číslo 2 do kalkulačky | |||
| Když stisknu divide | |||
| Pak výsledek by měl být 1.5 | |||
| @@ -0,0 +1,18 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| Before do | |||
| @calc = Calculator.new | |||
| end | |||
| Pokud('Zadám číslo {int} do kalkulačky') do |int| | |||
| @calc.push int | |||
| end | |||
| Když('stisknu {word}') do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Pak('výsledek by měl být {float}') do |float| | |||
| expect(@result).to eq(float) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,18 @@ | |||
| # language: da | |||
| Egenskab: Sammenlægning | |||
| For at slippe for at lave dumme fejl | |||
| Som bogholder | |||
| Vil jeg kunne lægge sammen | |||
| Scenarie: to tal | |||
| Givet at jeg har indtastet 5 | |||
| Og at jeg har indtastet 7 | |||
| Når jeg lægger sammen | |||
| Så skal resultatet være 12 | |||
| Scenarie: tre tal | |||
| Givet at jeg har indtastet 5 | |||
| Og at jeg har indtastet 7 | |||
| Og at jeg har indtastet 1 | |||
| Når jeg lægger sammen | |||
| Så skal resultatet være 13 | |||
| @@ -0,0 +1,28 @@ | |||
| begin | |||
| require 'rspec/expectations' | |||
| rescue LoadError | |||
| require 'spec/expectations' | |||
| end | |||
| require 'cucumber/formatter/unicode' | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'lommeregner' | |||
| Before do | |||
| @calc = Lommeregner.new | |||
| end | |||
| After do | |||
| end | |||
| Given(/at jeg har indtastet (\d+)/) do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| When('jeg lægger sammen') do | |||
| @result = @calc.add | |||
| end | |||
| Then(/skal resultatet være (\d*)/) do |result| | |||
| expect(@result).to eq(result.to_f) | |||
| end | |||
| @@ -0,0 +1,10 @@ | |||
| class Lommeregner | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| features.html | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: de | |||
| Funktionalität: Addition | |||
| Um dumme Fehler zu vermeiden | |||
| möchte ich als Matheidiot | |||
| die Summe zweier Zahlen gesagt bekommen | |||
| Szenariogrundriss: Zwei Zahlen hinzufügen | |||
| Angenommen ich habe <Eingabe_1> in den Taschenrechner eingegeben | |||
| Und ich habe <Eingabe_2> in den Taschenrechner eingegeben | |||
| Wenn ich <Knopf> drücke | |||
| Dann sollte das Ergebniss auf dem Bildschirm <Ausgabe> sein | |||
| Beispiele: | |||
| | Eingabe_1 | Eingabe_2 | Knopf | Ausgabe | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,10 @@ | |||
| # language: de | |||
| Funktionalität: Division | |||
| Um dumme Fehler zu vermeiden | |||
| müssen Kassierer in der Lage sein einen Bruchteil zu berechnen | |||
| Szenario: Normale Zahlen | |||
| Gegeben sei ich habe 3 in den Taschenrechner eingegeben | |||
| Und ich habe 2 in den Taschenrechner eingegeben | |||
| Wenn ich divide drücke | |||
| Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein | |||
| @@ -0,0 +1,28 @@ | |||
| begin | |||
| require 'rspec/expectations' | |||
| rescue LoadError | |||
| require 'spec/expectations' | |||
| end | |||
| require 'cucumber/formatter/unicode' | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| Before do | |||
| @calc = Calculator.new | |||
| end | |||
| After do | |||
| end | |||
| Angenommen(/ich habe (\d+) in den Taschenrechner eingegeben/) do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| Wenn(/ich (\w+) drücke/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Dann(/sollte das Ergebniss auf dem Bildschirm (.*) sein/) do |result| | |||
| expect(@result).to eq(result.to_f) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| features.html | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: el | |||
| Δυνατότητα: Πρόσθεση | |||
| Για να αποφεύγω χαζά λάθη | |||
| Ως πρωτάρης στα μαθηματικά | |||
| Θέλω να βλέπω το άθροισμα δύο αριθμών | |||
| Περιγραφή Σεναρίου: Πρόσθεση δύο αριθμών | |||
| Δεδομένου ότι έχω εισάγει <τελεστής_1> στην αριθμομηχανή | |||
| Και έχω εισάγει <τελεστής_2> στην αριθμομηχανή | |||
| Όταν πατάω <κουμπί> | |||
| Τότε το αποτέλεσμα στην οθόνη πρέπει να είναι <αποτέλεσμα> | |||
| Παραδείγματα: | |||
| | τελεστής_1 | τελεστής_2 | κουμπί | αποτέλεσμα | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,10 @@ | |||
| # language: el | |||
| Δυνατότητα: Διαίρεση | |||
| Για να αποφευχθούν χαζά λάθη | |||
| Οι ταμίες θα πρέπει να μπορούν να υπολογίζουν κλάσματα | |||
| Σενάριο: Κανονικοί αριθμοί | |||
| Δεδομένου ότι έχω εισάγει 3 στην αριθμομηχανή | |||
| Και έχω εισάγει 2 στην αριθμομηχανή | |||
| Όταν πατάω divide | |||
| Τότε το αποτέλεσμα στην οθόνη πρέπει να είναι 1.5 | |||
| @@ -0,0 +1,25 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| Before do | |||
| @calc = Calculator.new | |||
| end | |||
| After do | |||
| end | |||
| Δεδομένου('ότι έχω εισάγει {int} στην αριθμομηχανή') do |int| | |||
| @calc.push int | |||
| end | |||
| Δεδομένου('έχω εισάγει {int} στην αριθμομηχανή') do |int| | |||
| @calc.push int | |||
| end | |||
| Όταν(/πατάω (\w+)/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Τότε(/το αποτέλεσμα στην οθόνη πρέπει να είναι (.*)/) do |result| | |||
| expect(@result).to eq(result.to_f) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1,4 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new | |||
| @@ -0,0 +1,16 @@ | |||
| ICANHAZ(/^IN TEH BEGINNIN (\d+) CUCUMBRZ$/) do |n| | |||
| @basket = Basket.new(n.to_i) | |||
| end | |||
| WEN(/^I EAT (\d+) CUCUMBRZ$/) do |n| | |||
| @belly = Belly.new | |||
| @belly.eat(@basket.take(n.to_i)) | |||
| end | |||
| DEN(/^I HAS (\d+) CUCUMBERZ IN MAH BELLY$/) do |n| | |||
| expect(@belly.cukes).to eq(n.to_i) | |||
| end | |||
| DEN(/^IN TEH END (\d+) CUCUMBRZ KTHXBAI$/) do |n| | |||
| expect(@basket.cukes).to eq(n.to_i) | |||
| end | |||
| @@ -0,0 +1,8 @@ | |||
| # language: en-lol | |||
| OH HAI: STUFFING | |||
| MISHUN: CUCUMBR | |||
| I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ | |||
| WEN I EAT 2 CUCUMBRZ | |||
| DEN I HAS 2 CUCUMBERZ IN MAH BELLY | |||
| AN IN TEH END 1 CUCUMBRZ KTHXBAI | |||
| @@ -0,0 +1,10 @@ | |||
| begin | |||
| require 'rspec/expectations' | |||
| rescue LoadError | |||
| require 'spec/expectations' | |||
| end | |||
| require 'cucumber/formatter/unicode' | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'basket' | |||
| require 'belly' | |||
| @@ -0,0 +1,12 @@ | |||
| class Basket | |||
| attr_reader :cukes | |||
| def initialize(cukes) | |||
| @cukes = cukes | |||
| end | |||
| def take(cukes) | |||
| @cukes -= cukes | |||
| cukes | |||
| end | |||
| end | |||
| @@ -0,0 +1,11 @@ | |||
| class Belly | |||
| attr_reader :cukes | |||
| def initialize | |||
| @cukes = 0 | |||
| end | |||
| def eat(cukes) | |||
| @cukes += cukes | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| features.html | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: en | |||
| Feature: Addition | |||
| In order to avoid silly mistakes | |||
| As a math idiot | |||
| I want to be told the sum of two numbers | |||
| Scenario Outline: Add two numbers | |||
| Given I have entered <input_1> into the calculator | |||
| And I have entered <input_2> into the calculator | |||
| When I press <button> | |||
| Then the result should be <output> on the screen | |||
| Examples: | |||
| | input_1 | input_2 | button | output | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,10 @@ | |||
| # language: en | |||
| Feature: Division | |||
| In order to avoid silly mistakes | |||
| Cashiers must be able to calculate a fraction | |||
| Scenario: Regular numbers | |||
| * I have entered 3 into the calculator | |||
| * I have entered 2 into the calculator | |||
| * I press divide | |||
| * the result should be 1.5 on the screen | |||
| @@ -0,0 +1,21 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| Before do | |||
| @calc = Calculator.new | |||
| end | |||
| After do | |||
| end | |||
| Given(/I have entered (\d+) into the calculator/) do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| When(/I press (\w+)/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Then(/the result should be (.*) on the screen/) do |result| | |||
| expect(@result).to eq(result.to_f) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| features.html | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: eo | |||
| Trajto: Adicio | |||
| Por eviti stultajn erarojn | |||
| Kiel stultulo pri matematiko | |||
| Mi volas adicii du nombrojn | |||
| Kazo-skizo: Adiciu du nombrojn | |||
| Komence mi entajpas <nombro_1> en la kalkulilon | |||
| Kaj mi entajpas <nombro_2> en la kalkulilon | |||
| Se mi premas <butono> | |||
| Do la rezulto estu <rezulto> | |||
| Ekzemploj: | |||
| | nombro_1 | nombro_2 | butono | rezulto | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,10 @@ | |||
| # language: eo | |||
| Trajto: Divido | |||
| Por eviti stultajn erarojn | |||
| Uzantoj kapablu kalkuli frakciojn | |||
| Kazo: Simplaj nombroj | |||
| * mi entajpas 3 en la kalkulilon | |||
| * mi entajpas 2 en la kalkulilon | |||
| * mi premis divide | |||
| * la rezulto estu 1.5 | |||
| @@ -0,0 +1,21 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculator' | |||
| Before do | |||
| @calc = Calculator.new | |||
| end | |||
| After do | |||
| end | |||
| Se('mi entajpas {int} en la kalkulilon') do |int| | |||
| @calc.push int | |||
| end | |||
| Donitaĵo('mi premas/premis {word}') do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Do('la rezulto estu {float}') do |float| | |||
| expect(@result).to eq(float) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: es | |||
| Característica: adición | |||
| Para evitar hacer errores tontos | |||
| Como un matemático idiota | |||
| Quiero saber la suma de los números | |||
| Esquema del escenario: Sumar dos números | |||
| Dado que he introducido <entrada_1> en la calculadora | |||
| Y que he introducido <entrada_2> en la calculadora | |||
| Cuando oprimo el <botón> | |||
| Entonces el resultado debe ser <resultado> en la pantalla | |||
| Ejemplos: | |||
| | entrada_1 | entrada_2 | botón | resultado | | |||
| | 20 | 30 | add | 50 | | |||
| | 2 | 5 | add | 7 | | |||
| | 0 | 40 | add | 40 | | |||
| @@ -0,0 +1,18 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'calculador' | |||
| Before do | |||
| @calc = Calculador.new | |||
| end | |||
| Dado(/que he introducido (\d+) en la calculadora/) do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| Cuando(/oprimo el (\w+)/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Entonces(/el resultado debe ser (.*) en la pantalla/) do |result| | |||
| expect(@result).to eq(result.to_f) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Calculador | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def add | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def divide | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,10 @@ | |||
| # language: et | |||
| Omadus: Jagamine | |||
| Rumalate vigade vältimiseks | |||
| Peavad kassapidajad saama arvutada murdudes | |||
| Stsenaarium: Tavalised numbrid | |||
| Eeldades et olen sisestanud kalkulaatorisse numbri 3 | |||
| Ja olen sisestanud kalkulaatorisse numbri 2 | |||
| Kui ma vajutan jaga | |||
| Siis vastuseks peab ekraanil kuvatama 1.5 | |||
| @@ -0,0 +1,17 @@ | |||
| # language: et | |||
| Omadus: Liitmine | |||
| Selleks et vältida rumalaid vigu | |||
| Olles matemaatika-puupea | |||
| Tahan et mulle öeldaks kahe numbri summa | |||
| Raamstsenaarium: Liida kaks numbrit | |||
| Eeldades et olen sisestanud kalkulaatorisse numbri <input_1> | |||
| Ja olen sisestanud kalkulaatorisse numbri <input_2> | |||
| Kui ma vajutan <button> | |||
| Siis vastuseks peab ekraanil kuvatama <output> | |||
| Juhtumid: | |||
| | input_1 | input_2 | button | output | | |||
| | 20 | 30 | liida | 50 | | |||
| | 2 | 5 | liida | 7 | | |||
| | 0 | 40 | liida | 40 | | |||
| @@ -0,0 +1,21 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'kalkulaator' | |||
| Before do | |||
| @calc = Kalkulaator.new | |||
| end | |||
| After do | |||
| end | |||
| Given(/olen sisestanud kalkulaatorisse numbri (\d+)/) do |n| | |||
| @calc.push n.to_i | |||
| end | |||
| When(/ma vajutan (\w+)/) do |op| | |||
| @result = @calc.send op | |||
| end | |||
| Then(/vastuseks peab ekraanil kuvatama (.*)/) do |result| | |||
| expect(@result).to eq(result.to_f) | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class Kalkulaator | |||
| def push(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def liida | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def jaga | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| features.html | |||
| @@ -0,0 +1,6 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| @@ -0,0 +1,10 @@ | |||
| # language: fi | |||
| Ominaisuus: Jakolasku | |||
| Välttyäkseen hölmöiltä virheiltä | |||
| Kassanhoitajan on voitava laskea osamäärä | |||
| Tapaus: Kokonaislukujen jakolasku | |||
| Oletetaan että olen syöttänyt laskimeen luvun 3 | |||
| Ja että olen syöttänyt laskimeen luvun 2 | |||
| Kun painan "jaa" | |||
| Niin laskimen ruudulla pitäisi näkyä tulos 1.5 | |||
| @@ -0,0 +1,28 @@ | |||
| begin | |||
| require 'rspec/expectations' | |||
| rescue LoadError | |||
| require 'spec/expectations' | |||
| end | |||
| require 'cucumber/formatter/unicode' | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../lib") | |||
| require 'laskin' | |||
| Before do | |||
| @laskin = Laskin.new | |||
| end | |||
| After do | |||
| end | |||
| Given(/että olen syöttänyt laskimeen luvun (\d+)/) do |n| | |||
| @laskin.pinoa n.to_i | |||
| end | |||
| When(/painan "(\w+)"/) do |op| | |||
| @tulos = @laskin.send op | |||
| end | |||
| Then(/laskimen ruudulla pitäisi näkyä tulos (.*)/) do |tulos| | |||
| expect(@tulos).to eq(tulos.to_f) | |||
| end | |||
| @@ -0,0 +1,17 @@ | |||
| # language: fi | |||
| Ominaisuus: Yhteenlasku | |||
| Välttyäkseni hölmöiltä virheiltä | |||
| Koska olen laskutaidoton | |||
| Haluan että yhteenlaskut lasketaan puolestani | |||
| Tapausaihio: Kahden luvun summa | |||
| Oletetaan että olen syöttänyt laskimeen luvun <luku_1> | |||
| Ja että olen syöttänyt laskimeen luvun <luku_2> | |||
| Kun painan "<nappi>" | |||
| Niin laskimen ruudulla pitäisi näkyä tulos <tulos> | |||
| Tapaukset: | |||
| | luku_1 | luku_2 | nappi | tulos | | |||
| | 20 | 30 | summaa | 50 | | |||
| | 2 | 5 | summaa | 7 | | |||
| | 0 | 40 | summaa | 40 | | |||
| @@ -0,0 +1,14 @@ | |||
| class Laskin | |||
| def pinoa(n) | |||
| @args ||= [] | |||
| @args << n | |||
| end | |||
| def summaa | |||
| @args.inject(0) { |n, sum| sum + n } | |||
| end | |||
| def jaa | |||
| @args[0].to_f / @args[1].to_f | |||
| end | |||
| end | |||
| @@ -0,0 +1,8 @@ | |||
| $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../../../lib") | |||
| require 'cucumber/rake/task' | |||
| Cucumber::Rake::Task.new do |t| | |||
| t.cucumber_opts = %w[--format pretty] | |||
| end | |||
| task default: :cucumber | |||
| @@ -0,0 +1,18 @@ | |||
| # language: fr | |||
| Fonctionnalité: Addition | |||
| Afin de gagner du temps lors du calcul de la facture | |||
| En tant que commerçant | |||
| Je souhaite pouvoir faire une addition | |||
| Plan du Scénario: Addition de deux nombres | |||
| Soit une calculatrice | |||
| Et que j'entre <a> pour le premier nombre | |||
| Et que je tape sur la touche "+" | |||
| Et que j'entre <b> pour le second nombre | |||
| Lorsque je tape sur la touche "=" | |||
| Alors le résultat affiché doit être <somme> | |||
| Exemples: | |||
| | a | b | somme | | |||
| | 2 | 2 | 4 | | |||
| | 2 | 3 | 5 | | |||
| @@ -0,0 +1,17 @@ | |||
| # language: fr | |||
| Fonctionnalité: Addition | |||
| Afin de financer mon bonus avec l'argent des pigeons | |||
| En tant que trader | |||
| Je souhaite pouvoir additionner 2 chiffres | |||
| Plan du Scénario: Addition de produits dérivés | |||
| Soit une calculatrice | |||
| Etant donné qu'on tape <a> | |||
| Et qu'on tape <b> | |||
| Lorsqu'on tape additionner | |||
| Alors le résultat doit être <somme> | |||
| Exemples: | |||
| | a | b | somme | | |||
| | 2 | 2 | 4 | | |||
| | 2 | 3 | 5 | | |||
| @@ -0,0 +1,27 @@ | |||
| Soit(/^une calculatrice$/) do | |||
| @calc = Calculatrice.new | |||
| end | |||
| Etantdonnéqu('on tape {int}') do |entier| | |||
| @calc.push entier | |||
| end | |||
| Soit("j'entre {int} pour le premier/second nombre") do |entier| | |||
| @calc.push entier | |||
| end | |||
| Soit('je tape sur la touche {string}') do |_touche| | |||
| @result = @calc.additionner | |||
| end | |||
| Lorsqu(/on tape additionner/) do | |||
| @result = @calc.additionner | |||
| end | |||
| Alors('le résultat affiché doit être {float}') do |resultat_attendu| | |||
| expect(@result).to eq(resultat_attendu) | |||
| end | |||
| Alors('le résultat doit être {float}') do |resultat_attendu| | |||
| expect(@result).to eq(resultat_attendu) | |||
| end | |||