1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "modules/skottie/include/ExternalLayer.h" 9cb93a386Sopenharmony_ci#include "modules/skottie/src/SkottiePriv.h" 10cb93a386Sopenharmony_ci#include "modules/skottie/src/SkottieValue.h" 11cb93a386Sopenharmony_ci#include "modules/skottie/src/animator/Animator.h" 12cb93a386Sopenharmony_ci#include "src/utils/SkJSON.h" 13cb93a386Sopenharmony_ci#include "tests/Test.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include <cmath> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciusing namespace skottie; 18cb93a386Sopenharmony_ciusing namespace skottie::internal; 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cinamespace { 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_citemplate <typename T> 23cb93a386Sopenharmony_ciclass MockProperty final : public AnimatablePropertyContainer { 24cb93a386Sopenharmony_cipublic: 25cb93a386Sopenharmony_ci explicit MockProperty(const char* jprop) { 26cb93a386Sopenharmony_ci AnimationBuilder abuilder(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, 27cb93a386Sopenharmony_ci {100, 100}, 10, 1, 0); 28cb93a386Sopenharmony_ci skjson::DOM json_dom(jprop, strlen(jprop)); 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci fDidBind = this->bind(abuilder, json_dom.root(), &fValue); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci operator bool() const { return fDidBind; } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci const T& operator()(float t) { this->seek(t); return fValue; } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciprivate: 38cb93a386Sopenharmony_ci void onSync() override {} 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci T fValue = T(); 41cb93a386Sopenharmony_ci bool fDidBind; 42cb93a386Sopenharmony_ci}; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci} // namespace 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ciDEF_TEST(Skottie_Keyframe, reporter) { 47cb93a386Sopenharmony_ci { 48cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({})"); 49cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !prop); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci { 52cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({ "a": 1, "k": [] })"); 53cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !prop); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci { 56cb93a386Sopenharmony_ci // New style 57cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({ 58cb93a386Sopenharmony_ci "a": 1, 59cb93a386Sopenharmony_ci "k": [ 60cb93a386Sopenharmony_ci { "t": 1, "s": 1 }, 61cb93a386Sopenharmony_ci { "t": 2, "s": 2 }, 62cb93a386Sopenharmony_ci { "t": 3, "s": 4 } 63cb93a386Sopenharmony_ci ] 64cb93a386Sopenharmony_ci })"); 65cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop); 66cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !prop.isStatic()); 67cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( -1), 1)); 68cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 0), 1)); 69cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 1), 1)); 70cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(1.5), 1.5f)); 71cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 2), 2)); 72cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(2.5), 3)); 73cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 3), 4)); 74cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 4), 4)); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci { 77cb93a386Sopenharmony_ci // New style hold (hard stops) 78cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({ 79cb93a386Sopenharmony_ci "a": 1, 80cb93a386Sopenharmony_ci "k": [ 81cb93a386Sopenharmony_ci { "t": 1, "s": 1, "h": true }, 82cb93a386Sopenharmony_ci { "t": 2, "s": 2, "h": true }, 83cb93a386Sopenharmony_ci { "t": 3, "s": 4, "h": true } 84cb93a386Sopenharmony_ci ] 85cb93a386Sopenharmony_ci })"); 86cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop); 87cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !prop.isStatic()); 88cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(0 ), 1)); 89cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(1 ), 1)); 90cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(1.5), 1)); 91cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(std::nextafter(2.f, 0.f)), 1)); 92cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(2 ), 2)); 93cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(2.5), 2)); 94cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(std::nextafter(3.f, 0.f)), 2)); 95cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(3 ), 4)); 96cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(4 ), 4)); 97cb93a386Sopenharmony_ci } 98cb93a386Sopenharmony_ci { 99cb93a386Sopenharmony_ci // Legacy style 100cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({ 101cb93a386Sopenharmony_ci "a": 1, 102cb93a386Sopenharmony_ci "k": [ 103cb93a386Sopenharmony_ci { "t": 1, "s": 1, "e": 2 }, 104cb93a386Sopenharmony_ci { "t": 2, "s": 2, "e": 4 }, 105cb93a386Sopenharmony_ci { "t": 3 } 106cb93a386Sopenharmony_ci ] 107cb93a386Sopenharmony_ci })"); 108cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop); 109cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !prop.isStatic()); 110cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(-1), 1)); 111cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 0), 1)); 112cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 1 ), 1)); 113cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 1.5), 1.5f)); 114cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 2 ), 2)); 115cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 2.5), 3)); 116cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 3 ), 4)); 117cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop( 4 ), 4)); 118cb93a386Sopenharmony_ci } 119cb93a386Sopenharmony_ci { 120cb93a386Sopenharmony_ci // Legacy style hold (hard stops) 121cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({ 122cb93a386Sopenharmony_ci "a": 1, 123cb93a386Sopenharmony_ci "k": [ 124cb93a386Sopenharmony_ci { "t": 1, "s": 1, "e": 2, "h": true }, 125cb93a386Sopenharmony_ci { "t": 2, "s": 2, "e": 4, "h": true }, 126cb93a386Sopenharmony_ci { "t": 3 } 127cb93a386Sopenharmony_ci ] 128cb93a386Sopenharmony_ci })"); 129cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop); 130cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !prop.isStatic()); 131cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(0 ), 1)); 132cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(1 ), 1)); 133cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(1.5), 1)); 134cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(std::nextafter(2.f, 0.f)), 1)); 135cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(2 ), 2)); 136cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(2.5), 2)); 137cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(std::nextafter(3.f, 0.f)), 2)); 138cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(3 ), 4)); 139cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(4 ), 4)); 140cb93a386Sopenharmony_ci } 141cb93a386Sopenharmony_ci { 142cb93a386Sopenharmony_ci // Static scalar prop (all equal keyframes, using float kf Value) 143cb93a386Sopenharmony_ci MockProperty<ScalarValue> prop(R"({ 144cb93a386Sopenharmony_ci "a": 1, 145cb93a386Sopenharmony_ci "k": [ 146cb93a386Sopenharmony_ci { "t": 1, "s": 42, "e": 42 }, 147cb93a386Sopenharmony_ci { "t": 2, "s": 42, "e": 42 }, 148cb93a386Sopenharmony_ci { "t": 3 } 149cb93a386Sopenharmony_ci ] 150cb93a386Sopenharmony_ci })"); 151cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop); 152cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop.isStatic()); 153cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(0), 42)); 154cb93a386Sopenharmony_ci } 155cb93a386Sopenharmony_ci { 156cb93a386Sopenharmony_ci // Static vector prop (all equal keyframes, using uint32 kf Value) 157cb93a386Sopenharmony_ci MockProperty<Vec2Value> prop(R"({ 158cb93a386Sopenharmony_ci "a": 1, 159cb93a386Sopenharmony_ci "k": [ 160cb93a386Sopenharmony_ci { "t": 1, "s": [4,2], "e": [4,2] }, 161cb93a386Sopenharmony_ci { "t": 2, "s": [4,2], "e": [4,2] }, 162cb93a386Sopenharmony_ci { "t": 3 } 163cb93a386Sopenharmony_ci ] 164cb93a386Sopenharmony_ci })"); 165cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop); 166cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prop.isStatic()); 167cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(0).x, 4)); 168cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SkScalarNearlyEqual(prop(0).y, 2)); 169cb93a386Sopenharmony_ci } 170cb93a386Sopenharmony_ci} 171