Skip to content

Avoid image source layout invalidation for fixed-size views#35369

Merged
kubaflo merged 6 commits into
dotnet:inflight/currentfrom
AdamEssenmacher:issue-32457
May 11, 2026
Merged

Avoid image source layout invalidation for fixed-size views#35369
kubaflo merged 6 commits into
dotnet:inflight/currentfrom
AdamEssenmacher:issue-32457

Conversation

@AdamEssenmacher

Copy link
Copy Markdown

Description of Change

This PR avoids invalidating layout when an ImageSource changes for image-backed controls whose measured size cannot change: both width and height are explicit and both layout alignments are Fill.

The fix preserves measure invalidation when the image source can still affect measured size, including:

  • implicit width or height
  • non-Fill horizontal or vertical alignment
  • iOS stream image post-load sizing paths

Added regression coverage for Image, ImageButton, and Button, plus BenchmarkDotNet coverage for the source-swap layout invalidation path.

BenchmarkDotNet results for the layout-proxy benchmark:

Scenario Before After
Auto-sized image source swaps 2.875 ms, 1.59 MB 2.926 ms, 1630.47 KB
Explicitly sized image source swaps 4.189 ms, 1.59 MB 62.08 us, 71.88 KB

Validation performed:

  • dotnet test ./src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj
  • dotnet build ./src/Core/src/Core.csproj -f net10.0-ios26.0 -c Debug
  • dotnet build ./src/Core/tests/Benchmarks/Core.Benchmarks.csproj -c Release
  • BenchmarkDotNet default job for ImageSourceLayoutBenchmarker

Issues Fixed

Fixes #32457

