Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Feb 11, 2025

This PR contains the following updates:

Package Change Age Confidence
io.github.takahirom.roborazzi 1.40.11.56.0 age confidence
io.github.takahirom.roborazzi:roborazzi-compose-preview-scanner-support 1.40.11.56.0 age confidence
io.github.takahirom.roborazzi:roborazzi-compose-ios 1.40.11.56.0 age confidence
io.github.takahirom.roborazzi:roborazzi-compose-desktop 1.40.11.56.0 age confidence
io.github.takahirom.roborazzi:roborazzi-compose 1.40.11.56.0 age confidence
io.github.takahirom.roborazzi:roborazzi-junit-rule 1.40.11.56.0 age confidence
io.github.takahirom.roborazzi:roborazzi 1.40.11.56.0 age confidence

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

takahirom/roborazzi (io.github.takahirom.roborazzi)

v1.56.0

Compare Source

Added AGP 9.0 compatibility to RoborazziPlugin

Roborazzi was previously using APIs and classes that have since been deprecated, such as Variant.unitTest and TestedExtension. We have now migrated to alternative, supported classes and methods. Thanks for reporting this, @​allanconda-mercari !

Behavior changes: Stabilized preview LaunchedEffect execution for Compose Preview support

Previously, screenshots occasionally differed from Android Studio Composable Preview when using LaunchedEffect. We now invoke composeTestRule.mainClock.advanceTimeByFrame() by default, so some screenshots may appear different. You can restore the previous behavior by implementing a custom tester as follows:

composeRuleFactory = { createAndroidComposeRule<RoborazziActivity>() as AndroidComposeTestRule<ActivityScenarioRule<out ComponentActivity>, *> },
What's Changed

Full Changelog: takahirom/roborazzi@1.55.0...1.56.0

v1.55.0

Compare Source

Bugfix: Fix WebP ClassCastException
What happened
  • Robolectric runs inside a custom class loader named SdkSandboxClassLoader.
  • Roborazzi's WebP support relies on ImageIO.getImageWritersByMIMEType, which internally caches writers in a static field. When the writer is first created, the code is executed by SdkSandboxClassLoader1.
  • Subsequently, when another test runs with a different SDK (e.g., 35), a second SdkSandboxClassLoader (SdkSandboxClassLoader2) is spawned. Because ImageIO's cached instance was loaded by a different class loader, attempting to cast it triggers a ClassCastException.

class com.luciad.imageio.webp.WebPWriteParam cannot be cast to class com.luciad.imageio.webp.WebPWriteParam (com.luciad.imageio.webp.WebPWriteParam is in unnamed module of loader org.robolectric.internal.AndroidSandbox$SdkSandboxClassLoader @​1dbb650b; com.luciad.imageio.webp.WebPWriteParam is in unnamed module of loader org.robolectric.internal.AndroidSandbox$SdkSandboxClassLoader @​3e48e859)

What we did

We leveraged reflection to force ImageIO.getImageWritersByMIMEType to use the System ClassLoader, thereby guaranteeing that the same class definition is shared irrespective of the current SdkSandboxClassLoader.
Many thanks to @​eygraber for reporting this bug!

What's Changed

Full Changelog: takahirom/roborazzi@1.54.0...1.55.0

v1.54.0

Compare Source

Breaking change: Report HTML and JSON paths have changed

The HTML report used to be at build/reports/roborazzi/index.html but is now located at build/reports/roborazzi/<build_variant>/index.html. This is a first step toward fixing a long-standing issue where running recordRoborazzi (instead of recordRoborazziDebug) could break test results; further work is still needed to make it fully reliable.

You should be able to fix it by adding /debug/ (or your build variant) to the path in your CI script. I believe the change is straightforward, but if you run into any cases where it's difficult please let me know.

Note: This change does not affect the paths of the generated screenshot images, so most users will not be impacted.

Thank you for your contribution, @​vladcudoidem!

Behavioral change: Fixed screenshot timing for Compose Preview Support

