Skip to content

Commit 020a990

Browse files
committed
fix(anagram): allow arbitrary order of words in result
1 parent 66c8cdc commit 020a990

File tree

1 file changed

+68
-57
lines changed

1 file changed

+68
-57
lines changed

exercises/practice/anagram/anagram_test.cpp

Lines changed: 68 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,160 +5,171 @@
55
#include "test/catch.hpp"
66
#endif
77

8+
#include <string>
9+
#include <unordered_set>
10+
811
using namespace std;
912

1013
// Anagram exercise test case data version 1.5.0
1114

12-
TEST_CASE("no_matches")
13-
{
15+
namespace {
16+
/// Converts a vector into a set to allow comparison for equality regardless of
17+
/// order.
18+
std::unordered_set<std::string> to_set(
19+
std::vector<std::string> const& container) {
20+
return {std::cbegin(container), std::cend(container)};
21+
}
22+
} // namespace
23+
24+
TEST_CASE("no_matches") {
1425
// 'anagram::anagram' defines a class
1526
anagram::anagram subject = anagram::anagram("diaper");
1627
auto matches = subject.matches({"hello", "world", "zombies", "pants"});
1728
vector<string> expected;
1829

19-
REQUIRE(expected == matches);
30+
REQUIRE(to_set(expected) == to_set(matches));
2031
}
2132

2233
#if defined(EXERCISM_RUN_ALL_TESTS)
23-
TEST_CASE("detects_two_anagrams", "[findAnagrams][03eb9bbe-8906-4ea0-84fa-ffe711b52c8b]")
24-
{
34+
TEST_CASE("detects_two_anagrams",
35+
"[findAnagrams][03eb9bbe-8906-4ea0-84fa-ffe711b52c8b]") {
2536
auto subject = anagram::anagram("solemn");
26-
auto matches = subject.matches({"lemons", "cherry", "melons"});
37+
auto matches = subject.matches({"cherry", "melons", "lemons"});
2738
vector<string> expected{"lemons", "melons"};
2839

29-
REQUIRE(expected == matches);
40+
REQUIRE(to_set(expected) == to_set(matches));
3041
}
3142

32-
TEST_CASE("does_not_detect_anagram_subsets", "[findAnagrams][a27558ee-9ba0-4552-96b1-ecf665b06556]")
33-
{
43+
TEST_CASE("does_not_detect_anagram_subsets",
44+
"[findAnagrams][a27558ee-9ba0-4552-96b1-ecf665b06556]") {
3445
auto subject = anagram::anagram("good");
3546
auto matches = subject.matches({"dog", "goody"});
3647
vector<string> expected;
3748

38-
REQUIRE(expected == matches);
49+
REQUIRE(to_set(expected) == to_set(matches));
3950
}
4051

41-
TEST_CASE("detects_anagram", "[findAnagrams][64cd4584-fc15-4781-b633-3d814c4941a4]")
42-
{
52+
TEST_CASE("detects_anagram",
53+
"[findAnagrams][64cd4584-fc15-4781-b633-3d814c4941a4]") {
4354
auto subject = anagram::anagram("listen");
4455
auto matches = subject.matches({"enlists", "google", "inlets", "banana"});
4556
vector<string> expected{"inlets"};
4657

47-
REQUIRE(expected == matches);
58+
REQUIRE(to_set(expected) == to_set(matches));
4859
}
4960

50-
TEST_CASE("detects_three_anagrams", "[findAnagrams][99c91beb-838f-4ccd-b123-935139917283]")
51-
{
61+
TEST_CASE("detects_three_anagrams",
62+
"[findAnagrams][99c91beb-838f-4ccd-b123-935139917283]") {
5263
auto subject = anagram::anagram("allergy");
53-
auto matches = subject.matches({
54-
"gallery",
55-
"ballerina",
56-
"regally",
57-
"clergy",
58-
"largely",
59-
"leading"
60-
});
64+
auto matches = subject.matches(
65+
{"gallery", "ballerina", "regally", "clergy", "largely", "leading"});
6166
vector<string> expected{"gallery", "regally", "largely"};
6267

63-
REQUIRE(expected == matches);
68+
REQUIRE(to_set(expected) == to_set(matches));
6469
}
6570

66-
TEST_CASE("detects_multiple_anagrams_with_different_case", "[findAnagrams][78487770-e258-4e1f-a646-8ece10950d90]")
67-
{
71+
TEST_CASE("detects_multiple_anagrams_with_different_case",
72+
"[findAnagrams][78487770-e258-4e1f-a646-8ece10950d90]") {
6873
auto subject = anagram::anagram("nose");
6974
auto matches = subject.matches({"Eons", "ONES"});
7075
vector<string> expected{"Eons", "ONES"};
7176

72-
REQUIRE(expected == matches);
77+
REQUIRE(to_set(expected) == to_set(matches));
7378
}
7479

75-
TEST_CASE("does_not_detect_non_anagrams_with_identical_checksum", "[findAnagrams][1d0ab8aa-362f-49b7-9902-3d0c668d557b]")
76-
{
80+
TEST_CASE("does_not_detect_non_anagrams_with_identical_checksum",
81+
"[findAnagrams][1d0ab8aa-362f-49b7-9902-3d0c668d557b]") {
7782
auto subject = anagram::anagram("mass");
7883
auto matches = subject.matches({"last"});
7984
vector<string> expected;
8085

81-
REQUIRE(expected == matches);
86+
REQUIRE(to_set(expected) == to_set(matches));
8287
}
8388

84-
TEST_CASE("detects_anagrams_case_insensitively", "[findAnagrams][9e632c0b-c0b1-4804-8cc1-e295dea6d8a8]")
85-
{
89+
TEST_CASE("detects_anagrams_case_insensitively",
90+
"[findAnagrams][9e632c0b-c0b1-4804-8cc1-e295dea6d8a8]") {
8691
auto subject = anagram::anagram("Orchestra");
8792
auto matches = subject.matches({"cashregister", "Carthorse", "radishes"});
8893
vector<string> expected{"Carthorse"};
8994

90-
REQUIRE(expected == matches);
95+
REQUIRE(to_set(expected) == to_set(matches));
9196
}
9297

93-
TEST_CASE("detects_anagrams_using_case_insensitive_subject", "[findAnagrams][b248e49f-0905-48d2-9c8d-bd02d8c3e392]")
94-
{
98+
TEST_CASE("detects_anagrams_using_case_insensitive_subject",
99+
"[findAnagrams][b248e49f-0905-48d2-9c8d-bd02d8c3e392]") {
95100
auto subject = anagram::anagram("Orchestra");
96101
auto matches = subject.matches({"cashregister", "carthorse", "radishes"});
97102
vector<string> expected{"carthorse"};
98103

99-
REQUIRE(expected == matches);
104+
REQUIRE(to_set(expected) == to_set(matches));
100105
}
101106

102-
TEST_CASE("detects_anagrams_using_case_insensitive_possible_matches", "[findAnagrams][f367325c-78ec-411c-be76-e79047f4bd54]")
103-
{
107+
TEST_CASE("detects_anagrams_using_case_insensitive_possible_matches",
108+
"[findAnagrams][f367325c-78ec-411c-be76-e79047f4bd54]") {
104109
auto subject = anagram::anagram("orchestra");
105110
auto matches = subject.matches({"cashregister", "Carthorse", "radishes"});
106111
vector<string> expected{"Carthorse"};
107112

108-
REQUIRE(expected == matches);
113+
REQUIRE(to_set(expected) == to_set(matches));
109114
}
110115

111-
TEST_CASE("does_not_detect_an_anagram_if_the_original_word_is_repeated", "[findAnagrams][630abb71-a94e-4715-8395-179ec1df9f91]")
112-
{
116+
TEST_CASE("does_not_detect_an_anagram_if_the_original_word_is_repeated",
117+
"[findAnagrams][630abb71-a94e-4715-8395-179ec1df9f91]") {
113118
auto subject = anagram::anagram("go");
114119
auto matches = subject.matches({"goGoGO"});
115120
vector<string> expected;
116121

117-
REQUIRE(expected == matches);
122+
REQUIRE(to_set(expected) == to_set(matches));
118123
}
119124

120-
TEST_CASE("anagrams_must_use_all_letters_exactly_once", "[findAnagrams][9878a1c9-d6ea-4235-ae51-3ea2befd6842]")
121-
{
125+
TEST_CASE("anagrams_must_use_all_letters_exactly_once",
126+
"[findAnagrams][9878a1c9-d6ea-4235-ae51-3ea2befd6842]") {
122127
auto subject = anagram::anagram("tapper");
123128
auto matches = subject.matches({"patter"});
124129
vector<string> expected;
125130

126-
REQUIRE(expected == matches);
131+
REQUIRE(to_set(expected) == to_set(matches));
127132
}
128133

129-
TEST_CASE("words_are_not_anagrams_of_themselves", "[findAnagrams][68934ed0-010b-4ef9-857a-20c9012d1ebf]")
130-
{
134+
TEST_CASE("words_are_not_anagrams_of_themselves",
135+
"[findAnagrams][68934ed0-010b-4ef9-857a-20c9012d1ebf]") {
131136
auto subject = anagram::anagram("BANANA");
132137
auto matches = subject.matches({"BANANA"});
133138
vector<string> expected;
134139

135-
REQUIRE(expected == matches);
140+
REQUIRE(to_set(expected) == to_set(matches));
136141
}
137142

138-
TEST_CASE("words_are_not_anagrams_of_themselves_even_if_letter_case_is_partially_different", "[findAnagrams][589384f3-4c8a-4e7d-9edc-51c3e5f0c90e]")
139-
{
143+
TEST_CASE(
144+
// clang-format off
145+
"words_are_not_anagrams_of_themselves_even_if_letter_case_is_partially_different",
146+
// clang-format on
147+
"[findAnagrams][589384f3-4c8a-4e7d-9edc-51c3e5f0c90e]") {
140148
auto subject = anagram::anagram("BANANA");
141149
auto matches = subject.matches({"Banana"});
142150
vector<string> expected;
143151

144-
REQUIRE(expected == matches);
152+
REQUIRE(to_set(expected) == to_set(matches));
145153
}
146154

147-
TEST_CASE("words_are_not_anagrams_of_themselves_even_if_letter_case_is_completely_different", "[findAnagrams][ba53e423-7e02-41ee-9ae2-71f91e6d18e6]")
148-
{
155+
TEST_CASE(
156+
// clang-format off
157+
"words_are_not_anagrams_of_themselves_even_if_letter_case_is_completely_different",
158+
// clang-format on
159+
"[findAnagrams][ba53e423-7e02-41ee-9ae2-71f91e6d18e6]") {
149160
auto subject = anagram::anagram("BANANA");
150161
auto matches = subject.matches({"banana"});
151162
vector<string> expected;
152163

153-
REQUIRE(expected == matches);
164+
REQUIRE(to_set(expected) == to_set(matches));
154165
}
155166

156-
TEST_CASE("words_other_than_themselves_can_be_anagrams", "[findAnagrams][33d3f67e-fbb9-49d3-a90e-0beb00861da7]")
157-
{
167+
TEST_CASE("words_other_than_themselves_can_be_anagrams",
168+
"[findAnagrams][33d3f67e-fbb9-49d3-a90e-0beb00861da7]") {
158169
auto subject = anagram::anagram("LISTEN");
159170
auto matches = subject.matches({"Silent", "LISTEN"});
160171
vector<string> expected{"Silent"};
161172

162-
REQUIRE(expected == matches);
173+
REQUIRE(to_set(expected) == to_set(matches));
163174
}
164175
#endif

0 commit comments

Comments
 (0)