dependabot Bot and others added 5 commits May 7, 2026 08:48
Updated [Magick.NET-Q8-AnyCPU](https://github.com/dlemstra/Magick.NET)
from 14.10.4 to 14.12.0.

<details>
<summary>Release notes</summary>

_Sourced from [Magick.NET-Q8-AnyCPU's
releases](https://github.com/dlemstra/Magick.NET/releases)._

## 14.12.0

### What's Changed
- Added `FixByteOrder` to the `DcmReadDefines` (#​1976)
- Added `IconWriteDefines`.

### Related changes in ImageMagick since the last release of Magick.NET:
- Correct bug in `Composite` when using `CopyAlpha` (#​1985)
- Fixed incorrect orientation of JPEG compressed TIFF images (#​1991)
- Heap-Buffer-Overflow write of single zero byte when parsing xml
(GHSA-cr67-pvmx-2pp2)
- Stack Overflow in DestroyXMLTree
(GHSA-fwvm-ggf6-2p4x)
- Out-of-Bounds read in sample operation
(GHSA-pcvx-ph33-r5vv)
- Stack Overflow via Recursive FX Expression Parsing
(GHSA-f4qm-vj5j-9xpw)
- Heap Buffer Overflow in ImageMagick MVG decoder
(GHSA-x9h5-r9v2-vcww)
- Heap overflow caused by integer overflow/wraparound in viff encoder on
32-bit builds
(GHSA-v67w-737x-v2c9)
- Stack-buffer-overflow in MNG encoder with oversized pallete
(GHSA-98cp-rj9f-6v5g)
- Integer overflow in despeckle operation causes heap buffer overflow on
32-bit builds
(GHSA-26qp-ffjh-2x4v)
- Off-by-One in MSL decoder could result in crash
(GHSA-5xg3-585r-9jh5)
- Heap buffer overflow when encoding JXL image with a 16-bit float
(GHSA-jvgr-9ph5-m8v4)
- Heap-use-after-free via XMP profile could result in a crash when
printing the values
(GHSA-r83h-crwp-3vm7)
- Heap buffer overflow (WRITE) in the YAML and JSON encoders
(GHSA-5592-p365-24xh)
- Heap out-of-bounds write in JP2 encoder
(GHSA-pwg5-6jfc-crvh)

### Library updates:
- ImageMagick 7.1.2-19 (2026-04-12)
- aom 3.13.3 (2026-04-02)
- openexr 3.4.9 (2026-04-03)
- freetype 2.14.3 (2026-03-22)
- gdk-pixbuf 2.44.6 (2026-03-31)
- harfbuzz 14.0.0 (2026-04-01)
- liblzma 5.8.3 (2026-04-31)
- libpng 1.6.56 (2026-03-25)

**Full Changelog**:
dlemstra/Magick.NET@14.11.1...14.12.0

## 14.11.1

### Related changes in ImageMagick since the last release of Magick.NET:
- Stack-buffer-overflow WRITE in InterpretImageFilename due to overflow
(GHSA-8793-7xv6-82cf)

### Library updates:
- ImageMagick 7.1.2-18 (2026-03-23)
- aom 3.13.2 (2026-03-19)
- openexr 3.4.7 (2026-03-15)
- harfbuzz 13.2.1 (2026-03-19)

**Full Changelog**:
dlemstra/Magick.NET@14.11.0...14.11.1

## 14.11.0

### What's Changed
- Added `DcmReadDefines`.

### Related changes in ImageMagick since the last release of Magick.NET:
- Access mode change for files created from 0666 to 0600
(ImageMagick/ImageMagick#8609)
- Heap-buffer-overflow in NewXMLTree could result in crash
(GHSA-gc62-2v5p-qpmp)

### Library updates:
- ImageMagick 7.1.2-17 (2026-03-16)
- openexr 3.4.6 (2026-03-01)
- freetype 2.14.2 (2026-03-01)
- harfbuzz 13.0.1 (2026-03-07)
- libxml2 2.15.2 (2026-03-03)

**Full Changelog**:
dlemstra/Magick.NET@14.10.4...14.11.0

Commits viewable in [compare
view](dlemstra/Magick.NET@14.10.4...14.12.0).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Magick.NET-Q8-AnyCPU&package-manager=nuget&previous-version=14.10.4&new-version=14.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts page](https://github.com/dotnet/maui/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…t#35333)

Bump OpenTelemetry packages to latest stable versions in the
maui-aspire-servicedefaults template:

- OpenTelemetry.Exporter.OpenTelemetryProtocol: 1.9.0 to 1.15.3
- OpenTelemetry.Extensions.Hosting: 1.9.0 to 1.15.3
- OpenTelemetry.Instrumentation.Http: 1.9.0 to 1.15.1
- OpenTelemetry.Instrumentation.Runtime: 1.9.0 to 1.15.1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This pull request updates the following dependencies

[marker]: <> (Begin:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)
## From https://github.com/dotnet/xharness
- **Subscription**:
[a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95](https://maestro.dot.net/subscriptions?search=a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)
- **Build**:
[20260430.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2964906)
([312724](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/312724))
- **Date Produced**: May 1, 2026 7:05:11 AM UTC
- **Commit**:
[92962e5c46ac08a66ded4c5696209cc60f1a232f](dotnet/xharness@92962e5)
- **Branch**: [main](https://github.com/dotnet/xharness/tree/main)

[DependencyUpdate]: <> (Begin)

- **Dependency Updates**:
  - From [11.0.0-prerelease.26229.1 to 11.0.0-prerelease.26230.4][1]
     - Microsoft.DotNet.XHarness.CLI
     - Microsoft.DotNet.XHarness.TestRunners.Common
     - Microsoft.DotNet.XHarness.TestRunners.Xunit

[1]: dotnet/xharness@9d5a7e9...92962e5

[DependencyUpdate]: <> (End)


[marker]: <> (End:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Replaces `review-rules.md` (flat 345-line checklist) with a dimensional
expert review agent. Single source of truth for all review rules,
organized into 30 dimensions for per-dimension sub-agent evaluation.
Adds inline file:line PR comments alongside the existing wall-of-text
summary.

Extracted from 28k review comments across 5 maintainers via
[extraction-pipeline](https://github.com/dotnet/fsharp/blob/main/.github/agents/extraction-pipeline.md).
No functional code changes.

Recreated from dotnet#35062 on a dotnet/maui branch (originally opened from a
fork).

## What changed

**Before:** `review-rules.md` had 345 lines of flat rules. `code-review`
skill loaded them all into one context. Output was a single wall-of-text
PR comment.

**After:** Rules absorbed into `maui-expert-reviewer.md` as 30
dimensions with 200+ CHECK items. Each dimension runs as an independent
sub-agent with focused context. Output is inline file:line PR comments
via `inline-findings.json`.

## CI Flow

```
Review-PR.ps1 prompt:
  1. code-review → maui-expert-reviewer agent → inline-findings.json
  2. pr-review → Pre-Flight → Try-Fix → Report (sees findings, no duplication)

Posting:
  post-inline-review.ps1    → .json → GitHub file:line comments (NEW)
  post-ai-summary-comment.ps1 → {phase}/content.md → wall-of-text (existing)

CI: COMMENTS_VIA_FILE=true → agent writes .json, script posts
Local: agent writes .json, code-review posts directly via gh api
```

## Files

| Action | File | What |
|--------|------|------|
| **Add** | `agents/maui-expert-reviewer.md` | 30 dimensions, 200+
CHECKs, routing table |
| **Add** | `instructions/collectionview-{android,ios,windows}` |
Platform-isolated CV rules |
| **Add** |
`instructions/{handler-patterns,layout-system,performance-hotpaths,public-api,threading-async}`
| Domain-specific ambient guidance |
| **Add** | `scripts/post-inline-review.ps1` | Posts .json as GitHub PR
review |
| **Del** | `skills/code-review/references/review-rules.md` | Absorbed
into agent |
| **Mod** | `skills/code-review/SKILL.md` | Delegates to agent |
| **Mod** | `scripts/Review-PR.ps1` | Prompt + inline posting wiring |
| **Mod** | `eng/pipelines/ci-copilot.yml` | `COMMENTS_VIA_FILE` env var
|

---------

Co-authored-by: kubaflo <kubaflo@users.noreply.github.com>
Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com>
Copilot AI review requested due to automatic review settings May 10, 2026 23:39
@github-actions

github-actions Bot commented May 10, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35369

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35369"

@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label May 10, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Hey there @@AdamEssenmacher! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

Copilot AI 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.

Pull request overview

This PR reduces unnecessary layout/measure invalidations when swapping ImageSource on image-backed controls that are effectively fixed-size (explicit width/height + both alignments Fill), improving scrolling performance in image-heavy UIs.

Changes:

  • Conditionalized InvalidateMeasure for ImageSource changes so fixed-size/Fill-aligned views don’t thrash layout.
  • Preserved invalidation behavior for cases where the source can affect measured size (implicit dimensions, non-Fill alignments, iOS stream-source post-load sizing).
  • Added unit regression tests for Image, ImageButton, and Button, plus BenchmarkDotNet coverage for the source-swap layout invalidation path.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/Controls/src/Core/ImageElement.cs Skips measure invalidation on source changes when the view’s measured size cannot change.
src/Core/src/Handlers/Image/ImageHandler.iOS.cs Avoids iOS stream-image post-load measure invalidation for fixed-size/Fill-aligned images (but currently has a brace issue).
src/Controls/tests/Core.UnitTests/ImageTests.cs Adds regression tests ensuring source changes don’t invalidate measure for fixed-size images, and still do in sizing-sensitive cases.
src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs Mirrors the new regression coverage for ImageButton.
src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs Adds regression coverage for Button.ImageSource under fixed-size vs sizing-sensitive scenarios.
src/Core/tests/Benchmarks/Benchmarks/ImageSourceBenchmarker.cs Adds benchmarks for image-source swapping and layout invalidation impact under auto-sized vs explicitly sized setups.

@jfversluis

Copy link
Copy Markdown
Member

/azp run maui-pr

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@MauiBot

MauiBot commented May 11, 2026

Copy link
Copy Markdown
Collaborator

🤖 AI Summary

👋 @AdamEssenmacher — new AI review results are available. Please review the latest session below.

📊 Review Session8480ac8 · Avoid image source layout invalidation for fixed-size views · 2026-05-11 16:23 UTC
🚦 Gate — Test Before & After Fix

Gate Result: ✅ PASSED

Platform: IOS · Base: main · Merge base: f8cb875e

Test Without Fix (expect FAIL) With Fix (expect PASS)
🧪 ButtonUnitTest ButtonUnitTest ✅ FAIL — 32s ✅ PASS — 17s
🧪 ImageButtonTests ImageButtonTests ✅ FAIL — 6s ✅ PASS — 5s
🧪 ImageTests ImageTests ✅ FAIL — 6s ✅ PASS — 5s
🔴 Without fix — 🧪 ButtonUnitTest: FAIL ✅ · 32s
  Determining projects to restore...
  Restored /Users/cloudtest/vss/_work/1/s/src/Graphics/src/Graphics/Graphics.csproj (in 979 ms).
  Restored /Users/cloudtest/vss/_work/1/s/src/TestUtils/src/TestUtils/TestUtils.csproj (in 4.18 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj (in 4.83 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Essentials/src/Essentials.csproj (in 4.85 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/src/Core.csproj (in 5.62 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Core/maps/src/Maps.csproj (in 5.62 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/Maps/src/Controls.Maps.csproj (in 5.62 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Core/Controls.Core.csproj (in 5.62 sec).
  Restored /Users/cloudtest/vss/_work/1/s/src/Controls/src/Xaml/Controls.Xaml.csproj (in 5.63 sec).
  1 of 10 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
  TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.08]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.60]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [13 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed TestClickedvent(isEnabled: False) [< 1 ms]
  Passed TestClickedvent(isEnabled: True) [< 1 ms]
  Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [3 ms]
  Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
  Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
  Passed CommandCanExecuteInvokedOnChange [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [4 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed TestCommand [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed AssignToFontFamilyUpdatesFont [5 ms]
  Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
  Passed TestPressedEvent(isEnabled: False) [< 1 ms]
  Passed TestPressedEvent(isEnabled: True) [< 1 ms]
[xUnit.net 00:00:00.65]     FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.65]       Assert.False() Failure
[xUnit.net 00:00:00.65]       Expected: False
[xUnit.net 00:00:00.65]       Actual:   True
[xUnit.net 00:00:00.65]       Stack Trace:
[xUnit.net 00:00:00.66]         /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs(220,0): at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.66]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.66]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Failed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Error Message:
   Assert.False() Failure
Expected: False
Actual:   True
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs:line 220
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed ReenabledAfterCommandRemoved [< 1 ms]
  Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
  Passed ButtonContentLayoutTypeConverterTest [5 ms]
  Passed PressedVisualState [2 ms]
[xUnit.net 00:00:00.66]     ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.66]       Assert.Equal() Failure: Values differ
[xUnit.net 00:00:00.66]       Expected: 0
[xUnit.net 00:00:00.66]       Actual:   1
[xUnit.net 00:00:00.66]       Stack Trace:
[xUnit.net 00:00:00.66]         /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs(151,0): at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.66]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.66]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Failed ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Error Message:
   Assert.Equal() Failure: Values differ
Expected: 0
Actual:   1
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ButtonUnitTest.ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs:line 151
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed ButtonCornerRadiusSetToFive [< 1 ms]
  Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
  Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
  Passed AssignToFontAttributesUpdatesFont [< 1 ms]
  Passed TestBindingContextPropagation [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
[xUnit.net 00:00:00.67]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed MeasureInvalidatedOnTextChange [< 1 ms]
  Passed CommandUnhooksOnNull [< 1 ms]
  Passed AssignToFontSizeUpdatesFont [< 1 ms]
  Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
  Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]

Test Run Failed.
Total tests: 88
     Passed: 86
     Failed: 2
 Total time: 0.9147 Seconds

🟢 With fix — 🧪 ButtonUnitTest: PASS ✅ · 17s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.06]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.53]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.54]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [10 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed TestClickedvent(isEnabled: False) [< 1 ms]
  Passed TestClickedvent(isEnabled: True) [< 1 ms]
  Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [3 ms]
  Passed ImageSourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
  Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
  Passed CommandCanExecuteInvokedOnChange [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [3 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed TestCommand [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed AssignToFontFamilyUpdatesFont [2 ms]
  Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
  Passed TestPressedEvent(isEnabled: False) [< 1 ms]
  Passed TestPressedEvent(isEnabled: True) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed ReenabledAfterCommandRemoved [< 1 ms]
  Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
  Passed ButtonContentLayoutTypeConverterTest [5 ms]
  Passed PressedVisualState [2 ms]
  Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed ImageSourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed ButtonCornerRadiusSetToFive [< 1 ms]
  Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
  Passed ImageSourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
  Passed AssignToFontAttributesUpdatesFont [< 1 ms]
  Passed TestBindingContextPropagation [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
[xUnit.net 00:00:00.60]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed MeasureInvalidatedOnTextChange [< 1 ms]
  Passed CommandUnhooksOnNull [< 1 ms]
  Passed AssignToFontSizeUpdatesFont [< 1 ms]
  Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
  Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]

Test Run Successful.
Total tests: 88
     Passed: 88
 Total time: 0.8439 Seconds

🔴 Without fix — 🧪 ImageButtonTests: FAIL ✅ · 6s

(truncated to last 15,000 chars)

 ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.08]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.71]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.72]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [18 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed TestClickedvent(isEnabled: False) [< 1 ms]
  Passed TestClickedvent(isEnabled: True) [< 1 ms]
  Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [4 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
  Passed TestFillSizingWithConstrainedHeight [7 ms]
  Passed TestSizing [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed TestCommand [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
  Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestSource [< 1 ms]
  Passed TestSizeChanged [< 1 ms]
  Passed TestPressedEvent(isEnabled: False) [< 1 ms]
  Passed TestPressedEvent(isEnabled: True) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed CommandUnhooksOnNull [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
[xUnit.net 00:00:00.79]     SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.79]       Assert.Equal() Failure: Values differ
[xUnit.net 00:00:00.79]       Expected: 0
[xUnit.net 00:00:00.79]       Actual:   1
[xUnit.net 00:00:00.79]       Stack Trace:
[xUnit.net 00:00:00.79]         /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs(125,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.79]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.79]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Failed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Error Message:
   Assert.Equal() Failure: Values differ
Expected: 0
Actual:   1
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs:line 125
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed ReenabledAfterCommandRemoved [< 1 ms]
  Passed TestBindingContextPropagation [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [< 1 ms]
  Passed PressedVisualState [2 ms]
  Passed TestImageSourceToNullCancelsLoading [2 ms]
  Passed TestFileImageSourceChanged [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]
  Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestSourceDoubleSet [< 1 ms]
  Passed CommandCanExecuteInvokedOnChange [< 1 ms]
[xUnit.net 00:00:00.79]       Assert.False() Failure
[xUnit.net 00:00:00.79]       Expected: False
[xUnit.net 00:00:00.79]       Actual:   True
[xUnit.net 00:00:00.79]     StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.79]       Stack Trace:
[xUnit.net 00:00:00.79]         /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs(296,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.79]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.79]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.79]     FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.79]       Assert.False() Failure
[xUnit.net 00:00:00.79]       Expected: False
[xUnit.net 00:00:00.79]       Actual:   True
[xUnit.net 00:00:00.79]       Stack Trace:
[xUnit.net 00:00:00.79]         /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs(262,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.79]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.79]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.80]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Failed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Error Message:
   Assert.False() Failure
Expected: False
Actual:   True
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs:line 296
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
  Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
  Failed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Error Message:
   Assert.False() Failure
Expected: False
Actual:   True
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ImageButtonTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs:line 262
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
  Passed TestAspectSizingWithConstrainedHeight [< 1 ms]
  Passed TestFillSizingWithConstrainedWidth [< 1 ms]

Test Run Failed.
Total tests: 97
     Passed: 94
     Failed: 3
 Total time: 1.1297 Seconds

🟢 With fix — 🧪 ImageButtonTests: PASS ✅ · 5s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.08]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [14 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithBindingDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed TestClickedvent(isEnabled: False) [< 1 ms]
  Passed TestClickedvent(isEnabled: True) [< 1 ms]
  Passed CommandCanExecuteInvokedOnCommandSet [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildWithCommandDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed CommandCanExecuteInvokedOnCommandParameterSet [< 1 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [3 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesNestedChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledUpdatesDoNotOverrideCommand(viewEnabled: False, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnabledUpdatesDoNotRemoveBindings [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingLayoutWithDisabledChildWithCommandDoesNotEnableChild(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: True) [1 ms]
  Passed CommandCanExecuteModifiesEnabled(initial: False) [< 1 ms]
  Passed TestFillSizingWithConstrainedHeight [6 ms]
  Passed TestSizing [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed DisablingLayoutDisablesChildWithBinding(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed TestCommand [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed EnabledLayoutDoesNotAffectChildIsEnabled(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed CommandCanExecuteUpdatesEnabled [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: False, expectedEnabled: True) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed CommandUpdatesDoNotOverrideEnabled(viewEnabled: True, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed ButtonClickWhenCommandCanExecuteFalse [< 1 ms]
  Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestSource [< 1 ms]
  Passed TestSizeChanged [< 1 ms]
  Passed TestPressedEvent(isEnabled: False) [< 1 ms]
  Passed TestPressedEvent(isEnabled: True) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed DisabledLayoutDisablesChildWithCommand(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed CommandUnhooksOnNull [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.StackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.Grid)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.VerticalStackLayout)) [< 1 ms]
  Passed EnablingChildDoesNotEnableChildOfDisabledLayout(TLayout: typeof(Microsoft.Maui.Controls.HorizontalStackLayout)) [< 1 ms]
  Passed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: True, expectedEnabled: True) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: True, commandEnabled: False, expectedEnabled: False) [< 1 ms]
  Passed EnabledAndCommandAreCorrect(viewEnabled: False, commandEnabled: True, expectedEnabled: False) [< 1 ms]
  Passed ReenabledAfterCommandRemoved [< 1 ms]
  Passed TestBindingContextPropagation [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [< 1 ms]
  Passed PressedVisualState [2 ms]
  Passed TestImageSourceToNullCancelsLoading [2 ms]
  Passed TestFileImageSourceChanged [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]
  Passed TestImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestSourceDoubleSet [< 1 ms]
  Passed CommandCanExecuteInvokedOnChange [< 1 ms]
[xUnit.net 00:00:00.66]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Passed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed TestReleasedEvent(isEnabled: False) [< 1 ms]
  Passed TestReleasedEvent(isEnabled: True) [< 1 ms]
  Passed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
  Passed TestAspectSizingWithConstrainedHeight [< 1 ms]
  Passed TestFillSizingWithConstrainedWidth [< 1 ms]

Test Run Successful.
Total tests: 97
     Passed: 97
 Total time: 0.9453 Seconds

🔴 Without fix — 🧪 ImageTests: FAIL ✅ · 6s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
  TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.10]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.71]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.71]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.76]     StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.76]       Assert.False() Failure
[xUnit.net 00:00:00.76]       Expected: False
[xUnit.net 00:00:00.76]       Actual:   True
[xUnit.net 00:00:00.76]       Stack Trace:
[xUnit.net 00:00:00.76]         /_/src/Controls/tests/Core.UnitTests/ImageTests.cs(297,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.76]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.76]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [8 ms]
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
  Passed TestSourceDoubleSet [< 1 ms]
  Passed TestAspectSizingWithConstrainedHeight [10 ms]
  Passed TestFillSizingWithConstrainedHeight [< 1 ms]
  Passed TestSizing [< 1 ms]
  Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
  Failed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [1 ms]
  Error Message:
   Assert.False() Failure
Expected: False
Actual:   True
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageTests.cs:line 297
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.77]     SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.77]       Assert.Equal() Failure: Values differ
[xUnit.net 00:00:00.77]       Expected: 0
[xUnit.net 00:00:00.77]       Actual:   1
[xUnit.net 00:00:00.77]       Stack Trace:
[xUnit.net 00:00:00.77]         /_/src/Controls/tests/Core.UnitTests/ImageTests.cs(127,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.77]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.77]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestSource [1 ms]
  Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
  Passed TestFillSizingWithConstrainedWidth [< 1 ms]
  Passed TestSizeChanged [< 1 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
  Passed TestImageSourceToNullCancelsLoading [2 ms]
  Failed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [1 ms]
  Error Message:
   Assert.Equal() Failure: Values differ
Expected: 0
Actual:   1
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageTests.cs:line 127
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.77]       Assert.False() Failure
[xUnit.net 00:00:00.77]       Expected: False
[xUnit.net 00:00:00.77]     FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [FAIL]
[xUnit.net 00:00:00.77]       Actual:   True
[xUnit.net 00:00:00.77]       Stack Trace:
[xUnit.net 00:00:00.77]         /_/src/Controls/tests/Core.UnitTests/ImageTests.cs(264,0): at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit()
[xUnit.net 00:00:00.77]            at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
[xUnit.net 00:00:00.77]            at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
[xUnit.net 00:00:00.77]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Failed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Error Message:
   Assert.False() Failure
Expected: False
Actual:   True
  Stack Trace:
     at Microsoft.Maui.Controls.Core.UnitTests.ImageTests.FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit() in /_/src/Controls/tests/Core.UnitTests/ImageTests.cs:line 264
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
  Passed TestFileImageSourceChanged [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]

Test Run Failed.
Total tests: 21
     Passed: 18
     Failed: 3
 Total time: 1.0904 Seconds

🟢 With fix — 🧪 ImageTests: PASS ✅ · 5s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Graphics -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Graphics/Debug/net10.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Essentials -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Essentials/Debug/net10.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Core/Debug/net10.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.BindingSourceGen -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Maps/Debug/net10.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Core -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core/Debug/net10.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  ##vso[build.updatebuildnumber]10.0.70-ci+azdo.14065311
  Controls.Xaml -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Xaml/Debug/net10.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Maps/Debug/net10.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /Users/cloudtest/vss/_work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net10.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v10.0)
VSTest version 18.0.1 (arm64)

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 10.0.0)
[xUnit.net 00:00:00.06]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.58]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:00.59]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: False, setHeight: True) [7 ms]
  Passed SourceChangeTriggersResizeWhenWidthOrHeightIsImplicit(setWidth: True, setHeight: False) [< 1 ms]
  Passed TestSourceDoubleSet [< 1 ms]
  Passed TestAspectSizingWithConstrainedHeight [11 ms]
  Passed TestFillSizingWithConstrainedHeight [< 1 ms]
  Passed TestSizing [< 1 ms]
  Passed TestFileImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedHeight [< 1 ms]
  Passed StreamImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed TestStreamImageSourcePropertiesChangedTriggerResize [< 1 ms]
  Passed TestSource [1 ms]
  Passed TestAspectSizingWithConstrainedWidth [< 1 ms]
  Passed TestFillSizingWithConstrainedWidth [< 1 ms]
  Passed TestSizeChanged [< 1 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: False, setVerticalCenter: True) [< 1 ms]
  Passed SourceChangeTriggersResizeWhenExplicitButLayoutAlignmentIsNotFill(setHorizontalCenter: True, setVerticalCenter: False) [< 1 ms]
  Passed TestImageSourceToNullCancelsLoading [3 ms]
  Passed SourceChangeDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
[xUnit.net 00:00:00.64]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Passed FileImageSourcePropertiesChangedDoesNotTriggerResizeWhenWidthAndHeightExplicit [< 1 ms]
  Passed TestFileImageSourceChanged [< 1 ms]
  Passed TestAspectFillSizingWithConstrainedWidth [< 1 ms]

Test Run Successful.
Total tests: 21
     Passed: 21
 Total time: 0.9358 Seconds

📁 Fix files reverted (2 files)
  • src/Controls/src/Core/ImageElement.cs
  • src/Core/src/Handlers/Image/ImageHandler.iOS.cs

🧪 UI Tests — ViewBaseTests

Detected UI test categories: ViewBaseTests

🧪 UI Test Execution Results

⏭️ SKIPPED — 0 passed, 0 failed, 1 skipped (platform: ios)

Category Result Tests Duration Notes
ViewBaseTests ⏭️ SKIPPED 0s Runner threw an exception

Failures here are informational only — they do not block the gate or affect try-fix candidate scoring.

Deep UI tests — 112 passed, 0 failed across 1 category on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
ios_ui_tests-controls-ViewBaseTests 112/112 ✓
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)

