blob: 29d2177b1e3dab0555f1947c2e6fa28084de1163 [file] [log] [blame]
/*
* Copyright 2021 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "modules/skottie/include/Skottie.h"
#include "modules/skottie/include/SkottieProperty.h"
#include "tests/Test.h"
#include <iostream>
using namespace skottie;
namespace {
class FakeScalarExpressionEvaluator : public ExpressionEvaluator<float> {
public:
float evaluate(float t) override {
return 7.0f;
}
};
class FakeExpressionManager : public ExpressionManager {
public:
sk_sp<ExpressionEvaluator<float>> createNumberExpressionEvaluator(
const char expression[]) override {
return sk_make_sp<FakeScalarExpressionEvaluator>();
}
sk_sp<ExpressionEvaluator<SkString>> createStringExpressionEvaluator(
const char expression[]) override {
return nullptr;
}
sk_sp<ExpressionEvaluator<std::vector<float>>> createArrayExpressionEvaluator(
const char expression[]) override {
return nullptr;
}
};
class FakePropertyObserver : public PropertyObserver {
public:
void onOpacityProperty(const char node_name[],
const LazyHandle<OpacityPropertyHandle>& opacity_handle) override {
opacity_handle_.reset(opacity_handle().release());
}
std::unique_ptr<OpacityPropertyHandle> opacity_handle_;
};
} // namespace
DEF_TEST(Skottie_ScalarExpression, r) {
static constexpr char json[] =
R"({
"v": "5.2.1",
"w": 100,
"h": 100,
"fr": 10,
"ip": 0,
"op": 100,
"layers": [
{
"ip": 0,
"op": 100,
"ty": 1,
"nm": "My Layer",
"sr": 1,
"ks": {
"o": {
"a": 0,
"k": 100,
"ix": 11,
"x": "fake; return value is specified by the FakeScalarExpressionEvaluator."
},
"r": {
"a": 0,
"k": 0,
"ix": 10
},
"p": {
"a": 0,
"k": [
50,
50,
0
],
"ix": 2,
"l": 2
},
"a": {
"a": 0,
"k": [
50,
50,
0
],
"ix": 1,
"l": 2
},
"s": {
"a": 0,
"k": [
100,
100,
100
],
"ix": 6,
"l": 2
}
},
"ao": 0,
"sw": 100,
"sh": 100,
"sc": "#51251d",
"st": 0,
"bm": 0
}
]
})";
SkMemoryStream stream(json, strlen(json));
auto em = sk_make_sp<FakeExpressionManager>();
auto observer = sk_make_sp<FakePropertyObserver>();
auto anim = Animation::Builder()
.setExpressionManager(em)
.setPropertyObserver(observer)
.make(&stream);
REPORTER_ASSERT(r, anim);
anim->seekFrameTime(0);
REPORTER_ASSERT(r, SkScalarNearlyEqual(observer->opacity_handle_->get(), 7.0f));
}