Previously, we used Espresso.onIdle() and ShadowLooper.idle(), but these APIs are not suitable for Compose. Consequently, screenshots could not be captured after onSizeChanged completed.

@&#8203;Preview
@&#8203;Composable
fun PreviewOnSizeChanged() {
  var size by remember { mutableStateOf("unknown") }
  Box(
    modifier = Modifier
      .size(100.dp)
      .background(Color.Blue)
      .onSizeChanged { size = "${it.width}x${it.height}" } // Now invoked! (It used to be skipped.)
  ) {
    Text(text = size, color = Color.White)
  }
}

If you encounter issues with infinite animations—such as CircularProgressIndicator—you can configure frame-based captures using @RoboComposePreviewOptions.

@&#8203;RoboComposePreviewOptions(
  manualClockOptions = [ManualClockOptions(advanceTimeMillis = 0L)]
)

Thank you for reporting this issue, @​savvasenok!

What's Changed

Full Changelog: takahirom/roborazzi@1.53.0...1.54.0

v1.53.0

Compare Source

New feature generatedTestClassCount and behavior changes to Compose Preview support

We've added the generatedTestClassCount option, which enables us to run Preview tests in parallel when you set maxParallelForks to a value greater than 1.

roborazzi {
  generateComposePreviewRobolectricTests {
    generatedTestClassCount = 4
  }
}

As the name generatedTestClassCount suggests, this option generates as many test classes as specified. It creates tests whose previewIndex % totalTestClassCount == testClassIndex. However, this option does not modify maxParallelForks, so you must also set maxParallelForks yourself to run tests in parallel. This is our policy: we never alter other plugin(AGP) settings in order to keep one single source of configuration.

Behavior changes: generatedTestClassCount now defaults to the same value as maxParallelForks. Therefore, if you already use maxParallelForks during testing, the behavior may change if your tests are non-deterministic—for example, if they depend on the order in which other tests run.

Last but not least, thanks to @​sergio-sastre for suggesting this feature, reviewing the code, and confirming the approach works!

Fix configuration-time resolution when using BOM to Compose Preview support

Fixed an error where the version verification logic triggered configuration-time resolution errors when using BOM (Bill of Materials) for dependency management.

The fix simplifies the verifyComposablePreviewScannerVersion method by removing the complex fallback logic that attempted to infer versions from test configurations. Instead, the plugin now only checks explicitly declared versions—when no version is specified (indicating BOM management), verification is skipped.

Thanks to @​igokoro for reporting this issue!

Fix iOS snapshot not creating parent directories before writing files

Fixed a critical bug where iOS snapshot tests weren't being recorded on the first run. The root cause was that NSData.writeToFile silently fails when parent directories don't exist.

The fix ensures parent directories are automatically created before writing files using NSFileManager.defaultManager.createDirectoryAtPath with withIntermediateDirectories = true. Additionally, error logging was added to report both successful and failed file operations, preventing silent failures.

Thanks to @​jl-jonas for reporting this issue!

What's Changed

Full Changelog: takahirom/roborazzi@1.52.0...1.53.0

v1.52.0

Compare Source

Support for com.android.kotlin.multiplatform.library plugin

Even though we can use androidUnitTest in Kotlin Multiplatform Plugin, there is a way to add Android target to KMP and this might become mainstream. Roborazzi did not add the task for this plugin so we added tasks like recordRoborazziAndroidHostTest. Thank you for reporting this issue @​xVemu !

Support for KMP testRuns API

When we add testRuns in build.gradle, that enables us to control dependencies for tests in KMP, Roborazzi used to fail with Cannot add task 'clearRoborazziJvm' as a task with that name already exists.. Thank you for reporting this issue as well @​xVemu !

Fix preview tests plugin when using Bom dependencies

There are patterns that we cannot build with Roborazzi due to configuration cache issues. We addressed this issue using a new API for configuration cache. Thank you for reporting this @​igokoro !

What's Changed

Full Changelog: takahirom/roborazzi@1.51.0...1.52.0

