diff --git a/.github/workflows/env.properties b/.github/workflows/env.properties index 66c080d60..cf69475fd 100644 --- a/.github/workflows/env.properties +++ b/.github/workflows/env.properties @@ -1 +1,2 @@ xcode_version=16.4.0 +accessibility_snapshot_ios_version=16.2 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7a649ce50..63db81128 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -62,10 +62,15 @@ jobs: - name: Build & Test run: tuist test --path SampleApp --os ${{ matrix.sdk }} UnitTests -- -resultBundlePath TestResult + - name: Build & Test Accessibility Snapshots (iOS ${{ env.accessibility_snapshot_ios_version }} only) + if: ${{ matrix.sdk == env.accessibility_snapshot_ios_version }} + run: tuist test --path SampleApp --os ${{ matrix.sdk }} AccessibilitySnapshotTests -- -resultBundlePath AccessibilityTestResult + - name: Package snapshot changes if: ${{ failure() }} run: | git ls-files -mo BlueprintUICommonControls/Tests/Sources/Resources/ReferenceImages | xargs tar -cvf snapshot_changes_${{ matrix.sdk }}.tar + git ls-files -mo BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__ | xargs tar -cvf accessibility_snapshot_changes_${{ matrix.sdk }}.tar - name: Archive snapshot changes uses: actions/upload-artifact@v4 @@ -78,5 +83,12 @@ jobs: uses: actions/upload-artifact@v4 if: ${{ failure() }} with: - name: TestResult.xcresult + name: TestResult-${{ matrix.sdk }}.xcresult path: TestResult.xcresult + + - name: Archive AccessibilityTestResult + uses: actions/upload-artifact@v4 + if: ${{ failure() && matrix.sdk == env.accessibility_snapshot_ios_version }} + with: + name: AccessibilityTestResult-${{ matrix.sdk }}.xcresult + path: AccessibilityTestResult.xcresult diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/AccessibilityModifierSnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/AccessibilityModifierSnapshotTests.swift new file mode 100644 index 000000000..1e11b38b3 --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/AccessibilityModifierSnapshotTests.swift @@ -0,0 +1,147 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for accessibility modifier controls. +/// Tests various accessibility configurations to ensure proper accessibility support. +class AccessibilityModifierSnapshotTests: XCTestCase { + + func test_accessibility_element_basic() { + let content = Label(text: "Basic Element") + .accessibilityElement( + label: "Custom Label", + value: "Custom Value", + traits: [.button] + ) + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_element_with_hint() { + let content = Label(text: "Save Document") + .accessibilityElement( + label: "Save Document", + value: nil, + traits: [.button], + hint: "Saves the current document to disk" + ) + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_hidden() { + let content = Column(minimumSpacing: 8) { + Label(text: "Visible Label") + + Label(text: "Hidden Decorative Element") + .blockAccessibility() + + Label(text: "Another Visible Label") + } + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_container() { + let content = Column(minimumSpacing: 12) { + Label(text: "Container ") + + Row(minimumSpacing: 8) { + Label(text: "Item 1") + Label(text: "Item 2") + Label(text: "Item 3") + } + .accessibilityContainer(label: "Container Title") + } + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_label_override() { + let content = Column(minimumSpacing: 8) { + Label(text: "42°F") + .accessibilityElement(label: "42 degrees Fahrenheit", value: nil, traits: []) + + + Label(text: "NASA") + .accessibilityElement(label: "National Aeronautics and Space Administration", value: nil, traits: []) + + + Label(text: "🎉") + .accessibilityElement(label: "Celebration", value: nil, traits: []) + + } + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_value_override() { + let content = Column(minimumSpacing: 8) { + Label(text: "Progress: 75%") + .accessibilityElement(label: "Progress", value: "75 percent complete", traits: []) + + Label(text: "Battery: 50%") + .accessibilityElement(label: "Battery", value: "50 percent charged", traits: []) + + } + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_traits() { + let content = Column(minimumSpacing: 12) { + Label(text: "Header Text") + .accessibilityElement(label: "Header Text", value: nil, traits: [.header]) + + Label(text: "Button Text") + .accessibilityElement(label: "Button Text", value: nil, traits: [.button]) + + Label(text: "Back Button Text") + .accessibilityElement(label: "Button Text", value: nil, traits: [.backButton]) + + Label(text: "Toggle Text") + .accessibilityElement(label: "Toggle Text", value: nil, traits: [.toggleButton]) + + Label(text: "Link Text") + .accessibilityElement(label: "Link Text", value: nil, traits: [.link]) + + Label(text: "Selected Item") + .accessibilityElement(label: "Selected Text", value: nil, traits: [.selected]) + + Label(text: "Disabled Item") + .accessibilityElement(label: "Disabled Text", value: nil, traits: [.notEnabled]) + } + + assertAccessibilitySnapshot(of: content) + } + + func test_accessibility_complex_element() { + let element = + Column(minimumSpacing: 8) { + Row(minimumSpacing: 8) { + Label(text: "👤") + + Label(text: "John Doe") + + Spacer() + + Label(text: "Online") + } + + Label(text: "Software Engineer at Tech Corp") + + Label(text: "Last seen 2 minutes ago") + } + .inset(uniform: 12) + .accessibilityElement( + label: "John Doe", + value: "Software Engineer at Tech Corp, Online, Last seen 2 minutes ago", + traits: [.button], + hint: "Tap to view profile" + ) + + assertAccessibilitySnapshot(of: element) + } +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/AttributedLabelAccessibilitySnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/AttributedLabelAccessibilitySnapshotTests.swift new file mode 100644 index 000000000..821b7b30e --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/AttributedLabelAccessibilitySnapshotTests.swift @@ -0,0 +1,133 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for AttributedLabel control. +/// Tests various attributed label configurations to ensure proper accessibility support. +class AttributedLabelAccessibilitySnapshotTests: XCTestCase { + + func test_attributed_label_basic() { + let attributedText = NSAttributedString( + string: "Basic attributed text", + attributes: [.foregroundColor: UIColor.label] + ) + + let label = AttributedLabel(attributedText: attributedText) + + assertAccessibilitySnapshot(of: label) + } + + + func test_attributed_label_with_links() { + let attributedText = NSMutableAttributedString(string: "Visit our website at example.com for more information.") + + attributedText.addAttributes([ + .link: NSURL(string: "https://example.com")!, + ], range: attributedText.mutableString.range(of: "example.com")) + + let label = AttributedLabel(attributedText: attributedText) + assertAccessibilitySnapshot(of: label) + } + + func test_attributed_label_multiline() { + let attributedText = NSMutableAttributedString() + + attributedText.append(NSAttributedString( + string: "First Line\n", + attributes: [.font: UIFont.boldSystemFont(ofSize: 18)] + )) + + attributedText.append(NSAttributedString( + string: "Second line with regular text\n", + attributes: [.font: UIFont.systemFont(ofSize: 16)] + )) + + attributedText.append(NSAttributedString( + string: "Third line in italic", + attributes: [.font: UIFont.italicSystemFont(ofSize: 14)] + )) + + let label = AttributedLabel(attributedText: attributedText) + + assertAccessibilitySnapshot(of: label) + } + + func test_attributed_label_with_mixed_content() { + let attributedText = NSMutableAttributedString() + + // Title + attributedText.append(NSAttributedString( + string: "Product Review\n", + attributes: [ + .font: UIFont.boldSystemFont(ofSize: 20), + .foregroundColor: UIColor.label, + ] + )) + + // Rating + attributedText.append(NSAttributedString( + string: "⭐⭐⭐⭐⭐ ", + attributes: [.font: UIFont.systemFont(ofSize: 16)] + )) + + // Score + attributedText.append(NSAttributedString( + string: "5.0/5.0\n", + attributes: [ + .font: UIFont.boldSystemFont(ofSize: 16), + .foregroundColor: UIColor.systemGreen, + ] + )) + + // Description + attributedText.append(NSAttributedString( + string: "Excellent product with great quality and fast shipping.", + attributes: [ + .font: UIFont.systemFont(ofSize: 14), + .foregroundColor: UIColor.secondaryLabel, + ] + )) + + let label = AttributedLabel(attributedText: attributedText) + + + assertAccessibilitySnapshot(of: label) + } + + func test_attributed_label_with_strikethrough() { + let attributedText = NSMutableAttributedString() + + attributedText.append(NSAttributedString( + string: "Original Price: ", + attributes: [.font: UIFont.systemFont(ofSize: 16)] + )) + + attributedText.append(NSAttributedString( + string: "$29.99", + attributes: [ + .font: UIFont.systemFont(ofSize: 16), + .strikethroughStyle: NSUnderlineStyle.single.rawValue, + .foregroundColor: UIColor.secondaryLabel, + ] + )) + + attributedText.append(NSAttributedString( + string: " Sale Price: ", + attributes: [.font: UIFont.systemFont(ofSize: 16)] + )) + + attributedText.append(NSAttributedString( + string: "$19.99", + attributes: [ + .font: UIFont.boldSystemFont(ofSize: 16), + .foregroundColor: UIColor.systemRed, + ] + )) + + let label = AttributedLabel(attributedText: attributedText) + + assertAccessibilitySnapshot(of: label) + } +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/ButtonAccessibilitySnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/ButtonAccessibilitySnapshotTests.swift new file mode 100644 index 000000000..9253cbe09 --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/ButtonAccessibilitySnapshotTests.swift @@ -0,0 +1,47 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for Button control. +/// Tests various button configurations to ensure proper accessibility support. +class ButtonAccessibilitySnapshotTests: XCTestCase { + + func test_button_basic() { + let button = Button(wrapping: Label(text: "Basic Button")) + + assertAccessibilitySnapshot(of: button) + } + + func test_button_with_icon_and_text() { + let content = Row(minimumSpacing: 8) { + Label(text: "📁") + Label(text: "Open File") + } + + let button = Button(wrapping: content) + + assertAccessibilitySnapshot(of: button) + } + + func test_button_with_multipleText() { + let content = Row(minimumSpacing: 8) { + Label(text: "One") + Label(text: "Two") + } + + let button = Button(wrapping: content) + + assertAccessibilitySnapshot(of: button) + } + + + func test_button_multiline_text() { + let button = Button(wrapping: + Label(text: "This is a button with\nmultiple lines of text") + ) + + assertAccessibilitySnapshot(of: button) + } +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/LabelAccessibilitySnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/LabelAccessibilitySnapshotTests.swift new file mode 100644 index 000000000..a4144cf80 --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/LabelAccessibilitySnapshotTests.swift @@ -0,0 +1,24 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for Label control. +/// Tests various label configurations to ensure proper accessibility support. +class LabelAccessibilitySnapshotTests: XCTestCase { + + func test_label_basic() { + let label = Label(text: "Basic Label") + + assertAccessibilitySnapshot(of: label) + } + + func test_label_multiline() { + let label = Label(text: "This is a longer label that spans multiple lines\nto test accessibility with wrapped text content.") + + + assertAccessibilitySnapshot(of: label) + } + +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/ScrollViewAccessibilitySnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/ScrollViewAccessibilitySnapshotTests.swift new file mode 100644 index 000000000..7b486613f --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/ScrollViewAccessibilitySnapshotTests.swift @@ -0,0 +1,183 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for ScrollView control. +/// Tests various scroll view configurations to ensure proper accessibility support. +class ScrollViewAccessibilitySnapshotTests: XCTestCase { + + func test_scrollview_vertical() { + let content = Column(minimumSpacing: 16) { + Box( + backgroundColor: .systemBlue, + cornerStyle: .rounded(radius: 8), + wrapping: + Label(text: "Item 1").inset(uniform: 16) + ) + Box( + backgroundColor: .systemBlue, + cornerStyle: .rounded(radius: 8), + wrapping: + Label(text: "Item 2").inset(uniform: 16) + ) + Box( + backgroundColor: .systemBlue, + cornerStyle: .rounded(radius: 8), + wrapping: + Label(text: "Item 3").inset(uniform: 16) + ) + } + .inset(uniform: 16) + + let scrollView = ScrollView(.fittingHeight, wrapping: content) + .constrainedTo(height: .absolute(200)) + .accessibilityElement( + label: "Scrollable list", + value: nil, + traits: [], + hint: "Swipe up or down to scroll" + ) + + assertAccessibilitySnapshot(of: scrollView) + } + + func test_scrollview_horizontal() { + let content = Row(minimumSpacing: 16) { + Box( + backgroundColor: .systemGreen, + cornerStyle: .rounded(radius: 8), + wrapping: + Label(text: "Card 1").inset(uniform: 16) + ) + Box( + backgroundColor: .systemGreen, + cornerStyle: .rounded(radius: 8), + wrapping: + Label(text: "Card 2").inset(uniform: 16) + ) + Box( + backgroundColor: .systemGreen, + cornerStyle: .rounded(radius: 8), + wrapping: + Label(text: "Card 3").inset(uniform: 16) + ) + } + .inset(uniform: 16) + + let scrollView = ScrollView(.fittingWidth, wrapping: content) + .constrainedTo(width: .absolute(300)) + .accessibilityElement( + label: "Horizontal card list", + value: nil, + traits: [], + hint: "Swipe left or right to scroll" + ) + + assertAccessibilitySnapshot(of: scrollView) + } + + func test_scrollview_with_content_description() { + let content = Column(minimumSpacing: 12) { + Label(text: "Article Title") + .accessibilityElement(label: nil, value: nil, traits: [.header]) + + Label(text: "This is a long article with multiple paragraphs of content that requires scrolling to read completely.") + + Label(text: "Second paragraph with more detailed information about the topic being discussed.") + + Label(text: "Final paragraph concluding the article content.") + } + .inset(uniform: 16) + + let scrollView = ScrollView(.fittingHeight, wrapping: content) + .constrainedTo(height: .absolute(150)) + .accessibilityElement( + label: "Article content", + value: nil, + traits: [], + hint: "Scroll to read full article" + ) + + assertAccessibilitySnapshot(of: scrollView) + } + + func test_scrollview_empty() { + let content = Column(minimumSpacing: 16) { + Label(text: "No items to display") + .accessibilityElement(label: "No items available", value: nil, traits: [.staticText]) + } + .inset(uniform: 16) + + let scrollView = ScrollView(.fittingHeight, wrapping: content) + .constrainedTo(height: .absolute(200)) + + assertAccessibilitySnapshot(of: scrollView) + } + + func test_scrollview_nested() { + let innerContent = Row(minimumSpacing: 12) { + Box( + backgroundColor: .systemOrange, + cornerStyle: .rounded(radius: 6), + wrapping: + Label(text: "1").inset(uniform: 12) + ) + Box( + backgroundColor: .systemOrange, + cornerStyle: .rounded(radius: 6), + wrapping: + Label(text: "2").inset(uniform: 12) + ) + Box( + backgroundColor: .systemOrange, + cornerStyle: .rounded(radius: 6), + wrapping: + Label(text: "3").inset(uniform: 12) + ) + } + .inset(horizontal: 16) + + let innerScrollView = ScrollView(.fittingWidth, wrapping: innerContent) + .constrainedTo(height: .absolute(50)) + .accessibilityElement( + label: "Horizontal items", + value: nil, + traits: [], + hint: "Swipe horizontally to see more items" + ) + + let outerContent = Column(minimumSpacing: 20) { + Label(text: "Outer Scroll Content") + .accessibilityElement(label: nil, value: nil, traits: [.header]) + + innerScrollView + + Label(text: "More outer content below") + } + .inset(uniform: 16) + + let outerScrollView = ScrollView(.fittingHeight, wrapping: outerContent) + .constrainedTo(height: .absolute(200)) + + assertAccessibilitySnapshot(of: outerScrollView) + } + + func test_scrollview_fitting_content() { + let content = Column(minimumSpacing: 8) { + Label(text: "Short Content") + Label(text: "That fits entirely") + } + .inset(uniform: 16) + + let scrollView = ScrollView(.fittingContent, wrapping: content) + .accessibilityElement( + label: "Non-scrollable content", + value: nil, + traits: [.staticText] + ) + + assertAccessibilitySnapshot(of: scrollView) + } +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/SegmentedControlAccessibilitySnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/SegmentedControlAccessibilitySnapshotTests.swift new file mode 100644 index 000000000..64ce942f7 --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/SegmentedControlAccessibilitySnapshotTests.swift @@ -0,0 +1,31 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for SegmentedControl control. +/// Tests various segmented control configurations to ensure proper accessibility support. +class SegmentedControlAccessibilitySnapshotTests: XCTestCase { + + func test_segmented_control_selected() { + var segmentedControl = SegmentedControl() + segmentedControl.appendItem(title: "First", onSelect: {}) + segmentedControl.appendItem(title: "Second", onSelect: {}) + segmentedControl.appendItem(title: "Third", onSelect: {}) + segmentedControl.selection = .index(1) + + assertAccessibilitySnapshot(of: segmentedControl) + } + + + func test_segmented_control_no_selection() { + var segmentedControl = SegmentedControl() + segmentedControl.appendItem(title: "Option A", onSelect: {}) + segmentedControl.appendItem(title: "Option B", onSelect: {}) + segmentedControl.appendItem(title: "Option C", onSelect: {}) + segmentedControl.selection = .none + + assertAccessibilitySnapshot(of: segmentedControl) + } +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/TextFieldAccessibilitySnapshotTests.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/TextFieldAccessibilitySnapshotTests.swift new file mode 100644 index 000000000..62ad55fa5 --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/TextFieldAccessibilitySnapshotTests.swift @@ -0,0 +1,52 @@ +import AccessibilitySnapshot +import BlueprintUI +import BlueprintUICommonControls +import SnapshotTesting +import XCTest + +/// Accessibility snapshot tests for TextField control. +/// Tests various text field configurations to ensure proper accessibility support. +class TextFieldAccessibilitySnapshotTests: XCTestCase { + + func test_textfield_empty() { + let textField = TextField(text: "") + .constrainedTo(width: 200, height: 44) + + assertAccessibilitySnapshot(of: textField) + } + + func test_textfield_with_placeholder() { + let textField = TextField(text: "") { + $0.placeholder = "Enter your name" + } + .constrainedTo(width: 200, height: 44) + + assertAccessibilitySnapshot(of: textField) + } + + func test_textfield_with_text() { + let textField = TextField(text: "John Doe") + .constrainedTo(width: 200, height: 44) + + assertAccessibilitySnapshot(of: textField) + } + + func test_textfield_secure() { + let textField = TextField(text: "password") { + $0.secure = true + } + .constrainedTo(width: 200, height: 44) + + assertAccessibilitySnapshot(of: textField) + } + + func test_textfield_disabled() { + let textField = TextField(text: "Read only text") { + $0.isEnabled = false + } + .constrainedTo(width: 200, height: 44) + + assertAccessibilitySnapshot(of: textField) + } + +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/XCTestCase+AccessibilitySnapshot.swift b/BlueprintUICommonControls/AccessibilitySnapshotTests/XCTestCase+AccessibilitySnapshot.swift new file mode 100644 index 000000000..58eaa2014 --- /dev/null +++ b/BlueprintUICommonControls/AccessibilitySnapshotTests/XCTestCase+AccessibilitySnapshot.swift @@ -0,0 +1,133 @@ +import AccessibilitySnapshot +import BlueprintUI +import SnapshotTesting +import UIKit +import XCTest + +extension XCTestCase { + + /// Accessibility snapshot testing for Blueprint elements with view controller hosting. + /// + /// This method creates a UIViewController containing a BlueprintView with the provided element, + /// hosts it in the test application window, and performs accessibility snapshot testing with + /// automatic filename generation in the format: {test name}_{ios version}_{screen size}@{screen scale}x + /// + /// The hosted approach ensures proper accessibility hierarchy, view controller lifecycle, + /// and window presentation context for accurate accessibility testing. + /// + /// Example generated filenames: + /// - test_label_accessibility_snapshot_18.0_393x852@3x.png + /// - test_button_accessibility_snapshot_18.0_393x852@3x.png + /// - custom_test_name.png (when name is provided) + /// + /// - Parameters: + /// - element: The Blueprint Element to snapshot + /// - snapshotting: The snapshotting strategy (defaults to .accessibilityImage) + /// - name: Optional custom name override. If provided, automatic naming is skipped + /// - recording: Whether to record new snapshots + /// - timeout: Timeout for snapshot generation + /// - fileID: File identifier (automatically provided) + /// - filePath: File path (automatically provided) + /// - testName: Test function name (automatically provided) + /// - line: Line number (automatically provided) + /// - column: Column number (automatically provided) + func assertAccessibilitySnapshot( + of element: Element, + as snapshotting: Snapshotting = .accessibilityImage, + named name: String? = nil, + record recording: Bool? = nil, + timeout: TimeInterval = 5, + fileID: StaticString = #fileID, + file filePath: StaticString = #filePath, + testName: String = #function, + line: UInt = #line, + column: UInt = #column + ) { + let testViewController = createTestViewController(with: element) + let customName = name ?? generateSnapshotMetadate() + + show(vc: testViewController) { viewController in + // Snapshot just the BlueprintView, not the entire view controller + assertSnapshot( + of: viewController.blueprintView, + as: .accessibilityImage, + named: customName, + record: recording, + timeout: timeout, + fileID: fileID, + file: filePath, + testName: testName, + line: line, + column: column + ) + } + } + + // MARK: - Private Helper Methods + + /// Generates a snapshot filename with device and iOS version information. + /// + /// Creates filenames in the format: {test name}_{ios version}_{screen size}@{screen scale}x + /// + /// Example output: "test_label_accessibility_snapshot_18.0_393x852@3x" + /// + /// - Parameter testName: The test function name (typically from #function) + /// - Returns: A formatted filename string with device information + private func generateSnapshotMetadate() -> String { + // Get device information + let screen = UIScreen.main + let screenSize = screen.bounds.size + let screenScale = screen.scale + let iosVersion = ProcessInfo.processInfo.operatingSystemVersion + + // Format screen size as "widthxheight" + let screenSizeString = "\(Int(screenSize.width))x\(Int(screenSize.height))" + + // Format iOS version as "major.minor" + let iosVersionString = "\(iosVersion.majorVersion)-\(iosVersion.minorVersion)" + + // Create the filename: {test name}_{ios version}_{screen size}@{screen scale}x + return "\(iosVersionString)_\(screenSizeString)@\(Int(screenScale))x" + } + + /// Creates a UIViewController from a Blueprint Element for testing purposes. + /// + /// This method wraps the provided Element in a BlueprintView and hosts it in a + /// UIViewController to ensure proper accessibility hierarchy and view controller + /// lifecycle for snapshot testing. The BlueprintView is added as a subview so it + /// can size itself to its content rather than filling the entire screen. + /// + /// - Parameter element: The Blueprint Element to convert to a UIViewController + /// - Returns: A UIViewController containing the element with proper accessibility setup + private func createTestViewController(with element: Element) -> TestViewController { + let viewController = TestViewController() + viewController.blueprintView.element = element + + // Ensure the view is loaded and laid out + _ = viewController.view + viewController.view.setNeedsLayout() + viewController.view.layoutIfNeeded() + + return viewController + } +} + +/// Test view controller that hosts a BlueprintView for accessibility snapshot testing. +private final class TestViewController: UIViewController { + let blueprintView = BlueprintView() + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + + // Add BlueprintView as a subview so it can size to its content + view.addSubview(blueprintView) + + // Center the BlueprintView in the container + blueprintView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + blueprintView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + blueprintView.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + } +} diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_complex_element.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_complex_element.16-2_375x667-2x.png new file mode 100644 index 000000000..36c951299 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_complex_element.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_container.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_container.16-2_375x667-2x.png new file mode 100644 index 000000000..5668178c8 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_container.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_element_basic.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_element_basic.16-2_375x667-2x.png new file mode 100644 index 000000000..25eb40e94 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_element_basic.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_element_with_hint.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_element_with_hint.16-2_375x667-2x.png new file mode 100644 index 000000000..836a12c85 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_element_with_hint.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_hidden.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_hidden.16-2_375x667-2x.png new file mode 100644 index 000000000..c23c7d8ed Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_hidden.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_label_override.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_label_override.16-2_375x667-2x.png new file mode 100644 index 000000000..70f623306 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_label_override.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_traits.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_traits.16-2_375x667-2x.png new file mode 100644 index 000000000..6a107df98 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_traits.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_value_override.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_value_override.16-2_375x667-2x.png new file mode 100644 index 000000000..150d89c02 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AccessibilityModifierSnapshotTests/test_accessibility_value_override.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_basic.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_basic.16-2_375x667-2x.png new file mode 100644 index 000000000..eb73ff1f2 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_basic.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_multiline.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_multiline.16-2_375x667-2x.png new file mode 100644 index 000000000..12e298e41 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_multiline.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_links.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_links.16-2_375x667-2x.png new file mode 100644 index 000000000..918d4c72d Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_links.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_mixed_content.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_mixed_content.16-2_375x667-2x.png new file mode 100644 index 000000000..a982a2b79 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_mixed_content.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_strikethrough.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_strikethrough.16-2_375x667-2x.png new file mode 100644 index 000000000..e7085937d Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/AttributedLabelAccessibilitySnapshotTests/test_attributed_label_with_strikethrough.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_basic.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_basic.16-2_375x667-2x.png new file mode 100644 index 000000000..929117877 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_basic.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_multiline_text.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_multiline_text.16-2_375x667-2x.png new file mode 100644 index 000000000..8519e5fc8 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_multiline_text.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_with_icon_and_text.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_with_icon_and_text.16-2_375x667-2x.png new file mode 100644 index 000000000..cc95043f0 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_with_icon_and_text.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_with_multipleText.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_with_multipleText.16-2_375x667-2x.png new file mode 100644 index 000000000..ca80f5ba8 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ButtonAccessibilitySnapshotTests/test_button_with_multipleText.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/LabelAccessibilitySnapshotTests/test_label_basic.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/LabelAccessibilitySnapshotTests/test_label_basic.16-2_375x667-2x.png new file mode 100644 index 000000000..c63c9b7b5 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/LabelAccessibilitySnapshotTests/test_label_basic.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/LabelAccessibilitySnapshotTests/test_label_multiline.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/LabelAccessibilitySnapshotTests/test_label_multiline.16-2_375x667-2x.png new file mode 100644 index 000000000..ea1662b06 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/LabelAccessibilitySnapshotTests/test_label_multiline.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_empty.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_empty.16-2_375x667-2x.png new file mode 100644 index 000000000..165a44705 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_empty.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_fitting_content.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_fitting_content.16-2_375x667-2x.png new file mode 100644 index 000000000..6eb3f6c3c Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_fitting_content.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_horizontal.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_horizontal.16-2_375x667-2x.png new file mode 100644 index 000000000..9bacbe620 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_horizontal.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_nested.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_nested.16-2_375x667-2x.png new file mode 100644 index 000000000..1438f4a4e Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_nested.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_vertical.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_vertical.16-2_375x667-2x.png new file mode 100644 index 000000000..fdce8b460 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_vertical.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_with_content_description.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_with_content_description.16-2_375x667-2x.png new file mode 100644 index 000000000..ccf139efe Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/ScrollViewAccessibilitySnapshotTests/test_scrollview_with_content_description.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/SegmentedControlAccessibilitySnapshotTests/test_segmented_control_no_selection.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/SegmentedControlAccessibilitySnapshotTests/test_segmented_control_no_selection.16-2_375x667-2x.png new file mode 100644 index 000000000..f6437139c Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/SegmentedControlAccessibilitySnapshotTests/test_segmented_control_no_selection.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/SegmentedControlAccessibilitySnapshotTests/test_segmented_control_selected.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/SegmentedControlAccessibilitySnapshotTests/test_segmented_control_selected.16-2_375x667-2x.png new file mode 100644 index 000000000..a8d2fdbf8 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/SegmentedControlAccessibilitySnapshotTests/test_segmented_control_selected.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_disabled.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_disabled.16-2_375x667-2x.png new file mode 100644 index 000000000..0c3eb8f1c Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_disabled.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_empty.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_empty.16-2_375x667-2x.png new file mode 100644 index 000000000..8616f7644 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_empty.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_secure.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_secure.16-2_375x667-2x.png new file mode 100644 index 000000000..e171deacb Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_secure.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_with_placeholder.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_with_placeholder.16-2_375x667-2x.png new file mode 100644 index 000000000..6e308c034 Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_with_placeholder.16-2_375x667-2x.png differ diff --git a/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_with_text.16-2_375x667-2x.png b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_with_text.16-2_375x667-2x.png new file mode 100644 index 000000000..d5aee334d Binary files /dev/null and b/BlueprintUICommonControls/AccessibilitySnapshotTests/__Snapshots__/TextFieldAccessibilitySnapshotTests/test_textfield_with_text.16-2_375x667-2x.png differ diff --git a/SampleApp/Project.swift b/SampleApp/Project.swift index fb12b444b..a6c227022 100644 --- a/SampleApp/Project.swift +++ b/SampleApp/Project.swift @@ -76,6 +76,19 @@ let project = Project( ), ] ), + .target( + name: "BlueprintUICommonControls_AccessibilitySnapshotTests", + destinations: .iOS, + product: .unitTests, + bundleId: "$(inherited).AccessibilitySnapshotTests", + deploymentTargets: blueprintDeploymentTargets, + sources: ["../BlueprintUI/Tests/Extensions/**", "../BlueprintUICommonControls/AccessibilitySnapshotTests/**"], + dependencies: [ + .target(name: "BlueprintUICommonControls_TestHost"), + .external(name: "AccessibilitySnapshot"), + .external(name: "SnapshotTesting"), + ] + ), ], schemes: [ .scheme( @@ -89,6 +102,14 @@ let project = Project( ] ) ), + .scheme( + name: "AccessibilitySnapshotTests", + testAction: .targets( + [ + "BlueprintUICommonControls_AccessibilitySnapshotTests", + ] + ) + ), ], additionalFiles: [ "../CHANGELOG.md", diff --git a/SampleApp/Tuist/Package.resolved b/SampleApp/Tuist/Package.resolved new file mode 100644 index 000000000..407227a55 --- /dev/null +++ b/SampleApp/Tuist/Package.resolved @@ -0,0 +1,59 @@ +{ + "pins" : [ + { + "identity" : "accessibilitysnapshot", + "kind" : "remoteSourceControl", + "location" : "https://github.com/cashapp/AccessibilitySnapshot.git", + "state" : { + "revision" : "8d4bc42c1ba23755147b931e1e94c775df91a997", + "version" : "0.10.0" + } + }, + { + "identity" : "ios-snapshot-test-case", + "kind" : "remoteSourceControl", + "location" : "https://github.com/uber/ios-snapshot-test-case.git", + "state" : { + "revision" : "7b10770333a961be6e5a41c9ce04b8c6d3990126", + "version" : "8.0.0" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "82645ec760917961cfa08c9c0c7104a57a0fa4b1", + "version" : "1.3.3" + } + }, + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing.git", + "state" : { + "revision" : "a8b7c5e0ed33d8ab8887d1654d9b59f2cbad529b", + "version" : "1.18.7" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax", + "state" : { + "revision" : "4799286537280063c85a32f09884cfbca301b1a1", + "version" : "602.0.0" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "4c27acf5394b645b70d8ba19dc249c0472d5f618", + "version" : "1.7.0" + } + } + ], + "version" : 2 +} diff --git a/SampleApp/Tuist/Package.swift b/SampleApp/Tuist/Package.swift index 9f90e9032..8f5b34590 100644 --- a/SampleApp/Tuist/Package.swift +++ b/SampleApp/Tuist/Package.swift @@ -6,5 +6,13 @@ let package = Package( name: "Development", dependencies: [ .package(path: "../../"), + .package( + url: "https://github.com/cashapp/AccessibilitySnapshot.git", + from: "0.4.1" + ), + .package( + url: "https://github.com/pointfreeco/swift-snapshot-testing.git", + from: "1.18.0" + ), ] )