diff --git a/exercises/practice/anagram/.meta/example.php b/exercises/practice/anagram/.meta/example.php index 30747f9e7..a6a97f5f1 100644 --- a/exercises/practice/anagram/.meta/example.php +++ b/exercises/practice/anagram/.meta/example.php @@ -1,27 +1,5 @@ . - * - * To disable strict typing, comment out the directive below. - */ - declare(strict_types=1); function detectAnagrams($anagram, array $possibleMatches) diff --git a/exercises/practice/anagram/.meta/tests.toml b/exercises/practice/anagram/.meta/tests.toml index 7fb93f71b..914693ac3 100644 --- a/exercises/practice/anagram/.meta/tests.toml +++ b/exercises/practice/anagram/.meta/tests.toml @@ -1,12 +1,24 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. [dd40c4d2-3c8b-44e5-992a-f42b393ec373] description = "no matches" [b3cca662-f50a-489e-ae10-ab8290a09bdc] description = "detects two anagrams" +include = false + +[03eb9bbe-8906-4ea0-84fa-ffe711b52c8b] +description = "detects two anagrams" +reimplements = "b3cca662-f50a-489e-ae10-ab8290a09bdc" [a27558ee-9ba0-4552-96b1-ecf665b06556] description = "does not detect anagram subsets" @@ -34,12 +46,43 @@ description = "detects anagrams using case-insensitive possible matches" [7cc195ad-e3c7-44ee-9fd2-d3c344806a2c] description = "does not detect an anagram if the original word is repeated" +include = false + +[630abb71-a94e-4715-8395-179ec1df9f91] +description = "does not detect an anagram if the original word is repeated" +reimplements = "7cc195ad-e3c7-44ee-9fd2-d3c344806a2c" [9878a1c9-d6ea-4235-ae51-3ea2befd6842] description = "anagrams must use all letters exactly once" [85757361-4535-45fd-ac0e-3810d40debc1] description = "words are not anagrams of themselves (case-insensitive)" +include = false + +[68934ed0-010b-4ef9-857a-20c9012d1ebf] +description = "words are not anagrams of themselves" +reimplements = "85757361-4535-45fd-ac0e-3810d40debc1" + +[589384f3-4c8a-4e7d-9edc-51c3e5f0c90e] +description = "words are not anagrams of themselves even if letter case is partially different" +reimplements = "85757361-4535-45fd-ac0e-3810d40debc1" + +[ba53e423-7e02-41ee-9ae2-71f91e6d18e6] +description = "words are not anagrams of themselves even if letter case is completely different" +reimplements = "85757361-4535-45fd-ac0e-3810d40debc1" [a0705568-628c-4b55-9798-82e4acde51ca] description = "words other than themselves can be anagrams" +include = false + +[33d3f67e-fbb9-49d3-a90e-0beb00861da7] +description = "words other than themselves can be anagrams" +reimplements = "a0705568-628c-4b55-9798-82e4acde51ca" + +[a6854f66-eec1-4afd-a137-62ef2870c051] +include = false +description = "handles case of greek letters" + +[fd3509e5-e3ba-409d-ac3d-a9ac84d13296] +description = "different characters may have the same bytes" +include = false diff --git a/exercises/practice/anagram/AnagramTest.php b/exercises/practice/anagram/AnagramTest.php index 5fd75e82e..03a2f1136 100644 --- a/exercises/practice/anagram/AnagramTest.php +++ b/exercises/practice/anagram/AnagramTest.php @@ -1,27 +1,5 @@ . - * - * To disable strict typing, comment out the directive below. - */ - declare(strict_types=1); class AnagramTest extends PHPUnit\Framework\TestCase @@ -31,37 +9,50 @@ public static function setUpBeforeClass(): void require_once 'Anagram.php'; } + /** + * uuid dd40c4d2-3c8b-44e5-992a-f42b393ec373 + * @testdox No matches + */ public function testNoMatches(): void { $this->assertEquals([], detectAnagrams('diaper', ['hello', 'world', 'zombies', 'pants'])); } - public function testDetectsSimpleAnagram(): void + /** + * uuid 03eb9bbe-8906-4ea0-84fa-ffe711b52c8b + * @testdox Detects two anagrams + */ + public function testDetectsTwoAnagrams(): void { - $this->assertEquals(['tan'], detectAnagrams('ant', ['tan', 'stand', 'at'])); - } - - public function testDoesNotDetectFalsePositives(): void - { - $this->assertEquals([], detectAnagrams('galea', ['eagle'])); - } - - public function testDetectsMultipleAnagrams(): void - { - $this->assertEquals(['stream', 'maters'], detectAnagrams('master', ['stream', 'pigeon', 'maters'])); + $this->assertEquals( + ['lemons', 'melons'], + detectAnagrams('solemn', ['lemons', 'cherry', 'melons']) + ); } + /** + * uuid a27558ee-9ba0-4552-96b1-ecf665b06556 + * @testdox Does not detect anagram subsets + */ public function testDoesNotDetectAnagramSubsets(): void { $this->assertEquals([], detectAnagrams('good', ['dog', 'goody'])); } + /** + * uuid 64cd4584-fc15-4781-b633-3d814c4941a4 + * @testdox Detects anagram + */ public function testDetectsAnagram(): void { $this->assertEquals(['inlets'], detectAnagrams('listen', ['enlists', 'google', 'inlets', 'banana'])); } - public function testDetectsMultipleAnagrams2(): void + /** + * uuid 99c91beb-838f-4ccd-b123-935139917283 + * @testdox Detects three anagrams + */ + public function testDetectsThreeAnagrams(): void { $this->assertEquals( ['gallery', 'regally', 'largely'], @@ -69,70 +60,111 @@ public function testDetectsMultipleAnagrams2(): void ); } - public function testDoesNotDetectIdenticalWords(): void + /** + * uuid 78487770-e258-4e1f-a646-8ece10950d90 + * @testdox Detects multiple anagrams with different case + */ + public function testDetectsMultipleAnagramsWithDifferentCase(): void { - $this->assertEquals(['cron'], detectAnagrams('corn', ['corn', 'dark', 'Corn', 'rank', 'CORN', 'cron', 'park'])); + $this->assertEquals(['Eons', 'ONES'], detectAnagrams('nose', ['Eons', 'ONES'])); } + /** + * uuid 1d0ab8aa-362f-49b7-9902-3d0c668d557b + * @testdox Does not detect non-anagrams with identical checksum + */ public function testDoesNotDetectNonAnagramsWithIdenticalChecksum(): void { $this->assertEquals([], detectAnagrams('mass', ['last'])); } + /** + * uuid 9e632c0b-c0b1-4804-8cc1-e295dea6d8a8 + * @testdox Detects anagrams case-insensitively + */ public function testDetectsAnagramsCaseInsensitively(): void { $this->assertEquals(['Carthorse'], detectAnagrams('Orchestra', ['cashregister', 'Carthorse', 'radishes'])); } + /** + * uuid b248e49f-0905-48d2-9c8d-bd02d8c3e392 + * @testdox Detects anagrams using case-insensitive subject + */ public function testDetectsAnagramsUsingCaseInsensitiveSubject(): void { $this->assertEquals(['carthorse'], detectAnagrams('Orchestra', ['cashregister', 'carthorse', 'radishes'])); } + /** + * uuid 5c3d6a8d-7e0b-4b9e-9e1e-6c7d7f8b9c0c + * @testdox Detects anagrams using case-insensitive possible matches + */ public function testDetectsAnagramsUsingCaseInsensitvePossibleMatches(): void { $this->assertEquals(['Carthorse'], detectAnagrams('orchestra', ['cashregister', 'Carthorse', 'radishes'])); } - public function testDoesNotDetectAWordAsItsOwnAnagram(): void - { - $this->assertEquals([], detectAnagrams('banana', ['Banana'])); - } - + /** + * uuid 630abb71-a94e-4715-8395-179ec1df9f91 + * @testdox Does not detect an anagram if the original word is repeated + */ public function testDoesNotDetectAAnagramIfTheOriginalWordIsRepeated(): void { - $this->assertEquals([], detectAnagrams('go', ['go Go GO'])); + $this->assertEquals([], detectAnagrams('go', ['goGoGO'])); } + /** + * uuid 9878a1c9-d6ea-4235-ae51-3ea2befd6842 + * @testdox Anagrams must use all letters exactly once + */ public function testAnagramsMustUseAllLettersExactlyOnce(): void { $this->assertEquals([], detectAnagrams('tapper', ['patter'])); } - public function testEliminatesAnagramsWithTheSameChecksum(): void + /** + * uuid 68934ed0-010b-4ef9-857a-20c9012d1ebf + * @testdox Words are not anagrams of themselves + */ + public function testWordsAreNotAnagramsOfThemselves(): void { - $this->assertEquals([], detectAnagrams('mass', ['last'])); + $this->assertEquals([], detectAnagrams('BANANA', ['BANANA'])); } - public function testDetectsUnicodeAnagrams(): void + /** + * uuid 589384f3-4c8a-4e7d-9edc-51c3e5f0c90e + * @testdox Words are not anagrams of themselves even if letter case is partially different + */ + public function testWordsAreNotAnagramsOfThemselvesEvenIfLetterCaseIsPartiallyDifferent(): void { - $this->markTestSkipped('This requires `mbstring` to be installed and thus is optional.'); - $this->assertEquals(['ΒΓΑ', 'γβα'], detectAnagrams('ΑΒΓ', ['ΒΓΑ', 'ΒΓΔ', 'γβα'])); + $this->assertEquals([], detectAnagrams('BANANA', ['Banana'])); } - public function testEliminatesMisleadingUnicodeAnagrams(): void + /** + * uuid ba53e423-7e02-41ee-9ae2-71f91e6d18e6 + * @testdox Words are not anagrams of themselves even if letter case is completely different + */ + public function testWordsAreNotAnagramsOfThemselvesEvenIfLetterCaseIsCompletelyDifferent(): void { - $this->markTestSkipped('This requires `mbstring` to be installed and thus is optional.'); - $this->assertEquals([], detectAnagrams('ΑΒΓ', ['ABΓ'])); + $this->assertEquals([], detectAnagrams('BANANA', ['banana'])); } - public function testCapitalWordIsNotOwnAnagram(): void + /** + * uuid 33d3f67e-fbb9-49d3-a90e-0beb00861da7 + * @testdox Words other than themselves can be anagrams + */ + public function testWordsOtherThanThemselvesCanBeAnagrams(): void { - $this->assertEquals([], detectAnagrams('BANANA', ['Banana'])); + $this->assertEquals(['Silent'], detectAnagrams('LISTEN', ['LISTEN', 'Silent'])); } - public function testAnagramsMustUseAllLettersExactlyOnce2(): void + /** + * uuid a6854f66-eec1-4afd-a137-62ef2870c051 + * @testdox Handles case of greek letters + */ + public function testHandlesCaseOfGreekLetters(): void { - $this->assertEquals([], detectAnagrams('patter', ['tapper'])); + $this->markTestSkipped('This requires `mbstring` to be installed and thus is optional.'); } }