v1.51.0

Compare Source

Add validation for Compose Preview Support users

includePrivatePreviews is an option we can set in Gradle DSL. However, there is a scenario where we cannot use it, and it appears to be a flaw. The reason why includePrivatePreviews is not utilized is that users can specify a custom tester in their code, and Roborazzi's default tester applies the option using parameters from the Gradle DSL. You can see the error message if you do not set options properly, as shown below. You can simply review and follow what the error message indicates. Thank you, @​egorikftp, for reporting this issue! Thank you, @​sergio-sastre, for your input on this issue!

  You have two options:
  1. Remove 'includePrivatePreviews = true' from generateComposePreviewRobolectricTests configuration
     and call '.includePrivatePreviews()' directly in your custom tester's testParameters() method.

  2. Set 'useScanOptionParametersInTester = true' in generateComposePreviewRobolectricTests configuration
     and check 'options.scanOptions.includePrivatePreviews' in your testParameters() implementation.

  Example for option 1:

https://redirect.github.com/takahirom/roborazzi/pull/740/files#diff-0ed97664cea9b889781317183ecffc5ab489f71f3c1ee34484ea1eeb392dd3a5R121-R167

What's Changed

Full Changelog: takahirom/roborazzi@1.50.0...1.51.0

v1.50.0

Compare Source

Fixed: Resolved Gradle task dependency errors with Android Gradle Plugin 8.12+ where GenerateComposePreviewRobolectricTestsTask output was used by compilation tasks without explicit dependencies. Thank you @​papo2608 for reporting this issue.

What's Changed

Full Changelog: takahirom/roborazzi@1.49.0...1.50.0

v1.49.0

Compare Source

ComposablePreviewScanner 0.7.0 Compatibility Update
Breaking Change - Compatibility Update Required

This release addresses a breaking compatibility issue with ComposablePreviewScanner 0.7.0 that affects users of Roborazzi's Preview support feature.

The Problem

When using ComposablePreviewScanner 0.7.0 with previous versions of Roborazzi, you'll encounter NoSuchMethodError at runtime. This happens because:

  • Method relocation: ComposablePreviewScanner 0.7.0 moved methods from AndroidPreviewScreenshotIdBuilder to provide common PreviewScreenshotIdBuilder methods for Glance and Compose Multiplatform
  • Import mismatch: Previous Roborazzi versions contain generated code with outdated import statements
  • Runtime failure: Auto-generated Roborazzi tests from Previews crash when trying to execute methods at their old locations
The Solution

This Roborazzi update replaces the old method calls and import statements with new ones compatible with ComposablePreviewScanner 0.7.0+. However, since these new method locations don't exist in ComposablePreviewScanner 0.6.x, you must update both libraries together.

⚠️ Required Action

If you use Roborazzi's Preview support, you must:

  • Update Roborazzi to this version
  • Update ComposablePreviewScanner to 0.7.0 or later

Both updates are required - updating only one will cause build or runtime errors.

Migration Steps
// Update both dependencies together
implementation "io.github.takahirom.roborazzi:roborazzi:1.49.0"
implementation "io.github.sergio-sastre.ComposablePreviewScanner:android:0.7.0" // or newer
Improved Error Detection

We've added clear build-time error messages to help you identify when this compatibility issue occurs, so you'll know exactly what needs to be updated instead of encountering cryptic runtime errors.

Common Update Scenarios

Scenario 1: Update only ComposablePreviewScanner to 0.7.0
NoSuchMethodError with old Roborazzi. Update Roborazzi to resolve.

Scenario 2: Update only Roborazzi
→ Compile-time error with clear message to update ComposablePreviewScanner ✅

Acknowledgments

Thanks to @​sergio-sastre for collaboration on resolving this compatibility challenge and maintaining the ComposablePreviewScanner library.

What's Changed

Full Changelog: takahirom/roborazzi@1.48.0...1.49.0

v1.48.0

Compare Source

Fix Preview Size Retention Bug

