diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fcf723..df407ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,37 @@ なし +## [2.1.0] - 2026-08-02 + +### 追加 + +- **iPad の分割幅を `SnapshotDevice` に追加**: `iPadPro11Half`(597×834)と + `iPadPro11Third`(398×834)。iPadOS 26 で Split View / Slide Over が廃止され、 + ウィンドウが自由リサイズになったため、HIG が求める 1/2・1/3 幅での検証を撮れるようにした。 + 幅は横向き(1194pt)を基準に取る —— 縦向きの 1/3(278pt)は iPadOS が許す + ウィンドウ最小幅を下回り、実際には作れない面になるため。 + **どちらの幅も horizontal size class は compact に落ちる。** +- **文字サイズの軸 `SnapshotDynamicType`**: `.standard`(`.large`)と + `.accessibility3`。`SnapshotConfiguration.dynamicTypes` で指定する。 + SwiftUI の `\.dynamicTypeSize` 環境と `ViewImageConfig` の + `preferredContentSizeCategory` trait の両方に効かせる —— 環境だけだと、 + UIKit が寸法を決める部分(ナビゲーションバー・リスト行の最小高)が既定サイズのまま残る。 +- `SnapshotEntry.dynamicType`(`String?`)。既定サイズでは `nil`。 +- `SnapshotConfiguration.standardDevices`(既定で撮る 3 端末)。 + +### 変更 + +- **`SnapshotConfiguration` の既定端末を `SnapshotDevice.allCases` から + `standardDevices` に変更した。** 端末を 1 つ足すたびに既存の全スイートが撮る枚数が + 黙って増え、参照画像の無い面が失敗として現れるため。分割幅は使うスイートが明示的に足す。 + **2.0 系で撮った参照画像はそのまま使える**(既定の行列は変わっていない)。 + +### 互換性 + +- 既定の文字サイズでは参照画像の名前を変えない(`{state}.{theme}_{locale}.png`)。 + アクセシビリティサイズのときだけ `_{dynamicType}` が付く。2.0 系で記録した画像の + 撮り直しは不要。 + ## [2.0.0] - 2026-06-06 ### 破壊的変更 diff --git a/README.ja.md b/README.ja.md index 7dc4bdf..6518f2f 100644 --- a/README.ja.md +++ b/README.ja.md @@ -12,9 +12,9 @@ SwiftUI向けのスナップショットテストライブラリ。宣言的マ ## 特徴 - **宣言的マクロ**: `@SnapshotSuite` / `@Snapshot` / `@ComponentSnapshot` で View を返すだけ -- **マトリクステスト**: デバイス × テーマ × ロケールの全組み合わせを自動生成 +- **マトリクステスト**: デバイス × テーマ × ロケール × 文字サイズの全組み合わせを自動生成 - **デバイスサブディレクトリ**: `__Snapshots__/{ViewName}/{device}/{stateName}.{theme}_{locale}.png` で自動整理 -- **iPad 対応**: iPhone16 + iPhoneSE + iPadPro11 の3デバイスをデフォルトサポート +- **iPad 対応**: iPhone16 + iPhoneSE + iPadPro11 の3デバイスをデフォルトサポート。iPadOS 26 のウィンドウ幅(1/2・1/3)は明示指定で足せる - **メタデータカタログ**: per-view `manifest.json` とルート `snapshot-catalog.json` を自動生成 - **テーマシステム統合**: `ThemeApplicable` プロトコルで任意のテーマシステムと接続 - **View / Component 分離**: View は全軸マトリクス、コンポーネントはテーマ軸のみでテスト @@ -329,16 +329,25 @@ public struct SnapshotCase: Sendable, CustomTestStringConvertible { | `devices` | `[SnapshotDevice]` | `[.iPhone16, .iPhoneSE, .iPadPro11]` | テスト対象デバイス | | `themes` | `[SnapshotTheme]` | `[.light, .dark]` | テスト対象テーマ | | `locales` | `[String]` | `["en", "ja"]` | テスト対象ロケール | +| `dynamicTypes` | `[SnapshotDynamicType]` | `[.standard]` | テスト対象の文字サイズ | | `precision` | `Float` | `0.99` | ピクセル精度 | | `perceptualPrecision` | `Float` | `0.98` | 知覚的精度 | ### SnapshotDevice -| ケース | 画面サイズ | スケール | -|--------|----------|---------| -| `.iPhone16` | 393 × 852 | @3x | -| `.iPhoneSE` | 375 × 667 | @2x | -| `.iPadPro11` | 834 × 1194 | @2x | +| ケース | 画面サイズ | スケール | horizontal size class | +|--------|----------|---------|------| +| `.iPhone16` | 393 × 852 | @3x | compact | +| `.iPhoneSE` | 375 × 667 | @2x | compact | +| `.iPadPro11` | 834 × 1194 | @2x | regular | +| `.iPadPro11Half` | 597 × 834 | @2x | compact | +| `.iPadPro11Third` | 398 × 834 | @2x | compact | + +後ろの 2 つは iPad のウィンドウ幅。iPadOS 26 で Split View / Slide Over が廃止されて +自由リサイズのウィンドウになり、HIG が 1/2・1/3 幅での検証を求めるようになったため足した。 +幅は横向き(1194pt)を基準に取る —— 縦向きの 1/3(278pt)は iPadOS が許すウィンドウの +最小幅を下回り、実際には作れない面を撮ることになる。 +**既定の端末一覧には入れていない。** 要るスイートが明示的に足す。 ### SnapshotTheme @@ -347,6 +356,18 @@ public struct SnapshotCase: Sendable, CustomTestStringConvertible { | `.light` | ライトモード | | `.dark` | ダークモード | +### SnapshotDynamicType + +| ケース | `DynamicTypeSize` | ファイル名の接尾辞 | +|--------|------|------| +| `.standard` | `.large` | なし | +| `.accessibility3` | `.accessibility3` | `_accessibility3` | + +`.standard` は 2.0 系と同じファイル名のままなので、**この軸を足しても既存の参照画像は +無効にならない。** SwiftUI の `\.dynamicTypeSize` 環境と `preferredContentSizeCategory` +trait の両方に効かせる —— 環境だけだと、UIKit が寸法を決める部分(ナビゲーションバー・ +リスト行の最小高)が既定サイズのまま残る。 + ### ThemeApplicable ```swift diff --git a/README.md b/README.md index 62ace7f..3905625 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ SwiftUI snapshot testing library. Eliminates boilerplate with declarative macros ## Features - **Declarative macros**: `@SnapshotSuite` / `@Snapshot` / `@ComponentSnapshot` — just return a View -- **Matrix testing**: Automatically generates every device × theme × locale combination +- **Matrix testing**: Automatically generates every device × theme × locale × text size combination - **Device subdirectories**: Auto-organized at `__Snapshots__/{ViewName}/{device}/{stateName}.{theme}_{locale}.png` -- **iPad support**: iPhone 16, iPhone SE, and iPad Pro 11 supported by default (3 devices) +- **iPad support**: iPhone 16, iPhone SE, and iPad Pro 11 by default; iPadOS 26 window widths (1/2, 1/3) opt in - **Metadata catalog**: Auto-generates per-view `manifest.json` and root `snapshot-catalog.json` - **Theme system integration**: Connect any theme system via the `ThemeApplicable` protocol - **View / Component separation**: Views use the full matrix; components use theme axis only @@ -129,7 +129,7 @@ struct MyViewSnapshots { **Output**: `__Snapshots__/MyView/{device}/loaded.{theme}_{locale}.png` -The default configuration produces 3 devices × 2 themes × 2 locales = **12 snapshots**. +The default configuration produces 3 devices × 2 themes × 2 locales × 1 text size = **12 snapshots**. ### Component Snapshots @@ -329,16 +329,25 @@ public struct SnapshotCase: Sendable, CustomTestStringConvertible { | `devices` | `[SnapshotDevice]` | `[.iPhone16, .iPhoneSE, .iPadPro11]` | Target devices | | `themes` | `[SnapshotTheme]` | `[.light, .dark]` | Target themes | | `locales` | `[String]` | `["en", "ja"]` | Target locales | +| `dynamicTypes` | `[SnapshotDynamicType]` | `[.standard]` | Target text sizes | | `precision` | `Float` | `0.99` | Pixel precision | | `perceptualPrecision` | `Float` | `0.98` | Perceptual precision | ### SnapshotDevice -| Case | Screen Size | Scale | -|--------|----------|---------| -| `.iPhone16` | 393 × 852 | @3x | -| `.iPhoneSE` | 375 × 667 | @2x | -| `.iPadPro11` | 834 × 1194 | @2x | +| Case | Screen Size | Scale | Horizontal size class | +|--------|----------|---------|------| +| `.iPhone16` | 393 × 852 | @3x | compact | +| `.iPhoneSE` | 375 × 667 | @2x | compact | +| `.iPadPro11` | 834 × 1194 | @2x | regular | +| `.iPadPro11Half` | 597 × 834 | @2x | compact | +| `.iPadPro11Third` | 398 × 834 | @2x | compact | + +The two window widths cover the 1/2 and 1/3 sizes the HIG asks you to verify now that +iPadOS 26 replaced Split View with freely resizable windows. Widths are taken from the +landscape screen (1194pt) — a third of the portrait width (278pt) is below the minimum +window width iPadOS allows, so it would render a layout no user can produce. They are +**not** in the default device list; add them explicitly to the suites that need them. ### SnapshotTheme @@ -347,6 +356,18 @@ public struct SnapshotCase: Sendable, CustomTestStringConvertible { | `.light` | Light mode | | `.dark` | Dark mode | +### SnapshotDynamicType + +| Case | `DynamicTypeSize` | File name suffix | +|--------|------|------| +| `.standard` | `.large` | none | +| `.accessibility3` | `.accessibility3` | `_accessibility3` | + +`.standard` keeps the 2.0 file name, so adding this axis never invalidates existing +reference images. Both the SwiftUI `\.dynamicTypeSize` environment and the +`preferredContentSizeCategory` trait are set — the environment alone leaves UIKit-sized +chrome (navigation bar, minimum row height) at the default size. + ### ThemeApplicable ```swift diff --git a/Sources/VisualTesting/Assertions.swift b/Sources/VisualTesting/Assertions.swift index fb95707..9f1fb0d 100644 --- a/Sources/VisualTesting/Assertions.swift +++ b/Sources/VisualTesting/Assertions.swift @@ -44,31 +44,34 @@ public enum VisualTesting { for theme in configuration.themes { for locale in configuration.locales { - let vc = makeHostingController( - view: wrapped, - device: device, - theme: theme, - locale: locale - ) - let snapshotName = "\(theme.rawValue)_\(locale)" - - let failure = verifySnapshot( - of: vc, - as: .image( - on: device.config, - precision: configuration.precision, - perceptualPrecision: configuration.perceptualPrecision - ), - named: snapshotName, - snapshotDirectory: dir, - file: file, - testName: stateName, - line: line - ) - if let message = failure { - Issue.record( - Comment(rawValue: "\(viewName)/\(device.rawValue)/\(stateName).\(snapshotName): \(message)") + for dynamicType in configuration.dynamicTypes { + let vc = makeHostingController( + view: wrapped, + device: device, + theme: theme, + locale: locale, + dynamicType: dynamicType ) + let snapshotName = snapshotName(theme: theme, locale: locale, dynamicType: dynamicType) + + let failure = verifySnapshot( + of: vc, + as: .image( + on: device.config(dynamicType: dynamicType), + precision: configuration.precision, + perceptualPrecision: configuration.perceptualPrecision + ), + named: snapshotName, + snapshotDirectory: dir, + file: file, + testName: stateName, + line: line + ) + if let message = failure { + Issue.record( + Comment(rawValue: "\(viewName)/\(device.rawValue)/\(stateName).\(snapshotName): \(message)") + ) + } } } } @@ -80,6 +83,7 @@ public enum VisualTesting { device: device, themes: configuration.themes, locales: configuration.locales, + dynamicTypes: configuration.dynamicTypes, inNavigation: inNavigation, disableAnimations: disableAnimations, file: file @@ -157,15 +161,31 @@ public enum VisualTesting { // MARK: - Private Helpers + /// 参照画像の名前。 + /// + /// **既定の文字サイズでは名前に何も足さない。** 足すと 2.0 系で撮った参照画像が + /// 全部行方不明になり、この軸を使っていないスイートまで撮り直しになる。 + private static func snapshotName( + theme: SnapshotTheme, + locale: String, + dynamicType: SnapshotDynamicType + ) -> String { + let base = "\(theme.rawValue)_\(locale)" + return dynamicType == .standard ? base : "\(base)_\(dynamicType.rawValue)" + } + @MainActor private static func makeHostingController( view: V, device: SnapshotDevice, theme: SnapshotTheme, - locale: String + locale: String, + dynamicType: SnapshotDynamicType ) -> UIViewController { let themed = themeApplicable.applyTheme(view, theme: theme) - let localized = themed.environment(\.locale, Locale(identifier: locale)) + let localized = themed + .environment(\.locale, Locale(identifier: locale)) + .environment(\.dynamicTypeSize, dynamicType.dynamicTypeSize) let hostingController = UIHostingController(rootView: localized) hostingController.view.frame = CGRect( diff --git a/Sources/VisualTesting/CatalogGenerator.swift b/Sources/VisualTesting/CatalogGenerator.swift index 4bd725b..7f39fe2 100644 --- a/Sources/VisualTesting/CatalogGenerator.swift +++ b/Sources/VisualTesting/CatalogGenerator.swift @@ -14,6 +14,7 @@ extension VisualTesting { device: SnapshotDevice?, themes: [SnapshotTheme], locales: [String], + dynamicTypes: [SnapshotDynamicType] = [.standard], inNavigation: Bool, disableAnimations: Bool, file: StaticString @@ -46,13 +47,18 @@ extension VisualTesting { // View snapshot: device subdirectory for theme in themes { for locale in locales { - let fileName = "\(device.rawValue)/\(stateName).\(theme.rawValue)_\(locale).png" - entries.append(SnapshotEntry( - device: device.rawValue, - theme: theme.rawValue, - locale: locale, - file: fileName - )) + for dynamicType in dynamicTypes { + // 既定の文字サイズは名前に出さない(`Assertions.snapshotName` と同じ規則)。 + let suffix = dynamicType == .standard ? "" : "_\(dynamicType.rawValue)" + let fileName = "\(device.rawValue)/\(stateName).\(theme.rawValue)_\(locale)\(suffix).png" + entries.append(SnapshotEntry( + device: device.rawValue, + theme: theme.rawValue, + locale: locale, + dynamicType: dynamicType == .standard ? nil : dynamicType.rawValue, + file: fileName + )) + } } } } else { @@ -63,6 +69,7 @@ extension VisualTesting { device: nil, theme: theme.rawValue, locale: nil, + dynamicType: nil, file: fileName )) } diff --git a/Sources/VisualTesting/Configuration.swift b/Sources/VisualTesting/Configuration.swift index 9030bb8..2b26e16 100644 --- a/Sources/VisualTesting/Configuration.swift +++ b/Sources/VisualTesting/Configuration.swift @@ -1,4 +1,5 @@ #if canImport(UIKit) +import SwiftUI import UIKit import SnapshotTesting @@ -9,6 +10,10 @@ public enum SnapshotDevice: String, CaseIterable, Sendable { case iPhone16 = "iPhone16" case iPhoneSE = "iPhoneSE" case iPadPro11 = "iPadPro11" + /// iPad Pro 11 の画面を横に並べたときの、幅がおよそ半分になるウィンドウ(1194 の 1/2)。 + case iPadPro11Half = "iPadPro11Half" + /// 同じく幅がおよそ 1/3 になるウィンドウ(1194 の 1/3)。 + case iPadPro11Third = "iPadPro11Third" /// デバイス固有の画面サイズ・セーフエリア・ピクセル密度を定義した `ViewImageConfig`。 /// スナップショット撮影時にこの設定でビューをレンダリングする。 @@ -41,6 +46,78 @@ public enum SnapshotDevice: String, CaseIterable, Sendable { UITraitCollection(displayScale: 2), ]) ) + case .iPadPro11Half: + return iPadWindow(width: 597) + case .iPadPro11Third: + return iPadWindow(width: 398) + } + } + + /// `config` に文字サイズの trait を重ねた設定。 + /// + /// SwiftUI 側は `\.dynamicTypeSize` 環境で追随するが、`ViewImageConfig` の trait にも + /// 同じ大きさを載せないと、**UIKit が寸法を計算する部分(ナビゲーションバー・ + /// リスト行の最小高)だけが既定の大きさのまま**になり、実機と違う絵が撮れる。 + public func config(dynamicType: SnapshotDynamicType) -> ViewImageConfig { + var config = self.config + config.traits = UITraitCollection(traitsFrom: [ + config.traits, + UITraitCollection(preferredContentSizeCategory: dynamicType.contentSizeCategory), + ]) + return config + } + + /// iPad のウィンドウ幅だけを変えた設定。 + /// + /// iPadOS 26 で Split View / Slide Over が廃止され、**自由にリサイズできるウィンドウ**に + /// なった。HIG は画面の 1/2・1/3・1/4 の各幅で検証せよと書いている。 + /// 幅は横向き(1194pt)を基準に取る —— 縦向きの 1/3 は 278pt で、iPadOS が許す + /// ウィンドウの最小幅を下回るため、実際には作れない面を撮ることになる。 + /// + /// **どちらの幅も horizontal size class は compact になる**(iPad で regular に + /// なるのはおよそ 768pt 以上)。つまりここで見えるのは、iPad なのに iPhone と同じ + /// レイアウト分岐に落ちたときの姿で、`readableContentGuide` 相当の幅制限や + /// regular 前提の 2 カラムはここでは効かない。 + private func iPadWindow(width: CGFloat) -> ViewImageConfig { + ViewImageConfig( + safeArea: UIEdgeInsets(top: 24, left: 0, bottom: 20, right: 0), + size: CGSize(width: width, height: 834), + traits: UITraitCollection(traitsFrom: [ + UITraitCollection(userInterfaceStyle: .light), + UITraitCollection(displayScale: 2), + ]) + ) + } +} + +// MARK: - SnapshotDynamicType + +/// スナップショットテスト用の文字サイズ設定。 +/// +/// タイポグラフィが Dynamic Type に追随するようになると、**大きい文字で崩れるかどうか**が +/// 実際に撮れるようになる。行の高さ・アイコンとの垂直中心・省略の入り方はここで壊れる。 +public enum SnapshotDynamicType: String, CaseIterable, Sendable { + /// 既定の文字サイズ(`.large`)。この軸だけのときはファイル名に現れない。 + case standard + /// アクセシビリティサイズの中ほど(`.accessibility3`)。 + /// + /// 最大(`.accessibility5`)ではなくここを既定の検査点にするのは、 + /// **最大は何をしても崩れる**ので回帰の判別に使えないから。 + case accessibility3 + + /// SwiftUI 環境に流す文字サイズ。 + public var dynamicTypeSize: DynamicTypeSize { + switch self { + case .standard: return .large + case .accessibility3: return .accessibility3 + } + } + + /// UIKit 側の寸法計算に効かせる content size category。 + public var contentSizeCategory: UIContentSizeCategory { + switch self { + case .standard: return .large + case .accessibility3: return .accessibilityExtraLarge } } } @@ -71,26 +148,37 @@ public struct SnapshotConfiguration: Sendable { public var themes: [SnapshotTheme] /// テスト対象ロケールの一覧(例: `"en"`, `"ja"`)。 public var locales: [String] + /// テスト対象の文字サイズ一覧。既定は `[.standard]`(軸を増やさない)。 + public var dynamicTypes: [SnapshotDynamicType] /// ピクセル単位の一致精度。0〜1 の範囲で 1.0 が完全一致。 public var precision: Float /// 知覚的な色差を許容する精度。アンチエイリアスのズレなど微細な差異を吸収する。 public var perceptualPrecision: Float public init( - devices: [SnapshotDevice] = SnapshotDevice.allCases, + devices: [SnapshotDevice] = SnapshotConfiguration.standardDevices, themes: [SnapshotTheme] = SnapshotTheme.allCases, locales: [String] = ["en", "ja"], + dynamicTypes: [SnapshotDynamicType] = [.standard], precision: Float = 0.99, perceptualPrecision: Float = 0.98 ) { self.devices = devices self.themes = themes self.locales = locales + self.dynamicTypes = dynamicTypes self.precision = precision self.perceptualPrecision = perceptualPrecision } - /// デフォルト設定: iPhone16・iPhoneSE・iPadPro11、ライト・ダーク、en・ja。 + /// 既定で撮る端末。 + /// + /// **`SnapshotDevice.allCases` を既定にしない。** 端末を 1 つ足すたびに、 + /// 既存の全スイートが撮る枚数が黙って増え、参照画像の無い面が失敗として現れる。 + /// 分割幅(`iPadPro11Half` / `iPadPro11Third`)は、撮ると決めたスイートだけが明示的に足す。 + public static let standardDevices: [SnapshotDevice] = [.iPhone16, .iPhoneSE, .iPadPro11] + + /// デフォルト設定: iPhone16・iPhoneSE・iPadPro11、ライト・ダーク、en・ja、既定の文字サイズ。 public static let `default` = SnapshotConfiguration() /// コンポーネントスナップショットスイート用設定。テーマ軸のみ(デバイスフレーム・ロケール変動なし)。 diff --git a/Sources/VisualTesting/Manifest.swift b/Sources/VisualTesting/Manifest.swift index 14ee6b5..949977d 100644 --- a/Sources/VisualTesting/Manifest.swift +++ b/Sources/VisualTesting/Manifest.swift @@ -70,13 +70,16 @@ public struct SnapshotEntry: Codable, Sendable { public var theme: String /// ロケール識別子(例: `"en"`、`"ja"`)。コンポーネントスナップショットでは `nil`。 public var locale: String? + /// 文字サイズの raw value(例: `"accessibility3"`)。既定の文字サイズでは `nil`。 + public var dynamicType: String? /// マニフェストのディレクトリから PNG 画像への相対ファイルパス。 public var file: String - public init(device: String?, theme: String, locale: String?, file: String) { + public init(device: String?, theme: String, locale: String?, dynamicType: String? = nil, file: String) { self.device = device self.theme = theme self.locale = locale + self.dynamicType = dynamicType self.file = file } } diff --git a/Tests/VisualTestingIntegrationTests/IntegrationTests.swift b/Tests/VisualTestingIntegrationTests/IntegrationTests.swift index 8a58c99..dce3a0f 100644 --- a/Tests/VisualTestingIntegrationTests/IntegrationTests.swift +++ b/Tests/VisualTestingIntegrationTests/IntegrationTests.swift @@ -85,6 +85,52 @@ struct SampleComponentSnapshots { } } +// MARK: - iPad Split Widths and Dynamic Type + +/// Verifies the iPad window widths and the Dynamic Type axis render end-to-end. +/// +/// These axes are opt-in: `SnapshotConfiguration.default` keeps the original three devices +/// and the standard text size, so adding them here must not change any other suite's output. +@Suite("iPad widths and Dynamic Type") +@MainActor +struct AdaptiveAxesSnapshots { + @Test func splitWidths() { + VisualTesting.assertViewSnapshot( + of: SampleView(), + viewName: "AdaptiveSample", + stateName: "splitWidths", + inNavigation: false, + disableAnimations: true, + configuration: SnapshotConfiguration( + devices: [.iPadPro11Half, .iPadPro11Third], + themes: [.light], + locales: ["en"] + ), + file: #filePath, + line: #line + ) + } + + /// The standard size keeps the 2.0 file name; only the accessibility size gets a suffix. + @Test func dynamicType() { + VisualTesting.assertViewSnapshot( + of: SampleView(), + viewName: "AdaptiveSample", + stateName: "dynamicType", + inNavigation: false, + disableAnimations: true, + configuration: SnapshotConfiguration( + devices: [.iPhoneSE], + themes: [.light], + locales: ["en"], + dynamicTypes: [.standard, .accessibility3] + ), + file: #filePath, + line: #line + ) + } +} + // MARK: - Mixed Integration /// Verifies @Snapshot and @ComponentSnapshot can coexist in the same suite. diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPadPro11Half/splitWidths.light_en.png b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPadPro11Half/splitWidths.light_en.png new file mode 100644 index 0000000..0ce5df0 Binary files /dev/null and b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPadPro11Half/splitWidths.light_en.png differ diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPadPro11Third/splitWidths.light_en.png b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPadPro11Third/splitWidths.light_en.png new file mode 100644 index 0000000..9daeab3 Binary files /dev/null and b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPadPro11Third/splitWidths.light_en.png differ diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPhoneSE/dynamicType.light_en.png b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPhoneSE/dynamicType.light_en.png new file mode 100644 index 0000000..cfd645f Binary files /dev/null and b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPhoneSE/dynamicType.light_en.png differ diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPhoneSE/dynamicType.light_en_accessibility3.png b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPhoneSE/dynamicType.light_en_accessibility3.png new file mode 100644 index 0000000..194d56b Binary files /dev/null and b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/iPhoneSE/dynamicType.light_en_accessibility3.png differ diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/manifest.json b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/manifest.json new file mode 100644 index 0000000..de8662f --- /dev/null +++ b/Tests/VisualTestingIntegrationTests/__Snapshots__/AdaptiveSample/manifest.json @@ -0,0 +1,44 @@ +{ + "generatedAt" : "2026-08-01T15:24:12Z", + "name" : "AdaptiveSample", + "states" : { + "dynamicType" : { + "disableAnimations" : true, + "inNavigation" : false, + "snapshots" : [ + { + "device" : "iPhoneSE", + "file" : "iPhoneSE\/dynamicType.light_en.png", + "locale" : "en", + "theme" : "light" + }, + { + "device" : "iPhoneSE", + "dynamicType" : "accessibility3", + "file" : "iPhoneSE\/dynamicType.light_en_accessibility3.png", + "locale" : "en", + "theme" : "light" + } + ] + }, + "splitWidths" : { + "disableAnimations" : true, + "inNavigation" : false, + "snapshots" : [ + { + "device" : "iPadPro11Half", + "file" : "iPadPro11Half\/splitWidths.light_en.png", + "locale" : "en", + "theme" : "light" + }, + { + "device" : "iPadPro11Third", + "file" : "iPadPro11Third\/splitWidths.light_en.png", + "locale" : "en", + "theme" : "light" + } + ] + } + }, + "type" : "view" +} \ No newline at end of file diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/MixedSample/manifest.json b/Tests/VisualTestingIntegrationTests/__Snapshots__/MixedSample/manifest.json index a445ba8..6c6a8da 100644 --- a/Tests/VisualTestingIntegrationTests/__Snapshots__/MixedSample/manifest.json +++ b/Tests/VisualTestingIntegrationTests/__Snapshots__/MixedSample/manifest.json @@ -1,5 +1,5 @@ { - "generatedAt" : "2026-06-06T05:39:48Z", + "generatedAt" : "2026-08-01T15:24:07Z", "name" : "MixedSample", "states" : { "component" : { diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleComponent/manifest.json b/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleComponent/manifest.json index 1a9dbb9..ba1be8c 100644 --- a/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleComponent/manifest.json +++ b/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleComponent/manifest.json @@ -1,5 +1,5 @@ { - "generatedAt" : "2026-06-06T05:39:44Z", + "generatedAt" : "2026-08-01T15:24:08Z", "name" : "SampleComponent", "states" : { "withSize" : { diff --git a/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleView/manifest.json b/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleView/manifest.json index 5417efa..5e46586 100644 --- a/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleView/manifest.json +++ b/Tests/VisualTestingIntegrationTests/__Snapshots__/SampleView/manifest.json @@ -1,5 +1,5 @@ { - "generatedAt" : "2026-06-06T05:39:47Z", + "generatedAt" : "2026-08-01T15:24:12Z", "name" : "SampleView", "states" : { "allAttributes" : {