🔍 Pre-Flight — Context & Validation

Pre-Flight — PR #35369

Issue Summary (#32457)

Rapid ImageSource swaps thrash the layout system. Every source change calls
InvalidateMeasureInternal(MeasureChanged), which propagates a full measure/arrange up
the visual tree even when the view's measured size cannot change (explicit width/height,
Fill alignment). In a virtualized CollectionView of images this drops frame rates
dramatically (~26 FPS reported on iOS device vs. ~60 FPS with a Skia control that does
not request relayout).

PR Summary

Title: Avoid image source layout invalidation for fixed-size views
Author: AdamEssenmacher (community, also the issue author)
Base: main · Head: issue-32457 @ 8480ac8
Files: 6 (+598 / −4)

Approach

Skip InvalidateMeasureInternal from the image-source change path when the view's
measured size cannot change. The "size is locked" predicate
(SourceCouldChangeMeasuredSize → returns false only when):

  • WidthRequest is explicit (Dimension.IsExplicitSet(view.Width)), AND
  • HeightRequest is explicit, AND
  • HorizontalLayoutAlignment == Fill, AND
  • VerticalLayoutAlignment == Fill.

Two call sites updated:

  1. ImageElement.ImageSourceChanged / ImageSourceSourceChanged (Controls — covers
    Image, ImageButton, Button.ImageSource).
  2. ImageHandler.iOS.SetImageSource stream-image post-load path (Core — iOS only).