Fixed issue where @Preview annotation size attributes (heightDp/widthDp) incorrectly persisted between captures

Problem

Subsequent previews without explicit size would inherit dimensions from previous previews instead of using defaults.

Solution

Save and restore Robolectric qualifiers properly in captureRoboImage() to ensure preview size isolation.

Thanks to @​smuldr for reporting this issue!

Breaking Changes: Update Libraries

You can see the changes at: https://github.com/takahirom/roborazzi/actions/runs/16952566040

Overall, we are now using Kotlin 2.0.21. We don't chase the latest versions, but we want to add tests using the latest Compose Multiplatform Previews. Thank you for letting me know about this! @​sergio-sastre

What's Changed

Full Changelog: takahirom/roborazzi@1.47.0...1.48.0

v1.47.0

Compare Source

Compose Preview Tester Customization

Added Capturer interface to AndroidComposePreviewTester for customizing capture behavior (#​716). This allows setting custom
comparison thresholds and other RoborazziOptions for generated Compose preview tests.

import com.dropbox.differ.SimpleImageComparator
import com.github.takahirom.roborazzi.*

@&#8203;ExperimentalRoborazziApi
class MyCustomComposePreviewTester(
  private val defaultCapturer: AndroidComposePreviewTester.Capturer = AndroidComposePreviewTester.DefaultCapturer()
) : AndroidComposePreviewTester(
  capturer = { parameter ->
    val customOptions = parameter.roborazziOptions.copy(
      compareOptions = parameter.roborazziOptions.compareOptions.copy(
        // Set custom comparison threshold (0.0 = exact match, 1.0 = ignore differences)
        imageComparator = SimpleImageComparator(maxDistance = 0.01f)
      )
    )
    defaultCapturer.capture(
      parameter.copy(roborazziOptions = customOptions)
    )
  }
)

Fixes #​703. Thanks @​pavel163 for the issue report and @​sergio-sastre for the review!

What's Changed
New Contributors

Full Changelog: takahirom/roborazzi@1.46.1...1.47.0

v1.46.1

Compare Source

Bugfix: Fix screenshot sizing for RoborazziComposeSizeOption and Previews on Robolectric 4.15+

This release finally resolves a complex screenshot sizing issue that occurred after the Robolectric 4.15 update. Version 1.46.0 was never released as we discovered additional edge cases during the pre-release phase. This version, 1.46.1, addresses all known issues.

Initially, we migrated to using RuntimeEnvironment.setQualifiers() to configure the screen size, following the recommended approach for recent Robolectric versions. However, this change introduced new problems, especially when a widthDp and heightDp with different values were specified, or when used in combination with the device parameter in @Preview.

After extensive investigation and discussion, we've implemented a more robust solution. Roborazzi now automatically adds the correct orientation qualifier (-land or -port) based on the provided dimensions and ensures the qualifiers are applied in the correct order to avoid conflicts with other configurations. This fixes sizing for all Compose screenshot tests, making them reliable and predictable again.

Acknowledgements

A huge thank you to everyone who contributed to resolving this challenging issue! This fix would not have been possible without the collaborative effort of the community.

  • A special and massive thank you to @​sergio-sastre for their incredibly thorough testing and persistent feedback. They identified several critical edge cases, provided detailed reproductions, and patiently validated every fix, which was essential for making this solution robust.
  • Thank you to the Robolectric team, especially @​paulsowden and @​hoisie, for their invaluable guidance. Their deep insights into Robolectric's internals and clear explanation of how setQualifiers and orientation work were crucial in pointing us toward the correct and final solution.
  • Thanks to @​mannodermaus for the initial detailed bug report that kicked off this entire investigation.
  • Also, thank you to @​suhtai for providing helpful information in the early stages.
What's Changed

Full Changelog: takahirom/roborazzi@1.46.0...1.46.1

v1.45.1

Compare Source

Please refer to https://github.com/takahirom/roborazzi/releases/tag/1.45.0

v1.45.0: (Publishing Failed)

Compare Source

The attempt to publish version 1.45.0 to the Maven Central repository appears to have failed. The release status is showing as "FAILED," so I will publish version 1.45.1 instead.

(This issue has since been resolved by contacting Maven Central support. Please use 1.45.1)

Bug fixes

  • The dialog's background dimming is now visible, just as it would be on a real device. Thank you for investigating this. @​jeppeman
    image

  • There was a bug that caused Roborazzi to crash when using BoxWithConstraints with a Dialog. Thank you, @​matsudamper, for the report and the sample code.

What's Changed

Full Changelog: takahirom/roborazzi@1.44.0...1.45.0

v1.44.0

Compare Source

Please refer to https://github.com/takahirom/roborazzi/releases/tag/1.44.0-alpha01 to see the main changes in version 1.44.0. We are still seeking feedback on RoboComposePreviewOptions. RoboComposePreviewOptions is still experimental, and we may introduce breaking changes.

New feature: Added JUnit @Category to auto-generated tests from Compose Preview

You can now filter tests using JUnit4's RoborazziComposePreviewTestCategory. Thanks to @​hellohj for the suggestion.

Bugfix: Subdirectory screenshots are now removed when roborazzi.cleanupOldScreenshots=true

Previously, when roborazzi.cleanupOldScreenshots=true was used, subdirectory screenshots were not removed as intended. Thanks to @​pacoalface-jt for reporting the bug.

What's Changed

Full Changelog: takahirom/roborazzi@1.43.1...1.44.0

v1.43.1

Compare Source

We added error handling for font availability checks in 1.43.0. However, it seems that the "font not available" error is an Error rather than an Exception, so we updated the code to handle Throwable.

What's Changed
  • [No Roborazzi library dependency update] Update dependency androidx.compose.ui:ui-tooling-preview to v1.7.8 by @​renovate in #​643
  • Handle font availability errors by catching Throwable by @​takahirom in #​665

Full Changelog: takahirom/roborazzi@1.43.0...1.43.1

v1.43.0

Compare Source

Bugfix

Added error handling for font availability checks in headless environments, falling back to Font.MONOSPACED when preferred fonts are unavailable. Thanks for reporting this issue @​pavel163

What's Changed

Full Changelog: takahirom/roborazzi@1.42.0...1.43.0

v1.42.0

Compare Source

Bug fixes

We are using the "Courier New" font for comparison image text and screenshot dumps. It appears that "Courier New" is not available in CentOS, although this may not be an issue for Mac, Ubuntu, and Windows users.

To address this problem, we have introduced two mechanisms. Thank you for reporting this issue, @​LloydBlv.

  • Added a fallback to Font.MONOSPACED to ensure execution when the font exists
  • Made the font customizable through roborazzi.theme.typography.font.name=Your Font Name
What's Changed

Full Changelog: takahirom/roborazzi@1.41.1...1.42.0

v1.41.1

Compare Source

In some cases, the new test result format breaks the report's HTML/JS. Thank for fixing this, @​unni-dm!

What's Changed
  • Fix for HTML result will break when context data key has special char… by @​unni-dm in #​654
New Contributors

Full Changelog: takahirom/roborazzi@1.41.0...1.41.1

v1.41.0

Compare Source

HTML Report Improvements

Thanks to @​mannodermaus's contribution, context and AI assertion results now display more intuitively instead of showing raw data class toString() outputs.
image

Bug Fixes
  • Screenshot dumping now follows deterministic behavior thanks to @​siarhei-luskanau's implementation
Automatic Retry Handling for 429 Errors

(Only relevant for arbigent-ai-openai users)
We've implemented automatic retry logic for HTTP 429 errors common with AI model rate limits, eliminating manual intervention.

Experimental Multi-Image AI Assertion

Originally developed for Arbigent, this feature now supports multi-image inputs for AI assertions - enabling detection of video playback or animated content through AI analysis.

What's Changed

Full Changelog: takahirom/roborazzi@1.40.1...1.41.0


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about these updates again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot added the dependencies upgrade dependencies label Feb 11, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from d4f341d to af7c4e6 Compare February 13, 2025 07:04
@renovate renovate bot changed the title Update roborazzi to v1.41.0 Update roborazzi to v1.41.1 Feb 13, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from af7c4e6 to 6a3f1ee Compare February 16, 2025 05:30
@renovate renovate bot changed the title Update roborazzi to v1.41.1 Update roborazzi Feb 16, 2025
@renovate renovate bot changed the title Update roborazzi Update roborazzi to v1.42.0 Feb 16, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 6a3f1ee to b0edb6c Compare February 27, 2025 06:49
@renovate renovate bot changed the title Update roborazzi to v1.42.0 Update roborazzi to v1.43.0 Feb 27, 2025
@renovate renovate bot changed the title Update roborazzi to v1.43.0 Update roborazzi Mar 21, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from b0edb6c to dc45a33 Compare March 21, 2025 07:04
@renovate renovate bot changed the title Update roborazzi Update roborazzi to v1.43.1 Mar 21, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from dc45a33 to 6bacc66 Compare June 1, 2025 09:26
@renovate renovate bot changed the title Update roborazzi to v1.43.1 Update roborazzi to v1.44.0 Jun 1, 2025
@renovate renovate bot changed the title Update roborazzi to v1.44.0 Update roborazzi Jun 18, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 6bacc66 to 0b6388d Compare June 19, 2025 01:59
@renovate renovate bot changed the title Update roborazzi Update roborazzi to v1.45.1 Jun 19, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 0b6388d to 8eb1696 Compare July 5, 2025 14:44
@renovate renovate bot changed the title Update roborazzi to v1.45.1 Update roborazzi to v1.46.1 Jul 5, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 8eb1696 to 45e46a3 Compare August 11, 2025 12:46
@renovate renovate bot changed the title Update roborazzi to v1.46.1 Update roborazzi to v1.47.0 Aug 11, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 45e46a3 to 922fdd6 Compare August 14, 2025 09:44
@renovate renovate bot changed the title Update roborazzi to v1.47.0 Update roborazzi to v1.48.0 Aug 14, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 922fdd6 to 4f1658d Compare August 19, 2025 05:22
@renovate renovate bot changed the title Update roborazzi to v1.48.0 Update roborazzi to v1.49.0 Aug 19, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 4f1658d to 59696c6 Compare August 23, 2025 01:59
@renovate renovate bot changed the title Update roborazzi to v1.49.0 Update roborazzi to v1.50.0 Aug 23, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 59696c6 to 014d7d4 Compare November 4, 2025 06:52
@renovate renovate bot changed the title Update roborazzi to v1.50.0 Update roborazzi to v1.51.0 Nov 4, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 014d7d4 to 8d53dfa Compare November 24, 2025 13:35
@renovate renovate bot changed the title Update roborazzi to v1.51.0 Update roborazzi to v1.52.0 Nov 24, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from 8d53dfa to f82502b Compare December 31, 2025 08:46
@renovate renovate bot changed the title Update roborazzi to v1.52.0 Update roborazzi to v1.53.0 Dec 31, 2025
@renovate renovate bot force-pushed the renovate/roborazzi branch from f82502b to 5bbbef6 Compare January 3, 2026 10:05
@renovate renovate bot changed the title Update roborazzi to v1.53.0 Update roborazzi to v1.54.0 Jan 3, 2026
@renovate renovate bot force-pushed the renovate/roborazzi branch from 5bbbef6 to caf59f6 Compare January 7, 2026 13:34
@renovate renovate bot changed the title Update roborazzi to v1.54.0 Update roborazzi to v1.55.0 Jan 7, 2026
@renovate renovate bot force-pushed the renovate/roborazzi branch from caf59f6 to 16fd88b Compare January 9, 2026 14:09
@renovate renovate bot changed the title Update roborazzi to v1.55.0 Update roborazzi to v1.56.0 Jan 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies upgrade dependencies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant