[cupertino_ui] Migrate bottom_tab_bar_test.dart to SemanticsHandle#12012
Conversation
There was a problem hiding this comment.
Code Review
This pull request unskips the bottom tab bar tests, migrates them from SemanticsTester to SemanticsHandle with isSemantics assertions, and adds a new image_data.dart helper file. The reviewer feedback recommends using addTearDown to ensure SemanticsHandle is safely disposed of even if tests fail, allowing the manual dispose calls to be removed.
|
|
||
| testWidgets('tabs announce semantics', (WidgetTester tester) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
Using addTearDown(handle.dispose) immediately after creating the SemanticsHandle is a safer pattern. It ensures that the handle is properly disposed of even if the test fails or throws an exception, preventing leaks that could affect subsequent tests.
| final SemanticsHandle handle = tester.ensureSemantics(); | |
| final SemanticsHandle handle = tester.ensureSemantics(); | |
| addTearDown(handle.dispose); |
There was a problem hiding this comment.
This is how the test was previously structured, no addTearDown was previously used. Also explanation from gemini below as to why the test fails if we do use addTearDown(handle.dispose).
From gemini:
Flutter's TestWidgetsFlutterBinding runs its end-of-test leak verifications (specifically _verifySemanticsHandlesWereDisposed) inside the test body execution flow, immediately after your test callback completes, but before returning control to the Dart test runner:
1. [Test Runner] Starts test
2. [Flutter Binding] Runs test body (your async callback)
3. Your test code executes...
4. Your test code completes.
5. [Flutter Binding] Runs _endOfTestVerifications() <-- CRITICAL POINT
6. Checking active SemanticsHandles...
ERROR: "A SemanticsHandle was active at the end of the test."
7. [Test Runner] Runs addTearDown callbacks <-- TOO LATE!
8. handle.dispose() is called here.
Because the verification (Step 5) happens before the test runner runs the teardown callbacks (Step 7), the binding sees that the SemanticsHandle is still active and throws a FlutterError, failing the test.
There was a problem hiding this comment.
ensureSemantics is no longer needed per @chunhtai.
Though that's an interesting failure, I didn't realize that would happen if you used addTeardown!
| ); | ||
|
|
||
| semantics.dispose(); | ||
| handle.dispose(); |
There was a problem hiding this comment.
| WidgetTester tester, | ||
| ) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
Using addTearDown(handle.dispose) immediately after creating the SemanticsHandle is a safer pattern. It ensures that the handle is properly disposed of even if the test fails or throws an exception, preventing leaks that could affect subsequent tests.
| final SemanticsHandle handle = tester.ensureSemantics(); | |
| final SemanticsHandle handle = tester.ensureSemantics(); | |
| addTearDown(handle.dispose); |
There was a problem hiding this comment.
| ); | ||
|
|
||
| semantics.dispose(); | ||
| handle.dispose(); |
There was a problem hiding this comment.
justinmc
left a comment
There was a problem hiding this comment.
LGTM minus ensureSemantics in a few places 👍
|
|
||
| testWidgets('tabs announce semantics', (WidgetTester tester) async { | ||
| final semantics = SemanticsTester(tester); | ||
| final SemanticsHandle handle = tester.ensureSemantics(); |
There was a problem hiding this comment.
ensureSemantics is no longer needed per @chunhtai.
Though that's an interesting failure, I didn't realize that would happen if you used addTeardown!
|
TODO: remove image_data entirely and use Edit: done ready for re-review. |
…er#188916) flutter/packages@e742106...420e135 2026-07-02 dkwingsmt@users.noreply.github.com [material_ui] Migrate api sample code to @example dartdoc directive (flutter/packages#12078) 2026-07-02 dkwingsmt@users.noreply.github.com [material_ui] Move over more API samples (flutter/packages#12092) 2026-07-01 katelovett@google.com [cupertino_ui] Migrate api sample code to @example dartdoc directive (flutter/packages#12063) 2026-07-01 katelovett@google.com [cupertino_ui] Move over more API samples (flutter/packages#12086) 2026-07-01 48776784+mackings@users.noreply.github.com [two_dimensional_scrollables] Fix TreeView horizontal hit testing (flutter/packages#11859) 2026-07-01 1063596+reidbaker@users.noreply.github.com [camera_android_camerax][tool] Integrate dart_code_linter for cyclomatic complexity checks (flutter/packages#11999) 2026-07-01 dinurymomshad.dev@gmail.com [cross_file] Add runnable example with main() (flutter/packages#11527) 2026-07-01 36861262+QuncCccccc@users.noreply.github.com [cupertino_ui] Enable `switch_test.dart` (flutter/packages#12076) 2026-07-01 jmccandless@google.com [cupertino_ui] Re-enable dialog_test.dart (flutter/packages#12057) 2026-07-01 jmccandless@google.com [cupertino_ui] Re-enable action_sheet_test.dart (flutter/packages#12055) 2026-07-01 rmolivares@renzo-olivares.dev [cupertino_ui] Migrate `bottom_tab_bar_test.dart` to `SemanticsHandle` (flutter/packages#12012) 2026-07-01 1063596+reidbaker@users.noreply.github.com [repo] Add comment style guideline to AGENTS.md (flutter/packages#12077) 2026-07-01 43054281+camsim99@users.noreply.github.com Adds pre-push readiness skill (flutter/packages#11935) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC flutter-ecosystem@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Part of flutter/flutter#182636 and flutter/flutter#188395
This PR:
widgets/semantics_tester.dart. ReplacedSemanticsTesterwithSemanticsHandle.@Skipannotation, all tests in this file has passed.semantics_tester.darthas existed incupertino_ui, so we can directly importsemantics_tester.dart;test/folder.Pre-Review Checklist
[shared_preferences]///).