@@ -79,7 +79,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
7979 for (var type in IntegrationTestType .values) type: TestSuiteStatus .waiting
8080 },
8181 );
82- _statusController.add (state);
82+ if (! _statusController.isClosed) {
83+ _statusController.add (state);
84+ }
8385
8486 try {
8587 for (final type in IntegrationTestType .values) {
@@ -90,7 +92,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
9092 Logging .instance.log (Level .error, "Error running integration test suites: $e " );
9193 } finally {
9294 state = state.copyWith (isRunning: false );
93- _statusController.add (state);
95+ if (! _statusController.isClosed) {
96+ _statusController.add (state);
97+ }
9498 }
9599 }
96100
@@ -111,7 +115,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
111115 for (var type in WalletTestType .values) type: TestSuiteStatus .waiting
112116 },
113117 );
114- _statusController.add (state);
118+ if (! _statusController.isClosed) {
119+ _statusController.add (state);
120+ }
115121
116122 try {
117123 for (final type in WalletTestType .values) {
@@ -122,7 +128,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
122128 Logging .instance.log (Level .error, "Error running wallet test suites: $e " );
123129 } finally {
124130 state = state.copyWith (isRunning: false );
125- _statusController.add (state);
131+ if (! _statusController.isClosed) {
132+ _statusController.add (state);
133+ }
126134 }
127135 }
128136
@@ -150,7 +158,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
150158 integrationTestStatuses: updatedStatuses,
151159 suiteStatuses: updatedAllStatuses,
152160 );
153- _statusController.add (state);
161+ if (! _statusController.isClosed) {
162+ _statusController.add (state);
163+ }
154164
155165 try {
156166 final result = await suite.runTests ().timeout (
@@ -175,7 +185,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
175185 suiteStatuses: updatedAllStatuses,
176186 completed: completed,
177187 );
178- _statusController.add (state);
188+ if (! _statusController.isClosed) {
189+ _statusController.add (state);
190+ }
179191
180192 await suite.cleanup ();
181193 } catch (e) {
@@ -191,7 +203,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
191203 suiteStatuses: updatedAllStatuses,
192204 completed: completed,
193205 );
194- _statusController.add (state);
206+ if (! _statusController.isClosed) {
207+ _statusController.add (state);
208+ }
195209
196210 Logging .instance.log (Level .error, "Error running $type integration test suite: $e " );
197211 }
@@ -220,7 +234,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
220234 walletTestStatuses: updatedStatuses,
221235 suiteStatuses: updatedAllStatuses,
222236 );
223- _statusController.add (state);
237+ if (! _statusController.isClosed) {
238+ _statusController.add (state);
239+ }
224240
225241 try {
226242 // TODO: Pass wallet config to suite when implementing actual wallet tests.
@@ -246,7 +262,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
246262 suiteStatuses: updatedAllStatuses,
247263 completed: completed,
248264 );
249- _statusController.add (state);
265+ if (! _statusController.isClosed) {
266+ _statusController.add (state);
267+ }
250268
251269 await suite.cleanup ();
252270 } catch (e) {
@@ -262,7 +280,9 @@ class TestingService extends StateNotifier<TestingSessionState> {
262280 suiteStatuses: updatedAllStatuses,
263281 completed: completed,
264282 );
265- _statusController.add (state);
283+ if (! _statusController.isClosed) {
284+ _statusController.add (state);
285+ }
266286
267287 Logging .instance.log (Level .error, "Error running $type wallet test suite: $e " );
268288 }
@@ -280,7 +300,11 @@ class TestingService extends StateNotifier<TestingSessionState> {
280300 Future <void > cancelTesting () async {
281301 _cancelled = true ;
282302 state = state.copyWith (isRunning: false );
283- _statusController.add (state);
303+
304+ // Only add to stream controller if it's not closed.
305+ if (! _statusController.isClosed) {
306+ _statusController.add (state);
307+ }
284308
285309 for (final suite in _integrationTestSuites.values) {
286310 await suite.cleanup ();
@@ -291,32 +315,41 @@ class TestingService extends StateNotifier<TestingSessionState> {
291315 }
292316
293317 Future <void > resetTestResults () async {
318+ // Clear test suites to ensure fresh state.
319+ _integrationTestSuites.clear ();
320+ _walletTestSuites.clear ();
321+ _cancelled = false ;
322+
294323 state = TestingSessionState (
295324 testStatuses: {
296- for (var type in IntegrationTestType .values) type: TestSuiteStatus .waiting,
297- for (var type in WalletTestType .values) type: TestSuiteStatus .waiting,
325+ for (final type in IntegrationTestType .values) type: TestSuiteStatus .waiting,
326+ for (final type in WalletTestType .values) type: TestSuiteStatus .waiting,
298327 },
299328 integrationTestStatuses: {
300- for (var type in IntegrationTestType .values) type: TestSuiteStatus .waiting
329+ for (final type in IntegrationTestType .values) type: TestSuiteStatus .waiting
301330 },
302331 walletTestStatuses: {
303- for (var type in WalletTestType .values) type: TestSuiteStatus .waiting
332+ for (final type in WalletTestType .values) type: TestSuiteStatus .waiting
304333 },
305334 isRunning: false ,
306335 completed: 0 ,
307336 total: IntegrationTestType .values.length + WalletTestType .values.length,
308337 );
309- _statusController.add (state);
338+
339+ // Only add to stream controller if it's not closed.
340+ if (! _statusController.isClosed) {
341+ _statusController.add (state);
342+ }
310343 }
311344
312- // Wallet test configuration methods
345+ // Wallet test configuration methods.
313346 void setWalletTestConfig (WalletTestConfig config) {
314347 _walletTestConfig = config;
315348 }
316349
317350 WalletTestConfig ? get walletTestConfig => _walletTestConfig;
318351
319- // Helper method to calculate completed tests across both types
352+ // Helper method to calculate completed tests across both types.
320353 int _calculateCompletedTests () {
321354 final integrationCompleted = state.integrationTestStatuses.values
322355 .where ((status) => status == TestSuiteStatus .passed || status == TestSuiteStatus .failed)
@@ -351,7 +384,7 @@ class TestingService extends StateNotifier<TestingSessionState> {
351384 super .dispose ();
352385 }
353386
354- // Convenience methods for getting display names
387+ // Convenience methods for getting display names.
355388 String getDisplayNameForTest (TestType type) {
356389 return type.displayName;
357390 }
0 commit comments