Skip to content

Commit 311904b

Browse files
committed
fix: ensure game’s stopped to prevent races
1 parent f2aae8c commit 311904b

2 files changed

Lines changed: 15 additions & 37 deletions

File tree

test/ChordGameTest.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ TEST_CASE("ChordGame Flow") {
4242
CHECK(res1.getType() == "result");
4343
CHECK(res1.hasField("correct"));
4444

45+
game.stop();
4546
if (gameThread.joinable()) gameThread.join();
4647
}
4748

@@ -67,12 +68,8 @@ TEST_CASE("ChordGame Partial and Incorrect") {
6768
while (std::getline(ss, segment, ' ')) notes.push_back(segment);
6869

6970
// Envoyer seulement 1 note correcte (Partiel)
70-
if (!notes.empty()) {
71-
midi.pushNotes({notes[0]});
72-
} else {
73-
midi.pushNotes(std::vector<Note>{});
74-
}
75-
71+
if (!notes.empty()) midi.pushNotes({notes[0]});
72+
else midi.pushNotes(std::vector<Note>{});
7673
Message res1 = transport.waitForSentMessage();
7774
CHECK(res1.getType() == "result");
7875

@@ -85,7 +82,7 @@ TEST_CASE("ChordGame Partial and Incorrect") {
8582
// "incorrect" n'est PAS présent
8683
CHECK_FALSE(res1.hasField("incorrect"));
8784
}
88-
85+
game.stop();
8986
if (gameThread.joinable()) gameThread.join();
9087
}
9188

@@ -122,12 +119,10 @@ TEST_CASE("ChordGame Inversions") {
122119
transport.waitForSentMessage(); // result
123120

124121
// Envoyer ready seulement si on attend un autre tour
125-
if (i < 19) {
126-
transport.pushIncoming(Message("ready"));
127-
}
122+
if (i < 19) transport.pushIncoming(Message("ready"));
128123
}
129-
130124
CHECK(seenInversion); // Devrait être très probable
125+
game.stop();
131126
if (gameThread.joinable()) gameThread.join();
132127
}
133128

@@ -151,6 +146,7 @@ TEST_CASE("ChordGame Unknown Scale") {
151146
midi.pushNotes(std::vector<Note>{});
152147
transport.waitForSentMessage();
153148

149+
game.stop();
154150
if (gameThread.joinable()) gameThread.join();
155151
}
156152

@@ -179,6 +175,7 @@ TEST_CASE("ChordGame Completely Incorrect") {
179175
CHECK(res.getType() == "result");
180176
CHECK(res.hasField("incorrect"));
181177

178+
game.stop();
182179
if (gameThread.joinable()) gameThread.join();
183180
}
184181

@@ -206,6 +203,7 @@ TEST_CASE("ChordGame Ready Message Error") {
206203
transport.pushIncoming(Message("wrong"));
207204
std::this_thread::sleep_for(std::chrono::milliseconds(100));
208205

206+
game.stop();
209207
if (gameThread.joinable()) gameThread.join();
210208
}
211209

@@ -239,12 +237,10 @@ TEST_CASE("ChordGame With Inversions Coverage") {
239237

240238
midi.pushNotes(std::vector<Note>{});
241239
transport.waitForSentMessage(); // result
242-
243-
if (i < 49) {
244-
transport.pushIncoming(Message("ready"));
245-
}
240+
if (i < 49) transport.pushIncoming(Message("ready"));
246241
}
247242

248243
CHECK(foundInversion); // Très probable avec 50 tentatives
244+
game.stop();
249245
if (gameThread.joinable()) gameThread.join();
250246
}