Files Changed

# File Kind Notes
1 src/Controls/src/Core/ImageElement.cs src adds SourceCouldChangeMeasuredSize and gates both invalidation call sites
2 src/Core/src/Handlers/Image/ImageHandler.iOS.cs src/iOS gates stream-image InvalidateMeasure(image)
3 src/Controls/tests/Core.UnitTests/ButtonUnitTest.cs test regression tests
4 src/Controls/tests/Core.UnitTests/ImageButtonUnitTest.cs test regression tests
5 src/Controls/tests/Core.UnitTests/ImageTests.cs test regression tests
6 src/Core/tests/Benchmarks/Benchmarks/ImageSourceBenchmarker.cs bench new BDN benchmark

Platform Classification

Platform Touched Notes
Cross-platform ImageElement.cs covers Android/iOS/Windows/MacCatalyst
iOS / MacCatalyst ImageHandler.iOS.cs stream-source path
Android ⚠️ unchanged in handler — Android image handler does its own measure invalidation; issue reproduces there too but PR does not touch it. Open question whether the cross-platform ImageElement gating is sufficient on Android.
Windows ⚠️ unchanged in handler

Gate Result (from caller)

PASSED — added unit tests FAIL without the fix and PASS with it.

Code-Review Summary (see code-review.md)

  • Verdict: NEEDS_DISCUSSION (confidence: medium)
  • Errors: none — fix is correct under stated invariants.
  • Warnings:
    1. Cross-platform fix only validated by unit tests on the cross-platform code path; the iOS-handler change is exercised only indirectly. No device/UI regression test for actual rendering.
    2. SourceCouldChangeMeasuredSize(imageElement) dereferences (IView)imageElement before the null-conditional ?. later in the caller; if bindable is ever null (was previously tolerated by imageElement?.…), this would NRE. Low likelihood, but the previous code defended against it.
    3. Android-side image source swaps continue to trigger handler-level layout work; PR addresses cross-platform layer but not the parallel Android-specific path.
  • Failure-mode probes (advisory for try-fix):
    • Implicit Width/Height (most common scenario) → still invalidates ✅
    • WidthRequest/HeightRequest set but alignment Start/Center/End → still invalidates ✅
    • Explicit size + Fill on both axes → invalidation skipped ✅ (the new hot path)
    • First image load on a stream source where intrinsic size would change layout because the view was previously unmeasured → guarded by same predicate; correct because explicit size locks the box.
  • Blast radius: runs on every ImageSource change for every Image/ImageButton/Button and every stream-source post-load on iOS. Hot path on scrolling galleries.

