├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── js ├── 0-unit-test-examples │ ├── FortuneTellerTest.js │ ├── OracleTest.js │ ├── ThankfulOracleTest.js │ └── src │ │ ├── FortuneTeller.js │ │ ├── Oracle.js │ │ └── ThankfulOracle.js └── 1-bad-practices │ └── src │ ├── breaking-the-law-of-demeter.js │ ├── eval-expressions.js │ ├── global-state.js │ ├── incomplete-initialization.js │ ├── leaving-the-context.js │ └── no-feedback.js ├── package.json ├── php ├── 0-unit-test-examples │ ├── FortuneTellerMockeryTest.php │ ├── FortuneTellerTest.php │ ├── HookAwareOracleTest.php │ ├── OracleTest.php │ ├── TranslatingOracleBrainMonkeyTest.php │ ├── TranslatingOraclePatchworkTest.php │ └── src │ │ ├── FortuneTeller.php │ │ ├── HookAwareOracle.php │ │ ├── Oracle.php │ │ └── TranslatingOracle.php └── 1-bad-practices │ └── src │ ├── calling-static-methods.php │ ├── creating-intermediary-objects.php │ ├── creating-real-objects.php │ ├── insane-complexity.php │ ├── terminating-the-execution.php │ └── using-unresettable-singletons.php ├── phpunit.xml.dist └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Backups 2 | *~ 3 | *.DS_Store 4 | *.out 5 | *.so 6 | *.swp 7 | 8 | # Logs 9 | logs 10 | *.log 11 | 12 | # Composer 13 | vendor 14 | composer.lock 15 | 16 | # Node 17 | .npm 18 | node_modules 19 | npm-debug.log* 20 | 21 | # PhpStorm 22 | .idea 23 | 24 | # PHPUnit 25 | phpunit.xml 26 | 27 | 28 | # Git 29 | !.gitkeep 30 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 0.0.9 4 | 5 | * Refactor and improve unit test examples. 6 | 7 | ## 0.0.1-alpha 8 | 9 | * Initial commit. 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Thorsten Frommen 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # How (Not) to Write Testable Code 2 | 3 | This repository contains example code for the according talk at WordCamp Nuremberg, 2016. 4 | 5 | ## Unit Test Examples 6 | 7 | The first part of the talk is about unit testing. After a short summary, you can see several unit test examples. This repository includes the complete and fully documented versions of the presented [PHP unit tests](php/0-unit-test-examples) as well as the respective [JavaScript unit tests](js/0-unit-test-examples). 8 | 9 | ### Running the Tests 10 | 11 | You want to run the tests yourself? Here's how: 12 | 13 | #### JavaScript 14 | 15 | In order to run the JavaScript tests, you have to install the required [npm](https://www.npmjs.com/) packages first. 16 | 17 | Using [Yarn](https://www.npmjs.com/package/yarn): 18 | 19 | ```shell 20 | $ yarn && yarn run test 21 | ``` 22 | 23 | Using [npm](https://www.npmjs.com/package/npm): 24 | 25 | ```shell 26 | $ npm i && npm run test 27 | ``` 28 | 29 | #### PHP 30 | 31 | In order to run the PHP tests, you have to install the required [Composer](https://getcomposer.org/) packages first. 32 | 33 | ```shell 34 | $ composer install && vendor/bin/phpunit 35 | ``` 36 | 37 | ## Bad Practices 38 | 39 | The second and main part of the talk then is about code examples that are either hard to test, or not testable at all. As with the unit test examples, this repository also includes the bad practice [PHP code](php/1-bad-practices/src) and [JavaScript code](js/1-bad-practices/src) examples. 40 | 41 | Since only presenting _bad_ (i.e., hard-to-test) code doesn't do any good, this repository also includes improved versions of the code. For each of the code examples, you can find an according [pull request](https://github.com/tfrommen/testable-code/pulls). By means of the diff view, you can easily compare the original and the improved code. 42 | 43 | Feel free to [fork this repository](https://github.com/tfrommen/testable-code/fork), and work on possible tests, if you like. 44 | 45 | ## Changelog 46 | 47 | [Changelog](CHANGELOG.md). 48 | 49 | ## License 50 | 51 | Copyright (c) 2016 Thorsten Frommen 52 | 53 | This code is licensed under the [MIT License](LICENSE). 54 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tfrommen/testable-code", 3 | "description": "Example code for the talk \"How (Not) to Write Testable Code\" at WordCamp Nuremberg, 2016.", 4 | "keywords": [ 5 | "code", 6 | "es6", 7 | "javascript", 8 | "mockery", 9 | "php", 10 | "phpunit", 11 | "sinon", 12 | "tape", 13 | "testable", 14 | "testing", 15 | "unit" 16 | ], 17 | "homepage": "https://github.com/tfrommen/testable-code", 18 | "license": "MIT", 19 | "authors": [ 20 | { 21 | "name": "Thorsten Frommen", 22 | "email": "info@tfrommen.de", 23 | "homepage": "https://tfrommen.de", 24 | "role": "Developer" 25 | } 26 | ], 27 | "support": { 28 | "issues": "https://github.com/tfrommen/testable-code/issues", 29 | "source": "https://github.com/tfrommen/testable-code" 30 | }, 31 | "require": { 32 | "php": ">=5.4.0" 33 | }, 34 | "require-dev": { 35 | "antecedent/patchwork": "1.3.*", 36 | "brain/monkey": "^1.4.0", 37 | "mockery/mockery": "^0.9.7", 38 | "phpunit/phpunit": "~4.8|~5.1" 39 | }, 40 | "autoload": { 41 | "classmap": [ 42 | "php/0-unit-test-examples/src" 43 | ], 44 | "files": [ 45 | "vendor/antecedent/patchwork/Patchwork.php" 46 | ] 47 | }, 48 | "minimum-stability": "dev", 49 | "prefer-stable": true, 50 | "config": { 51 | "optimize-autoloader": true 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "afc7123bdef83c1694d8bdd15ccaee0b", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "antecedent/patchwork", 12 | "version": "1.3.5", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/antecedent/patchwork.git", 16 | "reference": "908a233f8a374f02b02ff5e3d6ba687ca506d57d" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/antecedent/patchwork/zipball/908a233f8a374f02b02ff5e3d6ba687ca506d57d", 21 | "reference": "908a233f8a374f02b02ff5e3d6ba687ca506d57d", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=5.3.0" 26 | }, 27 | "type": "library", 28 | "notification-url": "https://packagist.org/downloads/", 29 | "license": [ 30 | "MIT" 31 | ], 32 | "authors": [ 33 | { 34 | "name": "Ignas Rudaitis", 35 | "email": "ignas.rudaitis@gmail.com" 36 | } 37 | ], 38 | "description": "A pure PHP library that lets you redefine user-defined functions at runtime.", 39 | "homepage": "http://antecedent.github.io/patchwork/", 40 | "keywords": [ 41 | "aop", 42 | "aspect", 43 | "interception", 44 | "monkeypatching", 45 | "redefinition", 46 | "runkit", 47 | "testing" 48 | ], 49 | "time": "2015-10-09T18:20:06+00:00" 50 | }, 51 | { 52 | "name": "brain/monkey", 53 | "version": "1.4.2", 54 | "source": { 55 | "type": "git", 56 | "url": "https://github.com/Brain-WP/BrainMonkey.git", 57 | "reference": "61db1b4e44ddcc236127213723b95153bc66b40c" 58 | }, 59 | "dist": { 60 | "type": "zip", 61 | "url": "https://api.github.com/repos/Brain-WP/BrainMonkey/zipball/61db1b4e44ddcc236127213723b95153bc66b40c", 62 | "reference": "61db1b4e44ddcc236127213723b95153bc66b40c", 63 | "shasum": "" 64 | }, 65 | "require": { 66 | "antecedent/patchwork": "1.3.*", 67 | "mockery/mockery": "*", 68 | "php": ">=5.4.0" 69 | }, 70 | "require-dev": { 71 | "mockery/mockery": "0.9.3", 72 | "phpunit/phpunit": "~4.8" 73 | }, 74 | "type": "library", 75 | "extra": { 76 | "branch-alias": { 77 | "dev-master": "1.0.x-dev" 78 | } 79 | }, 80 | "autoload": { 81 | "psr-4": { 82 | "Brain\\": "src/" 83 | } 84 | }, 85 | "notification-url": "https://packagist.org/downloads/", 86 | "license": [ 87 | "MIT" 88 | ], 89 | "authors": [ 90 | { 91 | "name": "Giuseppe Mazzapica", 92 | "email": "giuseppe.mazzapica@gmail.com", 93 | "homepage": "http://gm.zoomlab.it", 94 | "role": "Developer" 95 | } 96 | ], 97 | "description": "Mocking utility for PHP functions and WordPress plugin API", 98 | "keywords": [ 99 | "Monkey Patching", 100 | "interception", 101 | "mock", 102 | "mock functions", 103 | "mockery", 104 | "patchwork", 105 | "redefinition", 106 | "runkit", 107 | "test", 108 | "testing" 109 | ], 110 | "time": "2016-11-17T18:47:07+00:00" 111 | }, 112 | { 113 | "name": "doctrine/instantiator", 114 | "version": "1.0.5", 115 | "source": { 116 | "type": "git", 117 | "url": "https://github.com/doctrine/instantiator.git", 118 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 119 | }, 120 | "dist": { 121 | "type": "zip", 122 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 123 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 124 | "shasum": "" 125 | }, 126 | "require": { 127 | "php": ">=5.3,<8.0-DEV" 128 | }, 129 | "require-dev": { 130 | "athletic/athletic": "~0.1.8", 131 | "ext-pdo": "*", 132 | "ext-phar": "*", 133 | "phpunit/phpunit": "~4.0", 134 | "squizlabs/php_codesniffer": "~2.0" 135 | }, 136 | "type": "library", 137 | "extra": { 138 | "branch-alias": { 139 | "dev-master": "1.0.x-dev" 140 | } 141 | }, 142 | "autoload": { 143 | "psr-4": { 144 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 145 | } 146 | }, 147 | "notification-url": "https://packagist.org/downloads/", 148 | "license": [ 149 | "MIT" 150 | ], 151 | "authors": [ 152 | { 153 | "name": "Marco Pivetta", 154 | "email": "ocramius@gmail.com", 155 | "homepage": "http://ocramius.github.com/" 156 | } 157 | ], 158 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 159 | "homepage": "https://github.com/doctrine/instantiator", 160 | "keywords": [ 161 | "constructor", 162 | "instantiate" 163 | ], 164 | "time": "2015-06-14T21:17:01+00:00" 165 | }, 166 | { 167 | "name": "hamcrest/hamcrest-php", 168 | "version": "v1.2.2", 169 | "source": { 170 | "type": "git", 171 | "url": "https://github.com/hamcrest/hamcrest-php.git", 172 | "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c" 173 | }, 174 | "dist": { 175 | "type": "zip", 176 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c", 177 | "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c", 178 | "shasum": "" 179 | }, 180 | "require": { 181 | "php": ">=5.3.2" 182 | }, 183 | "replace": { 184 | "cordoval/hamcrest-php": "*", 185 | "davedevelopment/hamcrest-php": "*", 186 | "kodova/hamcrest-php": "*" 187 | }, 188 | "require-dev": { 189 | "phpunit/php-file-iterator": "1.3.3", 190 | "satooshi/php-coveralls": "dev-master" 191 | }, 192 | "type": "library", 193 | "autoload": { 194 | "classmap": [ 195 | "hamcrest" 196 | ], 197 | "files": [ 198 | "hamcrest/Hamcrest.php" 199 | ] 200 | }, 201 | "notification-url": "https://packagist.org/downloads/", 202 | "license": [ 203 | "BSD" 204 | ], 205 | "description": "This is the PHP port of Hamcrest Matchers", 206 | "keywords": [ 207 | "test" 208 | ], 209 | "time": "2015-05-11T14:41:42+00:00" 210 | }, 211 | { 212 | "name": "mockery/mockery", 213 | "version": "0.9.7", 214 | "source": { 215 | "type": "git", 216 | "url": "https://github.com/padraic/mockery.git", 217 | "reference": "4de7969f4664da3cef1ccd83866c9f59378c3371" 218 | }, 219 | "dist": { 220 | "type": "zip", 221 | "url": "https://api.github.com/repos/padraic/mockery/zipball/4de7969f4664da3cef1ccd83866c9f59378c3371", 222 | "reference": "4de7969f4664da3cef1ccd83866c9f59378c3371", 223 | "shasum": "" 224 | }, 225 | "require": { 226 | "hamcrest/hamcrest-php": "~1.1", 227 | "lib-pcre": ">=7.0", 228 | "php": ">=5.3.2" 229 | }, 230 | "require-dev": { 231 | "phpunit/phpunit": "~4.0" 232 | }, 233 | "type": "library", 234 | "extra": { 235 | "branch-alias": { 236 | "dev-master": "0.9.x-dev" 237 | } 238 | }, 239 | "autoload": { 240 | "psr-0": { 241 | "Mockery": "library/" 242 | } 243 | }, 244 | "notification-url": "https://packagist.org/downloads/", 245 | "license": [ 246 | "BSD-3-Clause" 247 | ], 248 | "authors": [ 249 | { 250 | "name": "Pádraic Brady", 251 | "email": "padraic.brady@gmail.com", 252 | "homepage": "http://blog.astrumfutura.com" 253 | }, 254 | { 255 | "name": "Dave Marshall", 256 | "email": "dave.marshall@atstsolutions.co.uk", 257 | "homepage": "http://davedevelopment.co.uk" 258 | } 259 | ], 260 | "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", 261 | "homepage": "http://github.com/padraic/mockery", 262 | "keywords": [ 263 | "BDD", 264 | "TDD", 265 | "library", 266 | "mock", 267 | "mock objects", 268 | "mockery", 269 | "stub", 270 | "test", 271 | "test double", 272 | "testing" 273 | ], 274 | "time": "2016-12-19T14:50:55+00:00" 275 | }, 276 | { 277 | "name": "myclabs/deep-copy", 278 | "version": "1.5.5", 279 | "source": { 280 | "type": "git", 281 | "url": "https://github.com/myclabs/DeepCopy.git", 282 | "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108" 283 | }, 284 | "dist": { 285 | "type": "zip", 286 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108", 287 | "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108", 288 | "shasum": "" 289 | }, 290 | "require": { 291 | "php": ">=5.4.0" 292 | }, 293 | "require-dev": { 294 | "doctrine/collections": "1.*", 295 | "phpunit/phpunit": "~4.1" 296 | }, 297 | "type": "library", 298 | "autoload": { 299 | "psr-4": { 300 | "DeepCopy\\": "src/DeepCopy/" 301 | } 302 | }, 303 | "notification-url": "https://packagist.org/downloads/", 304 | "license": [ 305 | "MIT" 306 | ], 307 | "description": "Create deep copies (clones) of your objects", 308 | "homepage": "https://github.com/myclabs/DeepCopy", 309 | "keywords": [ 310 | "clone", 311 | "copy", 312 | "duplicate", 313 | "object", 314 | "object graph" 315 | ], 316 | "time": "2016-10-31T17:19:45+00:00" 317 | }, 318 | { 319 | "name": "phpdocumentor/reflection-common", 320 | "version": "1.0", 321 | "source": { 322 | "type": "git", 323 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 324 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" 325 | }, 326 | "dist": { 327 | "type": "zip", 328 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 329 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 330 | "shasum": "" 331 | }, 332 | "require": { 333 | "php": ">=5.5" 334 | }, 335 | "require-dev": { 336 | "phpunit/phpunit": "^4.6" 337 | }, 338 | "type": "library", 339 | "extra": { 340 | "branch-alias": { 341 | "dev-master": "1.0.x-dev" 342 | } 343 | }, 344 | "autoload": { 345 | "psr-4": { 346 | "phpDocumentor\\Reflection\\": [ 347 | "src" 348 | ] 349 | } 350 | }, 351 | "notification-url": "https://packagist.org/downloads/", 352 | "license": [ 353 | "MIT" 354 | ], 355 | "authors": [ 356 | { 357 | "name": "Jaap van Otterdijk", 358 | "email": "opensource@ijaap.nl" 359 | } 360 | ], 361 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 362 | "homepage": "http://www.phpdoc.org", 363 | "keywords": [ 364 | "FQSEN", 365 | "phpDocumentor", 366 | "phpdoc", 367 | "reflection", 368 | "static analysis" 369 | ], 370 | "time": "2015-12-27T11:43:31+00:00" 371 | }, 372 | { 373 | "name": "phpdocumentor/reflection-docblock", 374 | "version": "3.1.1", 375 | "source": { 376 | "type": "git", 377 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 378 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" 379 | }, 380 | "dist": { 381 | "type": "zip", 382 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", 383 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", 384 | "shasum": "" 385 | }, 386 | "require": { 387 | "php": ">=5.5", 388 | "phpdocumentor/reflection-common": "^1.0@dev", 389 | "phpdocumentor/type-resolver": "^0.2.0", 390 | "webmozart/assert": "^1.0" 391 | }, 392 | "require-dev": { 393 | "mockery/mockery": "^0.9.4", 394 | "phpunit/phpunit": "^4.4" 395 | }, 396 | "type": "library", 397 | "autoload": { 398 | "psr-4": { 399 | "phpDocumentor\\Reflection\\": [ 400 | "src/" 401 | ] 402 | } 403 | }, 404 | "notification-url": "https://packagist.org/downloads/", 405 | "license": [ 406 | "MIT" 407 | ], 408 | "authors": [ 409 | { 410 | "name": "Mike van Riel", 411 | "email": "me@mikevanriel.com" 412 | } 413 | ], 414 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 415 | "time": "2016-09-30T07:12:33+00:00" 416 | }, 417 | { 418 | "name": "phpdocumentor/type-resolver", 419 | "version": "0.2.1", 420 | "source": { 421 | "type": "git", 422 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 423 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" 424 | }, 425 | "dist": { 426 | "type": "zip", 427 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 428 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 429 | "shasum": "" 430 | }, 431 | "require": { 432 | "php": ">=5.5", 433 | "phpdocumentor/reflection-common": "^1.0" 434 | }, 435 | "require-dev": { 436 | "mockery/mockery": "^0.9.4", 437 | "phpunit/phpunit": "^5.2||^4.8.24" 438 | }, 439 | "type": "library", 440 | "extra": { 441 | "branch-alias": { 442 | "dev-master": "1.0.x-dev" 443 | } 444 | }, 445 | "autoload": { 446 | "psr-4": { 447 | "phpDocumentor\\Reflection\\": [ 448 | "src/" 449 | ] 450 | } 451 | }, 452 | "notification-url": "https://packagist.org/downloads/", 453 | "license": [ 454 | "MIT" 455 | ], 456 | "authors": [ 457 | { 458 | "name": "Mike van Riel", 459 | "email": "me@mikevanriel.com" 460 | } 461 | ], 462 | "time": "2016-11-25T06:54:22+00:00" 463 | }, 464 | { 465 | "name": "phpspec/prophecy", 466 | "version": "v1.6.2", 467 | "source": { 468 | "type": "git", 469 | "url": "https://github.com/phpspec/prophecy.git", 470 | "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" 471 | }, 472 | "dist": { 473 | "type": "zip", 474 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", 475 | "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", 476 | "shasum": "" 477 | }, 478 | "require": { 479 | "doctrine/instantiator": "^1.0.2", 480 | "php": "^5.3|^7.0", 481 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", 482 | "sebastian/comparator": "^1.1", 483 | "sebastian/recursion-context": "^1.0|^2.0" 484 | }, 485 | "require-dev": { 486 | "phpspec/phpspec": "^2.0", 487 | "phpunit/phpunit": "^4.8 || ^5.6.5" 488 | }, 489 | "type": "library", 490 | "extra": { 491 | "branch-alias": { 492 | "dev-master": "1.6.x-dev" 493 | } 494 | }, 495 | "autoload": { 496 | "psr-0": { 497 | "Prophecy\\": "src/" 498 | } 499 | }, 500 | "notification-url": "https://packagist.org/downloads/", 501 | "license": [ 502 | "MIT" 503 | ], 504 | "authors": [ 505 | { 506 | "name": "Konstantin Kudryashov", 507 | "email": "ever.zet@gmail.com", 508 | "homepage": "http://everzet.com" 509 | }, 510 | { 511 | "name": "Marcello Duarte", 512 | "email": "marcello.duarte@gmail.com" 513 | } 514 | ], 515 | "description": "Highly opinionated mocking framework for PHP 5.3+", 516 | "homepage": "https://github.com/phpspec/prophecy", 517 | "keywords": [ 518 | "Double", 519 | "Dummy", 520 | "fake", 521 | "mock", 522 | "spy", 523 | "stub" 524 | ], 525 | "time": "2016-11-21T14:58:47+00:00" 526 | }, 527 | { 528 | "name": "phpunit/php-code-coverage", 529 | "version": "4.0.4", 530 | "source": { 531 | "type": "git", 532 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 533 | "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a" 534 | }, 535 | "dist": { 536 | "type": "zip", 537 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c14196e64a78570034afd0b7a9f3757ba71c2a0a", 538 | "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a", 539 | "shasum": "" 540 | }, 541 | "require": { 542 | "php": "^5.6 || ^7.0", 543 | "phpunit/php-file-iterator": "~1.3", 544 | "phpunit/php-text-template": "~1.2", 545 | "phpunit/php-token-stream": "^1.4.2", 546 | "sebastian/code-unit-reverse-lookup": "~1.0", 547 | "sebastian/environment": "^1.3.2 || ^2.0", 548 | "sebastian/version": "~1.0|~2.0" 549 | }, 550 | "require-dev": { 551 | "ext-xdebug": ">=2.1.4", 552 | "phpunit/phpunit": "^5.4" 553 | }, 554 | "suggest": { 555 | "ext-dom": "*", 556 | "ext-xdebug": ">=2.4.0", 557 | "ext-xmlwriter": "*" 558 | }, 559 | "type": "library", 560 | "extra": { 561 | "branch-alias": { 562 | "dev-master": "4.0.x-dev" 563 | } 564 | }, 565 | "autoload": { 566 | "classmap": [ 567 | "src/" 568 | ] 569 | }, 570 | "notification-url": "https://packagist.org/downloads/", 571 | "license": [ 572 | "BSD-3-Clause" 573 | ], 574 | "authors": [ 575 | { 576 | "name": "Sebastian Bergmann", 577 | "email": "sb@sebastian-bergmann.de", 578 | "role": "lead" 579 | } 580 | ], 581 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 582 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 583 | "keywords": [ 584 | "coverage", 585 | "testing", 586 | "xunit" 587 | ], 588 | "time": "2016-12-20T15:22:42+00:00" 589 | }, 590 | { 591 | "name": "phpunit/php-file-iterator", 592 | "version": "1.4.2", 593 | "source": { 594 | "type": "git", 595 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 596 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" 597 | }, 598 | "dist": { 599 | "type": "zip", 600 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 601 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 602 | "shasum": "" 603 | }, 604 | "require": { 605 | "php": ">=5.3.3" 606 | }, 607 | "type": "library", 608 | "extra": { 609 | "branch-alias": { 610 | "dev-master": "1.4.x-dev" 611 | } 612 | }, 613 | "autoload": { 614 | "classmap": [ 615 | "src/" 616 | ] 617 | }, 618 | "notification-url": "https://packagist.org/downloads/", 619 | "license": [ 620 | "BSD-3-Clause" 621 | ], 622 | "authors": [ 623 | { 624 | "name": "Sebastian Bergmann", 625 | "email": "sb@sebastian-bergmann.de", 626 | "role": "lead" 627 | } 628 | ], 629 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 630 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 631 | "keywords": [ 632 | "filesystem", 633 | "iterator" 634 | ], 635 | "time": "2016-10-03T07:40:28+00:00" 636 | }, 637 | { 638 | "name": "phpunit/php-text-template", 639 | "version": "1.2.1", 640 | "source": { 641 | "type": "git", 642 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 643 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 644 | }, 645 | "dist": { 646 | "type": "zip", 647 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 648 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 649 | "shasum": "" 650 | }, 651 | "require": { 652 | "php": ">=5.3.3" 653 | }, 654 | "type": "library", 655 | "autoload": { 656 | "classmap": [ 657 | "src/" 658 | ] 659 | }, 660 | "notification-url": "https://packagist.org/downloads/", 661 | "license": [ 662 | "BSD-3-Clause" 663 | ], 664 | "authors": [ 665 | { 666 | "name": "Sebastian Bergmann", 667 | "email": "sebastian@phpunit.de", 668 | "role": "lead" 669 | } 670 | ], 671 | "description": "Simple template engine.", 672 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 673 | "keywords": [ 674 | "template" 675 | ], 676 | "time": "2015-06-21T13:50:34+00:00" 677 | }, 678 | { 679 | "name": "phpunit/php-timer", 680 | "version": "1.0.8", 681 | "source": { 682 | "type": "git", 683 | "url": "https://github.com/sebastianbergmann/php-timer.git", 684 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" 685 | }, 686 | "dist": { 687 | "type": "zip", 688 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", 689 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", 690 | "shasum": "" 691 | }, 692 | "require": { 693 | "php": ">=5.3.3" 694 | }, 695 | "require-dev": { 696 | "phpunit/phpunit": "~4|~5" 697 | }, 698 | "type": "library", 699 | "autoload": { 700 | "classmap": [ 701 | "src/" 702 | ] 703 | }, 704 | "notification-url": "https://packagist.org/downloads/", 705 | "license": [ 706 | "BSD-3-Clause" 707 | ], 708 | "authors": [ 709 | { 710 | "name": "Sebastian Bergmann", 711 | "email": "sb@sebastian-bergmann.de", 712 | "role": "lead" 713 | } 714 | ], 715 | "description": "Utility class for timing", 716 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 717 | "keywords": [ 718 | "timer" 719 | ], 720 | "time": "2016-05-12T18:03:57+00:00" 721 | }, 722 | { 723 | "name": "phpunit/php-token-stream", 724 | "version": "1.4.9", 725 | "source": { 726 | "type": "git", 727 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 728 | "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" 729 | }, 730 | "dist": { 731 | "type": "zip", 732 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", 733 | "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", 734 | "shasum": "" 735 | }, 736 | "require": { 737 | "ext-tokenizer": "*", 738 | "php": ">=5.3.3" 739 | }, 740 | "require-dev": { 741 | "phpunit/phpunit": "~4.2" 742 | }, 743 | "type": "library", 744 | "extra": { 745 | "branch-alias": { 746 | "dev-master": "1.4-dev" 747 | } 748 | }, 749 | "autoload": { 750 | "classmap": [ 751 | "src/" 752 | ] 753 | }, 754 | "notification-url": "https://packagist.org/downloads/", 755 | "license": [ 756 | "BSD-3-Clause" 757 | ], 758 | "authors": [ 759 | { 760 | "name": "Sebastian Bergmann", 761 | "email": "sebastian@phpunit.de" 762 | } 763 | ], 764 | "description": "Wrapper around PHP's tokenizer extension.", 765 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 766 | "keywords": [ 767 | "tokenizer" 768 | ], 769 | "time": "2016-11-15T14:06:22+00:00" 770 | }, 771 | { 772 | "name": "phpunit/phpunit", 773 | "version": "5.7.5", 774 | "source": { 775 | "type": "git", 776 | "url": "https://github.com/sebastianbergmann/phpunit.git", 777 | "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe" 778 | }, 779 | "dist": { 780 | "type": "zip", 781 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50fd2be8f3e23e91da825f36f08e5f9633076ffe", 782 | "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe", 783 | "shasum": "" 784 | }, 785 | "require": { 786 | "ext-dom": "*", 787 | "ext-json": "*", 788 | "ext-libxml": "*", 789 | "ext-mbstring": "*", 790 | "ext-xml": "*", 791 | "myclabs/deep-copy": "~1.3", 792 | "php": "^5.6 || ^7.0", 793 | "phpspec/prophecy": "^1.6.2", 794 | "phpunit/php-code-coverage": "^4.0.3", 795 | "phpunit/php-file-iterator": "~1.4", 796 | "phpunit/php-text-template": "~1.2", 797 | "phpunit/php-timer": "^1.0.6", 798 | "phpunit/phpunit-mock-objects": "^3.2", 799 | "sebastian/comparator": "~1.2.2", 800 | "sebastian/diff": "~1.2", 801 | "sebastian/environment": "^1.3.4 || ^2.0", 802 | "sebastian/exporter": "~2.0", 803 | "sebastian/global-state": "^1.0 || ^2.0", 804 | "sebastian/object-enumerator": "~2.0", 805 | "sebastian/resource-operations": "~1.0", 806 | "sebastian/version": "~1.0|~2.0", 807 | "symfony/yaml": "~2.1|~3.0" 808 | }, 809 | "conflict": { 810 | "phpdocumentor/reflection-docblock": "3.0.2" 811 | }, 812 | "require-dev": { 813 | "ext-pdo": "*" 814 | }, 815 | "suggest": { 816 | "ext-xdebug": "*", 817 | "phpunit/php-invoker": "~1.1" 818 | }, 819 | "bin": [ 820 | "phpunit" 821 | ], 822 | "type": "library", 823 | "extra": { 824 | "branch-alias": { 825 | "dev-master": "5.7.x-dev" 826 | } 827 | }, 828 | "autoload": { 829 | "classmap": [ 830 | "src/" 831 | ] 832 | }, 833 | "notification-url": "https://packagist.org/downloads/", 834 | "license": [ 835 | "BSD-3-Clause" 836 | ], 837 | "authors": [ 838 | { 839 | "name": "Sebastian Bergmann", 840 | "email": "sebastian@phpunit.de", 841 | "role": "lead" 842 | } 843 | ], 844 | "description": "The PHP Unit Testing framework.", 845 | "homepage": "https://phpunit.de/", 846 | "keywords": [ 847 | "phpunit", 848 | "testing", 849 | "xunit" 850 | ], 851 | "time": "2016-12-28T07:18:51+00:00" 852 | }, 853 | { 854 | "name": "phpunit/phpunit-mock-objects", 855 | "version": "3.4.3", 856 | "source": { 857 | "type": "git", 858 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 859 | "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" 860 | }, 861 | "dist": { 862 | "type": "zip", 863 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", 864 | "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", 865 | "shasum": "" 866 | }, 867 | "require": { 868 | "doctrine/instantiator": "^1.0.2", 869 | "php": "^5.6 || ^7.0", 870 | "phpunit/php-text-template": "^1.2", 871 | "sebastian/exporter": "^1.2 || ^2.0" 872 | }, 873 | "conflict": { 874 | "phpunit/phpunit": "<5.4.0" 875 | }, 876 | "require-dev": { 877 | "phpunit/phpunit": "^5.4" 878 | }, 879 | "suggest": { 880 | "ext-soap": "*" 881 | }, 882 | "type": "library", 883 | "extra": { 884 | "branch-alias": { 885 | "dev-master": "3.2.x-dev" 886 | } 887 | }, 888 | "autoload": { 889 | "classmap": [ 890 | "src/" 891 | ] 892 | }, 893 | "notification-url": "https://packagist.org/downloads/", 894 | "license": [ 895 | "BSD-3-Clause" 896 | ], 897 | "authors": [ 898 | { 899 | "name": "Sebastian Bergmann", 900 | "email": "sb@sebastian-bergmann.de", 901 | "role": "lead" 902 | } 903 | ], 904 | "description": "Mock Object library for PHPUnit", 905 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 906 | "keywords": [ 907 | "mock", 908 | "xunit" 909 | ], 910 | "time": "2016-12-08T20:27:08+00:00" 911 | }, 912 | { 913 | "name": "sebastian/code-unit-reverse-lookup", 914 | "version": "1.0.0", 915 | "source": { 916 | "type": "git", 917 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 918 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" 919 | }, 920 | "dist": { 921 | "type": "zip", 922 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 923 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 924 | "shasum": "" 925 | }, 926 | "require": { 927 | "php": ">=5.6" 928 | }, 929 | "require-dev": { 930 | "phpunit/phpunit": "~5" 931 | }, 932 | "type": "library", 933 | "extra": { 934 | "branch-alias": { 935 | "dev-master": "1.0.x-dev" 936 | } 937 | }, 938 | "autoload": { 939 | "classmap": [ 940 | "src/" 941 | ] 942 | }, 943 | "notification-url": "https://packagist.org/downloads/", 944 | "license": [ 945 | "BSD-3-Clause" 946 | ], 947 | "authors": [ 948 | { 949 | "name": "Sebastian Bergmann", 950 | "email": "sebastian@phpunit.de" 951 | } 952 | ], 953 | "description": "Looks up which function or method a line of code belongs to", 954 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 955 | "time": "2016-02-13T06:45:14+00:00" 956 | }, 957 | { 958 | "name": "sebastian/comparator", 959 | "version": "1.2.2", 960 | "source": { 961 | "type": "git", 962 | "url": "https://github.com/sebastianbergmann/comparator.git", 963 | "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" 964 | }, 965 | "dist": { 966 | "type": "zip", 967 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", 968 | "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", 969 | "shasum": "" 970 | }, 971 | "require": { 972 | "php": ">=5.3.3", 973 | "sebastian/diff": "~1.2", 974 | "sebastian/exporter": "~1.2 || ~2.0" 975 | }, 976 | "require-dev": { 977 | "phpunit/phpunit": "~4.4" 978 | }, 979 | "type": "library", 980 | "extra": { 981 | "branch-alias": { 982 | "dev-master": "1.2.x-dev" 983 | } 984 | }, 985 | "autoload": { 986 | "classmap": [ 987 | "src/" 988 | ] 989 | }, 990 | "notification-url": "https://packagist.org/downloads/", 991 | "license": [ 992 | "BSD-3-Clause" 993 | ], 994 | "authors": [ 995 | { 996 | "name": "Jeff Welch", 997 | "email": "whatthejeff@gmail.com" 998 | }, 999 | { 1000 | "name": "Volker Dusch", 1001 | "email": "github@wallbash.com" 1002 | }, 1003 | { 1004 | "name": "Bernhard Schussek", 1005 | "email": "bschussek@2bepublished.at" 1006 | }, 1007 | { 1008 | "name": "Sebastian Bergmann", 1009 | "email": "sebastian@phpunit.de" 1010 | } 1011 | ], 1012 | "description": "Provides the functionality to compare PHP values for equality", 1013 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 1014 | "keywords": [ 1015 | "comparator", 1016 | "compare", 1017 | "equality" 1018 | ], 1019 | "time": "2016-11-19T09:18:40+00:00" 1020 | }, 1021 | { 1022 | "name": "sebastian/diff", 1023 | "version": "1.4.1", 1024 | "source": { 1025 | "type": "git", 1026 | "url": "https://github.com/sebastianbergmann/diff.git", 1027 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" 1028 | }, 1029 | "dist": { 1030 | "type": "zip", 1031 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 1032 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", 1033 | "shasum": "" 1034 | }, 1035 | "require": { 1036 | "php": ">=5.3.3" 1037 | }, 1038 | "require-dev": { 1039 | "phpunit/phpunit": "~4.8" 1040 | }, 1041 | "type": "library", 1042 | "extra": { 1043 | "branch-alias": { 1044 | "dev-master": "1.4-dev" 1045 | } 1046 | }, 1047 | "autoload": { 1048 | "classmap": [ 1049 | "src/" 1050 | ] 1051 | }, 1052 | "notification-url": "https://packagist.org/downloads/", 1053 | "license": [ 1054 | "BSD-3-Clause" 1055 | ], 1056 | "authors": [ 1057 | { 1058 | "name": "Kore Nordmann", 1059 | "email": "mail@kore-nordmann.de" 1060 | }, 1061 | { 1062 | "name": "Sebastian Bergmann", 1063 | "email": "sebastian@phpunit.de" 1064 | } 1065 | ], 1066 | "description": "Diff implementation", 1067 | "homepage": "https://github.com/sebastianbergmann/diff", 1068 | "keywords": [ 1069 | "diff" 1070 | ], 1071 | "time": "2015-12-08T07:14:41+00:00" 1072 | }, 1073 | { 1074 | "name": "sebastian/environment", 1075 | "version": "2.0.0", 1076 | "source": { 1077 | "type": "git", 1078 | "url": "https://github.com/sebastianbergmann/environment.git", 1079 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" 1080 | }, 1081 | "dist": { 1082 | "type": "zip", 1083 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 1084 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 1085 | "shasum": "" 1086 | }, 1087 | "require": { 1088 | "php": "^5.6 || ^7.0" 1089 | }, 1090 | "require-dev": { 1091 | "phpunit/phpunit": "^5.0" 1092 | }, 1093 | "type": "library", 1094 | "extra": { 1095 | "branch-alias": { 1096 | "dev-master": "2.0.x-dev" 1097 | } 1098 | }, 1099 | "autoload": { 1100 | "classmap": [ 1101 | "src/" 1102 | ] 1103 | }, 1104 | "notification-url": "https://packagist.org/downloads/", 1105 | "license": [ 1106 | "BSD-3-Clause" 1107 | ], 1108 | "authors": [ 1109 | { 1110 | "name": "Sebastian Bergmann", 1111 | "email": "sebastian@phpunit.de" 1112 | } 1113 | ], 1114 | "description": "Provides functionality to handle HHVM/PHP environments", 1115 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1116 | "keywords": [ 1117 | "Xdebug", 1118 | "environment", 1119 | "hhvm" 1120 | ], 1121 | "time": "2016-11-26T07:53:53+00:00" 1122 | }, 1123 | { 1124 | "name": "sebastian/exporter", 1125 | "version": "2.0.0", 1126 | "source": { 1127 | "type": "git", 1128 | "url": "https://github.com/sebastianbergmann/exporter.git", 1129 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" 1130 | }, 1131 | "dist": { 1132 | "type": "zip", 1133 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 1134 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 1135 | "shasum": "" 1136 | }, 1137 | "require": { 1138 | "php": ">=5.3.3", 1139 | "sebastian/recursion-context": "~2.0" 1140 | }, 1141 | "require-dev": { 1142 | "ext-mbstring": "*", 1143 | "phpunit/phpunit": "~4.4" 1144 | }, 1145 | "type": "library", 1146 | "extra": { 1147 | "branch-alias": { 1148 | "dev-master": "2.0.x-dev" 1149 | } 1150 | }, 1151 | "autoload": { 1152 | "classmap": [ 1153 | "src/" 1154 | ] 1155 | }, 1156 | "notification-url": "https://packagist.org/downloads/", 1157 | "license": [ 1158 | "BSD-3-Clause" 1159 | ], 1160 | "authors": [ 1161 | { 1162 | "name": "Jeff Welch", 1163 | "email": "whatthejeff@gmail.com" 1164 | }, 1165 | { 1166 | "name": "Volker Dusch", 1167 | "email": "github@wallbash.com" 1168 | }, 1169 | { 1170 | "name": "Bernhard Schussek", 1171 | "email": "bschussek@2bepublished.at" 1172 | }, 1173 | { 1174 | "name": "Sebastian Bergmann", 1175 | "email": "sebastian@phpunit.de" 1176 | }, 1177 | { 1178 | "name": "Adam Harvey", 1179 | "email": "aharvey@php.net" 1180 | } 1181 | ], 1182 | "description": "Provides the functionality to export PHP variables for visualization", 1183 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1184 | "keywords": [ 1185 | "export", 1186 | "exporter" 1187 | ], 1188 | "time": "2016-11-19T08:54:04+00:00" 1189 | }, 1190 | { 1191 | "name": "sebastian/global-state", 1192 | "version": "1.1.1", 1193 | "source": { 1194 | "type": "git", 1195 | "url": "https://github.com/sebastianbergmann/global-state.git", 1196 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 1197 | }, 1198 | "dist": { 1199 | "type": "zip", 1200 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 1201 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 1202 | "shasum": "" 1203 | }, 1204 | "require": { 1205 | "php": ">=5.3.3" 1206 | }, 1207 | "require-dev": { 1208 | "phpunit/phpunit": "~4.2" 1209 | }, 1210 | "suggest": { 1211 | "ext-uopz": "*" 1212 | }, 1213 | "type": "library", 1214 | "extra": { 1215 | "branch-alias": { 1216 | "dev-master": "1.0-dev" 1217 | } 1218 | }, 1219 | "autoload": { 1220 | "classmap": [ 1221 | "src/" 1222 | ] 1223 | }, 1224 | "notification-url": "https://packagist.org/downloads/", 1225 | "license": [ 1226 | "BSD-3-Clause" 1227 | ], 1228 | "authors": [ 1229 | { 1230 | "name": "Sebastian Bergmann", 1231 | "email": "sebastian@phpunit.de" 1232 | } 1233 | ], 1234 | "description": "Snapshotting of global state", 1235 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1236 | "keywords": [ 1237 | "global state" 1238 | ], 1239 | "time": "2015-10-12T03:26:01+00:00" 1240 | }, 1241 | { 1242 | "name": "sebastian/object-enumerator", 1243 | "version": "2.0.0", 1244 | "source": { 1245 | "type": "git", 1246 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1247 | "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35" 1248 | }, 1249 | "dist": { 1250 | "type": "zip", 1251 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", 1252 | "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", 1253 | "shasum": "" 1254 | }, 1255 | "require": { 1256 | "php": ">=5.6", 1257 | "sebastian/recursion-context": "~2.0" 1258 | }, 1259 | "require-dev": { 1260 | "phpunit/phpunit": "~5" 1261 | }, 1262 | "type": "library", 1263 | "extra": { 1264 | "branch-alias": { 1265 | "dev-master": "2.0.x-dev" 1266 | } 1267 | }, 1268 | "autoload": { 1269 | "classmap": [ 1270 | "src/" 1271 | ] 1272 | }, 1273 | "notification-url": "https://packagist.org/downloads/", 1274 | "license": [ 1275 | "BSD-3-Clause" 1276 | ], 1277 | "authors": [ 1278 | { 1279 | "name": "Sebastian Bergmann", 1280 | "email": "sebastian@phpunit.de" 1281 | } 1282 | ], 1283 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1284 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1285 | "time": "2016-11-19T07:35:10+00:00" 1286 | }, 1287 | { 1288 | "name": "sebastian/recursion-context", 1289 | "version": "2.0.0", 1290 | "source": { 1291 | "type": "git", 1292 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1293 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" 1294 | }, 1295 | "dist": { 1296 | "type": "zip", 1297 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", 1298 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", 1299 | "shasum": "" 1300 | }, 1301 | "require": { 1302 | "php": ">=5.3.3" 1303 | }, 1304 | "require-dev": { 1305 | "phpunit/phpunit": "~4.4" 1306 | }, 1307 | "type": "library", 1308 | "extra": { 1309 | "branch-alias": { 1310 | "dev-master": "2.0.x-dev" 1311 | } 1312 | }, 1313 | "autoload": { 1314 | "classmap": [ 1315 | "src/" 1316 | ] 1317 | }, 1318 | "notification-url": "https://packagist.org/downloads/", 1319 | "license": [ 1320 | "BSD-3-Clause" 1321 | ], 1322 | "authors": [ 1323 | { 1324 | "name": "Jeff Welch", 1325 | "email": "whatthejeff@gmail.com" 1326 | }, 1327 | { 1328 | "name": "Sebastian Bergmann", 1329 | "email": "sebastian@phpunit.de" 1330 | }, 1331 | { 1332 | "name": "Adam Harvey", 1333 | "email": "aharvey@php.net" 1334 | } 1335 | ], 1336 | "description": "Provides functionality to recursively process PHP variables", 1337 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1338 | "time": "2016-11-19T07:33:16+00:00" 1339 | }, 1340 | { 1341 | "name": "sebastian/resource-operations", 1342 | "version": "1.0.0", 1343 | "source": { 1344 | "type": "git", 1345 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1346 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 1347 | }, 1348 | "dist": { 1349 | "type": "zip", 1350 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1351 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1352 | "shasum": "" 1353 | }, 1354 | "require": { 1355 | "php": ">=5.6.0" 1356 | }, 1357 | "type": "library", 1358 | "extra": { 1359 | "branch-alias": { 1360 | "dev-master": "1.0.x-dev" 1361 | } 1362 | }, 1363 | "autoload": { 1364 | "classmap": [ 1365 | "src/" 1366 | ] 1367 | }, 1368 | "notification-url": "https://packagist.org/downloads/", 1369 | "license": [ 1370 | "BSD-3-Clause" 1371 | ], 1372 | "authors": [ 1373 | { 1374 | "name": "Sebastian Bergmann", 1375 | "email": "sebastian@phpunit.de" 1376 | } 1377 | ], 1378 | "description": "Provides a list of PHP built-in functions that operate on resources", 1379 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1380 | "time": "2015-07-28T20:34:47+00:00" 1381 | }, 1382 | { 1383 | "name": "sebastian/version", 1384 | "version": "2.0.1", 1385 | "source": { 1386 | "type": "git", 1387 | "url": "https://github.com/sebastianbergmann/version.git", 1388 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1389 | }, 1390 | "dist": { 1391 | "type": "zip", 1392 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1393 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1394 | "shasum": "" 1395 | }, 1396 | "require": { 1397 | "php": ">=5.6" 1398 | }, 1399 | "type": "library", 1400 | "extra": { 1401 | "branch-alias": { 1402 | "dev-master": "2.0.x-dev" 1403 | } 1404 | }, 1405 | "autoload": { 1406 | "classmap": [ 1407 | "src/" 1408 | ] 1409 | }, 1410 | "notification-url": "https://packagist.org/downloads/", 1411 | "license": [ 1412 | "BSD-3-Clause" 1413 | ], 1414 | "authors": [ 1415 | { 1416 | "name": "Sebastian Bergmann", 1417 | "email": "sebastian@phpunit.de", 1418 | "role": "lead" 1419 | } 1420 | ], 1421 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1422 | "homepage": "https://github.com/sebastianbergmann/version", 1423 | "time": "2016-10-03T07:35:21+00:00" 1424 | }, 1425 | { 1426 | "name": "symfony/yaml", 1427 | "version": "v3.2.2", 1428 | "source": { 1429 | "type": "git", 1430 | "url": "https://github.com/symfony/yaml.git", 1431 | "reference": "50eadbd7926e31842893c957eca362b21592a97d" 1432 | }, 1433 | "dist": { 1434 | "type": "zip", 1435 | "url": "https://api.github.com/repos/symfony/yaml/zipball/50eadbd7926e31842893c957eca362b21592a97d", 1436 | "reference": "50eadbd7926e31842893c957eca362b21592a97d", 1437 | "shasum": "" 1438 | }, 1439 | "require": { 1440 | "php": ">=5.5.9" 1441 | }, 1442 | "require-dev": { 1443 | "symfony/console": "~2.8|~3.0" 1444 | }, 1445 | "suggest": { 1446 | "symfony/console": "For validating YAML files using the lint command" 1447 | }, 1448 | "type": "library", 1449 | "extra": { 1450 | "branch-alias": { 1451 | "dev-master": "3.2-dev" 1452 | } 1453 | }, 1454 | "autoload": { 1455 | "psr-4": { 1456 | "Symfony\\Component\\Yaml\\": "" 1457 | }, 1458 | "exclude-from-classmap": [ 1459 | "/Tests/" 1460 | ] 1461 | }, 1462 | "notification-url": "https://packagist.org/downloads/", 1463 | "license": [ 1464 | "MIT" 1465 | ], 1466 | "authors": [ 1467 | { 1468 | "name": "Fabien Potencier", 1469 | "email": "fabien@symfony.com" 1470 | }, 1471 | { 1472 | "name": "Symfony Community", 1473 | "homepage": "https://symfony.com/contributors" 1474 | } 1475 | ], 1476 | "description": "Symfony Yaml Component", 1477 | "homepage": "https://symfony.com", 1478 | "time": "2017-01-03T13:51:32+00:00" 1479 | }, 1480 | { 1481 | "name": "webmozart/assert", 1482 | "version": "1.2.0", 1483 | "source": { 1484 | "type": "git", 1485 | "url": "https://github.com/webmozart/assert.git", 1486 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 1487 | }, 1488 | "dist": { 1489 | "type": "zip", 1490 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 1491 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 1492 | "shasum": "" 1493 | }, 1494 | "require": { 1495 | "php": "^5.3.3 || ^7.0" 1496 | }, 1497 | "require-dev": { 1498 | "phpunit/phpunit": "^4.6", 1499 | "sebastian/version": "^1.0.1" 1500 | }, 1501 | "type": "library", 1502 | "extra": { 1503 | "branch-alias": { 1504 | "dev-master": "1.3-dev" 1505 | } 1506 | }, 1507 | "autoload": { 1508 | "psr-4": { 1509 | "Webmozart\\Assert\\": "src/" 1510 | } 1511 | }, 1512 | "notification-url": "https://packagist.org/downloads/", 1513 | "license": [ 1514 | "MIT" 1515 | ], 1516 | "authors": [ 1517 | { 1518 | "name": "Bernhard Schussek", 1519 | "email": "bschussek@gmail.com" 1520 | } 1521 | ], 1522 | "description": "Assertions to validate method input/output with nice error messages.", 1523 | "keywords": [ 1524 | "assert", 1525 | "check", 1526 | "validate" 1527 | ], 1528 | "time": "2016-11-23T20:04:58+00:00" 1529 | } 1530 | ], 1531 | "aliases": [], 1532 | "minimum-stability": "dev", 1533 | "stability-flags": [], 1534 | "prefer-stable": true, 1535 | "prefer-lowest": false, 1536 | "platform": { 1537 | "php": ">=5.4.0" 1538 | }, 1539 | "platform-dev": [] 1540 | } 1541 | -------------------------------------------------------------------------------- /js/0-unit-test-examples/FortuneTellerTest.js: -------------------------------------------------------------------------------- 1 | import test from 'tape'; 2 | import sinon from 'sinon'; 3 | import FortuneTeller from './src/FortuneTeller'; 4 | 5 | test( 'FortuneTeller#answer() ...', ( assert ) => { 6 | const answer = 'some answer here'; 7 | 8 | const oracle = { 9 | answer: sinon.stub().returns( answer ) 10 | }; 11 | 12 | const testee = new FortuneTeller( oracle ); 13 | 14 | assert.equal( 15 | testee.answer( 0 ), 16 | '', 17 | '... SHOULD return no answer for invalid or not enough money.' 18 | ); 19 | 20 | assert.equal( 21 | testee.answer( -5 ), 22 | '', 23 | '... SHOULD return no answer for invalid or not enough money.' 24 | ); 25 | 26 | assert.equal( 27 | testee.answer( null ), 28 | '', 29 | '... SHOULD return no answer for invalid or not enough money.' 30 | ); 31 | 32 | assert.equal( 33 | testee.answer( true ), 34 | '', 35 | '... SHOULD return no answer for invalid or not enough money.' 36 | ); 37 | 38 | assert.equal( 39 | testee.answer( false ), 40 | '', 41 | '... SHOULD return no answer for invalid or not enough money.' 42 | ); 43 | 44 | assert.equal( 45 | testee.answer( '' ), 46 | '', 47 | '... SHOULD return no answer for invalid or not enough money.' 48 | ); 49 | 50 | assert.equal( 51 | testee.answer( [] ), 52 | '', 53 | '... SHOULD return no answer for invalid or not enough money.' 54 | ); 55 | 56 | assert.equal( 57 | testee.answer( 5 ), 58 | answer, 59 | '... SHOULD return the expected answer for enough money.' 60 | ); 61 | 62 | assert.equal( 63 | testee.answer( '5' ), 64 | answer, 65 | '... SHOULD return the expected answer for enough money.' 66 | ); 67 | 68 | assert.equal( 69 | testee.answer( 100 ), 70 | answer, 71 | '... SHOULD return the expected answer for enough money.' 72 | ); 73 | 74 | assert.equal( 75 | testee.answer( '100' ), 76 | answer, 77 | '... SHOULD return the expected answer for enough money.' 78 | ); 79 | 80 | assert.end(); 81 | } ); 82 | -------------------------------------------------------------------------------- /js/0-unit-test-examples/OracleTest.js: -------------------------------------------------------------------------------- 1 | import test from 'tape'; 2 | import Oracle from './src/Oracle'; 3 | 4 | test( 'Oracle#answer() ...', ( assert ) => { 5 | assert.equal( 6 | ( new Oracle() ).answer(), 7 | '42', 8 | '... SHOULD return the expected answer.' 9 | ); 10 | 11 | assert.end(); 12 | } ); 13 | -------------------------------------------------------------------------------- /js/0-unit-test-examples/ThankfulOracleTest.js: -------------------------------------------------------------------------------- 1 | import test from 'tape'; 2 | import sinon from 'sinon'; 3 | import ThankfulOracle from './src/ThankfulOracle'; 4 | 5 | test( 'ThankfulOracle#answer() ...', ( assert ) => { 6 | global.showNotice = { 7 | note: sinon.spy() 8 | }; 9 | 10 | const money = 42; 11 | 12 | assert.equal( 13 | typeof ( new ThankfulOracle() ).answer( money ), 14 | 'number', 15 | '... SHOULD return a number.' 16 | ); 17 | 18 | assert.equal( 19 | global.showNotice.note.callCount, 20 | 1, 21 | '... SHOULD say thanks once.' 22 | ); 23 | 24 | assert.equal( 25 | global.showNotice.note.calledWithMatch( new RegExp( `"${Number( money )}"` ) ), 26 | true, 27 | '... SHOULD say thanks for the amount of money spent.' 28 | ); 29 | 30 | delete global.showNotice; 31 | 32 | assert.end(); 33 | } ); 34 | -------------------------------------------------------------------------------- /js/0-unit-test-examples/src/FortuneTeller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Fortune teller answering what an oracle friend of hers answers, or nothing. 3 | */ 4 | class FortuneTeller { 5 | /** 6 | * Constructor. Sets up the members. 7 | * @param {Oracle} oracle - The oracle object. 8 | */ 9 | constructor( oracle ) { 10 | this.oracle = oracle; 11 | } 12 | 13 | /** 14 | * Returns the answer to life, universe and everything—in case you spend enough money, that is. 15 | * @param {number} [money=0] - Money spent for getting an answer. 16 | * @returns {string} An answer. 17 | */ 18 | answer( money = 0 ) { 19 | if ( Number( money ) < 5 ) { 20 | return ''; 21 | } 22 | 23 | return this.oracle.answer(); 24 | } 25 | } 26 | 27 | export default FortuneTeller; 28 | -------------------------------------------------------------------------------- /js/0-unit-test-examples/src/Oracle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Oracle knowing the answer to life, universe and everything. 3 | */ 4 | class Oracle { 5 | /** 6 | * Returns the answer to life, universe and everything. 7 | * 8 | * @returns {string} The answer to life, universe and everything. 9 | */ 10 | answer() { 11 | return '42'; 12 | } 13 | } 14 | 15 | export default Oracle; 16 | -------------------------------------------------------------------------------- /js/0-unit-test-examples/src/ThankfulOracle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Oracle answering with a random number, thanking for your money. 3 | */ 4 | class ThankfulOracle { 5 | /** 6 | * Returns a random number. 7 | * @param {number} money - Money spent for getting an answer. 8 | * @returns {number} An answer. 9 | */ 10 | answer( money ) { 11 | showNotice.note( `Thanks for "${Number( money )}", buddy.` ); 12 | 13 | return Math.random(); 14 | } 15 | } 16 | 17 | export default ThankfulOracle; 18 | -------------------------------------------------------------------------------- /js/1-bad-practices/src/breaking-the-law-of-demeter.js: -------------------------------------------------------------------------------- 1 | function isIdEven( someObject ) { 2 | var id = someObject.getOtherObject().getId(); 3 | 4 | return ! ( id % 2 ); 5 | } 6 | 7 | function filterByEvenId( someObject ) { 8 | if ( isIdEven( someObject ) ) { 9 | return someObject; 10 | } 11 | 12 | return undefined; 13 | } 14 | -------------------------------------------------------------------------------- /js/1-bad-practices/src/eval-expressions.js: -------------------------------------------------------------------------------- 1 | function badlyDesignedFunction( data ) { 2 | return eval( '42 === data' ); 3 | } 4 | -------------------------------------------------------------------------------- /js/1-bad-practices/src/global-state.js: -------------------------------------------------------------------------------- 1 | function someFunction() { 2 | if ( 42 === globalFoo ) { 3 | // ... 4 | } 5 | 6 | // ... 7 | } 8 | -------------------------------------------------------------------------------- /js/1-bad-practices/src/incomplete-initialization.js: -------------------------------------------------------------------------------- 1 | function Renderer() { 2 | var formatter; 3 | 4 | this.setFormatter = function( f ) { 5 | formatter = f; 6 | }; 7 | 8 | this.getFormattedData = function( data ) { // <-- SUT 9 | return formatter.format( data ); 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /js/1-bad-practices/src/leaving-the-context.js: -------------------------------------------------------------------------------- 1 | function processData( data ) { 2 | data = prepareData( data ); 3 | sendData( data ); 4 | 5 | window.location.href = 'http://example.com'; 6 | } 7 | -------------------------------------------------------------------------------- /js/1-bad-practices/src/no-feedback.js: -------------------------------------------------------------------------------- 1 | function maybeDoSomething() { 2 | if ( ! checkSomething() ) { 3 | return; 4 | } 5 | 6 | doSomething(); 7 | } 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testable-code", 3 | "version": "0.0.9", 4 | "description": "Example code for the talk \"How (Not) to Write Testable Code\" at WordCamp Nuremberg, 2016.", 5 | "keywords": [ 6 | "code", 7 | "es6", 8 | "javascript", 9 | "mockery", 10 | "php", 11 | "phpunit", 12 | "sinon", 13 | "tape", 14 | "testable", 15 | "testing", 16 | "unit" 17 | ], 18 | "homepage": "https://github.com/tfrommen/testable-code", 19 | "bugs": "https://github.com/tfrommen/testable-code/issues", 20 | "license": "MIT", 21 | "author": { 22 | "name": "Thorsten Frommen", 23 | "email": "info@tfrommen.de", 24 | "url": "https://tfrommen.de" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "https://github.com/tfrommen/testable-code" 29 | }, 30 | "devDependencies": { 31 | "babel-preset-es2015": "^6.0.0", 32 | "babel-tape-runner": "^2.0.0", 33 | "sinon": "^1.17.0", 34 | "tape": "^4.6.0" 35 | }, 36 | "scripts": { 37 | "test": "babel-tape-runner js/**/*Test.js" 38 | }, 39 | "babel": { 40 | "presets": [ 41 | "es2015" 42 | ] 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/FortuneTellerMockeryTest.php: -------------------------------------------------------------------------------- 1 | $answer, 26 | ] ); 27 | 28 | $this->assertSame( 29 | $expected, 30 | ( new FortuneTeller( $oracle ) )->answer( $money ), 31 | 'answer() should return the expected answer.' 32 | ); 33 | } 34 | 35 | /** 36 | * @return array[] 37 | */ 38 | public function provide_answer_data() { 39 | 40 | $answer = 'answer'; 41 | 42 | return [ 43 | 'no_money' => [ 44 | 'expected' => '', 45 | 'money' => 0, 46 | 'answer' => $answer, 47 | ], 48 | 'negative_money' => [ 49 | 'expected' => '', 50 | 'money' => -5, 51 | 'answer' => $answer, 52 | ], 53 | 'money_null' => [ 54 | 'expected' => '', 55 | 'money' => null, 56 | 'answer' => $answer, 57 | ], 58 | 'money_true' => [ 59 | 'expected' => '', 60 | 'money' => true, 61 | 'answer' => $answer, 62 | ], 63 | 'money_false' => [ 64 | 'expected' => '', 65 | 'money' => false, 66 | 'answer' => $answer, 67 | ], 68 | 'money_empty_string' => [ 69 | 'expected' => '', 70 | 'money' => '', 71 | 'answer' => $answer, 72 | ], 73 | 'money_array' => [ 74 | 'expected' => '', 75 | 'money' => [], 76 | 'answer' => $answer, 77 | ], 78 | 'enough_money' => [ 79 | 'expected' => $answer, 80 | 'money' => 5, 81 | 'answer' => $answer, 82 | ], 83 | 'enough_money_string' => [ 84 | 'expected' => $answer, 85 | 'money' => '5', 86 | 'answer' => $answer, 87 | ], 88 | 'more_than_enough_money' => [ 89 | 'expected' => $answer, 90 | 'money' => 100, 91 | 'answer' => $answer, 92 | ], 93 | 'more_than_enough_money_string' => [ 94 | 'expected' => $answer, 95 | 'money' => '100', 96 | 'answer' => $answer, 97 | ], 98 | ]; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/FortuneTellerTest.php: -------------------------------------------------------------------------------- 1 | getMockBuilder( 'Oracle' ) 23 | ->getMock(); 24 | $oracle->method( 'answer' ) 25 | ->willReturn( $answer ); 26 | 27 | $this->assertSame( 28 | $expected, 29 | ( new FortuneTeller( $oracle ) )->answer( $money ), 30 | 'answer() should return the expected answer.' 31 | ); 32 | } 33 | 34 | /** 35 | * @return array[] 36 | */ 37 | public function provide_answer_data() { 38 | 39 | $answer = 'answer'; 40 | 41 | return [ 42 | 'no_money' => [ 43 | 'expected' => '', 44 | 'money' => 0, 45 | 'answer' => $answer, 46 | ], 47 | 'negative_money' => [ 48 | 'expected' => '', 49 | 'money' => -5, 50 | 'answer' => $answer, 51 | ], 52 | 'money_null' => [ 53 | 'expected' => '', 54 | 'money' => null, 55 | 'answer' => $answer, 56 | ], 57 | 'money_true' => [ 58 | 'expected' => '', 59 | 'money' => true, 60 | 'answer' => $answer, 61 | ], 62 | 'money_false' => [ 63 | 'expected' => '', 64 | 'money' => false, 65 | 'answer' => $answer, 66 | ], 67 | 'money_empty_string' => [ 68 | 'expected' => '', 69 | 'money' => '', 70 | 'answer' => $answer, 71 | ], 72 | 'money_array' => [ 73 | 'expected' => '', 74 | 'money' => [], 75 | 'answer' => $answer, 76 | ], 77 | 'enough_money' => [ 78 | 'expected' => $answer, 79 | 'money' => 5, 80 | 'answer' => $answer, 81 | ], 82 | 'enough_money_string' => [ 83 | 'expected' => $answer, 84 | 'money' => '5', 85 | 'answer' => $answer, 86 | ], 87 | 'more_than_enough_money' => [ 88 | 'expected' => $answer, 89 | 'money' => 100, 90 | 'answer' => $answer, 91 | ], 92 | 'more_than_enough_money_string' => [ 93 | 'expected' => $answer, 94 | 'money' => '100', 95 | 'answer' => $answer, 96 | ], 97 | ]; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/HookAwareOracleTest.php: -------------------------------------------------------------------------------- 1 | assertSame( 41 | '42', 42 | ( new HookAwareOracle() )->answer(), 43 | 'answer() should return the unfiltered answer.' 44 | ); 45 | 46 | $this->assertSame( 1, did_action( HookAwareOracle::ACTION ) ); 47 | 48 | $this->assertSame( 1, Monkey::filters()->applied( HookAwareOracle::FILTER ) ); 49 | } 50 | 51 | /** 52 | * Tests if the filtered answer is returned. 53 | * 54 | * @covers HookAwareOracle::answer() 55 | * 56 | * @return void 57 | */ 58 | public function test_return_filtered_answer() { 59 | 60 | $answer = 'some answer here'; 61 | 62 | Filters::expectApplied( HookAwareOracle::FILTER ) 63 | ->once() 64 | ->andReturn( $answer ); 65 | 66 | $this->assertSame( 67 | $answer, 68 | ( new HookAwareOracle() )->answer(), 69 | 'answer() should return the filtered answer.' 70 | ); 71 | 72 | $this->assertSame( 1, did_action( HookAwareOracle::ACTION ) ); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/OracleTest.php: -------------------------------------------------------------------------------- 1 | assertSame( 18 | '42', 19 | ( new Oracle() )->answer(), 20 | 'answer() should return the expected answer.' 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/TranslatingOracleBrainMonkeyTest.php: -------------------------------------------------------------------------------- 1 | once() 41 | ->andReturn( '%d' ); 42 | 43 | $this->assertRegExp( 44 | '/^\d+$/', 45 | ( new TranslatingOracle() )->answer(), 46 | 'answer() should return the expected answer.' 47 | ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/TranslatingOraclePatchworkTest.php: -------------------------------------------------------------------------------- 1 | assertRegExp( 33 | '/^\d+$/', 34 | ( new TranslatingOracle() )->answer(), 35 | 'answer() should return the expected answer.' 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/src/FortuneTeller.php: -------------------------------------------------------------------------------- 1 | oracle = $oracle; 21 | } 22 | 23 | /** 24 | * Returns the answer to life, universe and everything—in case you spend enough money, that is. 25 | * 26 | * @param int $money Optional. Money spent for getting an answer. Defaults to 0. 27 | * 28 | * @return string An answer. 29 | */ 30 | public function answer( $money = 0 ) { 31 | 32 | if ( (int) $money < 5 ) { 33 | return ''; 34 | } 35 | 36 | return $this->oracle->answer(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /php/0-unit-test-examples/src/HookAwareOracle.php: -------------------------------------------------------------------------------- 1 | post_title . '(' . $post_id . ')'; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /php/1-bad-practices/src/creating-real-objects.php: -------------------------------------------------------------------------------- 1 | format( $data ); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /php/1-bad-practices/src/insane-complexity.php: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | php/0-unit-test-examples 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.0.0" 7 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 8 | 9 | ansi-styles@^2.2.1: 10 | version "2.2.1" 11 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 12 | 13 | babel-code-frame@^6.20.0: 14 | version "6.20.0" 15 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" 16 | dependencies: 17 | chalk "^1.1.0" 18 | esutils "^2.0.2" 19 | js-tokens "^2.0.0" 20 | 21 | babel-core@^6.18.0: 22 | version "6.21.0" 23 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.21.0.tgz#75525480c21c803f826ef3867d22c19f080a3724" 24 | dependencies: 25 | babel-code-frame "^6.20.0" 26 | babel-generator "^6.21.0" 27 | babel-helpers "^6.16.0" 28 | babel-messages "^6.8.0" 29 | babel-register "^6.18.0" 30 | babel-runtime "^6.20.0" 31 | babel-template "^6.16.0" 32 | babel-traverse "^6.21.0" 33 | babel-types "^6.21.0" 34 | babylon "^6.11.0" 35 | convert-source-map "^1.1.0" 36 | debug "^2.1.1" 37 | json5 "^0.5.0" 38 | lodash "^4.2.0" 39 | minimatch "^3.0.2" 40 | path-is-absolute "^1.0.0" 41 | private "^0.1.6" 42 | slash "^1.0.0" 43 | source-map "^0.5.0" 44 | 45 | babel-generator@^6.21.0: 46 | version "6.21.0" 47 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.21.0.tgz#605f1269c489a1c75deeca7ea16d43d4656c8494" 48 | dependencies: 49 | babel-messages "^6.8.0" 50 | babel-runtime "^6.20.0" 51 | babel-types "^6.21.0" 52 | detect-indent "^4.0.0" 53 | jsesc "^1.3.0" 54 | lodash "^4.2.0" 55 | source-map "^0.5.0" 56 | 57 | babel-helper-call-delegate@^6.18.0: 58 | version "6.18.0" 59 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" 60 | dependencies: 61 | babel-helper-hoist-variables "^6.18.0" 62 | babel-runtime "^6.0.0" 63 | babel-traverse "^6.18.0" 64 | babel-types "^6.18.0" 65 | 66 | babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: 67 | version "6.18.0" 68 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" 69 | dependencies: 70 | babel-helper-function-name "^6.18.0" 71 | babel-runtime "^6.9.0" 72 | babel-types "^6.18.0" 73 | lodash "^4.2.0" 74 | 75 | babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: 76 | version "6.18.0" 77 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" 78 | dependencies: 79 | babel-helper-get-function-arity "^6.18.0" 80 | babel-runtime "^6.0.0" 81 | babel-template "^6.8.0" 82 | babel-traverse "^6.18.0" 83 | babel-types "^6.18.0" 84 | 85 | babel-helper-get-function-arity@^6.18.0: 86 | version "6.18.0" 87 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" 88 | dependencies: 89 | babel-runtime "^6.0.0" 90 | babel-types "^6.18.0" 91 | 92 | babel-helper-hoist-variables@^6.18.0: 93 | version "6.18.0" 94 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" 95 | dependencies: 96 | babel-runtime "^6.0.0" 97 | babel-types "^6.18.0" 98 | 99 | babel-helper-optimise-call-expression@^6.18.0: 100 | version "6.18.0" 101 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" 102 | dependencies: 103 | babel-runtime "^6.0.0" 104 | babel-types "^6.18.0" 105 | 106 | babel-helper-regex@^6.8.0: 107 | version "6.18.0" 108 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" 109 | dependencies: 110 | babel-runtime "^6.9.0" 111 | babel-types "^6.18.0" 112 | lodash "^4.2.0" 113 | 114 | babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: 115 | version "6.18.0" 116 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" 117 | dependencies: 118 | babel-helper-optimise-call-expression "^6.18.0" 119 | babel-messages "^6.8.0" 120 | babel-runtime "^6.0.0" 121 | babel-template "^6.16.0" 122 | babel-traverse "^6.18.0" 123 | babel-types "^6.18.0" 124 | 125 | babel-helpers@^6.16.0: 126 | version "6.16.0" 127 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" 128 | dependencies: 129 | babel-runtime "^6.0.0" 130 | babel-template "^6.16.0" 131 | 132 | babel-messages@^6.8.0: 133 | version "6.8.0" 134 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" 135 | dependencies: 136 | babel-runtime "^6.0.0" 137 | 138 | babel-plugin-check-es2015-constants@^6.3.13: 139 | version "6.8.0" 140 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" 141 | dependencies: 142 | babel-runtime "^6.0.0" 143 | 144 | babel-plugin-transform-es2015-arrow-functions@^6.3.13: 145 | version "6.8.0" 146 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" 147 | dependencies: 148 | babel-runtime "^6.0.0" 149 | 150 | babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: 151 | version "6.8.0" 152 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" 153 | dependencies: 154 | babel-runtime "^6.0.0" 155 | 156 | babel-plugin-transform-es2015-block-scoping@^6.18.0: 157 | version "6.21.0" 158 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.21.0.tgz#e840687f922e70fb2c42bb13501838c174a115ed" 159 | dependencies: 160 | babel-runtime "^6.20.0" 161 | babel-template "^6.15.0" 162 | babel-traverse "^6.21.0" 163 | babel-types "^6.21.0" 164 | lodash "^4.2.0" 165 | 166 | babel-plugin-transform-es2015-classes@^6.18.0: 167 | version "6.18.0" 168 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" 169 | dependencies: 170 | babel-helper-define-map "^6.18.0" 171 | babel-helper-function-name "^6.18.0" 172 | babel-helper-optimise-call-expression "^6.18.0" 173 | babel-helper-replace-supers "^6.18.0" 174 | babel-messages "^6.8.0" 175 | babel-runtime "^6.9.0" 176 | babel-template "^6.14.0" 177 | babel-traverse "^6.18.0" 178 | babel-types "^6.18.0" 179 | 180 | babel-plugin-transform-es2015-computed-properties@^6.3.13: 181 | version "6.8.0" 182 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" 183 | dependencies: 184 | babel-helper-define-map "^6.8.0" 185 | babel-runtime "^6.0.0" 186 | babel-template "^6.8.0" 187 | 188 | babel-plugin-transform-es2015-destructuring@^6.18.0: 189 | version "6.19.0" 190 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" 191 | dependencies: 192 | babel-runtime "^6.9.0" 193 | 194 | babel-plugin-transform-es2015-duplicate-keys@^6.6.0: 195 | version "6.8.0" 196 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" 197 | dependencies: 198 | babel-runtime "^6.0.0" 199 | babel-types "^6.8.0" 200 | 201 | babel-plugin-transform-es2015-for-of@^6.18.0: 202 | version "6.18.0" 203 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" 204 | dependencies: 205 | babel-runtime "^6.0.0" 206 | 207 | babel-plugin-transform-es2015-function-name@^6.9.0: 208 | version "6.9.0" 209 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" 210 | dependencies: 211 | babel-helper-function-name "^6.8.0" 212 | babel-runtime "^6.9.0" 213 | babel-types "^6.9.0" 214 | 215 | babel-plugin-transform-es2015-literals@^6.3.13: 216 | version "6.8.0" 217 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" 218 | dependencies: 219 | babel-runtime "^6.0.0" 220 | 221 | babel-plugin-transform-es2015-modules-amd@^6.18.0: 222 | version "6.18.0" 223 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" 224 | dependencies: 225 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 226 | babel-runtime "^6.0.0" 227 | babel-template "^6.8.0" 228 | 229 | babel-plugin-transform-es2015-modules-commonjs@^6.18.0: 230 | version "6.18.0" 231 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" 232 | dependencies: 233 | babel-plugin-transform-strict-mode "^6.18.0" 234 | babel-runtime "^6.0.0" 235 | babel-template "^6.16.0" 236 | babel-types "^6.18.0" 237 | 238 | babel-plugin-transform-es2015-modules-systemjs@^6.18.0: 239 | version "6.19.0" 240 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" 241 | dependencies: 242 | babel-helper-hoist-variables "^6.18.0" 243 | babel-runtime "^6.11.6" 244 | babel-template "^6.14.0" 245 | 246 | babel-plugin-transform-es2015-modules-umd@^6.18.0: 247 | version "6.18.0" 248 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" 249 | dependencies: 250 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 251 | babel-runtime "^6.0.0" 252 | babel-template "^6.8.0" 253 | 254 | babel-plugin-transform-es2015-object-super@^6.3.13: 255 | version "6.8.0" 256 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" 257 | dependencies: 258 | babel-helper-replace-supers "^6.8.0" 259 | babel-runtime "^6.0.0" 260 | 261 | babel-plugin-transform-es2015-parameters@^6.18.0: 262 | version "6.21.0" 263 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.21.0.tgz#46a655e6864ef984091448cdf024d87b60b2a7d8" 264 | dependencies: 265 | babel-helper-call-delegate "^6.18.0" 266 | babel-helper-get-function-arity "^6.18.0" 267 | babel-runtime "^6.9.0" 268 | babel-template "^6.16.0" 269 | babel-traverse "^6.21.0" 270 | babel-types "^6.21.0" 271 | 272 | babel-plugin-transform-es2015-shorthand-properties@^6.18.0: 273 | version "6.18.0" 274 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" 275 | dependencies: 276 | babel-runtime "^6.0.0" 277 | babel-types "^6.18.0" 278 | 279 | babel-plugin-transform-es2015-spread@^6.3.13: 280 | version "6.8.0" 281 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" 282 | dependencies: 283 | babel-runtime "^6.0.0" 284 | 285 | babel-plugin-transform-es2015-sticky-regex@^6.3.13: 286 | version "6.8.0" 287 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" 288 | dependencies: 289 | babel-helper-regex "^6.8.0" 290 | babel-runtime "^6.0.0" 291 | babel-types "^6.8.0" 292 | 293 | babel-plugin-transform-es2015-template-literals@^6.6.0: 294 | version "6.8.0" 295 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" 296 | dependencies: 297 | babel-runtime "^6.0.0" 298 | 299 | babel-plugin-transform-es2015-typeof-symbol@^6.18.0: 300 | version "6.18.0" 301 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" 302 | dependencies: 303 | babel-runtime "^6.0.0" 304 | 305 | babel-plugin-transform-es2015-unicode-regex@^6.3.13: 306 | version "6.11.0" 307 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" 308 | dependencies: 309 | babel-helper-regex "^6.8.0" 310 | babel-runtime "^6.0.0" 311 | regexpu-core "^2.0.0" 312 | 313 | babel-plugin-transform-regenerator@^6.16.0: 314 | version "6.21.0" 315 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.21.0.tgz#75d0c7e7f84f379358f508451c68a2c5fa5a9703" 316 | dependencies: 317 | regenerator-transform "0.9.8" 318 | 319 | babel-plugin-transform-strict-mode@^6.18.0: 320 | version "6.18.0" 321 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" 322 | dependencies: 323 | babel-runtime "^6.0.0" 324 | babel-types "^6.18.0" 325 | 326 | babel-polyfill@^6.3.14: 327 | version "6.20.0" 328 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.20.0.tgz#de4a371006139e20990aac0be367d398331204e7" 329 | dependencies: 330 | babel-runtime "^6.20.0" 331 | core-js "^2.4.0" 332 | regenerator-runtime "^0.10.0" 333 | 334 | babel-preset-es2015@^6.0.0: 335 | version "6.18.0" 336 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" 337 | dependencies: 338 | babel-plugin-check-es2015-constants "^6.3.13" 339 | babel-plugin-transform-es2015-arrow-functions "^6.3.13" 340 | babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" 341 | babel-plugin-transform-es2015-block-scoping "^6.18.0" 342 | babel-plugin-transform-es2015-classes "^6.18.0" 343 | babel-plugin-transform-es2015-computed-properties "^6.3.13" 344 | babel-plugin-transform-es2015-destructuring "^6.18.0" 345 | babel-plugin-transform-es2015-duplicate-keys "^6.6.0" 346 | babel-plugin-transform-es2015-for-of "^6.18.0" 347 | babel-plugin-transform-es2015-function-name "^6.9.0" 348 | babel-plugin-transform-es2015-literals "^6.3.13" 349 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 350 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 351 | babel-plugin-transform-es2015-modules-systemjs "^6.18.0" 352 | babel-plugin-transform-es2015-modules-umd "^6.18.0" 353 | babel-plugin-transform-es2015-object-super "^6.3.13" 354 | babel-plugin-transform-es2015-parameters "^6.18.0" 355 | babel-plugin-transform-es2015-shorthand-properties "^6.18.0" 356 | babel-plugin-transform-es2015-spread "^6.3.13" 357 | babel-plugin-transform-es2015-sticky-regex "^6.3.13" 358 | babel-plugin-transform-es2015-template-literals "^6.6.0" 359 | babel-plugin-transform-es2015-typeof-symbol "^6.18.0" 360 | babel-plugin-transform-es2015-unicode-regex "^6.3.13" 361 | babel-plugin-transform-regenerator "^6.16.0" 362 | 363 | babel-register@^6.18.0, babel-register@^6.3.13: 364 | version "6.18.0" 365 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" 366 | dependencies: 367 | babel-core "^6.18.0" 368 | babel-runtime "^6.11.6" 369 | core-js "^2.4.0" 370 | home-or-tmp "^2.0.0" 371 | lodash "^4.2.0" 372 | mkdirp "^0.5.1" 373 | source-map-support "^0.4.2" 374 | 375 | babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.9.0: 376 | version "6.20.0" 377 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" 378 | dependencies: 379 | core-js "^2.4.0" 380 | regenerator-runtime "^0.10.0" 381 | 382 | babel-tape-runner@^2.0.0: 383 | version "2.0.1" 384 | resolved "https://registry.yarnpkg.com/babel-tape-runner/-/babel-tape-runner-2.0.1.tgz#9c012ff9ab0f30020ac11fcc8e848f203f222173" 385 | dependencies: 386 | babel-polyfill "^6.3.14" 387 | babel-register "^6.3.13" 388 | glob "^6.0.1" 389 | 390 | babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: 391 | version "6.16.0" 392 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" 393 | dependencies: 394 | babel-runtime "^6.9.0" 395 | babel-traverse "^6.16.0" 396 | babel-types "^6.16.0" 397 | babylon "^6.11.0" 398 | lodash "^4.2.0" 399 | 400 | babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: 401 | version "6.21.0" 402 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" 403 | dependencies: 404 | babel-code-frame "^6.20.0" 405 | babel-messages "^6.8.0" 406 | babel-runtime "^6.20.0" 407 | babel-types "^6.21.0" 408 | babylon "^6.11.0" 409 | debug "^2.2.0" 410 | globals "^9.0.0" 411 | invariant "^2.2.0" 412 | lodash "^4.2.0" 413 | 414 | babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: 415 | version "6.21.0" 416 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" 417 | dependencies: 418 | babel-runtime "^6.20.0" 419 | esutils "^2.0.2" 420 | lodash "^4.2.0" 421 | to-fast-properties "^1.0.1" 422 | 423 | babylon@^6.11.0: 424 | version "6.14.1" 425 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" 426 | 427 | balanced-match@^0.4.1: 428 | version "0.4.2" 429 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 430 | 431 | brace-expansion@^1.0.0: 432 | version "1.1.6" 433 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 434 | dependencies: 435 | balanced-match "^0.4.1" 436 | concat-map "0.0.1" 437 | 438 | chalk@^1.1.0: 439 | version "1.1.3" 440 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 441 | dependencies: 442 | ansi-styles "^2.2.1" 443 | escape-string-regexp "^1.0.2" 444 | has-ansi "^2.0.0" 445 | strip-ansi "^3.0.0" 446 | supports-color "^2.0.0" 447 | 448 | concat-map@0.0.1: 449 | version "0.0.1" 450 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 451 | 452 | convert-source-map@^1.1.0: 453 | version "1.3.0" 454 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" 455 | 456 | core-js@^2.4.0: 457 | version "2.4.1" 458 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 459 | 460 | debug@^2.1.1, debug@^2.2.0: 461 | version "2.6.0" 462 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" 463 | dependencies: 464 | ms "0.7.2" 465 | 466 | deep-equal@~1.0.1: 467 | version "1.0.1" 468 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 469 | 470 | define-properties@^1.1.2: 471 | version "1.1.2" 472 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 473 | dependencies: 474 | foreach "^2.0.5" 475 | object-keys "^1.0.8" 476 | 477 | defined@~1.0.0: 478 | version "1.0.0" 479 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 480 | 481 | detect-indent@^4.0.0: 482 | version "4.0.0" 483 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 484 | dependencies: 485 | repeating "^2.0.0" 486 | 487 | es-abstract@^1.5.0: 488 | version "1.6.1" 489 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.6.1.tgz#bb8a2064120abcf928a086ea3d9043114285ec99" 490 | dependencies: 491 | es-to-primitive "^1.1.1" 492 | function-bind "^1.1.0" 493 | is-callable "^1.1.3" 494 | is-regex "^1.0.3" 495 | 496 | es-to-primitive@^1.1.1: 497 | version "1.1.1" 498 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 499 | dependencies: 500 | is-callable "^1.1.1" 501 | is-date-object "^1.0.1" 502 | is-symbol "^1.0.1" 503 | 504 | escape-string-regexp@^1.0.2: 505 | version "1.0.5" 506 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 507 | 508 | esutils@^2.0.2: 509 | version "2.0.2" 510 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 511 | 512 | for-each@~0.3.2: 513 | version "0.3.2" 514 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" 515 | dependencies: 516 | is-function "~1.0.0" 517 | 518 | foreach@^2.0.5: 519 | version "2.0.5" 520 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 521 | 522 | formatio@1.1.1: 523 | version "1.1.1" 524 | resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" 525 | dependencies: 526 | samsam "~1.1" 527 | 528 | fs.realpath@^1.0.0: 529 | version "1.0.0" 530 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 531 | 532 | function-bind@^1.0.2, function-bind@^1.1.0, function-bind@~1.1.0: 533 | version "1.1.0" 534 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 535 | 536 | glob@^6.0.1: 537 | version "6.0.4" 538 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 539 | dependencies: 540 | inflight "^1.0.4" 541 | inherits "2" 542 | minimatch "2 || 3" 543 | once "^1.3.0" 544 | path-is-absolute "^1.0.0" 545 | 546 | glob@~7.1.1: 547 | version "7.1.1" 548 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 549 | dependencies: 550 | fs.realpath "^1.0.0" 551 | inflight "^1.0.4" 552 | inherits "2" 553 | minimatch "^3.0.2" 554 | once "^1.3.0" 555 | path-is-absolute "^1.0.0" 556 | 557 | globals@^9.0.0: 558 | version "9.14.0" 559 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" 560 | 561 | has-ansi@^2.0.0: 562 | version "2.0.0" 563 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 564 | dependencies: 565 | ansi-regex "^2.0.0" 566 | 567 | has@~1.0.1: 568 | version "1.0.1" 569 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 570 | dependencies: 571 | function-bind "^1.0.2" 572 | 573 | home-or-tmp@^2.0.0: 574 | version "2.0.0" 575 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 576 | dependencies: 577 | os-homedir "^1.0.0" 578 | os-tmpdir "^1.0.1" 579 | 580 | inflight@^1.0.4: 581 | version "1.0.6" 582 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 583 | dependencies: 584 | once "^1.3.0" 585 | wrappy "1" 586 | 587 | inherits@2, inherits@~2.0.3: 588 | version "2.0.3" 589 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 590 | 591 | inherits@2.0.1: 592 | version "2.0.1" 593 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 594 | 595 | invariant@^2.2.0: 596 | version "2.2.2" 597 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 598 | dependencies: 599 | loose-envify "^1.0.0" 600 | 601 | is-callable@^1.1.1, is-callable@^1.1.3: 602 | version "1.1.3" 603 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 604 | 605 | is-date-object@^1.0.1: 606 | version "1.0.1" 607 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 608 | 609 | is-finite@^1.0.0: 610 | version "1.0.2" 611 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 612 | dependencies: 613 | number-is-nan "^1.0.0" 614 | 615 | is-function@~1.0.0: 616 | version "1.0.1" 617 | resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" 618 | 619 | is-regex@^1.0.3: 620 | version "1.0.3" 621 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" 622 | 623 | is-symbol@^1.0.1: 624 | version "1.0.1" 625 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 626 | 627 | js-tokens@^2.0.0: 628 | version "2.0.0" 629 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 630 | 631 | jsesc@^1.3.0: 632 | version "1.3.0" 633 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 634 | 635 | jsesc@~0.5.0: 636 | version "0.5.0" 637 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 638 | 639 | json5@^0.5.0: 640 | version "0.5.1" 641 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 642 | 643 | lodash@^4.2.0: 644 | version "4.17.4" 645 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 646 | 647 | lolex@1.3.2: 648 | version "1.3.2" 649 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" 650 | 651 | loose-envify@^1.0.0: 652 | version "1.3.0" 653 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" 654 | dependencies: 655 | js-tokens "^2.0.0" 656 | 657 | "minimatch@2 || 3", minimatch@^3.0.2: 658 | version "3.0.3" 659 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 660 | dependencies: 661 | brace-expansion "^1.0.0" 662 | 663 | minimist@0.0.8: 664 | version "0.0.8" 665 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 666 | 667 | minimist@~1.2.0: 668 | version "1.2.0" 669 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 670 | 671 | mkdirp@^0.5.1: 672 | version "0.5.1" 673 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 674 | dependencies: 675 | minimist "0.0.8" 676 | 677 | ms@0.7.2: 678 | version "0.7.2" 679 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 680 | 681 | number-is-nan@^1.0.0: 682 | version "1.0.1" 683 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 684 | 685 | object-inspect@~1.2.1: 686 | version "1.2.1" 687 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.2.1.tgz#3b62226eb8f6d441751c7d8f22a20ff80ac9dc3f" 688 | 689 | object-keys@^1.0.8: 690 | version "1.0.11" 691 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 692 | 693 | once@^1.3.0: 694 | version "1.4.0" 695 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 696 | dependencies: 697 | wrappy "1" 698 | 699 | os-homedir@^1.0.0: 700 | version "1.0.2" 701 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 702 | 703 | os-tmpdir@^1.0.1: 704 | version "1.0.2" 705 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 706 | 707 | path-is-absolute@^1.0.0: 708 | version "1.0.1" 709 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 710 | 711 | private@^0.1.6: 712 | version "0.1.6" 713 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" 714 | 715 | regenerate@^1.2.1: 716 | version "1.3.2" 717 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 718 | 719 | regenerator-runtime@^0.10.0: 720 | version "0.10.1" 721 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" 722 | 723 | regenerator-transform@0.9.8: 724 | version "0.9.8" 725 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" 726 | dependencies: 727 | babel-runtime "^6.18.0" 728 | babel-types "^6.19.0" 729 | private "^0.1.6" 730 | 731 | regexpu-core@^2.0.0: 732 | version "2.0.0" 733 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 734 | dependencies: 735 | regenerate "^1.2.1" 736 | regjsgen "^0.2.0" 737 | regjsparser "^0.1.4" 738 | 739 | regjsgen@^0.2.0: 740 | version "0.2.0" 741 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 742 | 743 | regjsparser@^0.1.4: 744 | version "0.1.5" 745 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 746 | dependencies: 747 | jsesc "~0.5.0" 748 | 749 | repeating@^2.0.0: 750 | version "2.0.1" 751 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 752 | dependencies: 753 | is-finite "^1.0.0" 754 | 755 | resolve@~1.1.7: 756 | version "1.1.7" 757 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 758 | 759 | resumer@~0.0.0: 760 | version "0.0.0" 761 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" 762 | dependencies: 763 | through "~2.3.4" 764 | 765 | samsam@1.1.2, samsam@~1.1: 766 | version "1.1.2" 767 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" 768 | 769 | sinon@^1.17.0: 770 | version "1.17.7" 771 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" 772 | dependencies: 773 | formatio "1.1.1" 774 | lolex "1.3.2" 775 | samsam "1.1.2" 776 | util ">=0.10.3 <1" 777 | 778 | slash@^1.0.0: 779 | version "1.0.0" 780 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 781 | 782 | source-map-support@^0.4.2: 783 | version "0.4.8" 784 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.8.tgz#4871918d8a3af07289182e974e32844327b2e98b" 785 | dependencies: 786 | source-map "^0.5.3" 787 | 788 | source-map@^0.5.0, source-map@^0.5.3: 789 | version "0.5.6" 790 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 791 | 792 | string.prototype.trim@~1.1.2: 793 | version "1.1.2" 794 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" 795 | dependencies: 796 | define-properties "^1.1.2" 797 | es-abstract "^1.5.0" 798 | function-bind "^1.0.2" 799 | 800 | strip-ansi@^3.0.0: 801 | version "3.0.1" 802 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 803 | dependencies: 804 | ansi-regex "^2.0.0" 805 | 806 | supports-color@^2.0.0: 807 | version "2.0.0" 808 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 809 | 810 | tape@^4.6.0: 811 | version "4.6.3" 812 | resolved "https://registry.yarnpkg.com/tape/-/tape-4.6.3.tgz#637e77581e9ab2ce17577e9bd4ce4f575806d8b6" 813 | dependencies: 814 | deep-equal "~1.0.1" 815 | defined "~1.0.0" 816 | for-each "~0.3.2" 817 | function-bind "~1.1.0" 818 | glob "~7.1.1" 819 | has "~1.0.1" 820 | inherits "~2.0.3" 821 | minimist "~1.2.0" 822 | object-inspect "~1.2.1" 823 | resolve "~1.1.7" 824 | resumer "~0.0.0" 825 | string.prototype.trim "~1.1.2" 826 | through "~2.3.8" 827 | 828 | through@~2.3.4, through@~2.3.8: 829 | version "2.3.8" 830 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 831 | 832 | to-fast-properties@^1.0.1: 833 | version "1.0.2" 834 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 835 | 836 | "util@>=0.10.3 <1": 837 | version "0.10.3" 838 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 839 | dependencies: 840 | inherits "2.0.1" 841 | 842 | wrappy@1: 843 | version "1.0.2" 844 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 845 | --------------------------------------------------------------------------------