From 4951b1b0f9a20ab50d4e534806b1ee22ee9d2c6c Mon Sep 17 00:00:00 2001 From: Maurizio Date: Thu, 17 Aug 2023 20:48:18 +0200 Subject: [PATCH] feat: add `toBeSnakeCase` --- src/Mixins/Expectation.php | 12 ++++++++++++ tests/Features/Expect/toBeSnakeCase.php | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/Features/Expect/toBeSnakeCase.php diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index 56e1da09..d128d30b 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -1009,4 +1009,16 @@ final class Expectation return $this; } + + /** + * Asserts that the value is snake_case. + * + * @return self + */ + public function toBeSnakeCase(string $message = ''): self + { + Assert::assertTrue((bool) preg_match('/^[\p{Ll}_]+$/u', (string) $this->value), $message); + + return $this; + } } diff --git a/tests/Features/Expect/toBeSnakeCase.php b/tests/Features/Expect/toBeSnakeCase.php new file mode 100644 index 00000000..121f9e51 --- /dev/null +++ b/tests/Features/Expect/toBeSnakeCase.php @@ -0,0 +1,23 @@ +toBeSnakeCase(); + expect('abc_def')->toBeSnakeCase(); + expect('abc-def')->not->toBeSnakeCase(); + expect('abcDef')->not->toBeSnakeCase(); + expect('AbcDef')->not->toBeSnakeCase(); +}); + +test('failures', function () { + expect('Abc')->toBeSnakeCase(); +})->throws(ExpectationFailedException::class); + +test('failures with custom message', function () { + expect('Abc')->toBeSnakeCase('oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect('abc_def')->not->toBeSnakeCase(); +})->throws(ExpectationFailedException::class);