Suggested hints for Try-Fix

  • Alternative gating dimensions: check view.Width/Height set state via Dimension.IsExplicitSet versus checking IView.Width/Height actual values; the latter can be NaN before first measure.
  • Could also be gated at the Image mapper level (ImageMapper.UpdateSource) instead of ImageElement.
  • Consider IImageElement.Aspect != AspectFill/AspectFit interplay — does aspect mode affect whether the rendered area could change? Under explicit width/height + Fill the layout box is fixed, but the content still respects aspect.
  • Android parity: the same gating could be applied in ImageHandler.Android.cs if it independently calls InvalidateMeasure.

🔧 Fix — Analysis & Comparison

Try-Fix Phase — PR #35369

Four independent fix candidates generated in isolated git worktrees off origin/main.
Each tested against the PR's regression suite (imported verbatim from PR #35369).

Fix Candidates

# Source Model Approach Test Result Files Changed Notes
1 try-fix-1 claude-opus-4.6 Generic propagation short-circuit in VisualElement.InvalidateMeasureInternalHasFullyConstrainedSize() checks raw WidthRequest/HeightRequest + alignment, skips MeasureInvalidated event + parent bubble when MeasureChanged on a size-locked view. ✅ PASS (9/9) src/Controls/src/Core/VisualElement/VisualElement.cs Generic — benefits all controls. Wider blast radius than PR.
2 try-fix-2 claude-sonnet-4.6 IImage.SourceCouldAffectLayout Core extension method — same predicate as PR, lifted into src/Core/src/Core/Extensions/ImageExtensions.cs; called from ImageElement.cs + ImageHandler.iOS.cs. ✅ PASS (24/24) Extensions/ImageExtensions.cs (NEW), ImageElement.cs, ImageHandler.iOS.cs Functionally equivalent to PR — same gating predicate, refactored location. Adds a Core API surface (extension method on IImage).
3 try-fix-3 gpt-5.3-codex Propagation boundary via SelfConstraint (LayoutConstraint flags) + alignment in VisualElement.InvalidateMeasureInternal. Reuses MAUI's existing constraint-tracking. ✅ PASS (9/9) src/Controls/src/Core/VisualElement/VisualElement.cs Generic. Uses LayoutConstraint instead of raw request values — slightly more idiomatic. Same broader-scope risk as try-fix-1.
4 try-fix-4 gpt-5.4 Early-return guard placed at the top of VisualElement.InvalidateMeasureInternal using Constraint == LayoutConstraint.Fixed. Skips InvalidateMeasureCache AND propagation. ✅ PASS (9/9) src/Controls/src/Core/VisualElement/VisualElement.cs More aggressive than try-fix-1/-3 — also skips local measure cache invalidation. Could mask edge cases where the cache should be invalidated even if propagation isn't needed.
PR PR #35369 Adam Essenmacher Image-specific gating: SourceCouldChangeMeasuredSize (explicit W+H + both Fill) at three call sites in ImageElement.cs (×2) and ImageHandler.iOS.cs (×1). ✅ PASSED (Gate) ImageElement.cs, ImageHandler.iOS.cs Surgical, narrow scope. Doesn't help non-image controls.
pr-plus-reviewer maui-expert-reviewer claude-opus-4.6 PR + reviewer's brace-indentation fix on ImageHandler.iOS.cs (cosmetic but improves readability of the new method). ✅ PASSED (same tests) Same 2 source files Functionally identical to PR; minor formatting only.

