├── .styleci.yml ├── stubs ├── footer.txt ├── browser_footer.txt ├── parent.txt ├── step.txt ├── browser_parent.txt ├── header.txt ├── browser_step.txt └── browser_header.txt ├── bin ├── behat ├── phpunit ├── phpcs ├── phpcbf └── update_i18n.php ├── src ├── Exceptions │ ├── TestFileExists.php │ ├── TestDoesNotFileExists.php │ ├── MustSetFileNameAndPath.php │ └── SourcePathNotFoundException.php ├── Helpers │ ├── BuildOutContent.php │ ├── AppendFile.php │ ├── AppendBrowserFile.php │ ├── WritePHPUnitFile.php │ ├── WriteBrowserFile.php │ ├── AppendFileBase.php │ └── WriteFileBase.php ├── RunTest.php ├── BaseGherkinToDusk.php └── GherkinToDusk.php ├── .editorconfig ├── bootstrap ├── autoload.php ├── app.php └── i18n.yml ├── ISSUE_TEMPLATE.md ├── CHANGELOG.md ├── LICENSE.md ├── phpunit.xml ├── CONTRIBUTING.md ├── PULL_REQUEST_TEMPLATE.md ├── composer.json ├── CONDUCT.md ├── pickle ├── README.md ├── i18n.php └── coverage.clover /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: psr2 2 | -------------------------------------------------------------------------------- /stubs/footer.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | } 4 | -------------------------------------------------------------------------------- /bin/behat: -------------------------------------------------------------------------------- 1 | ../vendor/behat/behat/bin/behat -------------------------------------------------------------------------------- /stubs/browser_footer.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | } 4 | -------------------------------------------------------------------------------- /bin/phpunit: -------------------------------------------------------------------------------- 1 | ../vendor/phpunit/phpunit/phpunit -------------------------------------------------------------------------------- /bin/phpcs: -------------------------------------------------------------------------------- 1 | ../vendor/squizlabs/php_codesniffer/scripts/phpcs -------------------------------------------------------------------------------- /bin/phpcbf: -------------------------------------------------------------------------------- 1 | ../vendor/squizlabs/php_codesniffer/scripts/phpcbf -------------------------------------------------------------------------------- /stubs/parent.txt: -------------------------------------------------------------------------------- 1 | 2 | public function [PARENT_METHOD]() { 3 | 4 | [STEPS_AREA] 5 | } 6 | 7 | -------------------------------------------------------------------------------- /stubs/step.txt: -------------------------------------------------------------------------------- 1 | 2 | protected function [STEP]() { 3 | 4 | $this->markTestIncomplete('Time to code [METHOD]'); 5 | 6 | } 7 | -------------------------------------------------------------------------------- /src/Exceptions/TestFileExists.php: -------------------------------------------------------------------------------- 1 | browse(function (Browser $browser) { 6 | $this->browser = $browser; 7 | [STEPS_AREA] 8 | }); 9 | } 10 | 11 | -------------------------------------------------------------------------------- /stubs/header.txt: -------------------------------------------------------------------------------- 1 | markTestIncomplete('Time to code [METHOD]'); 5 | 6 | $this->browser->visit('/'); 7 | //and in the next step 8 | //$this->browser->assertSee('Laravel'); 9 | } 10 | -------------------------------------------------------------------------------- /stubs/browser_header.txt: -------------------------------------------------------------------------------- 1 | $parent_method_name 12 | ]; 13 | } 14 | 15 | public function getStepLevelContent($step_method_name) 16 | { 17 | return [ 18 | "method_name" => $step_method_name, 19 | "reference" => sprintf("\$this->%s", $step_method_name) . "()" 20 | ]; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/Helpers/AppendFile.php: -------------------------------------------------------------------------------- 1 | base = $this->getFilesystem()->get($parent_base); 14 | 15 | parent::addParentContent($parent_function); 16 | } 17 | 18 | protected function addSteps(array $steps) 19 | { 20 | $path = __DIR__ . '/../../stubs/step.txt'; 21 | $this->step_template = $this->getFilesystem()->get($path); 22 | 23 | parent::addSteps($steps); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Helpers/AppendBrowserFile.php: -------------------------------------------------------------------------------- 1 | base = $this->getFilesystem()->get($parent_base); 15 | 16 | parent::addParentContent($parent_function); 17 | } 18 | 19 | protected function addSteps(array $steps) 20 | { 21 | $path = __DIR__ . '/../../stubs/browser_step.txt'; 22 | $this->step_template = $this->getFilesystem()->get($path); 23 | 24 | parent::addSteps($steps); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /bootstrap/autoload.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Detailed description 4 | 5 | Provide a detailed description of the change or addition you are proposing. 6 | 7 | Make it clear if the issue is a bug, an enhancement or just a question. 8 | 9 | ## Context 10 | 11 | Why is this change important to you? How would you use it? 12 | 13 | How can it benefit other users? 14 | 15 | ## Possible implementation 16 | 17 | Not obligatory, but suggest an idea for implementing addition or change. 18 | 19 | ## Your environment 20 | 21 | Include as many relevant details about the environment you experienced the bug in and how to reproduce it. 22 | 23 | * Version used (e.g. PHP 5.6, HHVM 3): 24 | * Operating system and version (e.g. Ubuntu 16.04, Windows 7): 25 | * Link to your project: 26 | * ... 27 | * ... 28 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All Notable changes to `pickle` will be documented in this file. 4 | 5 | Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) principles. 6 | 7 | ## Unreleased 8 | 9 | ### Added 10 | - method name in the output of the template for `$this->markTestIncomplete('Time to test METHOD_NAME')` 11 | 12 | ### Deprectiated 13 | - Nothing 14 | 15 | ### Fixed 16 | - Nothing 17 | 18 | ### Remove 19 | - Nothing 20 | 21 | ### Security 22 | - Nothing 23 | 24 | ## [v0.0.1] Working on APPEND - 2017-05-18 25 | 26 | ### Added 27 | - `pickle append` so you can append features to a file see readme for more info 28 | - Global install docs so now people can install and use 29 | 30 | ### Deprecated 31 | - Nothing 32 | 33 | ### Fixed 34 | - Nothing 35 | 36 | ### Removed 37 | - Nothing 38 | 39 | ### Security 40 | - Nothing 41 | 42 | ## [Unreleased] Working on RUN and better DI - 2017-05-13 43 | 44 | ### Added 45 | - `pickle run` so you can run from the feature file ui or domain tests 46 | - better us of DI system 47 | 48 | 49 | ### Deprecated 50 | - Nothing 51 | 52 | ### Fixed 53 | - Nothing 54 | 55 | ### Removed 56 | - Nothing 57 | 58 | ### Security 59 | - Nothing 60 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Alfred Nutile 4 | 5 | > Permission is hereby granted, free of charge, to any person obtaining a copy 6 | > of this software and associated documentation files (the "Software"), to deal 7 | > in the Software without restriction, including without limitation the rights 8 | > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | > copies of the Software, and to permit persons to whom the Software is 10 | > furnished to do so, subject to the following conditions: 11 | > 12 | > The above copyright notice and this permission notice shall be included in 13 | > all copies or substantial portions of the Software. 14 | > 15 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | > THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | tests 15 | ./tests/Unit 16 | ./tests/Browser 17 | 18 | 19 | 20 | 21 | src/ 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | getContainer()[\Behat\Gherkin\Parser::class] = function() { 19 | $il8n = __DIR__ . '/i18n.yml'; 20 | 21 | $keywords = new CucumberKeywords($il8n); 22 | 23 | $keywords->setLanguage('en'); 24 | 25 | $lexer = new Lexer($keywords); 26 | 27 | $parser = new Parser($lexer); 28 | return $parser; 29 | }; 30 | 31 | 32 | $app->getContainer()[Illuminate\Filesystem\Filesystem::class] = function() { 33 | return new \Illuminate\Filesystem\Filesystem(); 34 | }; 35 | 36 | 37 | $app->getContainer()[GD\GherkinToDusk::class] = function() use ($app) { 38 | $gd = new GD\GherkinToDusk($app); 39 | 40 | return $gd; 41 | }; 42 | 43 | 44 | $app->getContainer()['filesystem'] = $app->getContainer()[Illuminate\Filesystem\Filesystem::class]; 45 | 46 | $app->getContainer()['parser'] = $app->getContainer()[\Behat\Gherkin\Parser::class]; 47 | 48 | $app->getContainer()['output'] = function() use ($app) { 49 | 50 | return new Symfony\Component\Console\Output\ConsoleOutput(); 51 | 52 | }; 53 | 54 | 55 | 56 | 57 | return $app; -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be fully **credited**. 4 | 5 | We accept contributions via Pull Requests on [Github](https://github.com/alnutile/dg). 6 | 7 | Just let me know what you are are working on by making an Issue and 8 | note the item on the RoadMap you are taking on 9 | 10 | ## Pull Requests 11 | 12 | - **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - Check the code style with ``$ composer check-style`` and fix it with ``$ composer fix-style``. 13 | 14 | - **Add tests!** - Your patch won't be accepted if it doesn't have tests. 15 | 16 | - **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. 17 | 18 | - **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option. 19 | 20 | - **Create feature branches** - Don't ask us to pull from your master branch. 21 | 22 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 23 | 24 | - **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. 25 | 26 | 27 | ## Running Tests 28 | 29 | ``` bash 30 | $ composer test 31 | ``` 32 | 33 | 34 | **Happy coding**! 35 | -------------------------------------------------------------------------------- /src/Helpers/WritePHPUnitFile.php: -------------------------------------------------------------------------------- 1 | write_class_name = $name; 12 | 13 | $this->write_destination_folder_path = $path; 14 | 15 | $this->checkDestinationTestFolder(); 16 | 17 | $this->convertDuskClassAndMethodsArrayToText($dusk_class_and_methods); 18 | 19 | $this->saveToFile(); 20 | } 21 | 22 | protected function addParentContent($parent_function) 23 | { 24 | $parent_base = __DIR__ . '/../../stubs/parent.txt'; 25 | $this->base = $this->getFilesystem()->get($parent_base); 26 | 27 | parent::addParentContent($parent_function); 28 | } 29 | 30 | protected function addSteps(array $steps) 31 | { 32 | $path = __DIR__ . '/../../stubs/step.txt'; 33 | $this->step_template = $this->getFilesystem()->get($path); 34 | 35 | parent::addSteps($steps); 36 | } 37 | 38 | protected function getAndSetHeaderArea() 39 | { 40 | $path = __DIR__ . '/../../stubs/header.txt'; 41 | $this->content = $this->getFilesystem()->get($path); 42 | 43 | parent::getAndSetHeaderArea(); 44 | } 45 | 46 | protected function getAndSetFooterArea() 47 | { 48 | $path = __DIR__ . '/../../stubs/footer.txt'; 49 | $content = $this->getFilesystem()->get($path); 50 | 51 | $this->dusk_class_and_methods_string = $this->dusk_class_and_methods_string . $content; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Helpers/WriteBrowserFile.php: -------------------------------------------------------------------------------- 1 | write_class_name = $name; 14 | 15 | $this->write_destination_folder_path = $path; 16 | 17 | $this->checkDestinationTestFolder(); 18 | 19 | $this->convertDuskClassAndMethodsArrayToText($dusk_class_and_methods); 20 | 21 | $this->saveToFile(); 22 | } 23 | 24 | protected function getAndSetHeaderArea() 25 | { 26 | $path = __DIR__ . '/../../stubs/browser_header.txt'; 27 | $this->content = $this->getFilesystem()->get($path); 28 | 29 | parent::getAndSetHeaderArea(); 30 | } 31 | 32 | protected function getAndSetFooterArea() 33 | { 34 | $path = __DIR__ . '/../../stubs/browser_footer.txt'; 35 | $content = $this->getFilesystem()->get($path); 36 | 37 | $this->dusk_class_and_methods_string = $this->dusk_class_and_methods_string . $content; 38 | } 39 | 40 | protected function addParentContent($parent_function) 41 | { 42 | $parent_base = __DIR__ . '/../../stubs/browser_parent.txt'; 43 | $this->base = $this->getFilesystem()->get($parent_base); 44 | 45 | parent::addParentContent($parent_function); 46 | } 47 | 48 | protected function addSteps(array $steps) 49 | { 50 | $path = __DIR__ . '/../../stubs/browser_step.txt'; 51 | $this->step_template = $this->getFilesystem()->get($path); 52 | 53 | parent::addSteps($steps); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Description 4 | 5 | Describe your changes in detail. 6 | 7 | ## Motivation and context 8 | 9 | Why is this change required? What problem does it solve? 10 | 11 | If it fixes an open issue, please link to the issue here (if you write `fixes #num` 12 | or `closes #num`, the issue will be automatically closed when the pull is accepted.) 13 | 14 | ## How has this been tested? 15 | 16 | Please describe in detail how you tested your changes. 17 | 18 | Include details of your testing environment, and the tests you ran to 19 | see how your change affects other areas of the code, etc. 20 | 21 | ## Screenshots (if appropriate) 22 | 23 | ## Types of changes 24 | 25 | What types of changes does your code introduce? Put an `x` in all the boxes that apply: 26 | - [ ] Bug fix (non-breaking change which fixes an issue) 27 | - [ ] New feature (non-breaking change which adds functionality) 28 | - [ ] Breaking change (fix or feature that would cause existing functionality to change) 29 | 30 | ## Checklist: 31 | 32 | Go over all the following points, and put an `x` in all the boxes that apply. 33 | 34 | Please, please, please, don't send your pull request until all of the boxes are ticked. Once your pull request is created, it will trigger a build on our [continuous integration](http://www.phptherightway.com/#continuous-integration) server to make sure your [tests and code style pass](https://help.github.com/articles/about-required-status-checks/). 35 | 36 | - [ ] I have read the **[CONTRIBUTING](CONTRIBUTING.md)** document. 37 | - [ ] My pull request addresses exactly one patch/feature. 38 | - [ ] I have created a branch for this patch/feature. 39 | - [ ] Each individual commit in the pull request is meaningful. 40 | - [ ] I have added tests to cover my changes. 41 | - [ ] If my change requires a change to the documentation, I have updated it accordingly. 42 | 43 | If you're unsure about any of these, don't hesitate to ask. We're here to help! 44 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "alnutile/pickle", 3 | "type": "library", 4 | "description": "Gherkin to Dusk", 5 | "keywords": [ 6 | "alnutile", 7 | "bdd", 8 | "laravrel" 9 | ], 10 | "homepage": "https://github.com/alnutile/gd", 11 | "license": "MIT", 12 | "authors": [ 13 | { 14 | "name": "Alfred Nutile", 15 | "email": "me@alfrednutile.info", 16 | "homepage": "https://alfrednutile.info", 17 | "role": "Developer" 18 | } 19 | ], 20 | "require": { 21 | "php": "~5.6|~7.0", 22 | "behat/behat": "^3.3", 23 | "behat/gherkin": "^4.4", 24 | "illuminate/console": "~5.4", 25 | "illuminate/filesystem": "~5.1|~5.2", 26 | "illuminate/support": "~5.4", 27 | "larapack/dd": "1.*", 28 | "mnapoli/silly": "^1.5", 29 | "mnapoli/silly-pimple": "^1.0", 30 | "mockery/mockery": "0.9.*", 31 | "symfony/console": "~3.2", 32 | "symfony/process": "~3.2", 33 | "symfony/yaml": "^3.2" 34 | }, 35 | "require-dev": { 36 | "phpunit/phpunit": "~4.0||~5.0", 37 | "squizlabs/php_codesniffer": "^2.3", 38 | "symfony/filesystem": "^3.2", 39 | "symfony/finder": "^3.2" 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "GD\\": "src/" 44 | } 45 | }, 46 | "autoload-dev": { 47 | "psr-4": { 48 | "GD\\Tests\\": "tests/" 49 | } 50 | }, 51 | "scripts": { 52 | "test": "phpunit", 53 | "check-style": "phpcs -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src tests", 54 | "fix-style": "phpcbf -p --standard=PSR2 --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1 src tests" 55 | }, 56 | "extra": { 57 | "branch-alias": { 58 | "dev-master": "1.0-dev" 59 | } 60 | }, 61 | "config": { 62 | "sort-packages": true, 63 | "bin-dir": "bin" 64 | }, 65 | "bin": [ 66 | "pickle" 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /bin/update_i18n.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | $keywords) { 11 | $langMessages = array(); 12 | 13 | foreach ($keywords as $type => $words) { 14 | if (!is_array($words)) { 15 | $words = array($words); 16 | } 17 | 18 | if ('scenarioOutline' === $type) { 19 | $type = 'scenario_outline'; 20 | } 21 | 22 | if (in_array($type, array('given', 'when', 'then', 'and', 'but'))) { 23 | $formattedKeywords = array(); 24 | 25 | foreach ($words as $word) { 26 | $formattedWord = trim($word); 27 | 28 | if ($formattedWord === $word) { 29 | $formattedWord = $formattedWord.'<'; // Convert the keywords to the syntax used by Gherkin 2, which is expected by our Lexer. 30 | } 31 | 32 | $formattedKeywords[] = $formattedWord; 33 | } 34 | 35 | $words = $formattedKeywords; 36 | } 37 | 38 | usort($words, function($type1, $type2) { 39 | return mb_strlen($type2, 'utf8') - mb_strlen($type1, 'utf8'); 40 | }); 41 | 42 | $langMessages[$type] = implode('|', $words); 43 | } 44 | 45 | // ensure that the order of keys is consistent between updates 46 | ksort($langMessages); 47 | 48 | $array[$lang] = $langMessages; 49 | } 50 | 51 | // ensure that the languages are sorted to avoid useless diffs between updates. We keep the English first though as it is the reference. 52 | $enData = $array['en']; 53 | unset($array['en']); 54 | ksort($array); 55 | $array = array_merge(array('en' => $enData), $array); 56 | $arrayString = var_export($array, true); 57 | 58 | file_put_contents(__DIR__.'/../i18n.php', <<context = 'browser'; 23 | $this->setPathToCommand('php artisan dusk'); 24 | $this->runTestFromFile($path); 25 | } 26 | 27 | public function handleDomain($path) 28 | { 29 | $this->context = 'domain'; 30 | $this->setPathToCommand('vendor/bin/phpunit'); 31 | $this->runTestFromFile($path); 32 | } 33 | 34 | 35 | private function runTestFromFile($path) 36 | { 37 | $this->setPathToFeature($path)->buildDuskTestName(); 38 | 39 | $path_to_test = $this->fullPathToDestinationFile(); 40 | 41 | $path_to_command = $this->getPathToCommand(); 42 | 43 | $this->setCommand(sprintf("%s %s", $path_to_command, $path_to_test)); 44 | 45 | $this->runCommand(); 46 | } 47 | 48 | protected function runCommand() 49 | { 50 | $process = new \Symfony\Component\Process\Process($this->command); 51 | 52 | $process->setTimeout(600); 53 | 54 | $process->start(); 55 | 56 | $process->wait(function ($type, $buffer) use ($process) { 57 | if (Process::ERR === $type) { 58 | $this->app->getContainer()['output']->write($buffer); 59 | } else { 60 | $this->app->getContainer()['output']->write($buffer); 61 | } 62 | }); 63 | 64 | if (!$process->isSuccessful()) { 65 | //throw new ProcessFailedException($process); 66 | $this->app->getContainer()['output']->writeln("Error with tests...."); 67 | exit(1); 68 | } else { 69 | $this->app->getContainer()['output']->writeln("All Tests Passed..."); 70 | } 71 | } 72 | 73 | /** 74 | * @return string 75 | */ 76 | public function getCommand() 77 | { 78 | return $this->command; 79 | } 80 | 81 | /** 82 | * @param string $command 83 | */ 84 | public function setCommand($command) 85 | { 86 | $this->command = $command; 87 | } 88 | 89 | /** 90 | * @return mixed 91 | */ 92 | public function getPathToCommand() 93 | { 94 | return $this->path_to_command; 95 | } 96 | 97 | /** 98 | * @param mixed $path_to_command 99 | */ 100 | public function setPathToCommand($path_to_command) 101 | { 102 | $this->path_to_command = $path_to_command; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at `me@alfrednutile.info`. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /pickle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | command('initialize [--context=] relative_feature_file_path', function ( 13 | OutputInterface $output, 14 | GD\GherkinToDusk $gd, $context, $relative_feature_file_path) { 15 | 16 | //get source path of file 17 | $output->write("\nCreating File for you\n"); 18 | 19 | try { 20 | $gd->setContext($context) 21 | ->setPathToFeature($relative_feature_file_path) 22 | ->initializeFeature(); 23 | 24 | $path = $gd->fullPathToDestinationFile(); 25 | $output->write(sprintf("File now in %s for you to work on", $path)); 26 | 27 | $output->write("\n****done*****\n"); 28 | } catch (\Exception $e) { 29 | $output->write(sprintf("Error initializing \nMESSAGE: %s\n", $e->getMessage())); 30 | } 31 | 32 | })->defaults([ 33 | 'context' => "domain" 34 | ])->descriptions("This will stuff out your feature into a Dusk Test file", 35 | [ 36 | '--context' => "domain or ui this will help us to know what Dusk test to run domain is the inside code ui is the outside", 37 | "relative_feature_file_path" => "The path to the file for example tests/features/foo.feature" 38 | ] 39 | ); 40 | 41 | 42 | $app->command('append [--context=] relative_feature_file_path', function ( 43 | OutputInterface $output, 44 | GD\GherkinToDusk $gd, $context, $relative_feature_file_path) { 45 | 46 | //get source path of file 47 | $output->write("\nAppending File for you\n"); 48 | 49 | try { 50 | $gd->setContext($context) 51 | ->setPathToFeature($relative_feature_file_path) 52 | ->appendFeatures(); 53 | 54 | $path = $gd->fullPathToDestinationFile(); 55 | $output->writeln(sprintf("File now updated in %s for you to work on", $path)); 56 | } catch (\Exception $e) { 57 | $output->write(sprintf("Error initializing \nMESSAGE: %s\n", $e->getMessage())); 58 | } 59 | 60 | })->defaults([ 61 | 'context' => "domain" 62 | ])->descriptions("This will append new Scenarios and Steps from the feature file", 63 | [ 64 | '--context' => "domain or ui this will help us to know what Dusk test to run domain is the inside code ui is the outside", 65 | "relative_feature_file_path" => "The path to the file for example tests/features/foo.feature" 66 | ] 67 | ); 68 | 69 | $app->command('run [--context=] relative_feature_file_path', function ( 70 | OutputInterface $output, 71 | \Illuminate\Filesystem\Filesystem $files, $context, $relative_feature_file_path) use ($app) { 72 | 73 | if($context == 'domain') { 74 | $run = new \GD\RunTest($app); 75 | 76 | $run->handleDomain($relative_feature_file_path); 77 | 78 | } else { 79 | $run = new \GD\RunTest($app); 80 | 81 | $run->handleBrowser($relative_feature_file_path); 82 | } 83 | 84 | })->defaults([ 85 | 'context' => "domain" 86 | ])->descriptions("This will stuff out your feature into a Dusk Test file", 87 | [ 88 | '--context' => "domain or ui this will help us to know what Dusk test to run domain is the inside code ui is the outside", 89 | "relative_feature_file_path" => "The path to the file for example tests/features/foo.feature" 90 | ] 91 | ); 92 | 93 | 94 | $app->run(); -------------------------------------------------------------------------------- /src/Helpers/AppendFileBase.php: -------------------------------------------------------------------------------- 1 | write_class_name = $name; 17 | 18 | $this->write_destination_folder_path = $path; 19 | 20 | $this->checkDestinationTestFolder(); 21 | 22 | $this->convertDuskClassAndMethodsArrayToText($dusk_class_and_methods); 23 | 24 | $this->createUpdatedContent(); 25 | 26 | $this->appendToFile(); 27 | 28 | $this->saveToFile(); 29 | } 30 | 31 | 32 | 33 | protected function createUpdatedContent() 34 | { 35 | $where_is_the_end = strrpos($this->getExistingTestContent(), "}"); 36 | 37 | $existing_content = $this->getExistingTestContent(); 38 | 39 | $this->updated_content = $this->appendExistingFileWithNewResults($existing_content, $where_is_the_end); 40 | 41 | $this->dusk_class_and_methods_string = $this->updated_content; 42 | } 43 | 44 | protected function appendToFile() 45 | { 46 | 47 | $this->dusk_class_and_methods_string = $this->dusk_class_and_methods_string . "\n}"; 48 | } 49 | 50 | 51 | protected function convertDuskClassAndMethodsArrayToText($dusk_class_and_methods) 52 | { 53 | 54 | 55 | foreach ($dusk_class_and_methods as $dusk_class_and_method_index => $dusk_class_and_method) { 56 | if (!$this->checkIfMethodInClass($dusk_class_and_method)) { 57 | $this->addParentContent($dusk_class_and_method['parent']); 58 | } 59 | 60 | $this->addSteps($dusk_class_and_method['steps']); 61 | } 62 | } 63 | 64 | protected function checkDestinationTestFolder() 65 | { 66 | $file_to_append = $this->write_destination_folder_path . '/' . $this->write_class_name . '.php'; 67 | 68 | if (!$this->getFilesystem()->exists($file_to_append)) { 69 | throw new TestDoesNotFileExists(sprintf("Could not find the file to append to at %s", $file_to_append)); 70 | } else { 71 | $content = $this->getFilesystem()->get($file_to_append); 72 | $this->setExistingTestContent($content); 73 | } 74 | } 75 | 76 | protected function addNewStepToTest($step, $step_template) 77 | { 78 | $method = sprintf("protected function %s()", $step['method_name']); 79 | $found_existing = substr_count($this->getExistingTestContent(), $method); 80 | $found = substr_count($this->dusk_class_and_methods_string, $method); 81 | 82 | if ($found < 1 && $found_existing < 1) { 83 | $content = str_replace(["[STEP]", "[METHOD]"], $step['method_name'], $step_template); 84 | $this->dusk_class_and_methods_string = $this->dusk_class_and_methods_string . $content; 85 | } 86 | } 87 | 88 | /** 89 | * @return mixed 90 | */ 91 | public function getUpdatedContent() 92 | { 93 | return $this->updated_content; 94 | } 95 | 96 | protected function getAndSetFooterArea() 97 | { 98 | // TODO: Implement getAndSetFooterArea() method. 99 | } 100 | 101 | /** 102 | * @param $dusk_class_and_method 103 | * @return bool 104 | */ 105 | protected function checkIfMethodInClass($dusk_class_and_method) 106 | { 107 | $parent = sprintf("function %s()", $dusk_class_and_method['parent']); 108 | 109 | return str_contains($this->getExistingTestContent(), $parent); 110 | } 111 | 112 | /** 113 | * @param $existing_content 114 | * @param $where_is_the_end 115 | * @return mixed 116 | */ 117 | protected function appendExistingFileWithNewResults($existing_content, $where_is_the_end) 118 | { 119 | return substr_replace($existing_content, $this->dusk_class_and_methods_string, $where_is_the_end); 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/Helpers/WriteFileBase.php: -------------------------------------------------------------------------------- 1 | write_class_name; 32 | } 33 | 34 | public function setWriteClassName($name) 35 | { 36 | $this->write_class_name = $name; 37 | } 38 | 39 | 40 | /** 41 | * @return Filesystem 42 | */ 43 | public function getFilesystem() 44 | { 45 | if (!$this->filesystem) { 46 | $this->setFilesystem(); 47 | } 48 | return $this->filesystem; 49 | } 50 | 51 | /** 52 | * @param null $filesystem 53 | * @return $this 54 | */ 55 | public function setFilesystem($filesystem = null) 56 | { 57 | if (!$filesystem) { 58 | $filesystem = new Filesystem(); 59 | } 60 | 61 | $this->filesystem = $filesystem; 62 | return $this; 63 | } 64 | 65 | protected function convertDuskClassAndMethodsArrayToText($dusk_class_and_methods) 66 | { 67 | 68 | $this->getAndSetHeaderArea(); 69 | 70 | foreach ($dusk_class_and_methods as $dusk_class_and_method_index => $dusk_class_and_method) { 71 | /** 72 | * Check if set 73 | */ 74 | $this->addParentContent($dusk_class_and_method['parent']); 75 | 76 | $this->addSteps($dusk_class_and_method['steps']); 77 | } 78 | 79 | $this->getAndSetFooterArea(); 80 | } 81 | 82 | public function getDuskClassAndMethodsString() 83 | { 84 | return $this->dusk_class_and_methods_string; 85 | } 86 | 87 | protected function getAndSetHeaderArea() 88 | { 89 | $content = str_replace("[TEST_NAME]", $this->write_class_name, $this->content); 90 | $this->dusk_class_and_methods_string = $content; 91 | } 92 | 93 | abstract protected function getAndSetFooterArea(); 94 | 95 | protected function addSteps(array $steps) 96 | { 97 | $references = ""; 98 | 99 | foreach ($steps as $index => $step) { 100 | $references = $references . $this->spacing . $step['reference'] . $this->notLastLine($steps, $index); 101 | $this->addNewStepToTest($step, $this->step_template); 102 | } 103 | 104 | $this->dusk_class_and_methods_string = 105 | str_replace("[STEPS_AREA]", $references, $this->dusk_class_and_methods_string); 106 | } 107 | 108 | protected function notLastLine(array $steps, $index) 109 | { 110 | if (($index + 1) < count($steps)) { 111 | return ";\n "; 112 | } 113 | 114 | return ";"; 115 | } 116 | 117 | 118 | protected function addParentContent($parent_function) 119 | { 120 | $base = str_replace("[PARENT_METHOD]", $parent_function, $this->base); 121 | 122 | $this->dusk_class_and_methods_string = $this->dusk_class_and_methods_string . $base; 123 | } 124 | 125 | protected function addNewStepToTest($step, $step_template) 126 | { 127 | $method = sprintf("protected function %s()", $step['method_name']); 128 | $found = substr_count($this->dusk_class_and_methods_string, $method); 129 | 130 | if ($found < 1) { 131 | $content = str_replace(["[STEP]", "[METHOD]"], $step['method_name'], $step_template); 132 | $this->dusk_class_and_methods_string = $this->dusk_class_and_methods_string . $content; 133 | } 134 | } 135 | 136 | protected function checkDestinationTestFolder() 137 | { 138 | 139 | if (!$this->getFilesystem()->exists($this->write_destination_folder_path)) { 140 | $this->getFilesystem()->makeDirectory($this->write_destination_folder_path, 0777, true); 141 | } else { 142 | if ($this->getFilesystem()->exists($this->write_destination_folder_path . 143 | $this->write_class_name . '.php')) { 144 | throw new TestFileExists(sprintf("The file %s already exists", $this->write_class_name . '.php')); 145 | } 146 | } 147 | } 148 | 149 | protected function saveToFile() 150 | { 151 | $path = sprintf("%s/%s.php", $this->write_destination_folder_path, $this->write_class_name); 152 | 153 | $this->getFilesystem()->put( 154 | $path, 155 | $this->dusk_class_and_methods_string 156 | ); 157 | } 158 | 159 | public function getExistingTestContent() 160 | { 161 | 162 | if (!$this->existing_test_content) { 163 | $this->setExistingTestContent(); 164 | } 165 | 166 | return $this->existing_test_content; 167 | } 168 | 169 | /** 170 | * @param mixed $existing_test_content 171 | */ 172 | public function setExistingTestContent($existing_test_content = null) 173 | { 174 | if (!$existing_test_content) { 175 | $file_to_append = $this->write_destination_folder_path . '/' . $this->getWriteClassName() . '.php'; 176 | 177 | $content = $this->getFilesystem()->get($file_to_append); 178 | $this->existing_test_content = $content; 179 | } 180 | 181 | $this->existing_test_content = $existing_test_content; 182 | } 183 | } 184 | -------------------------------------------------------------------------------- /src/BaseGherkinToDusk.php: -------------------------------------------------------------------------------- 1 | app = $app; 56 | 57 | $this->filesystem = $this->app->getContainer()['filesystem']; 58 | 59 | $this->parser = $this->app->getContainer()['parser']; 60 | } 61 | 62 | 63 | public function getFileName() 64 | { 65 | return $this->file_name; 66 | } 67 | 68 | public function setFileName($file_name) 69 | { 70 | $this->file_name = $file_name; 71 | return $this; 72 | } 73 | 74 | /** 75 | * @return Filesystem 76 | */ 77 | public function getFilesystem() 78 | { 79 | return $this->filesystem; 80 | } 81 | 82 | /** 83 | * @param null $filesystem 84 | * @return $this 85 | */ 86 | public function setFilesystem($filesystem = null) 87 | { 88 | 89 | if (!$filesystem) { 90 | $filesystem = new Filesystem(); 91 | } 92 | $this->filesystem = $filesystem; 93 | return $this; 94 | } 95 | 96 | /** 97 | * @return null 98 | */ 99 | public function getFileNameAndPath() 100 | { 101 | if ($this->file_name_and_path == null) { 102 | $this->setFileNameAndPath(); 103 | } 104 | return $this->file_name_and_path; 105 | } 106 | 107 | /** 108 | * @param null $file_name_and_path 109 | * @return $this 110 | */ 111 | public function setFileNameAndPath($file_name_and_path = null) 112 | { 113 | if (!$file_name_and_path) { 114 | $file_name_and_path = 115 | $this->getSourcePath() . $this->features_folder . $this->getFileName(); 116 | } 117 | 118 | $this->file_name_and_path = $file_name_and_path; 119 | 120 | return $this; 121 | } 122 | 123 | 124 | 125 | /** 126 | * @return null 127 | */ 128 | public function getSourcePath() 129 | { 130 | if ($this->source_path == null) { 131 | $this->setSourcePath(); 132 | } 133 | return $this->source_path; 134 | } 135 | 136 | /** 137 | * @param null $source_path 138 | */ 139 | public function setSourcePath($source_path = null) 140 | { 141 | if (!$source_path) { 142 | $source_path = getcwd() . '/tests/features/'; 143 | } 144 | 145 | $this->source_path = $source_path; 146 | } 147 | 148 | /** 149 | * @return null 150 | */ 151 | public function getDestinationFolderRoot() 152 | { 153 | if (!$this->destination_folder_root) { 154 | $this->setDestinationFolderRoot(); 155 | } 156 | return $this->destination_folder_root; 157 | } 158 | 159 | /** 160 | * @param null $destination_folder_root 161 | */ 162 | public function setDestinationFolderRoot($destination_folder_root = null) 163 | { 164 | if (!$destination_folder_root) { 165 | $destination_folder_root = getcwd() . sprintf('/tests/%s', $this->getContextFolder()); 166 | } 167 | 168 | $this->destination_folder_root = $destination_folder_root; 169 | } 170 | 171 | /** 172 | * @return string 173 | */ 174 | public function getContext() 175 | { 176 | return $this->context; 177 | } 178 | 179 | /** 180 | * @param string $context 181 | * @return $this 182 | */ 183 | public function setContext($context) 184 | { 185 | $this->context = $context; 186 | return $this; 187 | } 188 | 189 | /** 190 | * @return Parser 191 | */ 192 | public function getParser() 193 | { 194 | return $this->parser; 195 | } 196 | 197 | /** 198 | * @param Parser $parser 199 | */ 200 | public function setParser($parser) 201 | { 202 | $this->parser = $parser; 203 | } 204 | 205 | 206 | /** 207 | * @return null 208 | */ 209 | public function getPathToFeature() 210 | { 211 | return $this->path_to_feature; 212 | } 213 | 214 | /** 215 | * @param null $path_to_feature 216 | * @return $this 217 | */ 218 | public function setPathToFeature($path_to_feature) 219 | { 220 | $this->path_to_feature = $path_to_feature; 221 | return $this; 222 | } 223 | 224 | public function fullPathToDestinationFile() 225 | { 226 | return $this->getDestinationFolderRoot() . '/' . $this->getDuskTestName() . '.php'; 227 | } 228 | 229 | 230 | protected function buildDuskTestName() 231 | { 232 | if (!$this->dusk_test_name) { 233 | $name = $this->getFilesystem()->name($this->getFullPathToFileAndFileName()); 234 | $this->dusk_test_name = ucfirst(camel_case($name) . 'Test'); 235 | } 236 | } 237 | 238 | protected function getFullPathToFileAndFileName() 239 | { 240 | return getcwd() . DIRECTORY_SEPARATOR . $this->getPathToFeature(); 241 | } 242 | 243 | /** 244 | * @return mixed 245 | */ 246 | public function getDuskTestName() 247 | { 248 | return $this->dusk_test_name; 249 | } 250 | 251 | /** 252 | * @param mixed $dusk_test_name 253 | */ 254 | public function setDuskTestName($dusk_test_name) 255 | { 256 | $this->dusk_test_name = $dusk_test_name; 257 | } 258 | 259 | private function getContextFolder() 260 | { 261 | switch ($this->context) { 262 | case "domain": 263 | return "Feature"; 264 | case "ui": 265 | case "browser": 266 | return "Browser"; 267 | default: 268 | return "Feature"; 269 | } 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /src/GherkinToDusk.php: -------------------------------------------------------------------------------- 1 | loadFileContent(); 69 | $this->buildDuskTestName(); 70 | $this->passThroughParser(); 71 | $this->breakIntoMethods(); 72 | 73 | switch ($this->context) { 74 | case 'unit': 75 | case 'domain': 76 | $this->featureAppendToUnit(); 77 | break; 78 | case 'ui': 79 | case 'browser': 80 | $this->featureAppendToBrowser(); 81 | break; 82 | default: 83 | //more coming soon 84 | break; 85 | } 86 | } 87 | 88 | public function initializeFeature() 89 | { 90 | $this->loadFileContent(); 91 | 92 | $this->buildDuskTestName(); 93 | 94 | $this->passThroughParser(); 95 | 96 | $this->breakIntoMethods(); 97 | 98 | switch ($this->context) { 99 | case 'unit': 100 | case 'domain': 101 | $this->featureToUnit(); 102 | break; 103 | case 'ui': 104 | case 'browser': 105 | $this->featureToBrowser(); 106 | break; 107 | default: 108 | //more coming soon 109 | break; 110 | } 111 | } 112 | 113 | protected function featureToBrowser() 114 | { 115 | $this->checkIfFileExists(); 116 | 117 | $this->getWriteBrowserTest()->writeTest( 118 | $this->getDestinationFolderRoot(), 119 | $this->getDuskTestName(), 120 | $this->getDuskClassAndMethods() 121 | ); 122 | } 123 | 124 | protected function featureAppendToBrowser() 125 | { 126 | $this->getAppendBrowserTest()->writeTest( 127 | $this->getDestinationFolderRoot(), 128 | $this->getDuskTestName(), 129 | $this->getDuskClassAndMethods() 130 | ); 131 | } 132 | 133 | protected function featureAppendToUnit() 134 | { 135 | $this->getAppendUnitTest()->writeTest( 136 | $this->getDestinationFolderRoot(), 137 | $this->getDuskTestName(), 138 | $this->getDuskClassAndMethods() 139 | ); 140 | } 141 | 142 | protected function featureToUnit() 143 | { 144 | $this->checkIfFileExists(); 145 | 146 | $this->getWriteUnitTest()->writeTest( 147 | $this->getDestinationFolderRoot(), 148 | $this->getDuskTestName(), 149 | $this->getDuskClassAndMethods() 150 | ); 151 | } 152 | 153 | 154 | /** 155 | * @return boolean 156 | */ 157 | public function isComponent() 158 | { 159 | return $this->component; 160 | } 161 | 162 | /** 163 | * @param boolean $component 164 | */ 165 | public function setComponent($component) 166 | { 167 | $this->component = $component; 168 | } 169 | 170 | /** 171 | * @return mixed 172 | */ 173 | public function getFeatureContent() 174 | { 175 | return $this->feature_content; 176 | } 177 | 178 | /** 179 | * @param mixed $feature_content 180 | */ 181 | public function setFeatureContent($feature_content) 182 | { 183 | $this->feature_content = $feature_content; 184 | } 185 | 186 | private function loadFileContent() 187 | { 188 | $this->feature_content = 189 | $this->getFilesystem()->get($this->getFullPathToFileAndFileName()); 190 | } 191 | 192 | private function passThroughParser() 193 | { 194 | $this->parsed_feature = $this->getParser()->parse($this->feature_content); 195 | } 196 | 197 | /** 198 | * @return \Behat\Gherkin\Node\FeatureNode 199 | */ 200 | public function getParsedFeature() 201 | { 202 | return $this->parsed_feature; 203 | } 204 | 205 | /** 206 | * @param \Behat\Gherkin\Node\FeatureNode $parsed_feature 207 | */ 208 | public function setParsedFeature($parsed_feature) 209 | { 210 | $this->parsed_feature = $parsed_feature; 211 | } 212 | 213 | private function breakIntoMethods() 214 | { 215 | $this->iterateOverScenariosAndBuildUpClassMethods(); 216 | } 217 | 218 | private function iterateOverScenariosAndBuildUpClassMethods() 219 | { 220 | /** @var $feature \Behat\Gherkin\Node\ScenarioNode */ 221 | foreach ($this->parsed_feature->getScenarios() as $scenario_index => $scenario) { 222 | $parent_method_name = ucfirst(camel_case($scenario->getTitle())); 223 | 224 | $parent_method_name_camelized_and_prefix_test = sprintf('test%s', $parent_method_name); 225 | 226 | $this->dusk_class_and_methods[$scenario_index] = [ 227 | 'parent' => $parent_method_name_camelized_and_prefix_test, 228 | 'parent_content' => $this->getParentLevelContent($parent_method_name_camelized_and_prefix_test) 229 | ]; 230 | 231 | $this->buildOutSteps($scenario, $scenario_index); 232 | } 233 | } 234 | 235 | /** 236 | * @param $scenario \Behat\Gherkin\Node\ScenarioNode 237 | */ 238 | protected function buildOutSteps($scenario, $scenario_index) 239 | { 240 | foreach ($scenario->getSteps() as $step_index => $step) { 241 | $method_name = camel_case(sprintf("%s %s", $step->getKeyword(), $step->getText())); 242 | $step_method_name_camalized = camel_case(sprintf("%s %s", $step->getKeyword(), $step->getText())); 243 | $this->dusk_class_and_methods[$scenario_index]['steps'][$step_index]['name'] = 244 | $method_name; 245 | $this->dusk_class_and_methods[$scenario_index]['steps'][$step_index] = 246 | $this->getStepLevelContent($step_method_name_camalized); 247 | } 248 | } 249 | 250 | 251 | 252 | /** 253 | * @return mixed 254 | */ 255 | public function getDuskClassAndMethods() 256 | { 257 | return $this->dusk_class_and_methods; 258 | } 259 | 260 | /** 261 | * @param mixed $dusk_class_and_methods 262 | */ 263 | public function setDuskClassAndMethods($dusk_class_and_methods) 264 | { 265 | $this->dusk_class_and_methods = $dusk_class_and_methods; 266 | } 267 | 268 | 269 | 270 | public function getWriteBrowserTest() 271 | { 272 | 273 | if (!$this->write_browser_test) { 274 | $this->setWriteBrowserTest(); 275 | } 276 | 277 | return $this->write_browser_test; 278 | } 279 | 280 | /** 281 | * @param null $write_browser_test 282 | * @return GherkinToDusk 283 | * @internal param WritePHPUnitFile $write_unit_test 284 | */ 285 | public function setWriteBrowserTest($write_browser_test = null) 286 | { 287 | if (!$write_browser_test) { 288 | $write_browser_test = new WriteBrowserFile(); 289 | } 290 | 291 | $this->write_browser_test = $write_browser_test; 292 | return $this; 293 | } 294 | 295 | 296 | public function getWriteUnitTest() 297 | { 298 | 299 | if (!$this->write_unit_test) { 300 | $this->setWriteUnitTest(); 301 | } 302 | 303 | return $this->write_unit_test; 304 | } 305 | 306 | /** 307 | * @param WritePHPUnitFile $write_unit_test 308 | * @return GherkinToDusk 309 | */ 310 | public function setWriteUnitTest($write_unit_test = null) 311 | { 312 | if (!$write_unit_test) { 313 | $write_unit_test = new WritePHPUnitFile(); 314 | } 315 | 316 | $this->write_unit_test = $write_unit_test; 317 | return $this; 318 | } 319 | 320 | /** 321 | * @return $append_unit_test AppendFile 322 | */ 323 | public function getAppendUnitTest() 324 | { 325 | 326 | if (!$this->append_unit_test) { 327 | $this->setAppendUnitTest(); 328 | } 329 | 330 | return $this->append_unit_test; 331 | } 332 | 333 | /** 334 | * @param AppendFile $append_unit_test 335 | * @return GherkinToDusk 336 | */ 337 | public function setAppendUnitTest($append_unit_test = null) 338 | { 339 | if (!$append_unit_test) { 340 | $append_unit_test = new AppendFile(); 341 | } 342 | 343 | $this->append_unit_test = $append_unit_test; 344 | return $this; 345 | } 346 | 347 | private function checkIfFileExists() 348 | { 349 | if ($this->filesystem->exists($this->fullPathToDestinationFile())) { 350 | $path = $this->fullPathToDestinationFile(); 351 | $message = sprintf("The test file exists already %s please use `append` command", $path); 352 | throw new \GD\Exceptions\TestFileExists($message); 353 | } 354 | } 355 | 356 | /** 357 | * @return Helpers\AppendBrowserFile 358 | */ 359 | public function getAppendBrowserTest() 360 | { 361 | if (!$this->append_browser_test) { 362 | $this->setAppendBrowserTest(); 363 | } 364 | 365 | return $this->append_browser_test; 366 | } 367 | 368 | /** 369 | * @param Helpers\AppendBrowserFile $append_browser_test 370 | * @return $this 371 | */ 372 | public function setAppendBrowserTest($append_browser_test = null) 373 | { 374 | if (!$append_browser_test) { 375 | $append_browser_test = new AppendBrowserFile(); 376 | } 377 | 378 | $this->append_browser_test = $append_browser_test; 379 | return $this; 380 | } 381 | } 382 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pickle 2 | 3 | [![Build Status](https://travis-ci.org/alnutile/pickle.svg?branch=master)](https://travis-ci.org/alnutile/pickle) 4 | 5 | [![Latest Version on Packagist][ico-version]][link-packagist] 6 | [![Software License][ico-license]](LICENSE.md) 7 | [![Build Status][ico-travis]][link-travis] 8 | [![Coverage Status][ico-scrutinizer]][link-scrutinizer] 9 | [![Quality Score][ico-code-quality]][link-code-quality] 10 | [![Total Downloads][ico-downloads]][link-downloads] 11 | 12 | 13 | 14 | ## Overview 15 | 16 | ![](https://dl.dropboxusercontent.com/s/7ek8r3477lljab4/pickle.jpg?dl=0) 17 | 18 | Converting Gherkin file to PHPUnit Compatible and Dusk Compatible files. 19 | 20 | This will attempt to make an easy way to work with Dusk and PHPUnit from a Gherkin formatted file. 21 | 22 | 23 | If you are familiar with Behat then this workflow might be similar. 24 | 25 | **[Intro Video](https://youtu.be/GmA-6hnhljI)** 26 | 27 | **[Intro Slides](https://goo.gl/djVXhJ)** 28 | 29 | 30 | ## Topics 31 | 32 | * [UI Example](#ui) 33 | * [Running](#running) 34 | * [RoadMap](#roadmap) 35 | * [Install](#install) 36 | * [Testing](#testing) 37 | * [Contributing](#contributing) 38 | * [Security](#security) 39 | * [Credits](#credits) 40 | * [License](#license) 41 | 42 | ### Initialize 43 | 44 | In this example I have written a feature 1 file and now I want to turn that into my first PHPUnit compatible test. 45 | 46 | For example I make a file `tests/features/profile.feature` 47 | 48 | ``` 49 | Feature: Test Profile Page 50 | Can See and Edit my profile 51 | As a user of the system 52 | So I can manage my profile 53 | 54 | Scenario: Edit Profile 55 | Given I have a profile created 56 | And I am in edit mode 57 | Then I can change the first name 58 | And the last name 59 | And and save my settings 60 | Then when I view my profile it will have those new settings 61 | ``` 62 | 63 | One of the key aspects I will talk about later is how I can use one file to drive two types of tests, Integration then Browser. And how the Gherkin syntax can influence how I name my classes in line with the business writing of the feature 2. 64 | 65 | ![](https://dl.dropboxusercontent.com/s/44lfxdd2wxrorcv/one_file.png?dl=0) 66 | 67 | 68 | >NOTE: the above feature does not really summarize the goal in business terms it is still quite a bit focused on the web. 69 | 70 | 71 | So at this point I can type, assuming you installed Pickle globally as I cover below: 72 | 73 | ``` 74 | pickle initialize tests/features/profile.feature 75 | ``` 76 | 77 | or for a Browser test: 78 | 79 | ``` 80 | pickle initialize --context=browser tests/features/profile.feature 81 | ``` 82 | 83 | In this case let's focus on domain context eg Integration. 84 | 85 | Now it will make a test for me in `tests/Feature/ProfileTest.php` 86 | 87 | and I can start working on that file which would look something like this 88 | 89 | ``` 90 | givenIHaveAProfileCreated(); 99 | $this->andIamInEditMode(); 100 | //etc etc 101 | } 102 | 103 | protected function andIamInEditMode() { 104 | $this->markTestIncomplete('Time to code'); 105 | } 106 | 107 | protected function andIamInEditMode() { 108 | $this->markTestIncomplete('Time to code'); 109 | } 110 | 111 | //and all the rest 112 | 113 | } 114 | 115 | ``` 116 | 117 | ### Running 118 | 119 | Now this is just icing on the cake and you can just default back to the basics 120 | and it will all still work. 121 | 122 | ``` 123 | pickle run tests/features/profile.feature 124 | ``` 125 | 126 | Or just go back to using PHPUnit 127 | 128 | ``` 129 | phpunit tests/Feature/ProfileTest.php 130 | ``` 131 | 132 | Or Dusk via Pickle 133 | 134 | ``` 135 | pickle run --context=browser tests/features/profile.feature 136 | ``` 137 | 138 | Or via Dusk 139 | 140 | ``` 141 | php artisan dusk tests/Browser/ProfileTest.php 142 | ``` 143 | 144 | 145 | ### UI Example 146 | 147 | 148 | 149 | After I am done with my Integration tests and all that work is in place I can start on the Browser tests. 150 | 151 | So I run the command 152 | 153 | ``` 154 | pickle run --context=browser tests/features/profile.feature 155 | ``` 156 | 157 | And I get 158 | 159 | 160 | ``` 161 | browse(function (Browser $browser) { 184 | $this->browser = $browser; 185 | $this->visitHome(); 186 | $this->seeSomething(); 187 | //etc... 188 | //etc... 189 | }); 190 | } 191 | 192 | private function visitHome() 193 | { 194 | $this->browser->visit('/'); 195 | } 196 | 197 | private function seeSomething() 198 | { 199 | $this->browser->assertSee('Laravel'); 200 | } 201 | } 202 | 203 | ``` 204 | 205 | By setting the `$this->browser` as global I can work one step or function at a time: 206 | 207 | * visit the page 208 | * enter a form field 209 | * enter another form field 210 | * submit 211 | * look for results 212 | 213 | 214 | ### Appending Tests 215 | 216 | As here is an example of when you need to add new Scenarios to a feature file and you need to then update the Class file. 217 | 218 | For example 219 | 220 | ``` 221 | Feature: Test Profile Page 222 | Can See and Edit my profile 223 | As a user of the system 224 | So I can manage my profile 225 | 226 | Scenario: Edit Profile 227 | Given I have a profile created 228 | And I am in edit mode 229 | Then I can change the first name 230 | And the last name 231 | And and save my settings 232 | Then when I view my profile it will have those new settings 233 | 234 | @new_scenario 235 | Scenario: View Profile 236 | Given I have a profile created 237 | And I am in view mode 238 | Then I can see the first name 239 | And the last name 240 | ``` 241 | 242 | We now need to append more to it so we run 243 | 244 | `pickle append tests/features/test_profile.feature` 245 | 246 | or 247 | 248 | `pickle append --context=browser tests/features/test_profile.feature` 249 | 250 | This will add the new Scenario and methods making sure not to duplicate Scenarios. 251 | 252 | 🤖🤖**WARNING**🤖🤖 253 | 254 | This will not update existing Scenarios 255 | 256 | For example you modify this Scenario 257 | 258 | ``` 259 | Scenario: Edit Profile 260 | Given I have a profile created 261 | And I am in edit mode 262 | Then I can change the first name 263 | And the last name 264 | And and save my settings 265 | Then when I view my profile it will have those new settings 266 | ``` 267 | 268 | to 269 | 270 | ``` 271 | Scenario: Edit Profile 272 | Given I have a profile created 273 | And I am in edit mode 274 | Then I can change the first name 275 | And the last name 276 | And I can add my photo 277 | And and save my settings 278 | Then when I view my profile it will have those new settings 279 | ``` 280 | 281 | So the new line `And I can add my photo` will show up as a method 282 | 283 | ``` 284 | protected function andICanAddMyPhoto() { 285 | $this->markIncomplete("Time to Code"); 286 | } 287 | ``` 288 | 289 | **but** it will not add it to the `Scenario` step as seen after initialize as 290 | 291 | ``` 292 | public function testEditProfile() 293 | { 294 | $this->browse(function (Browser $browser) { 295 | $this->browser = $browser; 296 | $this->foo(); 297 | $this->bar(); 298 | }); 299 | } 300 | ``` 301 | 302 | You just need to add it, to the correct ordered location before or after 303 | 304 | ``` 305 | $this->foo(); 306 | $this->bar(); 307 | $this->andICanAddMyPhoto(); 308 | ``` 309 | 310 | 311 | 312 | 313 | ## RoadMap 314 | 315 | ### Initialize (DONE) 316 | 317 | The ability to use a Gherkin file to create a Unit or Browser test 318 | 319 | #### Todo 320 | 321 | Move the work into `pickle` cli file see at root of app. Simple stuff since it is working in the test 322 | 323 | I will take that one asap 324 | 325 | Right now the test show it working now I need to add it to the global command 326 | 327 | 328 | ### Append Snippets (DONE) 329 | 330 | The ability to add more steps and scenarios to existing Unit and Browser tests 331 | 332 | So if they add new steps or scenarios to the feature pickle is smart enough to append the scenario(s) 333 | (easy stuff there) but also append steps into the scenario as needed. 334 | 335 | #### Todo 336 | 337 | Everything! I mean I have code to prevent duplicate methods. 338 | 339 | ### Run from Gherkin (DONE) 340 | 341 | Running from the Gherkin test either the domain or ui test with nice Gherkin based output 342 | 343 | eg 344 | 345 | ``` 346 | pickle run tests/features/profile.feature --domain 347 | ``` 348 | 349 | And it would know to use the `tests/Feature/ProfileTest.php` 350 | 351 | and output in that nice Gherkin format like Behat. 352 | 353 | 354 | #### Todo 355 | 356 | 357 | I will track these as Issues [here](https://github.com/alnutile/pickle/issues) 358 | 359 | And as much as possible / soon in Projects [here](https://github.com/alnutile/pickle/projects/1) 360 | 361 | 362 | 363 | 364 | 365 | ## Install 366 | 367 | First you need to install the Global Composer Tool to help over all [learn more](https://packagist.org/packages/consolidation/cgr) 368 | 369 | 370 | ``` 371 | composer global require consolidation/cgr 372 | ``` 373 | 374 | Then make sure that `~/.composer/vendor/bin` to your $PATH` 375 | 376 | You might have this already 377 | 378 | eg edit your ~/.bash_profile` and add 379 | 380 | 381 | ``` 382 | export PATH=~/.composer/vendor/bin:$PATH 383 | ``` 384 | 385 | Then type 386 | 387 | ``` 388 | source ~/.bash_profile 389 | ``` 390 | 391 | Now if you type 392 | ``` 393 | cgr --help 394 | ``` 395 | 396 | You should get some output like this 397 | 398 | ``` 399 | The 'cgr' tool is a "safer" alternative to 'composer global require'. 400 | Installing projects with cgr helps avoid dependency conflicts between 401 | different tools. Use 'cgr' wherever 'composer global require' is recommended. 402 | 403 | ..... 404 | ..... 405 | ..... 406 | 407 | ``` 408 | 409 | **Now for Pickle** 410 | 411 | ``` 412 | cgr global require alnutile/pickle:dev-master 413 | ``` 414 | 415 | now you should be able to run from any location on your Mac 416 | 417 | ``` 418 | pickle help 419 | ``` 420 | 421 | 422 | and to upgrade often since it is a busy project 423 | 424 | 425 | ``` 426 | cgr global update alnutile/pickle 427 | ``` 428 | 429 | 430 | 431 | ## Testing 432 | 433 | ``` bash 434 | $ composer test 435 | ``` 436 | 437 | ## Contributing 438 | 439 | Please see [CONTRIBUTING](CONTRIBUTING.md) and [CONDUCT](CONDUCT.md) for details. 440 | 441 | 442 | ## Security 443 | 444 | If you discover any security related issues, please email me@alfrednutile.info instead of using the issue tracker. 445 | 446 | 447 | ## Credits 448 | 449 | - [Alfred Nutile][link-author] 450 | - [All Contributors][link-contributors] 451 | 452 | 453 | ## Footnotes 454 | 455 | 1 Feature files are written in Gherkin. You can see some examples [here](https://github.com/alnutile/recipes/blob/master/features/profile/home.feature) 456 | 457 | The "Feature" area gives the feature a title then sense 458 | 459 | * What is being built 460 | * Who it is being built for 461 | * What is the business result 462 | 463 | Then then leads into the "Scenarios" 464 | 465 | 466 | 2 467 | 468 | You can read more about BDD [here](http://stakeholderwhisperer.com/posts/2014/10/introducing-modelling-by-example) 469 | 470 | 471 | 472 | 473 | ## License 474 | 475 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 476 | 477 | [ico-version]: https://img.shields.io/packagist/v/alnutile/pickle.svg?style=flat-square 478 | [ico-license]: https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square 479 | [ico-travis]: https://img.shields.io/travis/alnutile/pickle/master.svg?style=flat-square 480 | [ico-scrutinizer]: https://img.shields.io/scrutinizer/coverage/g/alnutile/pickle.svg?style=flat-square 481 | [ico-code-quality]: https://img.shields.io/scrutinizer/g/alnutile/pickle.svg?style=flat-square 482 | [ico-downloads]: https://img.shields.io/packagist/dt/alnutile/pickle.svg?style=flat-square 483 | 484 | [link-packagist]: https://packagist.org/packages/alnutile/pickle 485 | [link-travis]: https://travis-ci.org/alnutile/pickle 486 | [link-scrutinizer]: https://scrutinizer-ci.com/g/alnutile/pickle/code-structure 487 | [link-code-quality]: https://scrutinizer-ci.com/g/alnutile/pickle 488 | [link-downloads]: https://packagist.org/packages/alnutile/pickle 489 | [link-author]: https://github.com/alnutile 490 | [link-contributors]: ../../contributors 491 | -------------------------------------------------------------------------------- /bootstrap/i18n.yml: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # !!! DON'T TOUCH THIS FILE, IT WAS AUTODOWNLOADED FROM: 4 | # https://github.com/cucumber/gherkin/blob/master/lib/gherkin/i18n.yml 5 | # 6 | 7 | # encoding: UTF-8 8 | # 9 | # We use ISO 639-1 (language) and ISO 3166 alpha-2 (region - if applicable): 10 | # http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes 11 | # http://en.wikipedia.org/wiki/ISO_3166-1 12 | # 13 | # If you want several aliases for a keyword, just separate them 14 | # with a | character. The * is a step keyword alias for all translations. 15 | # 16 | # If you do *not* want a trailing space after a keyword, end it with a < character. 17 | # (See Chinese for examples). 18 | # 19 | "en": 20 | name: English 21 | native: English 22 | feature: Feature 23 | background: Background 24 | scenario: Scenario 25 | scenario_outline: Scenario Outline|Scenario Template 26 | examples: Examples|Scenarios 27 | given: "*|Given" 28 | when: "*|When" 29 | then: "*|Then" 30 | and: "*|And" 31 | but: "*|But" 32 | 33 | # Please keep the grammars in alphabetical order by name from here and down. 34 | 35 | "ar": 36 | name: Arabic 37 | native: العربية 38 | feature: خاصية 39 | background: الخلفية 40 | scenario: سيناريو 41 | scenario_outline: سيناريو مخطط 42 | examples: امثلة 43 | given: "*|بفرض" 44 | when: "*|متى|عندما" 45 | then: "*|اذاً|ثم" 46 | and: "*|و" 47 | but: "*|لكن" 48 | "bg": 49 | name: Bulgarian 50 | native: български 51 | feature: Функционалност 52 | background: Предистория 53 | scenario: Сценарий 54 | scenario_outline: Рамка на сценарий 55 | examples: Примери 56 | given: "*|Дадено" 57 | when: "*|Когато" 58 | then: "*|То" 59 | and: "*|И" 60 | but: "*|Но" 61 | "ca": 62 | name: Catalan 63 | native: català 64 | background: Rerefons|Antecedents 65 | feature: Característica|Funcionalitat 66 | scenario: Escenari 67 | scenario_outline: Esquema de l'escenari 68 | examples: Exemples 69 | given: "*|Donat|Donada|Atès|Atesa" 70 | when: "*|Quan" 71 | then: "*|Aleshores|Cal" 72 | and: "*|I" 73 | but: "*|Però" 74 | "cy-GB": 75 | name: Welsh 76 | native: Cymraeg 77 | background: Cefndir 78 | feature: Arwedd 79 | scenario: Scenario 80 | scenario_outline: Scenario Amlinellol 81 | examples: Enghreifftiau 82 | given: "*|Anrhegedig a" 83 | when: "*|Pryd" 84 | then: "*|Yna" 85 | and: "*|A" 86 | but: "*|Ond" 87 | "cs": 88 | name: Czech 89 | native: Česky 90 | feature: Požadavek 91 | background: Pozadí|Kontext 92 | scenario: Scénář 93 | scenario_outline: Náčrt Scénáře|Osnova scénáře 94 | examples: Příklady 95 | given: "*|Pokud" 96 | when: "*|Když" 97 | then: "*|Pak" 98 | and: "*|A také|A" 99 | but: "*|Ale" 100 | "da": 101 | name: Danish 102 | native: dansk 103 | feature: Egenskab 104 | background: Baggrund 105 | scenario: Scenarie 106 | scenario_outline: Abstrakt Scenario 107 | examples: Eksempler 108 | given: "*|Givet" 109 | when: "*|Når" 110 | then: "*|Så" 111 | and: "*|Og" 112 | but: "*|Men" 113 | "de": 114 | name: German 115 | native: Deutsch 116 | feature: Funktionalität 117 | background: Grundlage 118 | scenario: Szenario 119 | scenario_outline: Szenariogrundriss 120 | examples: Beispiele 121 | given: "*|Angenommen|Gegeben sei" 122 | when: "*|Wenn" 123 | then: "*|Dann" 124 | and: "*|Und" 125 | but: "*|Aber" 126 | "en-au": 127 | name: Australian 128 | native: Australian 129 | feature: Crikey 130 | background: Background 131 | scenario: Mate 132 | scenario_outline: Blokes 133 | examples: Cobber 134 | given: "*|Ya know how" 135 | when: "*|When" 136 | then: "*|Ya gotta" 137 | and: "*|N" 138 | but: "*|Cept" 139 | "en-lol": 140 | name: LOLCAT 141 | native: LOLCAT 142 | feature: OH HAI 143 | background: B4 144 | scenario: MISHUN 145 | scenario_outline: MISHUN SRSLY 146 | examples: EXAMPLZ 147 | given: "*|I CAN HAZ" 148 | when: "*|WEN" 149 | then: "*|DEN" 150 | and: "*|AN" 151 | but: "*|BUT" 152 | "en-pirate": 153 | name: Pirate 154 | native: Pirate 155 | feature: Ahoy matey! 156 | background: Yo-ho-ho 157 | scenario: Heave to 158 | scenario_outline: Shiver me timbers 159 | examples: Dead men tell no tales 160 | given: "*|Gangway!" 161 | when: "*|Blimey!" 162 | then: "*|Let go and haul" 163 | and: "*|Aye" 164 | but: "*|Avast!" 165 | "en-Scouse": 166 | name: Scouse 167 | native: Scouse 168 | feature: Feature 169 | background: "Dis is what went down" 170 | scenario: "The thing of it is" 171 | scenario_outline: "Wharrimean is" 172 | examples: Examples 173 | given: "*|Givun|Youse know when youse got" 174 | when: "*|Wun|Youse know like when" 175 | then: "*|Dun|Den youse gotta" 176 | and: "*|An" 177 | but: "*|Buh" 178 | "en-tx": 179 | name: Texan 180 | native: Texan 181 | feature: Feature 182 | background: Background 183 | scenario: Scenario 184 | scenario_outline: All y'all 185 | examples: Examples 186 | given: "*|Given y'all" 187 | when: "*|When y'all" 188 | then: "*|Then y'all" 189 | and: "*|And y'all" 190 | but: "*|But y'all" 191 | "eo": 192 | name: Esperanto 193 | native: Esperanto 194 | feature: Trajto 195 | background: Fono 196 | scenario: Scenaro 197 | scenario_outline: Konturo de la scenaro 198 | examples: Ekzemploj 199 | given: "*|Donitaĵo" 200 | when: "*|Se" 201 | then: "*|Do" 202 | and: "*|Kaj" 203 | but: "*|Sed" 204 | "es": 205 | name: Spanish 206 | native: español 207 | background: Antecedentes 208 | feature: Característica 209 | scenario: Escenario 210 | scenario_outline: Esquema del escenario 211 | examples: Ejemplos 212 | given: "*|Dado|Dada|Dados|Dadas" 213 | when: "*|Cuando" 214 | then: "*|Entonces" 215 | and: "*|Y" 216 | but: "*|Pero" 217 | "et": 218 | name: Estonian 219 | native: eesti keel 220 | feature: Omadus 221 | background: Taust 222 | scenario: Stsenaarium 223 | scenario_outline: Raamstsenaarium 224 | examples: Juhtumid 225 | given: "*|Eeldades" 226 | when: "*|Kui" 227 | then: "*|Siis" 228 | and: "*|Ja" 229 | but: "*|Kuid" 230 | "fi": 231 | name: Finnish 232 | native: suomi 233 | feature: Ominaisuus 234 | background: Tausta 235 | scenario: Tapaus 236 | scenario_outline: Tapausaihio 237 | examples: Tapaukset 238 | given: "*|Oletetaan" 239 | when: "*|Kun" 240 | then: "*|Niin" 241 | and: "*|Ja" 242 | but: "*|Mutta" 243 | "fr": 244 | name: French 245 | native: français 246 | feature: Fonctionnalité 247 | background: Contexte 248 | scenario: Scénario 249 | scenario_outline: Plan du scénario|Plan du Scénario 250 | examples: Exemples 251 | given: "*|Soit|Etant donné|Etant donnée|Etant donnés|Etant données|Étant donné|Étant donnée|Étant donnés|Étant données" 252 | when: "*|Quand|Lorsque|Lorsqu'<" 253 | then: "*|Alors" 254 | and: "*|Et" 255 | but: "*|Mais" 256 | "he": 257 | name: Hebrew 258 | native: עברית 259 | feature: תכונה 260 | background: רקע 261 | scenario: תרחיש 262 | scenario_outline: תבנית תרחיש 263 | examples: דוגמאות 264 | given: "*|בהינתן" 265 | when: "*|כאשר" 266 | then: "*|אז|אזי" 267 | and: "*|וגם" 268 | but: "*|אבל" 269 | "hr": 270 | name: Croatian 271 | native: hrvatski 272 | feature: Osobina|Mogućnost|Mogucnost 273 | background: Pozadina 274 | scenario: Scenarij 275 | scenario_outline: Skica|Koncept 276 | examples: Primjeri|Scenariji 277 | given: "*|Zadan|Zadani|Zadano" 278 | when: "*|Kada|Kad" 279 | then: "*|Onda" 280 | and: "*|I" 281 | but: "*|Ali" 282 | "hu": 283 | name: Hungarian 284 | native: magyar 285 | feature: Jellemző 286 | background: Háttér 287 | scenario: Forgatókönyv 288 | scenario_outline: Forgatókönyv vázlat 289 | examples: Példák 290 | given: "*|Amennyiben|Adott" 291 | when: "*|Majd|Ha|Amikor" 292 | then: "*|Akkor" 293 | and: "*|És" 294 | but: "*|De" 295 | "id": 296 | name: Indonesian 297 | native: Bahasa Indonesia 298 | feature: Fitur 299 | background: Dasar 300 | scenario: Skenario 301 | scenario_outline: Skenario konsep 302 | examples: Contoh 303 | given: "*|Dengan" 304 | when: "*|Ketika" 305 | then: "*|Maka" 306 | and: "*|Dan" 307 | but: "*|Tapi" 308 | "is": 309 | name: Icelandic 310 | native: Íslenska 311 | feature: Eiginleiki 312 | background: Bakgrunnur 313 | scenario: Atburðarás 314 | scenario_outline: Lýsing Atburðarásar|Lýsing Dæma 315 | examples: Dæmi|Atburðarásir 316 | given: "*|Ef" 317 | when: "*|Þegar" 318 | then: "*|Þá" 319 | and: "*|Og" 320 | but: "*|En" 321 | "it": 322 | name: Italian 323 | native: italiano 324 | feature: Funzionalità 325 | background: Contesto 326 | scenario: Scenario 327 | scenario_outline: Schema dello scenario 328 | examples: Esempi 329 | given: "*|Dato|Data|Dati|Date" 330 | when: "*|Quando" 331 | then: "*|Allora" 332 | and: "*|E" 333 | but: "*|Ma" 334 | "ja": 335 | name: Japanese 336 | native: 日本語 337 | feature: フィーチャ|機能 338 | background: 背景 339 | scenario: シナリオ 340 | scenario_outline: シナリオアウトライン|シナリオテンプレート|テンプレ|シナリオテンプレ 341 | examples: 例|サンプル 342 | given: "*|前提<" 343 | when: "*|もし<" 344 | then: "*|ならば<" 345 | and: "*|かつ<" 346 | but: "*|しかし<|但し<|ただし<" 347 | "ko": 348 | name: Korean 349 | native: 한국어 350 | background: 배경 351 | feature: 기능 352 | scenario: 시나리오 353 | scenario_outline: 시나리오 개요 354 | examples: 예 355 | given: "*|조건<|먼저<" 356 | when: "*|만일<|만약<" 357 | then: "*|그러면<" 358 | and: "*|그리고<" 359 | but: "*|하지만<|단<" 360 | "lt": 361 | name: Lithuanian 362 | native: lietuvių kalba 363 | feature: Savybė 364 | background: Kontekstas 365 | scenario: Scenarijus 366 | scenario_outline: Scenarijaus šablonas 367 | examples: Pavyzdžiai|Scenarijai|Variantai 368 | given: "*|Duota" 369 | when: "*|Kai" 370 | then: "*|Tada" 371 | and: "*|Ir" 372 | but: "*|Bet" 373 | "lu": 374 | name: Luxemburgish 375 | native: Lëtzebuergesch 376 | feature: Funktionalitéit 377 | background: Hannergrond 378 | scenario: Szenario 379 | scenario_outline: Plang vum Szenario 380 | examples: Beispiller 381 | given: "*|ugeholl" 382 | when: "*|wann" 383 | then: "*|dann" 384 | and: "*|an|a" 385 | but: "*|awer|mä" 386 | "lv": 387 | name: Latvian 388 | native: latviešu 389 | feature: Funkcionalitāte|Fīča 390 | background: Konteksts|Situācija 391 | scenario: Scenārijs 392 | scenario_outline: Scenārijs pēc parauga 393 | examples: Piemēri|Paraugs 394 | given: "*|Kad" 395 | when: "*|Ja" 396 | then: "*|Tad" 397 | and: "*|Un" 398 | but: "*|Bet" 399 | "nl": 400 | name: Dutch 401 | native: Nederlands 402 | feature: Functionaliteit 403 | background: Achtergrond 404 | scenario: Scenario 405 | scenario_outline: Abstract Scenario 406 | examples: Voorbeelden 407 | given: "*|Gegeven|Stel" 408 | when: "*|Als" 409 | then: "*|Dan" 410 | and: "*|En" 411 | but: "*|Maar" 412 | "no": 413 | name: Norwegian 414 | native: norsk 415 | feature: Egenskap 416 | background: Bakgrunn 417 | scenario: Scenario 418 | scenario_outline: Scenariomal|Abstrakt Scenario 419 | examples: Eksempler 420 | given: "*|Gitt" 421 | when: "*|Når" 422 | then: "*|Så" 423 | and: "*|Og" 424 | but: "*|Men" 425 | "pl": 426 | name: Polish 427 | native: polski 428 | feature: Właściwość 429 | background: Założenia 430 | scenario: Scenariusz 431 | scenario_outline: Szablon scenariusza 432 | examples: Przykłady 433 | given: "*|Zakładając|Mając" 434 | when: "*|Jeżeli|Jeśli" 435 | then: "*|Wtedy" 436 | and: "*|Oraz|I" 437 | but: "*|Ale" 438 | "pt": 439 | name: Portuguese 440 | native: português 441 | background: Contexto 442 | feature: Funcionalidade 443 | scenario: Cenário|Cenario 444 | scenario_outline: Esquema do Cenário|Esquema do Cenario 445 | examples: Exemplos 446 | given: "*|Dado|Dada|Dados|Dadas" 447 | when: "*|Quando" 448 | then: "*|Então|Entao" 449 | and: "*|E" 450 | but: "*|Mas" 451 | "ro": 452 | name: Romanian 453 | native: română 454 | background: Context 455 | feature: Functionalitate|Funcționalitate|Funcţionalitate 456 | scenario: Scenariu 457 | scenario_outline: Structura scenariu|Structură scenariu 458 | examples: Exemple 459 | given: "*|Date fiind|Dat fiind|Dati fiind|Dați fiind|Daţi fiind" 460 | when: "*|Cand|Când" 461 | then: "*|Atunci" 462 | and: "*|Si|Și|Şi" 463 | but: "*|Dar" 464 | "ru": 465 | name: Russian 466 | native: русский 467 | feature: Функция|Функционал|Свойство 468 | background: Предыстория|Контекст 469 | scenario: Сценарий 470 | scenario_outline: Структура сценария 471 | examples: Примеры 472 | given: "*|Допустим|Дано|Пусть" 473 | when: "*|Если|Когда" 474 | then: "*|То|Тогда" 475 | and: "*|И|К тому же" 476 | but: "*|Но|А" 477 | "sv": 478 | name: Swedish 479 | native: Svenska 480 | feature: Egenskap 481 | background: Bakgrund 482 | scenario: Scenario 483 | scenario_outline: Abstrakt Scenario|Scenariomall 484 | examples: Exempel 485 | given: "*|Givet" 486 | when: "*|När" 487 | then: "*|Så" 488 | and: "*|Och" 489 | but: "*|Men" 490 | "sk": 491 | name: Slovak 492 | native: Slovensky 493 | feature: Požiadavka 494 | background: Pozadie 495 | scenario: Scenár 496 | scenario_outline: Náčrt Scenáru 497 | examples: Príklady 498 | given: "*|Pokiaľ" 499 | when: "*|Keď" 500 | then: "*|Tak" 501 | and: "*|A" 502 | but: "*|Ale" 503 | "sr-Latn": 504 | name: Serbian (Latin) 505 | native: Srpski (Latinica) 506 | feature: Funkcionalnost|Mogućnost|Mogucnost|Osobina 507 | background: Kontekst|Osnova|Pozadina 508 | scenario: Scenario|Primer 509 | scenario_outline: Struktura scenarija|Skica|Koncept 510 | examples: Primeri|Scenariji 511 | given: "*|Zadato|Zadate|Zatati" 512 | when: "*|Kada|Kad" 513 | then: "*|Onda" 514 | and: "*|I" 515 | but: "*|Ali" 516 | "sr-Cyrl": 517 | name: Serbian 518 | native: Српски 519 | feature: Функционалност|Могућност|Особина 520 | background: Контекст|Основа|Позадина 521 | scenario: Сценарио|Пример 522 | scenario_outline: Структура сценарија|Скица|Концепт 523 | examples: Примери|Сценарији 524 | given: "*|Задато|Задате|Задати" 525 | when: "*|Када|Кад" 526 | then: "*|Онда" 527 | and: "*|И" 528 | but: "*|Али" 529 | "tr": 530 | name: Turkish 531 | native: Türkçe 532 | feature: Özellik 533 | background: Geçmiş 534 | scenario: Senaryo 535 | scenario_outline: Senaryo taslağı 536 | examples: Örnekler 537 | given: "*|Diyelim ki" 538 | when: "*|Eğer ki" 539 | then: "*|O zaman" 540 | and: "*|Ve" 541 | but: "*|Fakat|Ama" 542 | "uk": 543 | name: Ukrainian 544 | native: Українська 545 | feature: Функціонал 546 | background: Передумова 547 | scenario: Сценарій 548 | scenario_outline: Структура сценарію 549 | examples: Приклади 550 | given: "*|Припустимо|Припустимо, що|Нехай|Дано" 551 | when: "*|Якщо|Коли" 552 | then: "*|То|Тоді" 553 | and: "*|І|А також|Та" 554 | but: "*|Але" 555 | "uz": 556 | name: Uzbek 557 | native: Узбекча 558 | feature: Функционал 559 | background: Тарих 560 | scenario: Сценарий 561 | scenario_outline: Сценарий структураси 562 | examples: Мисоллар 563 | given: "*|Агар" 564 | when: "*|Агар" 565 | then: "*|Унда" 566 | and: "*|Ва" 567 | but: "*|Лекин|Бирок|Аммо" 568 | "vi": 569 | name: Vietnamese 570 | native: Tiếng Việt 571 | feature: Tính năng 572 | background: Bối cảnh 573 | scenario: Tình huống|Kịch bản 574 | scenario_outline: Khung tình huống|Khung kịch bản 575 | examples: Dữ liệu 576 | given: "*|Biết|Cho" 577 | when: "*|Khi" 578 | then: "*|Thì" 579 | and: "*|Và" 580 | but: "*|Nhưng" 581 | "zh-CN": 582 | name: Chinese simplified 583 | native: 简体中文 584 | feature: 功能 585 | background: 背景 586 | scenario: 场景 587 | scenario_outline: 场景大纲 588 | examples: 例子 589 | given: "*|假如<" 590 | when: "*|当<" 591 | then: "*|那么<" 592 | and: "*|而且<" 593 | but: "*|但是<" 594 | "zh-TW": 595 | name: Chinese traditional 596 | native: 繁體中文 597 | feature: 功能 598 | background: 背景 599 | scenario: 場景|劇本 600 | scenario_outline: 場景大綱|劇本大綱 601 | examples: 例子 602 | given: "*|假設<" 603 | when: "*|當<" 604 | then: "*|那麼<" 605 | and: "*|而且<|並且<" 606 | but: "*|但是<" 607 | -------------------------------------------------------------------------------- /i18n.php: -------------------------------------------------------------------------------- 1 | 14 | array ( 15 | 'and' => 'And|*', 16 | 'background' => 'Background', 17 | 'but' => 'But|*', 18 | 'examples' => 'Scenarios|Examples', 19 | 'feature' => 'Business Need|Feature|Ability', 20 | 'given' => 'Given|*', 21 | 'name' => 'English', 22 | 'native' => 'English', 23 | 'scenario' => 'Scenario', 24 | 'scenario_outline' => 'Scenario Template|Scenario Outline', 25 | 'then' => 'Then|*', 26 | 'when' => 'When|*', 27 | ), 28 | 'af' => 29 | array ( 30 | 'and' => 'En|*', 31 | 'background' => 'Agtergrond', 32 | 'but' => 'Maar|*', 33 | 'examples' => 'Voorbeelde', 34 | 'feature' => 'Besigheid Behoefte|Funksie|Vermoë', 35 | 'given' => 'Gegewe|*', 36 | 'name' => 'Afrikaans', 37 | 'native' => 'Afrikaans', 38 | 'scenario' => 'Situasie', 39 | 'scenario_outline' => 'Situasie Uiteensetting', 40 | 'then' => 'Dan|*', 41 | 'when' => 'Wanneer|*', 42 | ), 43 | 'am' => 44 | array ( 45 | 'and' => 'Եվ|*', 46 | 'background' => 'Կոնտեքստ', 47 | 'but' => 'Բայց|*', 48 | 'examples' => 'Օրինակներ', 49 | 'feature' => 'Ֆունկցիոնալություն|Հատկություն', 50 | 'given' => 'Դիցուք|*', 51 | 'name' => 'Armenian', 52 | 'native' => 'հայերեն', 53 | 'scenario' => 'Սցենար', 54 | 'scenario_outline' => 'Սցենարի կառուցվացքը', 55 | 'then' => 'Ապա|*', 56 | 'when' => 'Երբ|Եթե|*', 57 | ), 58 | 'ar' => 59 | array ( 60 | 'and' => '*|و', 61 | 'background' => 'الخلفية', 62 | 'but' => 'لكن|*', 63 | 'examples' => 'امثلة', 64 | 'feature' => 'خاصية', 65 | 'given' => 'بفرض|*', 66 | 'name' => 'Arabic', 67 | 'native' => 'العربية', 68 | 'scenario' => 'سيناريو', 69 | 'scenario_outline' => 'سيناريو مخطط', 70 | 'then' => 'اذاً|ثم|*', 71 | 'when' => 'عندما|متى|*', 72 | ), 73 | 'ast' => 74 | array ( 75 | 'and' => 'Ya|*|Y', 76 | 'background' => 'Antecedentes', 77 | 'but' => 'Peru|*', 78 | 'examples' => 'Exemplos', 79 | 'feature' => 'Carauterística', 80 | 'given' => 'Dada|Daos|Daes|Dáu|*', 81 | 'name' => 'Asturian', 82 | 'native' => 'asturianu', 83 | 'scenario' => 'Casu', 84 | 'scenario_outline' => 'Esbozu del casu', 85 | 'then' => 'Entós|*', 86 | 'when' => 'Cuando|*', 87 | ), 88 | 'az' => 89 | array ( 90 | 'and' => 'Həm|Və|*', 91 | 'background' => 'Kontekst|Keçmiş', 92 | 'but' => 'Ancaq|Amma|*', 93 | 'examples' => 'Nümunələr', 94 | 'feature' => 'Özəllik', 95 | 'given' => 'Tutaq ki|Verilir|*', 96 | 'name' => 'Azerbaijani', 97 | 'native' => 'Azərbaycanca', 98 | 'scenario' => 'Ssenari', 99 | 'scenario_outline' => 'Ssenarinin strukturu', 100 | 'then' => 'O halda|*', 101 | 'when' => 'Nə vaxt ki|Əgər|*', 102 | ), 103 | 'bg' => 104 | array ( 105 | 'and' => '*|И', 106 | 'background' => 'Предистория', 107 | 'but' => 'Но|*', 108 | 'examples' => 'Примери', 109 | 'feature' => 'Функционалност', 110 | 'given' => 'Дадено|*', 111 | 'name' => 'Bulgarian', 112 | 'native' => 'български', 113 | 'scenario' => 'Сценарий', 114 | 'scenario_outline' => 'Рамка на сценарий', 115 | 'then' => 'То|*', 116 | 'when' => 'Когато|*', 117 | ), 118 | 'bm' => 119 | array ( 120 | 'and' => 'Dan|*', 121 | 'background' => 'Latar Belakang', 122 | 'but' => 'Tetapi|Tapi|*', 123 | 'examples' => 'Contoh', 124 | 'feature' => 'Fungsi', 125 | 'given' => 'Diberi|Bagi|*', 126 | 'name' => 'Malay', 127 | 'native' => 'Bahasa Melayu', 128 | 'scenario' => 'Senario|Situasi|Keadaan', 129 | 'scenario_outline' => 'Garis Panduan Senario|Kerangka Senario|Kerangka Situasi|Kerangka Keadaan', 130 | 'then' => 'Kemudian|Maka|*', 131 | 'when' => 'Apabila|*', 132 | ), 133 | 'bs' => 134 | array ( 135 | 'and' => '*|I|A', 136 | 'background' => 'Pozadina', 137 | 'but' => 'Ali|*', 138 | 'examples' => 'Primjeri', 139 | 'feature' => 'Karakteristika', 140 | 'given' => 'Dato|*', 141 | 'name' => 'Bosnian', 142 | 'native' => 'Bosanski', 143 | 'scenario' => 'Scenariju|Scenario', 144 | 'scenario_outline' => 'Scenario-outline|Scenariju-obris', 145 | 'then' => 'Zatim|*', 146 | 'when' => 'Kada|*', 147 | ), 148 | 'ca' => 149 | array ( 150 | 'and' => '*|I', 151 | 'background' => 'Antecedents|Rerefons', 152 | 'but' => 'Però|*', 153 | 'examples' => 'Exemples', 154 | 'feature' => 'Característica|Funcionalitat', 155 | 'given' => 'Donada|Donat|Atesa|Atès|*', 156 | 'name' => 'Catalan', 157 | 'native' => 'català', 158 | 'scenario' => 'Escenari', 159 | 'scenario_outline' => 'Esquema de l\'escenari', 160 | 'then' => 'Aleshores|Cal|*', 161 | 'when' => 'Quan|*', 162 | ), 163 | 'cs' => 164 | array ( 165 | 'and' => 'A také|*|A', 166 | 'background' => 'Kontext|Pozadí', 167 | 'but' => 'Ale|*', 168 | 'examples' => 'Příklady', 169 | 'feature' => 'Požadavek', 170 | 'given' => 'Za předpokladu|Pokud|*', 171 | 'name' => 'Czech', 172 | 'native' => 'Česky', 173 | 'scenario' => 'Scénář', 174 | 'scenario_outline' => 'Osnova scénáře|Náčrt Scénáře', 175 | 'then' => 'Pak|*', 176 | 'when' => 'Když|*', 177 | ), 178 | 'cy-GB' => 179 | array ( 180 | 'and' => '*|A', 181 | 'background' => 'Cefndir', 182 | 'but' => 'Ond|*', 183 | 'examples' => 'Enghreifftiau', 184 | 'feature' => 'Arwedd', 185 | 'given' => 'Anrhegedig a|*', 186 | 'name' => 'Welsh', 187 | 'native' => 'Cymraeg', 188 | 'scenario' => 'Scenario', 189 | 'scenario_outline' => 'Scenario Amlinellol', 190 | 'then' => 'Yna|*', 191 | 'when' => 'Pryd|*', 192 | ), 193 | 'da' => 194 | array ( 195 | 'and' => 'Og|*', 196 | 'background' => 'Baggrund', 197 | 'but' => 'Men|*', 198 | 'examples' => 'Eksempler', 199 | 'feature' => 'Egenskab', 200 | 'given' => 'Givet|*', 201 | 'name' => 'Danish', 202 | 'native' => 'dansk', 203 | 'scenario' => 'Scenarie', 204 | 'scenario_outline' => 'Abstrakt Scenario', 205 | 'then' => 'Så|*', 206 | 'when' => 'Når|*', 207 | ), 208 | 'de' => 209 | array ( 210 | 'and' => 'Und|*', 211 | 'background' => 'Grundlage', 212 | 'but' => 'Aber|*', 213 | 'examples' => 'Beispiele', 214 | 'feature' => 'Funktionalität', 215 | 'given' => 'Gegeben seien|Gegeben sei|Angenommen|*', 216 | 'name' => 'German', 217 | 'native' => 'Deutsch', 218 | 'scenario' => 'Szenario', 219 | 'scenario_outline' => 'Szenariogrundriss', 220 | 'then' => 'Dann|*', 221 | 'when' => 'Wenn|*', 222 | ), 223 | 'el' => 224 | array ( 225 | 'and' => 'Και|*', 226 | 'background' => 'Υπόβαθρο', 227 | 'but' => 'Αλλά|*', 228 | 'examples' => 'Παραδείγματα|Σενάρια', 229 | 'feature' => 'Δυνατότητα|Λειτουργία', 230 | 'given' => 'Δεδομένου|*', 231 | 'name' => 'Greek', 232 | 'native' => 'Ελληνικά', 233 | 'scenario' => 'Σενάριο', 234 | 'scenario_outline' => 'Περιγραφή Σεναρίου', 235 | 'then' => 'Τότε|*', 236 | 'when' => 'Όταν|*', 237 | ), 238 | 'em' => 239 | array ( 240 | 'and' => '😂<|*', 241 | 'background' => '💤', 242 | 'but' => '😔<|*', 243 | 'examples' => '📓', 244 | 'feature' => '📚', 245 | 'given' => '😐<|*', 246 | 'name' => 'Emoji', 247 | 'native' => '😀', 248 | 'scenario' => '📕', 249 | 'scenario_outline' => '📖', 250 | 'then' => '🙏<|*', 251 | 'when' => '🎬<|*', 252 | ), 253 | 'en-Scouse' => 254 | array ( 255 | 'and' => 'An|*', 256 | 'background' => 'Dis is what went down', 257 | 'but' => 'Buh|*', 258 | 'examples' => 'Examples', 259 | 'feature' => 'Feature', 260 | 'given' => 'Youse know when youse got|Givun|*', 261 | 'name' => 'Scouse', 262 | 'native' => 'Scouse', 263 | 'scenario' => 'The thing of it is', 264 | 'scenario_outline' => 'Wharrimean is', 265 | 'then' => 'Den youse gotta|Dun|*', 266 | 'when' => 'Youse know like when|Wun|*', 267 | ), 268 | 'en-au' => 269 | array ( 270 | 'and' => 'Too right|*', 271 | 'background' => 'First off', 272 | 'but' => 'Yeah nah|*', 273 | 'examples' => 'You\'ll wanna', 274 | 'feature' => 'Pretty much', 275 | 'given' => 'Y\'know|*', 276 | 'name' => 'Australian', 277 | 'native' => 'Australian', 278 | 'scenario' => 'Awww, look mate', 279 | 'scenario_outline' => 'Reckon it\'s like', 280 | 'then' => 'But at the end of the day I reckon|*', 281 | 'when' => 'It\'s just unbelievable|*', 282 | ), 283 | 'en-lol' => 284 | array ( 285 | 'and' => 'AN|*', 286 | 'background' => 'B4', 287 | 'but' => 'BUT|*', 288 | 'examples' => 'EXAMPLZ', 289 | 'feature' => 'OH HAI', 290 | 'given' => 'I CAN HAZ|*', 291 | 'name' => 'LOLCAT', 292 | 'native' => 'LOLCAT', 293 | 'scenario' => 'MISHUN', 294 | 'scenario_outline' => 'MISHUN SRSLY', 295 | 'then' => 'DEN|*', 296 | 'when' => 'WEN|*', 297 | ), 298 | 'en-old' => 299 | array ( 300 | 'and' => 'Ond|*|7', 301 | 'background' => 'Aer|Ær', 302 | 'but' => 'Ac|*', 303 | 'examples' => 'Se the|Se þe|Se ðe', 304 | 'feature' => 'Hwaet|Hwæt', 305 | 'given' => 'Thurh|Þurh|Ðurh|*', 306 | 'name' => 'Old English', 307 | 'native' => 'Englisc', 308 | 'scenario' => 'Swa', 309 | 'scenario_outline' => 'Swa hwaer swa|Swa hwær swa', 310 | 'then' => 'Tha the|Þa þe|Ða ðe|Tha|Þa|Ða|*', 311 | 'when' => 'Tha|Þa|Ða|*', 312 | ), 313 | 'en-pirate' => 314 | array ( 315 | 'and' => 'Aye|*', 316 | 'background' => 'Yo-ho-ho', 317 | 'but' => 'Avast!|*', 318 | 'examples' => 'Dead men tell no tales', 319 | 'feature' => 'Ahoy matey!', 320 | 'given' => 'Gangway!|*', 321 | 'name' => 'Pirate', 322 | 'native' => 'Pirate', 323 | 'scenario' => 'Heave to', 324 | 'scenario_outline' => 'Shiver me timbers', 325 | 'then' => 'Let go and haul|*', 326 | 'when' => 'Blimey!|*', 327 | ), 328 | 'eo' => 329 | array ( 330 | 'and' => 'Kaj|*', 331 | 'background' => 'Fono', 332 | 'but' => 'Sed|*', 333 | 'examples' => 'Ekzemploj', 334 | 'feature' => 'Trajto', 335 | 'given' => 'Donitaĵo|Komence|*', 336 | 'name' => 'Esperanto', 337 | 'native' => 'Esperanto', 338 | 'scenario' => 'Scenaro|Kazo', 339 | 'scenario_outline' => 'Konturo de la scenaro|Kazo-skizo|Skizo', 340 | 'then' => 'Do|*', 341 | 'when' => 'Se|*', 342 | ), 343 | 'es' => 344 | array ( 345 | 'and' => '*|Y|E', 346 | 'background' => 'Antecedentes', 347 | 'but' => 'Pero|*', 348 | 'examples' => 'Ejemplos', 349 | 'feature' => 'Característica', 350 | 'given' => 'Dados|Dadas|Dada|Dado|*', 351 | 'name' => 'Spanish', 352 | 'native' => 'español', 353 | 'scenario' => 'Escenario', 354 | 'scenario_outline' => 'Esquema del escenario', 355 | 'then' => 'Entonces|*', 356 | 'when' => 'Cuando|*', 357 | ), 358 | 'et' => 359 | array ( 360 | 'and' => 'Ja|*', 361 | 'background' => 'Taust', 362 | 'but' => 'Kuid|*', 363 | 'examples' => 'Juhtumid', 364 | 'feature' => 'Omadus', 365 | 'given' => 'Eeldades|*', 366 | 'name' => 'Estonian', 367 | 'native' => 'eesti keel', 368 | 'scenario' => 'Stsenaarium', 369 | 'scenario_outline' => 'Raamstsenaarium', 370 | 'then' => 'Siis|*', 371 | 'when' => 'Kui|*', 372 | ), 373 | 'fa' => 374 | array ( 375 | 'and' => '*|و', 376 | 'background' => 'زمینه', 377 | 'but' => 'اما|*', 378 | 'examples' => 'نمونه ها', 379 | 'feature' => 'وِیژگی', 380 | 'given' => 'با فرض|*', 381 | 'name' => 'Persian', 382 | 'native' => 'فارسی', 383 | 'scenario' => 'سناریو', 384 | 'scenario_outline' => 'الگوی سناریو', 385 | 'then' => 'آنگاه|*', 386 | 'when' => 'هنگامی|*', 387 | ), 388 | 'fi' => 389 | array ( 390 | 'and' => 'Ja|*', 391 | 'background' => 'Tausta', 392 | 'but' => 'Mutta|*', 393 | 'examples' => 'Tapaukset', 394 | 'feature' => 'Ominaisuus', 395 | 'given' => 'Oletetaan|*', 396 | 'name' => 'Finnish', 397 | 'native' => 'suomi', 398 | 'scenario' => 'Tapaus', 399 | 'scenario_outline' => 'Tapausaihio', 400 | 'then' => 'Niin|*', 401 | 'when' => 'Kun|*', 402 | ), 403 | 'fr' => 404 | array ( 405 | 'and' => 'Et qu\'<|Et que|Et|*', 406 | 'background' => 'Contexte', 407 | 'but' => 'Mais qu\'<|Mais que|Mais|*', 408 | 'examples' => 'Exemples', 409 | 'feature' => 'Fonctionnalité', 410 | 'given' => 'Etant donné qu\'<|Étant donné qu\'<|Etant donné que|Étant donné que|Etant données|Étant données|Etant donnée|Etant donnés|Étant donnée|Étant donnés|Etant donné|Étant donné|Soit|*', 411 | 'name' => 'French', 412 | 'native' => 'français', 413 | 'scenario' => 'Scénario', 414 | 'scenario_outline' => 'Plan du scénario|Plan du Scénario', 415 | 'then' => 'Alors|*', 416 | 'when' => 'Lorsqu\'<|Lorsque|Quand|*', 417 | ), 418 | 'ga' => 419 | array ( 420 | 'and' => 'Agus<|*', 421 | 'background' => 'Cúlra', 422 | 'but' => 'Ach<|*', 423 | 'examples' => 'Samplaí', 424 | 'feature' => 'Gné', 425 | 'given' => 'Cuir i gcás nach<|Cuir i gcás gur<|Cuir i gcás nár<|Cuir i gcás go<|*', 426 | 'name' => 'Irish', 427 | 'native' => 'Gaeilge', 428 | 'scenario' => 'Cás', 429 | 'scenario_outline' => 'Cás Achomair', 430 | 'then' => 'Ansin<|*', 431 | 'when' => 'Nuair nach<|Nuair nár<|Nuair ba<|Nuair a<|*', 432 | ), 433 | 'gj' => 434 | array ( 435 | 'and' => 'અને|*', 436 | 'background' => 'બેકગ્રાઉન્ડ', 437 | 'but' => 'પણ|*', 438 | 'examples' => 'ઉદાહરણો', 439 | 'feature' => 'વ્યાપાર જરૂર|ક્ષમતા|લક્ષણ', 440 | 'given' => 'આપેલ છે|*', 441 | 'name' => 'Gujarati', 442 | 'native' => 'ગુજરાતી', 443 | 'scenario' => 'સ્થિતિ', 444 | 'scenario_outline' => 'પરિદ્દશ્ય રૂપરેખા|પરિદ્દશ્ય ઢાંચો', 445 | 'then' => 'પછી|*', 446 | 'when' => 'ક્યારે|*', 447 | ), 448 | 'gl' => 449 | array ( 450 | 'and' => '*|E', 451 | 'background' => 'Contexto', 452 | 'but' => 'Pero|Mais|*', 453 | 'examples' => 'Exemplos', 454 | 'feature' => 'Característica', 455 | 'given' => 'Dados|Dadas|Dada|Dado|*', 456 | 'name' => 'Galician', 457 | 'native' => 'galego', 458 | 'scenario' => 'Escenario', 459 | 'scenario_outline' => 'Esbozo do escenario', 460 | 'then' => 'Entón|Logo|*', 461 | 'when' => 'Cando|*', 462 | ), 463 | 'he' => 464 | array ( 465 | 'and' => 'וגם|*', 466 | 'background' => 'רקע', 467 | 'but' => 'אבל|*', 468 | 'examples' => 'דוגמאות', 469 | 'feature' => 'תכונה', 470 | 'given' => 'בהינתן|*', 471 | 'name' => 'Hebrew', 472 | 'native' => 'עברית', 473 | 'scenario' => 'תרחיש', 474 | 'scenario_outline' => 'תבנית תרחיש', 475 | 'then' => 'אזי|אז|*', 476 | 'when' => 'כאשר|*', 477 | ), 478 | 'hi' => 479 | array ( 480 | 'and' => 'तथा|और|*', 481 | 'background' => 'पृष्ठभूमि', 482 | 'but' => 'परन्तु|किन्तु|पर|*', 483 | 'examples' => 'उदाहरण', 484 | 'feature' => 'रूप लेख', 485 | 'given' => 'चूंकि|यदि|अगर|*', 486 | 'name' => 'Hindi', 487 | 'native' => 'हिंदी', 488 | 'scenario' => 'परिदृश्य', 489 | 'scenario_outline' => 'परिदृश्य रूपरेखा', 490 | 'then' => 'तदा|तब|*', 491 | 'when' => 'कदा|जब|*', 492 | ), 493 | 'hr' => 494 | array ( 495 | 'and' => '*|I', 496 | 'background' => 'Pozadina', 497 | 'but' => 'Ali|*', 498 | 'examples' => 'Scenariji|Primjeri', 499 | 'feature' => 'Mogucnost|Mogućnost|Osobina', 500 | 'given' => 'Zadani|Zadano|Zadan|*', 501 | 'name' => 'Croatian', 502 | 'native' => 'hrvatski', 503 | 'scenario' => 'Scenarij', 504 | 'scenario_outline' => 'Koncept|Skica', 505 | 'then' => 'Onda|*', 506 | 'when' => 'Kada|Kad|*', 507 | ), 508 | 'ht' => 509 | array ( 510 | 'and' => 'Epi|Ak|*|E', 511 | 'background' => 'Kontèks|Istorik', 512 | 'but' => 'Men|*', 513 | 'examples' => 'Egzanp', 514 | 'feature' => 'Karakteristik|Fonksyonalite|Mak', 515 | 'given' => 'Sipoze ke|Sipoze Ke|Sipoze|*', 516 | 'name' => 'Creole', 517 | 'native' => 'kreyòl', 518 | 'scenario' => 'Senaryo', 519 | 'scenario_outline' => 'Senaryo deskripsyon|Senaryo Deskripsyon|Dyagram senaryo|Dyagram Senaryo|Plan senaryo|Plan Senaryo', 520 | 'then' => 'Le sa a|Lè sa a|*', 521 | 'when' => 'Le|Lè|*', 522 | ), 523 | 'hu' => 524 | array ( 525 | 'and' => 'És|*', 526 | 'background' => 'Háttér', 527 | 'but' => 'De|*', 528 | 'examples' => 'Példák', 529 | 'feature' => 'Jellemző', 530 | 'given' => 'Amennyiben|Adott|*', 531 | 'name' => 'Hungarian', 532 | 'native' => 'magyar', 533 | 'scenario' => 'Forgatókönyv', 534 | 'scenario_outline' => 'Forgatókönyv vázlat', 535 | 'then' => 'Akkor|*', 536 | 'when' => 'Amikor|Majd|Ha|*', 537 | ), 538 | 'id' => 539 | array ( 540 | 'and' => 'Dan|*', 541 | 'background' => 'Dasar', 542 | 'but' => 'Tapi|*', 543 | 'examples' => 'Contoh', 544 | 'feature' => 'Fitur', 545 | 'given' => 'Dengan|*', 546 | 'name' => 'Indonesian', 547 | 'native' => 'Bahasa Indonesia', 548 | 'scenario' => 'Skenario', 549 | 'scenario_outline' => 'Skenario konsep', 550 | 'then' => 'Maka|*', 551 | 'when' => 'Ketika|*', 552 | ), 553 | 'is' => 554 | array ( 555 | 'and' => 'Og|*', 556 | 'background' => 'Bakgrunnur', 557 | 'but' => 'En|*', 558 | 'examples' => 'Atburðarásir|Dæmi', 559 | 'feature' => 'Eiginleiki', 560 | 'given' => 'Ef|*', 561 | 'name' => 'Icelandic', 562 | 'native' => 'Íslenska', 563 | 'scenario' => 'Atburðarás', 564 | 'scenario_outline' => 'Lýsing Atburðarásar|Lýsing Dæma', 565 | 'then' => 'Þá|*', 566 | 'when' => 'Þegar|*', 567 | ), 568 | 'it' => 569 | array ( 570 | 'and' => '*|E', 571 | 'background' => 'Contesto', 572 | 'but' => 'Ma|*', 573 | 'examples' => 'Esempi', 574 | 'feature' => 'Funzionalità', 575 | 'given' => 'Data|Dato|Dati|Date|*', 576 | 'name' => 'Italian', 577 | 'native' => 'italiano', 578 | 'scenario' => 'Scenario', 579 | 'scenario_outline' => 'Schema dello scenario', 580 | 'then' => 'Allora|*', 581 | 'when' => 'Quando|*', 582 | ), 583 | 'ja' => 584 | array ( 585 | 'and' => 'かつ<|*', 586 | 'background' => '背景', 587 | 'but' => 'しかし<|ただし<|但し<|*', 588 | 'examples' => 'サンプル|例', 589 | 'feature' => 'フィーチャ|機能', 590 | 'given' => '前提<|*', 591 | 'name' => 'Japanese', 592 | 'native' => '日本語', 593 | 'scenario' => 'シナリオ', 594 | 'scenario_outline' => 'シナリオアウトライン|シナリオテンプレート|シナリオテンプレ|テンプレ', 595 | 'then' => 'ならば<|*', 596 | 'when' => 'もし<|*', 597 | ), 598 | 'jv' => 599 | array ( 600 | 'and' => 'Lan|*', 601 | 'background' => 'Dasar', 602 | 'but' => 'Ananging|Nanging|Tapi|*', 603 | 'examples' => 'Contone|Conto', 604 | 'feature' => 'Fitur', 605 | 'given' => 'Nalikaning|Nalika|*', 606 | 'name' => 'Javanese', 607 | 'native' => 'Basa Jawa', 608 | 'scenario' => 'Skenario', 609 | 'scenario_outline' => 'Konsep skenario', 610 | 'then' => 'Banjur|Njuk|*', 611 | 'when' => 'Menawa|Manawa|*', 612 | ), 613 | 'ka' => 614 | array ( 615 | 'and' => 'და<|*', 616 | 'background' => 'კონტექსტი', 617 | 'but' => 'მაგ­რამ<|*', 618 | 'examples' => 'მაგალითები', 619 | 'feature' => 'თვისება', 620 | 'given' => 'მოცემული<|*', 621 | 'name' => 'Georgian', 622 | 'native' => 'ქართველი', 623 | 'scenario' => 'სცენარის', 624 | 'scenario_outline' => 'სცენარის ნიმუში', 625 | 'then' => 'მაშინ<|*', 626 | 'when' => 'როდესაც<|*', 627 | ), 628 | 'kn' => 629 | array ( 630 | 'and' => 'ಮತ್ತು|*', 631 | 'background' => 'ಹಿನ್ನೆಲೆ', 632 | 'but' => 'ಆದರೆ|*', 633 | 'examples' => 'ಉದಾಹರಣೆಗಳು', 634 | 'feature' => 'ಹೆಚ್ಚಳ', 635 | 'given' => 'ನೀಡಿದ|*', 636 | 'name' => 'Kannada', 637 | 'native' => 'ಕನ್ನಡ', 638 | 'scenario' => 'ಕಥಾಸಾರಾಂಶ', 639 | 'scenario_outline' => 'ವಿವರಣೆ', 640 | 'then' => 'ನಂತರ|*', 641 | 'when' => 'ಸ್ಥಿತಿಯನ್ನು|*', 642 | ), 643 | 'ko' => 644 | array ( 645 | 'and' => '그리고<|*', 646 | 'background' => '배경', 647 | 'but' => '하지만<|단<|*', 648 | 'examples' => '예', 649 | 'feature' => '기능', 650 | 'given' => '먼저<|조건<|*', 651 | 'name' => 'Korean', 652 | 'native' => '한국어', 653 | 'scenario' => '시나리오', 654 | 'scenario_outline' => '시나리오 개요', 655 | 'then' => '그러면<|*', 656 | 'when' => '만약<|만일<|*', 657 | ), 658 | 'lt' => 659 | array ( 660 | 'and' => 'Ir|*', 661 | 'background' => 'Kontekstas', 662 | 'but' => 'Bet|*', 663 | 'examples' => 'Pavyzdžiai|Scenarijai|Variantai', 664 | 'feature' => 'Savybė', 665 | 'given' => 'Duota|*', 666 | 'name' => 'Lithuanian', 667 | 'native' => 'lietuvių kalba', 668 | 'scenario' => 'Scenarijus', 669 | 'scenario_outline' => 'Scenarijaus šablonas', 670 | 'then' => 'Tada|*', 671 | 'when' => 'Kai|*', 672 | ), 673 | 'lu' => 674 | array ( 675 | 'and' => 'an|*|a', 676 | 'background' => 'Hannergrond', 677 | 'but' => 'awer|mä|*', 678 | 'examples' => 'Beispiller', 679 | 'feature' => 'Funktionalitéit', 680 | 'given' => 'ugeholl|*', 681 | 'name' => 'Luxemburgish', 682 | 'native' => 'Lëtzebuergesch', 683 | 'scenario' => 'Szenario', 684 | 'scenario_outline' => 'Plang vum Szenario', 685 | 'then' => 'dann|*', 686 | 'when' => 'wann|*', 687 | ), 688 | 'lv' => 689 | array ( 690 | 'and' => 'Un|*', 691 | 'background' => 'Konteksts|Situācija', 692 | 'but' => 'Bet|*', 693 | 'examples' => 'Piemēri|Paraugs', 694 | 'feature' => 'Funkcionalitāte|Fīča', 695 | 'given' => 'Kad|*', 696 | 'name' => 'Latvian', 697 | 'native' => 'latviešu', 698 | 'scenario' => 'Scenārijs', 699 | 'scenario_outline' => 'Scenārijs pēc parauga', 700 | 'then' => 'Tad|*', 701 | 'when' => 'Ja|*', 702 | ), 703 | 'mk-Cyrl' => 704 | array ( 705 | 'and' => '*|И', 706 | 'background' => 'Контекст|Содржина', 707 | 'but' => 'Но|*', 708 | 'examples' => 'Сценарија|Примери', 709 | 'feature' => 'Функционалност|Бизнис потреба|Можност', 710 | 'given' => 'Дадена|Дадено|*', 711 | 'name' => 'Macedonian', 712 | 'native' => 'Македонски', 713 | 'scenario' => 'На пример|Сценарио', 714 | 'scenario_outline' => 'Преглед на сценарија|Концепт|Скица', 715 | 'then' => 'Тогаш|*', 716 | 'when' => 'Кога|*', 717 | ), 718 | 'mk-Latn' => 719 | array ( 720 | 'and' => '*|I', 721 | 'background' => 'Sodrzhina|Kontekst', 722 | 'but' => 'No|*', 723 | 'examples' => 'Scenaria|Primeri', 724 | 'feature' => 'Funkcionalnost|Biznis potreba|Mozhnost', 725 | 'given' => 'Dadena|Dadeno|*', 726 | 'name' => 'Macedonian (Latin)', 727 | 'native' => 'Makedonski (Latinica)', 728 | 'scenario' => 'Na primer|Scenario', 729 | 'scenario_outline' => 'Pregled na scenarija|Koncept|Skica', 730 | 'then' => 'Togash|*', 731 | 'when' => 'Koga|*', 732 | ), 733 | 'mn' => 734 | array ( 735 | 'and' => 'Тэгээд|Мөн|*', 736 | 'background' => 'Агуулга', 737 | 'but' => 'Гэхдээ|Харин|*', 738 | 'examples' => 'Тухайлбал', 739 | 'feature' => 'Функционал|Функц', 740 | 'given' => 'Өгөгдсөн нь|Анх|*', 741 | 'name' => 'Mongolian', 742 | 'native' => 'монгол', 743 | 'scenario' => 'Сценар', 744 | 'scenario_outline' => 'Сценарын төлөвлөгөө', 745 | 'then' => 'Үүний дараа|Тэгэхэд|*', 746 | 'when' => 'Хэрэв|*', 747 | ), 748 | 'nl' => 749 | array ( 750 | 'and' => 'En|*', 751 | 'background' => 'Achtergrond', 752 | 'but' => 'Maar|*', 753 | 'examples' => 'Voorbeelden', 754 | 'feature' => 'Functionaliteit', 755 | 'given' => 'Gegeven|Stel|*', 756 | 'name' => 'Dutch', 757 | 'native' => 'Nederlands', 758 | 'scenario' => 'Scenario', 759 | 'scenario_outline' => 'Abstract Scenario', 760 | 'then' => 'Dan|*', 761 | 'when' => 'Wanneer|Als|*', 762 | ), 763 | 'no' => 764 | array ( 765 | 'and' => 'Og|*', 766 | 'background' => 'Bakgrunn', 767 | 'but' => 'Men|*', 768 | 'examples' => 'Eksempler', 769 | 'feature' => 'Egenskap', 770 | 'given' => 'Gitt|*', 771 | 'name' => 'Norwegian', 772 | 'native' => 'norsk', 773 | 'scenario' => 'Scenario', 774 | 'scenario_outline' => 'Abstrakt Scenario|Scenariomal', 775 | 'then' => 'Så|*', 776 | 'when' => 'Når|*', 777 | ), 778 | 'pa' => 779 | array ( 780 | 'and' => 'ਅਤੇ|*', 781 | 'background' => 'ਪਿਛੋਕੜ', 782 | 'but' => 'ਪਰ|*', 783 | 'examples' => 'ਉਦਾਹਰਨਾਂ', 784 | 'feature' => 'ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|ਖਾਸੀਅਤ', 785 | 'given' => 'ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|*', 786 | 'name' => 'Panjabi', 787 | 'native' => 'ਪੰਜਾਬੀ', 788 | 'scenario' => 'ਪਟਕਥਾ', 789 | 'scenario_outline' => 'ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ', 790 | 'then' => 'ਤਦ|*', 791 | 'when' => 'ਜਦੋਂ|*', 792 | ), 793 | 'pl' => 794 | array ( 795 | 'and' => 'Oraz|*|I', 796 | 'background' => 'Założenia', 797 | 'but' => 'Ale|*', 798 | 'examples' => 'Przykłady', 799 | 'feature' => 'Potrzeba biznesowa|Właściwość|Funkcja|Aspekt', 800 | 'given' => 'Zakładając, że|Zakładając|Mając|*', 801 | 'name' => 'Polish', 802 | 'native' => 'polski', 803 | 'scenario' => 'Scenariusz', 804 | 'scenario_outline' => 'Szablon scenariusza', 805 | 'then' => 'Wtedy|*', 806 | 'when' => 'Jeżeli|Jeśli|Kiedy|Gdy|*', 807 | ), 808 | 'pt' => 809 | array ( 810 | 'and' => '*|E', 811 | 'background' => 'Cenario de Fundo|Cenário de Fundo|Contexto|Fundo', 812 | 'but' => 'Mas|*', 813 | 'examples' => 'Exemplos|Cenários|Cenarios', 814 | 'feature' => 'Funcionalidade|Característica|Caracteristica', 815 | 'given' => 'Dados|Dadas|Dada|Dado|*', 816 | 'name' => 'Portuguese', 817 | 'native' => 'português', 818 | 'scenario' => 'Cenário|Cenario', 819 | 'scenario_outline' => 'Delineação do Cenário|Delineacao do Cenario|Esquema do Cenário|Esquema do Cenario', 820 | 'then' => 'Entao|Então|*', 821 | 'when' => 'Quando|*', 822 | ), 823 | 'ro' => 824 | array ( 825 | 'and' => 'Și|Si|Şi|*', 826 | 'background' => 'Context', 827 | 'but' => 'Dar|*', 828 | 'examples' => 'Exemple', 829 | 'feature' => 'Functionalitate|Funcționalitate|Funcţionalitate', 830 | 'given' => 'Date fiind|Dati fiind|Dați fiind|Daţi fiind|Dat fiind|*', 831 | 'name' => 'Romanian', 832 | 'native' => 'română', 833 | 'scenario' => 'Scenariu', 834 | 'scenario_outline' => 'Structura scenariu|Structură scenariu', 835 | 'then' => 'Atunci|*', 836 | 'when' => 'Când|Cand|*', 837 | ), 838 | 'ru' => 839 | array ( 840 | 'and' => 'К тому же|Также|*|И', 841 | 'background' => 'Предыстория|Контекст', 842 | 'but' => 'Но|*|А', 843 | 'examples' => 'Примеры', 844 | 'feature' => 'Функциональность|Функционал|Свойство|Функция', 845 | 'given' => 'Допустим|Пусть|Дано|Если|*', 846 | 'name' => 'Russian', 847 | 'native' => 'русский', 848 | 'scenario' => 'Сценарий', 849 | 'scenario_outline' => 'Структура сценария', 850 | 'then' => 'Затем|Тогда|То|*', 851 | 'when' => 'Когда|*', 852 | ), 853 | 'sk' => 854 | array ( 855 | 'and' => 'A taktiež|A zároveň|A tiež|*|A', 856 | 'background' => 'Pozadie', 857 | 'but' => 'Ale|*', 858 | 'examples' => 'Príklady', 859 | 'feature' => 'Požiadavka|Vlastnosť|Funkcia', 860 | 'given' => 'Za predpokladu|Pokiaľ|*', 861 | 'name' => 'Slovak', 862 | 'native' => 'Slovensky', 863 | 'scenario' => 'Scenár', 864 | 'scenario_outline' => 'Osnova Scenára|Náčrt Scenáru|Náčrt Scenára', 865 | 'then' => 'Potom|Tak|*', 866 | 'when' => 'Keď|Ak|*', 867 | ), 868 | 'sl' => 869 | array ( 870 | 'and' => 'Ter|In', 871 | 'background' => 'Kontekst|Osnova|Ozadje', 872 | 'but' => 'Vendar|Ampak|Toda', 873 | 'examples' => 'Scenariji|Primeri', 874 | 'feature' => 'Funkcionalnost|Značilnost|Funkcija|Možnosti|Moznosti|Lastnost', 875 | 'given' => 'Privzeto|Zaradi|Podano|Dano', 876 | 'name' => 'Slovenian', 877 | 'native' => 'Slovenski', 878 | 'scenario' => 'Scenarij|Primer', 879 | 'scenario_outline' => 'Struktura scenarija|Oris scenarija|Koncept|Osnutek|Skica', 880 | 'then' => 'Takrat|Potem|Nato', 881 | 'when' => 'Kadar|Ko|Ce|Če', 882 | ), 883 | 'sr-Cyrl' => 884 | array ( 885 | 'and' => '*|И', 886 | 'background' => 'Контекст|Позадина|Основа', 887 | 'but' => 'Али|*', 888 | 'examples' => 'Сценарији|Примери', 889 | 'feature' => 'Функционалност|Могућност|Особина', 890 | 'given' => 'За дате|За дато|За дати|*', 891 | 'name' => 'Serbian', 892 | 'native' => 'Српски', 893 | 'scenario' => 'Сценарио|Пример', 894 | 'scenario_outline' => 'Структура сценарија|Концепт|Скица', 895 | 'then' => 'Онда|*', 896 | 'when' => 'Када|Кад|*', 897 | ), 898 | 'sr-Latn' => 899 | array ( 900 | 'and' => '*|I', 901 | 'background' => 'Kontekst|Pozadina|Osnova', 902 | 'but' => 'Ali|*', 903 | 'examples' => 'Scenariji|Primeri', 904 | 'feature' => 'Funkcionalnost|Mogućnost|Mogucnost|Osobina', 905 | 'given' => 'Za date|Za dato|Za dati|*', 906 | 'name' => 'Serbian (Latin)', 907 | 'native' => 'Srpski (Latinica)', 908 | 'scenario' => 'Scenario|Primer', 909 | 'scenario_outline' => 'Struktura scenarija|Koncept|Skica', 910 | 'then' => 'Onda|*', 911 | 'when' => 'Kada|Kad|*', 912 | ), 913 | 'sv' => 914 | array ( 915 | 'and' => 'Och|*', 916 | 'background' => 'Bakgrund', 917 | 'but' => 'Men|*', 918 | 'examples' => 'Exempel', 919 | 'feature' => 'Egenskap', 920 | 'given' => 'Givet|*', 921 | 'name' => 'Swedish', 922 | 'native' => 'Svenska', 923 | 'scenario' => 'Scenario', 924 | 'scenario_outline' => 'Abstrakt Scenario|Scenariomall', 925 | 'then' => 'Så|*', 926 | 'when' => 'När|*', 927 | ), 928 | 'ta' => 929 | array ( 930 | 'and' => 'மற்றும்|மேலும்|*', 931 | 'background' => 'பின்னணி', 932 | 'but' => 'ஆனால்|*', 933 | 'examples' => 'எடுத்துக்காட்டுகள்| நிலைமைகளில்|காட்சிகள்', 934 | 'feature' => 'வணிக தேவை|அம்சம்|திறன்', 935 | 'given' => 'கொடுக்கப்பட்ட|*', 936 | 'name' => 'Tamil', 937 | 'native' => 'தமிழ்', 938 | 'scenario' => 'காட்சி', 939 | 'scenario_outline' => 'காட்சி வார்ப்புரு|காட்சி சுருக்கம்', 940 | 'then' => 'அப்பொழுது|*', 941 | 'when' => 'எப்போது|*', 942 | ), 943 | 'th' => 944 | array ( 945 | 'and' => 'และ|*', 946 | 'background' => 'แนวคิด', 947 | 'but' => 'แต่|*', 948 | 'examples' => 'ชุดของเหตุการณ์|ชุดของตัวอย่าง', 949 | 'feature' => 'ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก', 950 | 'given' => 'กำหนดให้|*', 951 | 'name' => 'Thai', 952 | 'native' => 'ไทย', 953 | 'scenario' => 'เหตุการณ์', 954 | 'scenario_outline' => 'โครงสร้างของเหตุการณ์|สรุปเหตุการณ์', 955 | 'then' => 'ดังนั้น|*', 956 | 'when' => 'เมื่อ|*', 957 | ), 958 | 'tl' => 959 | array ( 960 | 'and' => 'మరియు|*', 961 | 'background' => 'నేపథ్యం', 962 | 'but' => 'కాని|*', 963 | 'examples' => 'ఉదాహరణలు', 964 | 'feature' => 'గుణము', 965 | 'given' => 'చెప్పబడినది|*', 966 | 'name' => 'Telugu', 967 | 'native' => 'తెలుగు', 968 | 'scenario' => 'సన్నివేశం', 969 | 'scenario_outline' => 'కథనం', 970 | 'then' => 'అప్పుడు|*', 971 | 'when' => 'ఈ పరిస్థితిలో|*', 972 | ), 973 | 'tlh' => 974 | array ( 975 | 'and' => 'latlh|\'ej|*', 976 | 'background' => 'mo\'', 977 | 'but' => '\'ach|\'a|*', 978 | 'examples' => 'ghantoH|lutmey', 979 | 'feature' => 'poQbogh malja\'|Qu\'meH \'ut|perbogh|Qap|laH', 980 | 'given' => 'DaH ghu\' bejlu\'|ghu\' noblu\'|*', 981 | 'name' => 'Klingon', 982 | 'native' => 'tlhIngan', 983 | 'scenario' => 'lut', 984 | 'scenario_outline' => 'lut chovnatlh', 985 | 'then' => 'vaj|*', 986 | 'when' => 'qaSDI\'|*', 987 | ), 988 | 'tr' => 989 | array ( 990 | 'and' => 'Ve|*', 991 | 'background' => 'Geçmiş', 992 | 'but' => 'Fakat|Ama|*', 993 | 'examples' => 'Örnekler', 994 | 'feature' => 'Özellik', 995 | 'given' => 'Diyelim ki|*', 996 | 'name' => 'Turkish', 997 | 'native' => 'Türkçe', 998 | 'scenario' => 'Senaryo', 999 | 'scenario_outline' => 'Senaryo taslağı', 1000 | 'then' => 'O zaman|*', 1001 | 'when' => 'Eğer ki|*', 1002 | ), 1003 | 'tt' => 1004 | array ( 1005 | 'and' => 'Һәм|Вә|*', 1006 | 'background' => 'Кереш', 1007 | 'but' => 'Ләкин|Әмма|*', 1008 | 'examples' => 'Үрнәкләр|Мисаллар', 1009 | 'feature' => 'Үзенчәлеклелек|Мөмкинлек', 1010 | 'given' => 'Әйтик|*', 1011 | 'name' => 'Tatar', 1012 | 'native' => 'Татарча', 1013 | 'scenario' => 'Сценарий', 1014 | 'scenario_outline' => 'Сценарийның төзелеше', 1015 | 'then' => 'Нәтиҗәдә|*', 1016 | 'when' => 'Әгәр|*', 1017 | ), 1018 | 'uk' => 1019 | array ( 1020 | 'and' => 'А також|Та|*|І', 1021 | 'background' => 'Передумова', 1022 | 'but' => 'Але|*', 1023 | 'examples' => 'Приклади', 1024 | 'feature' => 'Функціонал', 1025 | 'given' => 'Припустимо, що|Припустимо|Нехай|Дано|*', 1026 | 'name' => 'Ukrainian', 1027 | 'native' => 'Українська', 1028 | 'scenario' => 'Сценарій', 1029 | 'scenario_outline' => 'Структура сценарію', 1030 | 'then' => 'Тоді|То|*', 1031 | 'when' => 'Коли|Якщо|*', 1032 | ), 1033 | 'ur' => 1034 | array ( 1035 | 'and' => 'اور|*', 1036 | 'background' => 'پس منظر', 1037 | 'but' => 'لیکن|*', 1038 | 'examples' => 'مثالیں', 1039 | 'feature' => 'کاروبار کی ضرورت|صلاحیت|خصوصیت', 1040 | 'given' => 'فرض کیا|بالفرض|اگر|*', 1041 | 'name' => 'Urdu', 1042 | 'native' => 'اردو', 1043 | 'scenario' => 'منظرنامہ', 1044 | 'scenario_outline' => 'منظر نامے کا خاکہ', 1045 | 'then' => 'پھر|تب|*', 1046 | 'when' => 'جب|*', 1047 | ), 1048 | 'uz' => 1049 | array ( 1050 | 'and' => 'Ва|*', 1051 | 'background' => 'Тарих', 1052 | 'but' => 'Бирок|Лекин|Аммо|*', 1053 | 'examples' => 'Мисоллар', 1054 | 'feature' => 'Функционал', 1055 | 'given' => 'Агар|*', 1056 | 'name' => 'Uzbek', 1057 | 'native' => 'Узбекча', 1058 | 'scenario' => 'Сценарий', 1059 | 'scenario_outline' => 'Сценарий структураси', 1060 | 'then' => 'Унда|*', 1061 | 'when' => 'Агар|*', 1062 | ), 1063 | 'vi' => 1064 | array ( 1065 | 'and' => 'Và|*', 1066 | 'background' => 'Bối cảnh', 1067 | 'but' => 'Nhưng|*', 1068 | 'examples' => 'Dữ liệu', 1069 | 'feature' => 'Tính năng', 1070 | 'given' => 'Biết|Cho|*', 1071 | 'name' => 'Vietnamese', 1072 | 'native' => 'Tiếng Việt', 1073 | 'scenario' => 'Tình huống|Kịch bản', 1074 | 'scenario_outline' => 'Khung tình huống|Khung kịch bản', 1075 | 'then' => 'Thì|*', 1076 | 'when' => 'Khi|*', 1077 | ), 1078 | 'zh-CN' => 1079 | array ( 1080 | 'and' => '并且<|而且<|同时<|*', 1081 | 'background' => '背景', 1082 | 'but' => '但是<|*', 1083 | 'examples' => '例子', 1084 | 'feature' => '功能', 1085 | 'given' => '假设<|假如<|假定<|*', 1086 | 'name' => 'Chinese simplified', 1087 | 'native' => '简体中文', 1088 | 'scenario' => '场景|剧本', 1089 | 'scenario_outline' => '场景大纲|剧本大纲', 1090 | 'then' => '那么<|*', 1091 | 'when' => '当<|*', 1092 | ), 1093 | 'zh-TW' => 1094 | array ( 1095 | 'and' => '並且<|而且<|同時<|*', 1096 | 'background' => '背景', 1097 | 'but' => '但是<|*', 1098 | 'examples' => '例子', 1099 | 'feature' => '功能', 1100 | 'given' => '假設<|假如<|假定<|*', 1101 | 'name' => 'Chinese traditional', 1102 | 'native' => '繁體中文', 1103 | 'scenario' => '場景|劇本', 1104 | 'scenario_outline' => '場景大綱|劇本大綱', 1105 | 'then' => '那麼<|*', 1106 | 'when' => '當<|*', 1107 | ), 1108 | ); -------------------------------------------------------------------------------- /coverage.clover: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | --------------------------------------------------------------------------------