fix LottieExtensionHandler getPreloadURLs, move DivBuilders to DivKitTestsSupport

commit_hash:e22b43dde31492aae7d9ad8723ec9409b4980cd7
This commit is contained in:
babaevmm
2025-06-23 17:00:04 +03:00
parent 3debbd2af3
commit 8cf91c73a3
45 changed files with 206 additions and 92 deletions
+2
View File
@@ -13923,6 +13923,7 @@
"client/ios/DivKitExtensions/Shimmers/Shine/ShineExtensionParams.swift":"divkit/public/client/ios/DivKitExtensions/Shimmers/Shine/ShineExtensionParams.swift",
"client/ios/DivKitExtensions/Shimmers/Shine/ShineView.swift":"divkit/public/client/ios/DivKitExtensions/Shimmers/Shine/ShineView.swift",
"client/ios/DivKitExtensions/SizeProvider/SizeProviderExtensionHandler.swift":"divkit/public/client/ios/DivKitExtensions/SizeProvider/SizeProviderExtensionHandler.swift",
"client/ios/DivKitExtensionsTests/LottieExtensionHandlerTests.swift":"divkit/public/client/ios/DivKitExtensionsTests/LottieExtensionHandlerTests.swift",
"client/ios/DivKitExtensionsTests/ShimmerImagePreviewStyleTests.swift":"divkit/public/client/ios/DivKitExtensionsTests/ShimmerImagePreviewStyleTests.swift",
"client/ios/DivKitExtensionsTests/ShimmerStyleTester.swift":"divkit/public/client/ios/DivKitExtensionsTests/ShimmerStyleTester.swift",
"client/ios/DivKitExtensionsTests/ShineExtensionParamsTests.swift":"divkit/public/client/ios/DivKitExtensionsTests/ShineExtensionParamsTests.swift",
@@ -14159,6 +14160,7 @@
"client/ios/DivKitTestsSupport/DivBuilders.swift":"divkit/public/client/ios/DivKitTestsSupport/DivBuilders.swift",
"client/ios/DivKitTestsSupport/FakeImageHolder.swift":"divkit/public/client/ios/DivKitTestsSupport/FakeImageHolder.swift",
"client/ios/DivKitTestsSupport/MockDivBlockModelingContext.swift":"divkit/public/client/ios/DivKitTestsSupport/MockDivBlockModelingContext.swift",
"client/ios/DivKitTestsSupport/MockURLResourceRequester.swift":"divkit/public/client/ios/DivKitTestsSupport/MockURLResourceRequester.swift",
"client/ios/DivKitUITests/AppLaunchUITests.swift":"divkit/public/client/ios/DivKitUITests/AppLaunchUITests.swift",
"client/ios/DivKitUITests/TooltipsUITests.swift":"divkit/public/client/ios/DivKitUITests/TooltipsUITests.swift",
"client/ios/LayoutKit/Interface/ActionsAttribute.swift":"divkit/public/client/ios/LayoutKit/Interface/ActionsAttribute.swift",
+10 -4
View File
@@ -15,7 +15,10 @@
0C276A862DDC949700247E75 /* ImageBaseBlockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C276A852DDC949700247E75 /* ImageBaseBlockTests.swift */; };
0C9BB87F2DF02ECF001C4E72 /* MockDivExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9BB87E2DF02ECF001C4E72 /* MockDivExtensionHandler.swift */; };
0C9BB8802DF02ECF001C4E72 /* MockDivExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9BB87E2DF02ECF001C4E72 /* MockDivExtensionHandler.swift */; };
0CE1B3552E04197A00677706 /* LottieExtensionHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CE1B3542E04197A00677706 /* LottieExtensionHandlerTests.swift */; };
0CE4BDE52C4FAE9F0048BEF8 /* GenericViewBlockTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CE4BDE42C4FAE9F0048BEF8 /* GenericViewBlockTests.swift */; };
0CE65E942E041BBE005EBB5A /* MockURLResourceRequester.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CE65E932E041BBE005EBB5A /* MockURLResourceRequester.swift */; };
0CE65E952E041BBE005EBB5A /* MockURLResourceRequester.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CE65E932E041BBE005EBB5A /* MockURLResourceRequester.swift */; };
431CF8582B7BC47E005A2E61 /* DivActionURLHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431CF8572B7BC47E005A2E61 /* DivActionURLHandlerTests.swift */; };
431DC9C22961EF84007FA268 /* ContainerBlockLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431DC9C12961EF84007FA268 /* ContainerBlockLayoutTests.swift */; };
431DC9C429620AA1007FA268 /* BlockTestsModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 431DC9C329620AA1007FA268 /* BlockTestsModels.swift */; };
@@ -279,8 +282,6 @@
8CF329702875D64B003F799A /* LayoutKit in Frameworks */ = {isa = PBXBuildFile; productRef = 8CF3296F2875D64B003F799A /* LayoutKit */; };
8CF32B7E2875E12F003F799A /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF32B7D2875E12F003F799A /* Utils.swift */; };
8CF8BBE52B322E3100569777 /* Assert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF8BBE42B322E3100569777 /* Assert.swift */; };
8CF8BBE82B32660500569777 /* BlockModelingUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF8BBE72B32660500569777 /* BlockModelingUtils.swift */; };
8CF8BBEA2B32682700569777 /* DivBuilders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF8BBE92B32682700569777 /* DivBuilders.swift */; };
8CF91B042D0AE4ED0082FDC1 /* MockDivActionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF91B032D0AE4ED0082FDC1 /* MockDivActionHandler.swift */; };
8CFD4C9E2B2C5B780092814C /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CFD4C9D2B2C5B780092814C /* Theme.swift */; };
982A7F142C9C08F30081DE74 /* PagerViewLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982A7F132C9C08F30081DE74 /* PagerViewLayoutTests.swift */; };
@@ -390,7 +391,9 @@
0C1B9FDF2DDE1D6B00F69371 /* DivDataResourcesPreloaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DivDataResourcesPreloaderTests.swift; sourceTree = "<group>"; };
0C276A852DDC949700247E75 /* ImageBaseBlockTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageBaseBlockTests.swift; sourceTree = "<group>"; };
0C9BB87E2DF02ECF001C4E72 /* MockDivExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDivExtensionHandler.swift; sourceTree = "<group>"; };
0CE1B3542E04197A00677706 /* LottieExtensionHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieExtensionHandlerTests.swift; sourceTree = "<group>"; };
0CE4BDE42C4FAE9F0048BEF8 /* GenericViewBlockTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenericViewBlockTests.swift; sourceTree = "<group>"; };
0CE65E932E041BBE005EBB5A /* MockURLResourceRequester.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLResourceRequester.swift; sourceTree = "<group>"; };
431CF8572B7BC47E005A2E61 /* DivActionURLHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DivActionURLHandlerTests.swift; sourceTree = "<group>"; };
431DC9C12961EF84007FA268 /* ContainerBlockLayoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerBlockLayoutTests.swift; sourceTree = "<group>"; };
431DC9C329620AA1007FA268 /* BlockTestsModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockTestsModels.swift; sourceTree = "<group>"; };
@@ -807,6 +810,7 @@
52DED03C29F6E3D500D64519 /* ShimmerImagePreviewStyleTests.swift */,
9F89F0D82CEF4C8D00460B76 /* ShineExtensionParamsTests.swift */,
9F89F0DA2CEF5AA600460B76 /* ShimmerStyleTester.swift */,
0CE1B3542E04197A00677706 /* LottieExtensionHandlerTests.swift */,
);
path = DivKitExtensionsTests;
sourceTree = "<group>";
@@ -1459,6 +1463,7 @@
8CF8BBE92B32682700569777 /* DivBuilders.swift */,
9FE7D31B2CF7535700BAF071 /* FakeImageHolder.swift */,
9FE7D2D22CF74C2F00BAF071 /* MockDivBlockModelingContext.swift */,
0CE65E932E041BBE005EBB5A /* MockURLResourceRequester.swift */,
);
path = DivKitTestsSupport;
sourceTree = "<group>";
@@ -1923,6 +1928,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0CE1B3552E04197A00677706 /* LottieExtensionHandlerTests.swift in Sources */,
52DED05329F734B900D64519 /* ShimmerImagePreviewStyleTests.swift in Sources */,
9F89F0DB2CEF5AAC00460B76 /* ShimmerStyleTester.swift in Sources */,
0C9BB87F2DF02ECF001C4E72 /* MockDivExtensionHandler.swift in Sources */,
@@ -2061,7 +2067,6 @@
52907F662A71199B00518F50 /* DivLastVisibleBoundsCacheTests.swift in Sources */,
8C23F41729DDB3810069F3F7 /* EntityWithArrayOfExpressionsTemplate.swift in Sources */,
8C23F41D29DDB3810069F3F7 /* EntityWithComplexProperty.swift in Sources */,
8CF8BBEA2B32682700569777 /* DivBuilders.swift in Sources */,
8CB960E628883B8E00D16E47 /* Platform.swift in Sources */,
8C23F41829DDB3810069F3F7 /* EntityWithArrayOfNestedItems.swift in Sources */,
8C23F43729DDB3810069F3F7 /* EntityWithoutProperties.swift in Sources */,
@@ -2102,7 +2107,6 @@
8C84C2232D0870F400A574AC /* ScrollActionHandlerTests.swift in Sources */,
8C23F41929DDB3810069F3F7 /* EntityWithArrayOfNestedItemsTemplate.swift in Sources */,
8C23F41B29DDB3810069F3F7 /* EntityWithArrayWithTransform.swift in Sources */,
8CF8BBE82B32660500569777 /* BlockModelingUtils.swift in Sources */,
8C23F42A29DDB3810069F3F7 /* EntityWithPropertyWithDefaultValueTemplate.swift in Sources */,
8C23F42929DDB3810069F3F7 /* EntityWithPropertyWithDefaultValue.swift in Sources */,
8C23F44229DDB3810069F3F7 /* OptionalComplexPropertyTests.swift in Sources */,
@@ -2129,6 +2133,7 @@
8C23F42129DDB3810069F3F7 /* EntityWithEntityProperty.swift in Sources */,
8C23F41129DDB3810069F3F7 /* Entity.swift in Sources */,
8CBE33002BD699CC00CFFDF5 /* DivTriggersStorageTests.swift in Sources */,
0CE65E952E041BBE005EBB5A /* MockURLResourceRequester.swift in Sources */,
8C23F43929DDB3810069F3F7 /* ArrayOfEnums.swift in Sources */,
8C23F3C729DDB2120069F3F7 /* TemplateToTypeTests.swift in Sources */,
8CB960E828883B9A00D16E47 /* FunctionSignaturesTests.swift in Sources */,
@@ -2235,6 +2240,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
0CE65E942E041BBE005EBB5A /* MockURLResourceRequester.swift in Sources */,
0C1B9FE22DDE290A00F69371 /* BlockModelingUtils.swift in Sources */,
0C1B9FE12DDE28BF00F69371 /* DivBuilders.swift in Sources */,
9FE7D3262CF753A400BAF071 /* FakeImageHolder.swift in Sources */,
@@ -61,7 +61,7 @@ public final class LottieExtensionHandler: DivExtensionHandler {
)
}
public func getPreloadURLs(div: DivBase) -> [URL] {
public func getPreloadURLs(div: DivBase, expressionResolver _: ExpressionResolver) -> [URL] {
[Self.getPreloadURL(div: div)].compactMap { $0 }
}
@@ -129,6 +129,8 @@ private struct LottieExtensionParams {
if let repeatCount = params["repeat_count"] {
if let repeatCountFloat = repeatCount as? Float {
self.repeatCount = repeatCountFloat
} else if let repeatCountInt = repeatCount as? Int {
self.repeatCount = Float(repeatCountInt)
} else {
DivKitLogger.error("Not valid repeat_count")
return nil
@@ -0,0 +1,65 @@
@testable import DivKit
import DivKitTestsSupport
import DivKitExtensions
import LayoutKit
import VGSL
import XCTest
final class LottieExtensionHandlerTests: XCTestCase {
private var requester = MockURLResourceRequester()
private var factory = MockLottieAnimationFactory()
private var expressionResolver = DivBlockModelingContext.default.expressionResolver
private lazy var lottieExtensionHandler = LottieExtensionHandler(
factory: factory,
requester: requester
)
func test_getPreloadURLs() {
let lottieURLString = "https://example.com/DivGif9.json"
let divWithExtension = divContainer(
id: "container_with_extension",
extensions: [
DivExtension(
id: lottieExtensionHandler.id,
params: [
"lottie_url": lottieURLString,
"repeat_count": 2,
"repeat_mode": "reverse"
]
)
],
items: []
)
let castedExtensionHandler: DivExtensionHandler = lottieExtensionHandler
let preloadURLs = castedExtensionHandler.getPreloadURLs(
div: divWithExtension.value,
expressionResolver: expressionResolver
)
XCTAssertEqual(preloadURLs, [URL(string: lottieURLString)])
}
}
private final class MockLottieAnimationFactory: AsyncSourceAnimatableViewFactory {
var returnView = MockAnimatableView(frame: .zero)
func createAsyncSourceAnimatableView(withMode mode: AnimationRepeatMode, repeatCount count: Float)
-> AsyncSourceAnimatableView {
returnView
}
}
private final class MockAnimatableView: UIView, AsyncSourceAnimatableView {
var playCallsCount = 0
var receivedSources: [any DivKitExtensions.AnimationSourceType] = []
func play() {
playCallsCount += 1
}
func setSourceAsync(_ source: any DivKitExtensions.AnimationSourceType) async {
receivedSources.append(source)
}
}
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import XCTest
final class DivActionIntentTests: XCTestCase {
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import Foundation
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import LayoutKit
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import Serialization
import VGSL
@@ -1,3 +1,4 @@
import DivKitTestsSupport
import Foundation
import VGSL
@@ -1,6 +1,7 @@
@testable @_spi(Internal) import DivKit
@testable import LayoutKit
import XCTest
import DivKitTestsSupport
final class CustomFunctionTests: XCTestCase {
private let incrementFunction = DivFunction(
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import Serialization
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import LayoutKit
import VGSL
import XCTest
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import Testing
import UIKit
import VGSL
@@ -1,6 +1,6 @@
@testable import DivKit
import DivKitTestsSupport
@testable import LayoutKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import XCTest
final class DivContainerAccessibilityDescriptionTests: XCTestCase {
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import XCTest
final class DivContainerExtensionsTests: XCTestCase {
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import XCTest
final class DivDataExtensionsTests: XCTestCase {
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import XCTest
final class DivSeparatorExtensionsTests: XCTestCase {
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import XCTest
final class DivStateExtensionsTests: XCTestCase {
@@ -1,4 +1,5 @@
import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,5 +1,6 @@
@testable import DivKit
@testable import LayoutKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@_spi(Internal) @testable @preconcurrency import DivKit
import DivKitTestsSupport
import LayoutKit
import VGSL
import XCTest
@@ -1,6 +1,5 @@
@testable import DivKit
@testable import DivKitExtensions
@testable import DivKitTestsSupport
import DivKitTestsSupport
import VGSL
import XCTest
@@ -381,48 +380,6 @@ final class DivDataResourcesPreloaderTests: XCTestCase {
}
}
private final class MockURLResourceRequester: URLResourceRequesting {
var requestedURLs: [URL] = []
var shouldSucceed = true
var customBehavior: ((URL) -> Bool)?
@MainActor
func getDataWithSource(
from url: URL,
completion: @escaping CompletionHandlerWithSource
) -> Cancellable? {
requestedURLs.append(url)
if let customBehavior {
if customBehavior(url) {
completion(.success(URLRequestResult(data: Data(), source: .network)))
} else {
completion(.failure(NSError(domain: "test", code: 0)))
}
} else {
if shouldSucceed {
completion(.success(URLRequestResult(data: Data(), source: .network)))
} else {
completion(.failure(NSError(domain: "test", code: 0)))
}
}
return CancellableImpl {}
}
}
private struct CancellableImpl: Cancellable {
private let closure: @Sendable () -> Void
init(_ closure: @escaping @Sendable () -> Void = {}) {
self.closure = closure
}
func cancel() {
closure()
}
}
private func createDivVideo(id: String, url: String, preloadRequired: Bool) -> Div {
divVideo(
id: id,
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import Foundation
import XCTest
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import Foundation
import Testing
@@ -1,4 +1,5 @@
@testable @_spi(Internal) import DivKit
import DivKitTestsSupport
import LayoutKit
import XCTest
@@ -1,4 +1,5 @@
import DivKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,4 +1,5 @@
import DivKit
import DivKitTestsSupport
import VGSL
import XCTest
@@ -1,4 +1,5 @@
@testable import DivKit
import DivKitTestsSupport
import LayoutKit
import VGSL
import XCTest
@@ -1,10 +1,10 @@
@testable import DivKit
import Foundation
@testable import LayoutKit
import Foundation
import VGSL
import XCTest
func makeBlock(
public func makeBlock(
_ div: Div,
context: DivBlockModelingContext = DivBlockModelingContext(),
ignoreErrors: Bool = false,
@@ -17,13 +17,13 @@ func makeBlock(
return block
}
func separatorBlock() -> Block {
public func separatorBlock() -> Block {
SeparatorBlock(
color: color("#14000000")
)
}
func textBlock(
public func textBlock(
widthTrait: LayoutTrait = .resizable,
text: String,
path: UIElementPath
@@ -38,10 +38,10 @@ func textBlock(
}
extension AccessibilityElement {
static let `default` = accessibility(traits: .none, label: nil)
public static let `default` = accessibility(traits: .none, label: nil)
}
func accessibility(
public func accessibility(
traits: AccessibilityElement.Traits = .none,
label: String? = nil,
identifier: String? = nil,
@@ -58,7 +58,7 @@ func accessibility(
}
extension ActionAnimation {
static let `default` = ActionAnimation(
public static let `default` = ActionAnimation(
touchDown: [TransitioningAnimation(
kind: .fade,
start: 1.0,
@@ -79,11 +79,11 @@ extension ActionAnimation {
}
extension UIElementPath {
static let root = DivBlockModelingContext.testCardId.path
public static let root = DivBlockModelingContext.testCardId.path
}
extension DivAction {
func uiAction(
public func uiAction(
pathSuffix: String
) -> UserInterfaceAction? {
let pathComponents = pathSuffix.split(separator: "/")
@@ -95,7 +95,7 @@ extension DivAction {
}
}
func uiAction(
public func uiAction(
logId: String,
path: UIElementPath = .root,
url: String
@@ -114,7 +114,7 @@ func uiAction(
)
}
func divActionPayload(
public func divActionPayload(
_ json: JSONDictionary,
path: UIElementPath = .root,
url: String? = nil
@@ -131,14 +131,14 @@ func divActionPayload(
}
extension Block {
func unwrap<T>() throws -> T {
public func unwrap<T>() throws -> T {
let wrapperBlock = try XCTUnwrap(self as? WrapperBlock)
return try XCTUnwrap(wrapperBlock.child as? T)
}
}
extension String {
func withTypo(size: CGFloat = 12, weight: DivFontWeight = .regular) -> NSAttributedString {
public func withTypo(size: CGFloat = 12, weight: DivFontWeight = .regular) -> NSAttributedString {
let typo = Typo(
font: DivBlockModelingContext.default.fontProvider.font(weight: weight, size: size)
)
@@ -146,14 +146,14 @@ extension String {
}
}
func color(_ color: String) -> Color {
public func color(_ color: String) -> Color {
Color.color(withHexString: color)!
}
func url(_ string: String) -> URL {
public func url(_ string: String) -> URL {
URL(string: string)!
}
func expression<T>(_ expression: String) -> DivKit.Expression<T> {
public func expression<T>(_ expression: String) -> DivKit.Expression<T> {
.link(ExpressionLink<T>(rawValue: expression)!)
}
+26 -26
View File
@@ -4,7 +4,7 @@ import Foundation
import LayoutKit
import VGSL
func divAction(
public func divAction(
isEnabled: Bool = true,
logId: String = "test",
payload: [String: Any]? = nil,
@@ -30,7 +30,7 @@ func divAction(
)
}
func divData(
public func divData(
logId: String = DivBlockModelingContext.testCardId.rawValue,
states: [DivData.State]
) -> DivData {
@@ -45,7 +45,7 @@ func divData(
)
}
func divData(
public func divData(
_ div: Div,
logId: String = UIElementPath.root.description,
stateId: Int = 0
@@ -56,7 +56,7 @@ func divData(
)
}
func divGifImage(
public func divGifImage(
accessibility: DivAccessibility? = nil,
gifUrl: String,
height: DivSize? = nil,
@@ -72,7 +72,7 @@ func divGifImage(
))
}
func divInput(
public func divInput(
accessibility: DivAccessibility? = nil,
keyboardType: DivInput.KeyboardType? = nil,
textVariable: String
@@ -84,7 +84,7 @@ func divInput(
))
}
func divImage(
public func divImage(
accessibility: DivAccessibility? = nil,
height: DivSize? = nil,
id: String? = nil,
@@ -116,7 +116,7 @@ func divImage(
))
}
func divText(
public func divText(
accessibility: DivAccessibility? = nil,
actions: [DivAction]? = nil,
disappearActions: [DivDisappearAction]? = nil,
@@ -160,7 +160,7 @@ func divText(
))
}
func divSeparator(
public func divSeparator(
accessibility: DivAccessibility? = nil,
actions: [DivAction]? = nil,
alpha: CGFloat? = nil,
@@ -194,7 +194,7 @@ func divSeparator(
))
}
func divContainer(
public func divContainer(
id: String? = nil,
accessibility: DivAccessibility? = nil,
actions: [DivAction]? = nil,
@@ -262,7 +262,7 @@ func divContainer(
))
}
func divGallery(
public func divGallery(
items: [Div],
id: String? = nil
) -> Div {
@@ -313,7 +313,7 @@ func divGallery(
))
}
func divGrid(
public func divGrid(
columnCount: Int,
items: [Div]
) -> Div {
@@ -367,7 +367,7 @@ func divGrid(
))
}
func divPager(
public func divPager(
items: [Div],
layoutMode: DivPagerLayoutMode
) -> Div {
@@ -418,7 +418,7 @@ func divPager(
))
}
func divState(
public func divState(
divId: String?,
id: String? = nil,
defaultStateId: Expression<String>? = nil,
@@ -466,7 +466,7 @@ func divState(
))
}
func divStateState(
public func divStateState(
div: Div?,
stateId: String
) -> DivState.State {
@@ -479,7 +479,7 @@ func divStateState(
)
}
func divTabs(
public func divTabs(
items: [DivTabs.Item]
) -> Div {
.divTabs(DivTabs(
@@ -529,7 +529,7 @@ func divTabs(
))
}
func divTabsItem(
public func divTabsItem(
div: Div,
title: String
) -> DivTabs.Item {
@@ -540,35 +540,35 @@ func divTabsItem(
)
}
func fixedSize(_ value: Int) -> DivSize {
public func fixedSize(_ value: Int) -> DivSize {
.divFixedSize(DivFixedSize(value: .value(value)))
}
func matchParentSize() -> DivSize {
public func matchParentSize() -> DivSize {
.divMatchParentSize(DivMatchParentSize())
}
func wrapContentSize() -> DivSize {
public func wrapContentSize() -> DivSize {
.divWrapContentSize(DivWrapContentSize())
}
func point(x: Double, y: Double) -> DivPoint {
public func point(x: Double, y: Double) -> DivPoint {
DivPoint(
x: DivDimension(value: .value(x)),
y: DivDimension(value: .value(y))
)
}
func variable(_ name: String, _ value: String) -> DivVariable {
public func variable(_ name: String, _ value: String) -> DivVariable {
.stringVariable(StringVariable(name: name, value: .value(value)))
}
func solidBackground(_ color: RGBAColor) -> DivBackground {
public func solidBackground(_ color: RGBAColor) -> DivBackground {
.divSolidBackground(DivSolidBackground(color: .value(color)))
}
func divVideo(
public func divVideo(
id: String? = nil,
videoSources: [DivVideoSource],
preloadRequired: Bool? = nil,
@@ -587,7 +587,7 @@ func divVideo(
))
}
func divVideoSource(
public func divVideoSource(
mimeType: String,
url: String? = nil,
urlExpression: String? = nil
@@ -604,7 +604,7 @@ func divVideoSource(
)
}
func divTextImage(
public func divTextImage(
start: Int = 0,
url: String,
preloadRequired: Bool? = nil
@@ -617,7 +617,7 @@ func divTextImage(
)
}
func divImageBackground(
public func divImageBackground(
imageUrl: String,
preloadRequired: Bool? = nil
) -> DivBackground {
@@ -0,0 +1,46 @@
import Foundation
import VGSLFundamentals
public final class MockURLResourceRequester: URLResourceRequesting {
public var requestedURLs: [URL] = []
public var shouldSucceed = true
public var customBehavior: ((URL) -> Bool)?
public init() {}
@MainActor
public func getDataWithSource(
from url: URL,
completion: @escaping CompletionHandlerWithSource
) -> Cancellable? {
requestedURLs.append(url)
if let customBehavior {
if customBehavior(url) {
completion(.success(URLRequestResult(data: Data(), source: .network)))
} else {
completion(.failure(NSError(domain: "test", code: 0)))
}
} else {
if shouldSucceed {
completion(.success(URLRequestResult(data: Data(), source: .network)))
} else {
completion(.failure(NSError(domain: "test", code: 0)))
}
}
return CancellableImpl {}
}
}
private struct CancellableImpl: Cancellable {
private let closure: @Sendable () -> Void
init(_ closure: @escaping @Sendable () -> Void = {}) {
self.closure = closure
}
func cancel() {
closure()
}
}