Cross-Pollination

Model Round New Ideas? Details
claude-opus-4.6 1 Produced generic propagation short-circuit (try-fix-1).
claude-sonnet-4.6 1 Lifted PR's predicate into Core extension (try-fix-2). Did NOT meaningfully diverge from the PR's logic.
gpt-5.3-codex 1 Produced propagation boundary via SelfConstraint (try-fix-3).
gpt-5.4 1 Produced top-of-method early return on LayoutConstraint.Fixed (try-fix-4).
All 2 No new ideas The three generic candidates (try-fix-1/-3/-4) converged on the same architectural insight (propagation-level gating) with mechanical variations. The handler-extension variant (try-fix-2) re-states the PR's logic at a different layer. Further rounds unlikely to surface a genuinely novel direction.

Exhausted: Yes (all 4 models produced candidates; 3 converged on generic VisualElement gating, 1 on the PR's predicate-at-Core-extension).

Selected Fix

pr-plus-reviewer — the PR's fix with the expert reviewer's cosmetic brace-indent
correction applied. See report/content.md for the full comparative rationale.

Headline reasoning: All four try-fix candidates passed the regression suite, but the
three generic VisualElement-level variants (try-fix-1/-3/-4) change behaviour for every
control
with explicit size + Fill, not just images. That's a much larger blast radius
than the PR's image-specific gating and would require its own multi-control regression
investigation before merge. try-fix-2 is functionally equivalent to the PR but adds a new
Core API surface (IImage extension), which is unnecessary churn for this fix. The PR
plus the reviewer's brace-indent cleanup is the smallest, safest, and well-tested change.


📋 Report — Final Recommendation

Phase 3 — Comparative Report — PR #35369

Candidates Evaluated

Candidate Approach Test Verdict Blast Radius Key Concern
pr Image-specific gating: SourceCouldChangeMeasuredSize private helper at three sites (ImageElement.cs ×2, ImageHandler.iOS.cs ×1) ✅ PASSED (Gate) Narrow — only image source changes Minor brace-indent ambiguity in ImageHandler.iOS.cs (noted by expert reviewer)
pr-plus-reviewer PR + 1-line brace-indentation cleanup in ImageHandler.iOS.cs ✅ PASSED (Gate) Narrow — same as PR None functional
try-fix-1 Generic gate in VisualElement.InvalidateMeasureInternal using WidthRequest/HeightRequest/HorizontalOptions/VerticalOptions ✅ PASS (9/9) WIDE — affects every control with explicit size + Fill Behaviour change for all view types, not just images. Suppresses MeasureInvalidated event for any MeasureChanged trigger. Needs broad regression coverage.
try-fix-2 Same predicate as PR, hoisted into a new IImage.SourceCouldAffectLayout extension in Core ✅ PASS (24/24) Narrow — same as PR Adds Core API surface (ImageExtensions) for a single internal usage; ⚠️ test count discrepancy (claimed 24 vs others' 9) suggests the agent inadvertently ran extra tests but result is still PASS
try-fix-3 Generic propagation boundary in VisualElement.InvalidateMeasureInternal keyed on SelfConstraint flags + alignment ✅ PASS (9/9) WIDE — same risk surface as try-fix-1 Same as try-fix-1
try-fix-4 Generic early-return at top of VisualElement.InvalidateMeasureInternal using Constraint == LayoutConstraint.Fixed; also skips InvalidateMeasureCache() ✅ PASS (9/9) WIDE + AGGRESSIVE — additionally bypasses local measure-cache invalidation Highest risk — measure cache is normally invalidated on every MeasureChanged; suppressing that could surface stale DesiredSize reads in unrelated code paths

Comparative Analysis

Why the three generic candidates (try-fix-1, -3, -4) are NOT ranked above the PR

All three rewrite VisualElement.InvalidateMeasureInternal to short-circuit MeasureChanged
propagation whenever a view has both explicit WidthRequest/HeightRequest and
Fill/Fill alignment. This is intellectually attractive — it fixes the bug for every
control
, not just images — but it has a fundamentally different risk profile:

  1. Behavioural change for non-image scenarios. Any control whose layout system relies
    on MeasureChanged propagating up under fixed-size+Fill conditions will silently
    change behaviour. Examples that could be affected:
    • A Label with WidthRequest=100, HeightRequest=40, HorizontalOptions=Fill, VerticalOptions=Fill that updates its Text: under the generic fix, parent
      InvalidateMeasure is skipped. In most cases this is fine, but custom layouts that
      subscribe to MeasureInvalidated would no longer be notified.
    • Custom views or third-party controls that depend on the existing contract.
  2. No additional regression coverage. The candidates passed the PR's own image-specific
    tests, but they ALSO change behaviour for non-image controls and added zero new
    tests for those scenarios.
  3. The PR's diagnosis is correct and narrowly scoped. The bug is specifically about
    image source swaps. Fixing it at the image layer is the minimal, locally-reasoned
    change. Generalising the fix is a separate, larger design decision that deserves its
    own PR with its own regression suite.
  4. try-fix-4 additionally skips the local measure cache invalidation. This is more
    aggressive still — InvalidateMeasureCache() is normally run on every MeasureChanged
    regardless of propagation. Suppressing it can leave stale DesiredSize values
    readable to callers between layout passes.

Why try-fix-2 is functionally equivalent to the PR (not better)

try-fix-2 uses the same predicate (explicit W+H + Fill+Fill) and the same call sites
(both ImageElement.cs invalidations + the iOS handler stream-source invalidation). The
only difference is location: it lives in src/Core/src/Core/Extensions/ImageExtensions.cs
as an IImage extension. The PR's helper is a private static on ImageElement. Both are
internal helpers. There is no concrete reuse today that would justify the extra Core
extension API; the PR keeps the predicate co-located with its only callers.

Why pr-plus-reviewer wins over plain pr

The expert reviewer (maui-expert-reviewer at claude-opus-4.6) ran a 30-dimension audit
and surfaced a single moderate finding: in ImageHandler.iOS.cs the new expression-bodied
method's closing context made the trailing brace at \t\t} look like a method-closing
brace, when in fact it closes the outer class. The reviewer applied a 1-line indentation
fix. This is a strict superset of the PR with zero behavioural change.

Decision

Winner: pr-plus-reviewer

  • Smallest diff among passing candidates with the correct conservative scope.
  • Includes the expert reviewer's readability fix for the iOS handler.
  • All regression tests pass (gate-verified).
  • Does not introduce broad VisualElement behavioural changes that lack regression coverage.

Recommendation to the PR Author

  1. Apply the brace-indent fix on src/Core/src/Handlers/Image/ImageHandler.iOS.cs:83-84
    (see expert-pr-eval/content.md for diff hint).
  2. (Optional / follow-up) The generic-propagation idea (try-fix-1/-3) is interesting
    and worth a separate exploratory issue/PR with broader (non-image) regression coverage
    — but it is not a substitute for this fix.
  3. (Optional) Consider parity for Android (ImageHandler.Android.cs) — the PR fixes the
    cross-platform ImageElement path which benefits Android, but if the Android handler
    has its own analogous post-load invalidation it would not be gated.

@MauiBot MauiBot added s/agent-review-incomplete s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels May 11, 2026
@kubaflo kubaflo changed the base branch from main to inflight/current May 11, 2026 18:48
@kubaflo kubaflo merged commit f4140ed into dotnet:inflight/current May 11, 2026
3 of 4 checks passed
@AdamEssenmacher AdamEssenmacher deleted the issue-32457 branch May 11, 2026 18:48
@github-actions github-actions Bot added this to the .NET 10 SR7 milestone May 11, 2026
@kubaflo kubaflo added s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-changes-requested AI agent recommends changes - found a better alternative or issues and removed s/agent-review-incomplete labels May 20, 2026
PureWeen pushed a commit that referenced this pull request Jun 2, 2026
### Description of Change

This PR avoids invalidating layout when an `ImageSource` changes for
image-backed controls whose measured size cannot change: both width and
height are explicit and both layout alignments are `Fill`.

The fix preserves measure invalidation when the image source can still
affect measured size, including:
- implicit width or height
- non-`Fill` horizontal or vertical alignment
- iOS stream image post-load sizing paths

Added regression coverage for `Image`, `ImageButton`, and `Button`, plus
BenchmarkDotNet coverage for the source-swap layout invalidation path.

BenchmarkDotNet results for the layout-proxy benchmark:

| Scenario | Before | After |
|---|---:|---:|
| Auto-sized image source swaps | 2.875 ms, 1.59 MB | 2.926 ms, 1630.47
KB |
| Explicitly sized image source swaps | 4.189 ms, 1.59 MB | 62.08 us,
71.88 KB |

Validation performed:
- `dotnet test
./src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj`
- `dotnet build ./src/Core/src/Core.csproj -f net10.0-ios26.0 -c Debug`
- `dotnet build ./src/Core/tests/Benchmarks/Core.Benchmarks.csproj -c
Release`
- BenchmarkDotNet default job for `ImageSourceLayoutBenchmarker`

### Issues Fixed

Fixes #32457

---------
PureWeen pushed a commit that referenced this pull request Jun 11, 2026
### Description of Change

This PR avoids invalidating layout when an `ImageSource` changes for
image-backed controls whose measured size cannot change: both width and
height are explicit and both layout alignments are `Fill`.

The fix preserves measure invalidation when the image source can still
affect measured size, including:
- implicit width or height
- non-`Fill` horizontal or vertical alignment
- iOS stream image post-load sizing paths

Added regression coverage for `Image`, `ImageButton`, and `Button`, plus
BenchmarkDotNet coverage for the source-swap layout invalidation path.

BenchmarkDotNet results for the layout-proxy benchmark:

| Scenario | Before | After |
|---|---:|---:|
| Auto-sized image source swaps | 2.875 ms, 1.59 MB | 2.926 ms, 1630.47
KB |
| Explicitly sized image source swaps | 4.189 ms, 1.59 MB | 62.08 us,
71.88 KB |

Validation performed:
- `dotnet test
./src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj`
- `dotnet build ./src/Core/src/Core.csproj -f net10.0-ios26.0 -c Debug`
- `dotnet build ./src/Core/tests/Benchmarks/Core.Benchmarks.csproj -c
Release`
- BenchmarkDotNet default job for `ImageSourceLayoutBenchmarker`

### Issues Fixed

Fixes #32457

---------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community ✨ Community Contribution s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Image source swaps thrash layout under fixed constraints, tanking frame rate when scrolling virtualized collections

5 participants