diff --git a/.mapping.json b/.mapping.json index 40fe9cf66..24087f195 100644 --- a/.mapping.json +++ b/.mapping.json @@ -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", diff --git a/client/ios/DivKit.xcodeproj/project.pbxproj b/client/ios/DivKit.xcodeproj/project.pbxproj index e4a4c32fd..ea01cf143 100644 --- a/client/ios/DivKit.xcodeproj/project.pbxproj +++ b/client/ios/DivKit.xcodeproj/project.pbxproj @@ -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 = ""; }; 0C276A852DDC949700247E75 /* ImageBaseBlockTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageBaseBlockTests.swift; sourceTree = ""; }; 0C9BB87E2DF02ECF001C4E72 /* MockDivExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDivExtensionHandler.swift; sourceTree = ""; }; + 0CE1B3542E04197A00677706 /* LottieExtensionHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieExtensionHandlerTests.swift; sourceTree = ""; }; 0CE4BDE42C4FAE9F0048BEF8 /* GenericViewBlockTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenericViewBlockTests.swift; sourceTree = ""; }; + 0CE65E932E041BBE005EBB5A /* MockURLResourceRequester.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLResourceRequester.swift; sourceTree = ""; }; 431CF8572B7BC47E005A2E61 /* DivActionURLHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DivActionURLHandlerTests.swift; sourceTree = ""; }; 431DC9C12961EF84007FA268 /* ContainerBlockLayoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerBlockLayoutTests.swift; sourceTree = ""; }; 431DC9C329620AA1007FA268 /* BlockTestsModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockTestsModels.swift; sourceTree = ""; }; @@ -807,6 +810,7 @@ 52DED03C29F6E3D500D64519 /* ShimmerImagePreviewStyleTests.swift */, 9F89F0D82CEF4C8D00460B76 /* ShineExtensionParamsTests.swift */, 9F89F0DA2CEF5AA600460B76 /* ShimmerStyleTester.swift */, + 0CE1B3542E04197A00677706 /* LottieExtensionHandlerTests.swift */, ); path = DivKitExtensionsTests; sourceTree = ""; @@ -1459,6 +1463,7 @@ 8CF8BBE92B32682700569777 /* DivBuilders.swift */, 9FE7D31B2CF7535700BAF071 /* FakeImageHolder.swift */, 9FE7D2D22CF74C2F00BAF071 /* MockDivBlockModelingContext.swift */, + 0CE65E932E041BBE005EBB5A /* MockURLResourceRequester.swift */, ); path = DivKitTestsSupport; sourceTree = ""; @@ -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 */, diff --git a/client/ios/DivKitExtensions/Animations/Lottie/LottieExtensionHandler.swift b/client/ios/DivKitExtensions/Animations/Lottie/LottieExtensionHandler.swift index d1c9f1310..f4e99d836 100644 --- a/client/ios/DivKitExtensions/Animations/Lottie/LottieExtensionHandler.swift +++ b/client/ios/DivKitExtensions/Animations/Lottie/LottieExtensionHandler.swift @@ -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 diff --git a/client/ios/DivKitExtensionsTests/LottieExtensionHandlerTests.swift b/client/ios/DivKitExtensionsTests/LottieExtensionHandlerTests.swift new file mode 100644 index 000000000..f1b2e507d --- /dev/null +++ b/client/ios/DivKitExtensionsTests/LottieExtensionHandlerTests.swift @@ -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) + } + + +} diff --git a/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift b/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift index 1ed9fccf1..c8cc09443 100644 --- a/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift +++ b/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Actions/DivActionIntentTests.swift b/client/ios/DivKitTests/Actions/DivActionIntentTests.swift index 811e6af82..7370cf621 100644 --- a/client/ios/DivKitTests/Actions/DivActionIntentTests.swift +++ b/client/ios/DivKitTests/Actions/DivActionIntentTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import XCTest final class DivActionIntentTests: XCTestCase { diff --git a/client/ios/DivKitTests/Actions/DivActionURLHandlerTests.swift b/client/ios/DivKitTests/Actions/DivActionURLHandlerTests.swift index ca6f50afd..53e39ede1 100644 --- a/client/ios/DivKitTests/Actions/DivActionURLHandlerTests.swift +++ b/client/ios/DivKitTests/Actions/DivActionURLHandlerTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Actions/ScrollActionHandlerTests.swift b/client/ios/DivKitTests/Actions/ScrollActionHandlerTests.swift index ff1ce6be3..1c066a284 100644 --- a/client/ios/DivKitTests/Actions/ScrollActionHandlerTests.swift +++ b/client/ios/DivKitTests/Actions/ScrollActionHandlerTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Actions/SetStoredValueActionHandlerTests.swift b/client/ios/DivKitTests/Actions/SetStoredValueActionHandlerTests.swift index 9791b01d7..9486d5484 100644 --- a/client/ios/DivKitTests/Actions/SetStoredValueActionHandlerTests.swift +++ b/client/ios/DivKitTests/Actions/SetStoredValueActionHandlerTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Actions/SubmitActionHandlerTests.swift b/client/ios/DivKitTests/Actions/SubmitActionHandlerTests.swift index 8a24fe127..8053caa27 100644 --- a/client/ios/DivKitTests/Actions/SubmitActionHandlerTests.swift +++ b/client/ios/DivKitTests/Actions/SubmitActionHandlerTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/DivBlockModelingContextTests.swift b/client/ios/DivKitTests/DivBlockModelingContextTests.swift index c3c8cbe90..88f8d7dc2 100644 --- a/client/ios/DivKitTests/DivBlockModelingContextTests.swift +++ b/client/ios/DivKitTests/DivBlockModelingContextTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/DivPersistentValuesStorageTests.swift b/client/ios/DivKitTests/DivPersistentValuesStorageTests.swift index 2c046231a..af38c3a27 100644 --- a/client/ios/DivKitTests/DivPersistentValuesStorageTests.swift +++ b/client/ios/DivKitTests/DivPersistentValuesStorageTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import Foundation import VGSL import XCTest diff --git a/client/ios/DivKitTests/DivSerializationTests.swift b/client/ios/DivKitTests/DivSerializationTests.swift index 21d4a441a..91f235757 100644 --- a/client/ios/DivKitTests/DivSerializationTests.swift +++ b/client/ios/DivKitTests/DivSerializationTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/DivStateManagerTests.swift b/client/ios/DivKitTests/DivStateManagerTests.swift index de50e77ab..d2430286e 100644 --- a/client/ios/DivKitTests/DivStateManagerTests.swift +++ b/client/ios/DivKitTests/DivStateManagerTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import LayoutKit import VGSL import XCTest diff --git a/client/ios/DivKitTests/DivViewTests.swift b/client/ios/DivKitTests/DivViewTests.swift index f0aff6cd3..426a45cae 100644 --- a/client/ios/DivKitTests/DivViewTests.swift +++ b/client/ios/DivKitTests/DivViewTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import Serialization import VGSL diff --git a/client/ios/DivKitTests/Entities/ExpectedEntities.swift b/client/ios/DivKitTests/Entities/ExpectedEntities.swift index 0bd37771a..eb998a4e8 100644 --- a/client/ios/DivKitTests/Entities/ExpectedEntities.swift +++ b/client/ios/DivKitTests/Entities/ExpectedEntities.swift @@ -1,3 +1,4 @@ +import DivKitTestsSupport import Foundation import VGSL diff --git a/client/ios/DivKitTests/Expressions/CustomFunctionTests.swift b/client/ios/DivKitTests/Expressions/CustomFunctionTests.swift index a0dd6e253..9870f9767 100644 --- a/client/ios/DivKitTests/Expressions/CustomFunctionTests.swift +++ b/client/ios/DivKitTests/Expressions/CustomFunctionTests.swift @@ -1,6 +1,7 @@ @testable @_spi(Internal) import DivKit @testable import LayoutKit import XCTest +import DivKitTestsSupport final class CustomFunctionTests: XCTestCase { private let incrementFunction = DivFunction( diff --git a/client/ios/DivKitTests/Expressions/ExpressionResolverAnyTests.swift b/client/ios/DivKitTests/Expressions/ExpressionResolverAnyTests.swift index 06e597143..c1c6e29b5 100644 --- a/client/ios/DivKitTests/Expressions/ExpressionResolverAnyTests.swift +++ b/client/ios/DivKitTests/Expressions/ExpressionResolverAnyTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift b/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift index ec3b9f8ee..06a1f6083 100644 --- a/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift +++ b/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import Serialization import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivActionExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivActionExtensionsTests.swift index 791c060f4..2d1fafacb 100644 --- a/client/ios/DivKitTests/Extensions/DivActionExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivActionExtensionsTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import LayoutKit import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivBaseExtensions+AccessibilityElementsStorageTests.swift b/client/ios/DivKitTests/Extensions/DivBaseExtensions+AccessibilityElementsStorageTests.swift index fbc100256..1a8aefa69 100644 --- a/client/ios/DivKitTests/Extensions/DivBaseExtensions+AccessibilityElementsStorageTests.swift +++ b/client/ios/DivKitTests/Extensions/DivBaseExtensions+AccessibilityElementsStorageTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import Testing import UIKit import VGSL diff --git a/client/ios/DivKitTests/Extensions/DivBaseExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivBaseExtensionsTests.swift index e76550ab6..76a548105 100644 --- a/client/ios/DivKitTests/Extensions/DivBaseExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivBaseExtensionsTests.swift @@ -1,6 +1,6 @@ @testable import DivKit -import DivKitTestsSupport @testable import LayoutKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivContainerAccessibilityDescriptionTests.swift b/client/ios/DivKitTests/Extensions/DivContainerAccessibilityDescriptionTests.swift index e1f9d42ad..cbb71b639 100644 --- a/client/ios/DivKitTests/Extensions/DivContainerAccessibilityDescriptionTests.swift +++ b/client/ios/DivKitTests/Extensions/DivContainerAccessibilityDescriptionTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import XCTest final class DivContainerAccessibilityDescriptionTests: XCTestCase { diff --git a/client/ios/DivKitTests/Extensions/DivContainerExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivContainerExtensionsTests.swift index e447639a2..5591f3dc4 100644 --- a/client/ios/DivKitTests/Extensions/DivContainerExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivContainerExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import XCTest final class DivContainerExtensionsTests: XCTestCase { diff --git a/client/ios/DivKitTests/Extensions/DivDataExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivDataExtensionsTests.swift index 041c8dd39..4d20bd5b3 100644 --- a/client/ios/DivKitTests/Extensions/DivDataExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivDataExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import XCTest final class DivDataExtensionsTests: XCTestCase { diff --git a/client/ios/DivKitTests/Extensions/DivDataPatchExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivDataPatchExtensionsTests.swift index a8b7deefd..37903f351 100644 --- a/client/ios/DivKitTests/Extensions/DivDataPatchExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivDataPatchExtensionsTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivGalleryExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivGalleryExtensionsTests.swift index a936205fa..0bd3f711d 100644 --- a/client/ios/DivKitTests/Extensions/DivGalleryExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivGalleryExtensionsTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivGridExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivGridExtensionsTests.swift index dc902d704..d5224512f 100644 --- a/client/ios/DivKitTests/Extensions/DivGridExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivGridExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivInputExtentionsTests.swift b/client/ios/DivKitTests/Extensions/DivInputExtentionsTests.swift index 0ac14e3a6..3d9d2d861 100644 --- a/client/ios/DivKitTests/Extensions/DivInputExtentionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivInputExtentionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivSeparatorExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivSeparatorExtensionsTests.swift index 28119f5b8..d70649152 100644 --- a/client/ios/DivKitTests/Extensions/DivSeparatorExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivSeparatorExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import XCTest final class DivSeparatorExtensionsTests: XCTestCase { diff --git a/client/ios/DivKitTests/Extensions/DivStateExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivStateExtensionsTests.swift index da7fe0b54..074af74e2 100644 --- a/client/ios/DivKitTests/Extensions/DivStateExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivStateExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import XCTest final class DivStateExtensionsTests: XCTestCase { diff --git a/client/ios/DivKitTests/Extensions/DivTabsExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivTabsExtensionsTests.swift index cda1ac004..b009585c1 100644 --- a/client/ios/DivKitTests/Extensions/DivTabsExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivTabsExtensionsTests.swift @@ -1,4 +1,5 @@ import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivTextExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivTextExtensionsTests.swift index 0fa55f63b..b9c1797a8 100644 --- a/client/ios/DivKitTests/Extensions/DivTextExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivTextExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Extensions/DivTooltipExtensionsTests.swift b/client/ios/DivKitTests/Extensions/DivTooltipExtensionsTests.swift index deaaac7fd..33d1b3b57 100644 --- a/client/ios/DivKitTests/Extensions/DivTooltipExtensionsTests.swift +++ b/client/ios/DivKitTests/Extensions/DivTooltipExtensionsTests.swift @@ -1,5 +1,6 @@ @testable import DivKit @testable import LayoutKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/IntegrationTests.swift b/client/ios/DivKitTests/IntegrationTests.swift index 07689cc6b..81544946d 100644 --- a/client/ios/DivKitTests/IntegrationTests.swift +++ b/client/ios/DivKitTests/IntegrationTests.swift @@ -1,4 +1,5 @@ @_spi(Internal) @testable @preconcurrency import DivKit +import DivKitTestsSupport import LayoutKit import VGSL import XCTest diff --git a/client/ios/DivKitTests/ResourcesPreloader/DivDataResourcesPreloaderTests.swift b/client/ios/DivKitTests/ResourcesPreloader/DivDataResourcesPreloaderTests.swift index a78829604..2be35b79f 100644 --- a/client/ios/DivKitTests/ResourcesPreloader/DivDataResourcesPreloaderTests.swift +++ b/client/ios/DivKitTests/ResourcesPreloader/DivDataResourcesPreloaderTests.swift @@ -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, diff --git a/client/ios/DivKitTests/Timers/DivTimerControllerTests.swift b/client/ios/DivKitTests/Timers/DivTimerControllerTests.swift index 87af8dba2..8b4856294 100644 --- a/client/ios/DivKitTests/Timers/DivTimerControllerTests.swift +++ b/client/ios/DivKitTests/Timers/DivTimerControllerTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import Foundation import XCTest diff --git a/client/ios/DivKitTests/Timers/DivTimerStorageTest.swift b/client/ios/DivKitTests/Timers/DivTimerStorageTest.swift index 3db82cbdc..25e2c41e4 100644 --- a/client/ios/DivKitTests/Timers/DivTimerStorageTest.swift +++ b/client/ios/DivKitTests/Timers/DivTimerStorageTest.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import Foundation import Testing diff --git a/client/ios/DivKitTests/Variables/DivTriggersStorageTests.swift b/client/ios/DivKitTests/Variables/DivTriggersStorageTests.swift index b20c37bf7..1f519bb41 100644 --- a/client/ios/DivKitTests/Variables/DivTriggersStorageTests.swift +++ b/client/ios/DivKitTests/Variables/DivTriggersStorageTests.swift @@ -1,4 +1,5 @@ @testable @_spi(Internal) import DivKit +import DivKitTestsSupport import LayoutKit import XCTest diff --git a/client/ios/DivKitTests/Variables/DivVariableStorageTests.swift b/client/ios/DivKitTests/Variables/DivVariableStorageTests.swift index c6eb7f35f..9d8eb728d 100644 --- a/client/ios/DivKitTests/Variables/DivVariableStorageTests.swift +++ b/client/ios/DivKitTests/Variables/DivVariableStorageTests.swift @@ -1,4 +1,5 @@ import DivKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Variables/DivVariableStorageWithOuterStorageTests.swift b/client/ios/DivKitTests/Variables/DivVariableStorageWithOuterStorageTests.swift index 1a77b28df..f2cb134af 100644 --- a/client/ios/DivKitTests/Variables/DivVariableStorageWithOuterStorageTests.swift +++ b/client/ios/DivKitTests/Variables/DivVariableStorageWithOuterStorageTests.swift @@ -1,4 +1,5 @@ import DivKit +import DivKitTestsSupport import VGSL import XCTest diff --git a/client/ios/DivKitTests/Variables/DivVariablesStorageTests.swift b/client/ios/DivKitTests/Variables/DivVariablesStorageTests.swift index 092bd8e2c..366f38afd 100644 --- a/client/ios/DivKitTests/Variables/DivVariablesStorageTests.swift +++ b/client/ios/DivKitTests/Variables/DivVariablesStorageTests.swift @@ -1,4 +1,5 @@ @testable import DivKit +import DivKitTestsSupport import LayoutKit import VGSL import XCTest diff --git a/client/ios/DivKitTestsSupport/BlockModelingUtils.swift b/client/ios/DivKitTestsSupport/BlockModelingUtils.swift index 6c1067b31..63b37c6e1 100644 --- a/client/ios/DivKitTestsSupport/BlockModelingUtils.swift +++ b/client/ios/DivKitTestsSupport/BlockModelingUtils.swift @@ -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() throws -> T { + public func unwrap() 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(_ expression: String) -> DivKit.Expression { +public func expression(_ expression: String) -> DivKit.Expression { .link(ExpressionLink(rawValue: expression)!) } diff --git a/client/ios/DivKitTestsSupport/DivBuilders.swift b/client/ios/DivKitTestsSupport/DivBuilders.swift index 3322a4a97..c56fbba6f 100644 --- a/client/ios/DivKitTestsSupport/DivBuilders.swift +++ b/client/ios/DivKitTestsSupport/DivBuilders.swift @@ -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? = 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 { diff --git a/client/ios/DivKitTestsSupport/MockURLResourceRequester.swift b/client/ios/DivKitTestsSupport/MockURLResourceRequester.swift new file mode 100644 index 000000000..33be79fd3 --- /dev/null +++ b/client/ios/DivKitTestsSupport/MockURLResourceRequester.swift @@ -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() + } +}