Skip to content

[cupertino_ui] Migrate bottom_tab_bar_test.dart to SemanticsHandle#12012

Merged
auto-submit[bot] merged 6 commits into
flutter:mainfrom
Renzo-Olivares:cupertino_ui_bottom_tab_bar_test_migration
Jul 1, 2026
Merged

[cupertino_ui] Migrate bottom_tab_bar_test.dart to SemanticsHandle#12012
auto-submit[bot] merged 6 commits into
flutter:mainfrom
Renzo-Olivares:cupertino_ui_bottom_tab_bar_test_migration

Conversation

@Renzo-Olivares

Copy link
Copy Markdown
Contributor

Part of flutter/flutter#182636 and flutter/flutter#188395

This PR:

  • Removed the cross-import of widgets/semantics_tester.dart. Replaced SemanticsTester with SemanticsHandle.
  • Removed @Skip annotation, all tests in this file has passed. semantics_tester.dart has existed in cupertino_ui, so we can directly import semantics_tester.dart;
  • Moved the file to test/ folder.

Pre-Review Checklist

  • I read the [Contributor Guide] and followed the process outlined there for submitting PRs.
  • I read the [AI contribution guidelines] and understand my responsibilities, or I am not using AI tools.
  • I read the [Tree Hygiene] page, which explains my responsibilities.
  • I read and followed the [relevant style guides] and ran [the auto-formatter].
  • I signed the [CLA].
  • The title of the PR starts with the name of the package surrounded by square brackets, e.g. [shared_preferences]
  • I [linked to at least one issue that this PR fixes] in the description above.
  • I followed [the version and CHANGELOG instructions], using [semantic versioning] and the [repository CHANGELOG style], or I have commented below to indicate which documented exception this PR falls under[^1].
  • I updated/added any relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or I have commented below to indicate which [test exemption] this PR falls under[^1].
  • All existing and new tests are passing.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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.

Suggested change
final SemanticsHandle handle = tester.ensureSemantics();
final SemanticsHandle handle = tester.ensureSemantics();
addTearDown(handle.dispose);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since addTearDown(handle.dispose) is used to manage the lifecycle of the SemanticsHandle, this manual call to handle.dispose() can be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WidgetTester tester,
) async {
final semantics = SemanticsTester(tester);
final SemanticsHandle handle = tester.ensureSemantics();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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.

Suggested change
final SemanticsHandle handle = tester.ensureSemantics();
final SemanticsHandle handle = tester.ensureSemantics();
addTearDown(handle.dispose);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

);

semantics.dispose();
handle.dispose();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since addTearDown(handle.dispose) is used to manage the lifecycle of the SemanticsHandle, this manual call to handle.dispose() can be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@github-actions github-actions Bot removed the CICD Run CI/CD label Jun 25, 2026
@Renzo-Olivares Renzo-Olivares added the CICD Run CI/CD label Jun 25, 2026

@justinmc justinmc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM minus ensureSemantics in a few places 👍


testWidgets('tabs announce semantics', (WidgetTester tester) async {
final semantics = SemanticsTester(tester);
final SemanticsHandle handle = tester.ensureSemantics();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ensureSemantics is no longer needed per @chunhtai.

Though that's an interesting failure, I didn't realize that would happen if you used addTeardown!

@github-actions github-actions Bot removed the CICD Run CI/CD label Jun 30, 2026
@Renzo-Olivares Renzo-Olivares added the CICD Run CI/CD label Jun 30, 2026
@Renzo-Olivares

Renzo-Olivares commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

TODO: remove image_data entirely and use CupertinoIcons.

Edit: done ready for re-review.

@github-actions github-actions Bot removed the CICD Run CI/CD label Jul 1, 2026
@Renzo-Olivares Renzo-Olivares added the CICD Run CI/CD label Jul 1, 2026
@Renzo-Olivares Renzo-Olivares requested a review from justinmc July 1, 2026 04:44

@justinmc justinmc left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@justinmc justinmc added the autosubmit Merge PR when tree becomes green via auto submit App label Jul 1, 2026
@auto-submit auto-submit Bot merged commit f4b7893 into flutter:main Jul 1, 2026
89 checks passed
pull Bot pushed a commit to Klomgor/flutter that referenced this pull request Jul 2, 2026
…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autosubmit Merge PR when tree becomes green via auto submit App CICD Run CI/CD p: cupertino_ui triage-framework Should be looked at in framework triage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants