Files
divkit/client/ios/DivKitTests/Extensions/DivBaseExtensions+AccessibilityElementsStorageTests.swift
pkurchatov 718eec9f90 Swift Testing
commit_hash:9b1d9b2e0d20d42afde551f6e6bb29a694ce8a4f
2026-01-28 00:59:47 +03:00

245 lines
5.9 KiB
Swift

@testable import DivKit
import DivKitTestsSupport
@testable import LayoutKit
import Testing
import UIKit
import VGSL
@Suite
struct DivBaseExtensionsAndAccessibilityElementsStorageTests {
@Test
func getOrderedIds_WhenForwardIdExist() {
let testData = divData(
divGallery(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "firstId"
),
]
)
)
#expect(getOrderedIds(divData: testData) == ["firstId"])
}
@Test
func getOeredIds_WhenForwardIdNotExist() {
let testData = divData(
divGallery(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
]
)
)
#expect(getOrderedIds(divData: testData) == ["firstId", "secondId"])
}
@Test
func getOrderedIds_CycleOfTwoElements() {
let testData = divData(
divGallery(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
createDivTextWithNextFocusId(
id: "secondId",
forwardId: "firstId"
),
]
)
)
#expect(getOrderedIds(divData: testData) == ["firstId", "secondId"])
}
@Test
func getAccessibilityElemenents_WhenForwardIdExist() async {
let testData = divData(
divGallery(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "firstId"
),
]
)
)
#expect(await getAccessibilityIds(divData: testData) == ["firstId"])
}
@Test
func getAccessibilityElemenents_WhenForwardIdNotExist() async {
let testData = divData(
divGallery(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
]
)
)
#expect(await getAccessibilityIds(divData: testData) == ["firstId"])
}
@Test
func getAccessibilityElemenents_CycleOfTwoElements() async {
let testData = divData(
divContainer(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
createDivTextWithNextFocusId(
id: "secondId",
forwardId: "firstId"
),
]
)
)
#expect(await getAccessibilityIds(divData: testData) == ["firstId", "secondId"])
}
@Test
func getAccessibilityElemenents_SecondElementDivVisibilityVisible() async {
let testData = divData(
divContainer(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
divText(
focus: DivFocus(
nextFocusIds: DivFocus.NextFocusIds(
forward: .value("thirdId")
)
),
id: "secondId",
width: fixedSize(10),
visibility: .value(.visible)
),
createDivTextWithNextFocusId(
id: "thirdId",
forwardId: "firstId"
),
]
)
)
#expect(await getAccessibilityIds(divData: testData) == ["firstId", "secondId", "thirdId"])
}
@Test
func getAccessibilityElemenents_SecondElementDivVisibilityGone() async {
let testData = divData(
divContainer(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
divText(
focus: DivFocus(
nextFocusIds: DivFocus.NextFocusIds(
forward: .value("thirdId")
)
),
id: "secondId",
width: fixedSize(10),
visibility: .value(.gone)
),
createDivTextWithNextFocusId(
id: "thirdId",
forwardId: "firstId"
),
]
)
)
#expect(await getAccessibilityIds(divData: testData) == ["firstId", "thirdId"])
}
@Test
func getAccessibilityElemenents_DivVisibilityInvisible() async {
let testData = divData(
divContainer(
items: [
createDivTextWithNextFocusId(
id: "firstId",
forwardId: "secondId"
),
divText(
focus: DivFocus(
nextFocusIds: DivFocus.NextFocusIds(
forward: .value("thirdId")
)
),
id: "secondId",
width: fixedSize(10),
visibility: .value(.invisible)
),
createDivTextWithNextFocusId(
id: "thirdId",
forwardId: "firstId"
),
]
)
)
#expect(await getAccessibilityIds(divData: testData) == ["firstId", "thirdId"])
}
private func createDivTextWithNextFocusId(id: String, forwardId: String) -> Div {
divText(
focus: DivFocus(
nextFocusIds: DivFocus.NextFocusIds(
forward: .value(forwardId)
)
),
id: id,
width: fixedSize(10)
)
}
private func getOrderedIds(divData: DivData) -> [String]? {
let context = DivBlockModelingContext()
_ = try! divData.makeBlock(context: context)
return context.accessibilityElementsStorage.getOrderedIds()
}
@MainActor
private func getAccessibilityIds(divData: DivData) async -> [String]? {
let divView = DivView(divKitComponents: DivKitComponents())
await divView.setSource(.init(kind: .divData(divData), cardId: "card"))
divView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
divView.forceLayout()
guard let elements = divView.accessibilityElements else {
Issue.record("accessibilityElements are not available or have the wrong type")
return nil
}
let ids = elements.compactMap { element -> String? in
if let element = element as? UIView {
return element.accessibilityIdentifier
}
return nil
}
return ids
}
}