forked from airbnb/lottie-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ValueProvidersTests.swift
99 lines (85 loc) · 3.85 KB
/
ValueProvidersTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//
// ValueProvidersTests.swift
// LottieTests
//
// Created by Marcelo Fabri on 5/5/22.
//
import XCTest
@testable import Lottie
@MainActor
final class ValueProvidersTests: XCTestCase {
func testGetValue() async throws {
let optionalAnimationView = await SnapshotConfiguration.makeAnimationView(
for: "HamburgerArrow",
configuration: .init(renderingEngine: .mainThread))
let animationView = try XCTUnwrap(optionalAnimationView)
let keypath = AnimationKeypath(keypath: "A1.Shape 1.Stroke 1.Color")
animationView.setValueProvider(ColorValueProvider(.red), keypath: keypath)
let updatedColor = try XCTUnwrap(animationView.getValue(for: keypath, atFrame: 0) as? LottieColor)
XCTAssertEqual(updatedColor, .red)
let originalColor = try XCTUnwrap(animationView.getOriginalValue(for: keypath, atFrame: 0) as? LottieColor)
XCTAssertEqual(originalColor, LottieColor(r: 0.4, g: 0.16, b: 0.7, a: 1))
}
func testValueProviderStore() async throws {
let optionalAnimationView = await SnapshotConfiguration.makeAnimationView(
for: "HamburgerArrow",
configuration: .init(renderingEngine: .mainThread))
let animation = try XCTUnwrap(optionalAnimationView?.animation)
let store = ValueProviderStore(logger: .printToConsole)
let animationContext = LayerAnimationContext(
animation: animation,
timingConfiguration: .init(),
startFrame: 0,
endFrame: 100,
valueProviderStore: store,
compatibilityTracker: .init(mode: .track, logger: .printToConsole),
logger: .printToConsole,
loggingState: LoggingState(),
currentKeypath: .init(keys: []),
textProvider: DictionaryTextProvider([:]))
// Test that the store returns the expected value for the provider.
store.setValueProvider(ColorValueProvider(.red), keypath: "**.Color")
let keyFramesQuery1 = try store.customKeyframes(
of: .color,
for: "Layer.Shape Group.Stroke 1.Color",
context: animationContext)
XCTAssertEqual(keyFramesQuery1?.keyframes.map(\.value.components), [[1, 0, 0, 1]])
// Test a different provider/keypath.
store.setValueProvider(ColorValueProvider(.blue), keypath: "A1.Shape 1.Stroke 1.Color")
let keyFramesQuery2 = try store.customKeyframes(
of: .color,
for: "A1.Shape 1.Stroke 1.Color",
context: animationContext)
XCTAssertEqual(keyFramesQuery2?.keyframes.map(\.value.components), [[0, 0, 1, 1]])
// Test that adding a different keypath didn't disrupt the original one.
let keyFramesQuery3 = try store.customKeyframes(
of: .color,
for: "Layer.Shape Group.Stroke 1.Color",
context: animationContext)
XCTAssertEqual(keyFramesQuery3?.keyframes.map(\.value.components), [[1, 0, 0, 1]])
// Test overriding the original keypath with a new provider stores the new provider.
store.setValueProvider(ColorValueProvider(.black), keypath: "**.Color")
let keyFramesQuery4 = try store.customKeyframes(
of: .color,
for: "Layer.Shape Group.Stroke 1.Color",
context: animationContext)
XCTAssertEqual(keyFramesQuery4?.keyframes.map(\.value.components), [[0, 0, 0, 1]])
// Test removing specific keypath
let keypathToRemove: AnimationKeypath = "**.Color"
store.setValueProvider(ColorValueProvider(.black), keypath: keypathToRemove)
store.removeValueProvider(for: keypathToRemove)
let keyFramesQuery5 = try store.customKeyframes(
of: .color,
for: "Layer.Shape Group.Stroke 1.Color",
context: animationContext)
XCTAssertNil(keyFramesQuery5)
// Test removing wildcard keypath
store.setValueProvider(ColorValueProvider(.black), keypath: "**1.Color")
store.removeValueProvider(for: "**.Color")
let keyFramesQuery6 = try store.customKeyframes(
of: .color,
for: "Layer.Shape Group.Stroke 1.Color",
context: animationContext)
XCTAssertNil(keyFramesQuery6)
}
}