test/NoteGameTest.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,29 @@ TEST_CASE("NoteGame Flow") {
1717
config.mode = "Majeur";
1818
config.maxChallenges = 2; // Test avec 2 défis pour vérifier l'enchaînement
1919
NoteGame game(transport, midi, config);
20-
2120
game.start();
2221
std::thread gameThread([&game]() { game.play(); });
23-
2422
// Premier défi
2523
Message msg1 = transport.waitForSentMessage();
2624
CHECK(msg1.getType() == "note");
2725
std::string expectedNote = msg1.getField("note");
28-
2926
// Simulation de la réponse correcte via MIDI
3027
midi.pushNotes({expectedNote});
31-
3228
// Vérification du résultat (attendu correct)
3329
Message res1 = transport.waitForSentMessage();
3430
CHECK(res1.getType() == "result");
3531
CHECK(res1.hasField("correct"));
36-
3732
// Signal pour passer au défi suivant
3833
transport.pushIncoming(Message("ready"));
39-
4034
// Deuxième défi
4135
Message msg2 = transport.waitForSentMessage();
4236
CHECK(msg2.getType() == "note");
4337
expectedNote = msg2.getField("note");
4438
midi.pushNotes({expectedNote});
45-
4639
Message res2 = transport.waitForSentMessage();
4740
CHECK(res2.getType() == "result");
4841
CHECK(res2.hasField("correct"));
49-
42+
game.stop();
5043
if (gameThread.joinable()) gameThread.join();
5144
}
5245

@@ -60,22 +53,18 @@ TEST_CASE("NoteGame Incorrect Answer") {
6053
config.mode = "maj";
6154
config.maxChallenges = 1;
6255
NoteGame game(transport, midi, config);
63-
6456
game.start();
6557
std::thread gameThread([&game]() { game.play(); });
66-
6758
Message msg1 = transport.waitForSentMessage();
6859
std::string expectedNote = msg1.getField("note");
69-
7060
// Envoyer note incorrecte
7161
std::string wrongNote = (expectedNote == "c4") ? "d4" : "c4";
7262
midi.pushNotes({wrongNote});
73-
7463
Message res1 = transport.waitForSentMessage();
7564
CHECK(res1.getType() == "result");
7665
CHECK(res1.hasField("incorrect"));
7766
CHECK_FALSE(res1.hasField("correct"));
78-
67+
game.stop();
7968
if (gameThread.joinable()) gameThread.join();
8069
}
8170

@@ -89,15 +78,12 @@ TEST_CASE("NoteGame Unknown Scale Fallback") {
8978
config.mode = "mode";
9079
config.maxChallenges = 1;
9180
NoteGame game(transport, midi, config);
92-
9381
game.start();
9482
std::thread gameThread([&game]() { game.play(); });
95-
9683
// Devrait fallback sur Do Majeur, donc générer une note
9784
Message msg1 = transport.waitForSentMessage();
9885
CHECK(msg1.getType() == "note");
99-
100-
midi.close(); // Arrêter attente notes
86+
game.stop();
10187
if (gameThread.joinable()) gameThread.join();
10288
}
10389

@@ -111,26 +97,22 @@ TEST_CASE("NoteGame Multiple Incorrect Notes") {
11197
config.mode = "maj";
11298
config.maxChallenges = 1;
11399
NoteGame game(transport, midi, config);
114-
115100
game.start();
116101
std::thread gameThread([&game]() { game.play(); });
117-
118102
Message msg1 = transport.waitForSentMessage();
119103
std::string expectedNote = msg1.getField("note");
120-
121104
// Envoyer plusieurs notes incorrectes (couvre ligne 60 branch)
122105
std::vector<std::string> wrongNotes;
123106
if (expectedNote != "c4") wrongNotes.push_back("c4");
124107
if (expectedNote != "d4") wrongNotes.push_back("d4");
125108
if (expectedNote != "e4") wrongNotes.push_back("e4");
126109
midi.pushNotes(wrongNotes);
127-
128110
Message res1 = transport.waitForSentMessage();
129111
CHECK(res1.getType() == "result");
130112
CHECK(res1.hasField("incorrect"));
131113
// Vérifier que champ incorrect contient espaces (ligne 60)
132114
std::string incorrect = res1.getField("incorrect");
133115
CHECK(incorrect.find(" ") != std::string::npos);
134-
116+
game.stop();
135117
if (gameThread.joinable()) gameThread.join();
136118
}

0 commit comments

Comments
 (0)