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/Skottie.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "tests/Test.h"
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ciusing namespace skottie;
13cb93a386Sopenharmony_ciusing namespace skresources;
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ciDEF_TEST(Skottie_AudioLayer, r) {
16cb93a386Sopenharmony_ci    static constexpr char json[] =
17cb93a386Sopenharmony_ci        R"({
18cb93a386Sopenharmony_ci             "v": "5.2.1",
19cb93a386Sopenharmony_ci             "w": 100,
20cb93a386Sopenharmony_ci             "h": 100,
21cb93a386Sopenharmony_ci             "fr": 10,
22cb93a386Sopenharmony_ci             "ip": 0,
23cb93a386Sopenharmony_ci             "op": 100,
24cb93a386Sopenharmony_ci             "assets": [
25cb93a386Sopenharmony_ci               {
26cb93a386Sopenharmony_ci                 "id": "audio_0",
27cb93a386Sopenharmony_ci                 "p" : "audio.mp3",
28cb93a386Sopenharmony_ci                 "u" : "assets/"
29cb93a386Sopenharmony_ci               }
30cb93a386Sopenharmony_ci             ],
31cb93a386Sopenharmony_ci             "layers": [
32cb93a386Sopenharmony_ci               {
33cb93a386Sopenharmony_ci                 "ty"   : 6,
34cb93a386Sopenharmony_ci                 "ind"  : 0,
35cb93a386Sopenharmony_ci                 "ip"   : 20,
36cb93a386Sopenharmony_ci                 "op"   : 70,
37cb93a386Sopenharmony_ci                 "refId": "audio_0"
38cb93a386Sopenharmony_ci               },
39cb93a386Sopenharmony_ci               {
40cb93a386Sopenharmony_ci                 "ty"   : 6,
41cb93a386Sopenharmony_ci                 "ind"  : 0,
42cb93a386Sopenharmony_ci                 "ip"   : 50,
43cb93a386Sopenharmony_ci                 "op"   : 80,
44cb93a386Sopenharmony_ci                 "refId": "audio_0"
45cb93a386Sopenharmony_ci               },
46cb93a386Sopenharmony_ci               {
47cb93a386Sopenharmony_ci                 "ty": 1,
48cb93a386Sopenharmony_ci                 "ip": 0,
49cb93a386Sopenharmony_ci                 "op": 100,
50cb93a386Sopenharmony_ci                 "sw": 100,
51cb93a386Sopenharmony_ci                 "sh": 100,
52cb93a386Sopenharmony_ci                 "sc": "#ffffff"
53cb93a386Sopenharmony_ci               }
54cb93a386Sopenharmony_ci             ]
55cb93a386Sopenharmony_ci           })";
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci    class MockTracker final : public ExternalTrackAsset {
58cb93a386Sopenharmony_ci    public:
59cb93a386Sopenharmony_ci        bool isPlaying()    const { return fCurrentTime >= 0; }
60cb93a386Sopenharmony_ci        float currentTime() const { return fCurrentTime; }
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ci    private:
63cb93a386Sopenharmony_ci        void seek(float t) override {
64cb93a386Sopenharmony_ci            fCurrentTime = t;
65cb93a386Sopenharmony_ci        }
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ci        float                     fCurrentTime = 0;
68cb93a386Sopenharmony_ci    };
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci    class MockResourceProvider final : public ResourceProvider {
71cb93a386Sopenharmony_ci    public:
72cb93a386Sopenharmony_ci        explicit MockResourceProvider(skiatest::Reporter* r) : fReporter(r) {}
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ci        const std::vector<sk_sp<MockTracker>>& tracks() const { return fTracks; }
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_ci    private:
77cb93a386Sopenharmony_ci        sk_sp<ExternalTrackAsset> loadAudioAsset(const char path[],
78cb93a386Sopenharmony_ci                                                 const char name[],
79cb93a386Sopenharmony_ci                                                 const char id[]) override {
80cb93a386Sopenharmony_ci            REPORTER_ASSERT(fReporter, !strcmp(path, "assets/"));
81cb93a386Sopenharmony_ci            REPORTER_ASSERT(fReporter, !strcmp(name, "audio.mp3"));
82cb93a386Sopenharmony_ci            REPORTER_ASSERT(fReporter, !strcmp(id  , "audio_0"));
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci            fTracks.push_back(sk_make_sp<MockTracker>());
85cb93a386Sopenharmony_ci
86cb93a386Sopenharmony_ci            return fTracks.back();
87cb93a386Sopenharmony_ci        }
88cb93a386Sopenharmony_ci
89cb93a386Sopenharmony_ci        skiatest::Reporter*             fReporter;
90cb93a386Sopenharmony_ci        std::vector<sk_sp<MockTracker>> fTracks;
91cb93a386Sopenharmony_ci    };
92cb93a386Sopenharmony_ci
93cb93a386Sopenharmony_ci    SkMemoryStream stream(json, strlen(json));
94cb93a386Sopenharmony_ci    auto rp = sk_make_sp<MockResourceProvider>(r);
95cb93a386Sopenharmony_ci
96cb93a386Sopenharmony_ci    auto skottie = skottie::Animation::Builder()
97cb93a386Sopenharmony_ci            .setResourceProvider(rp)
98cb93a386Sopenharmony_ci            .make(&stream);
99cb93a386Sopenharmony_ci
100cb93a386Sopenharmony_ci    const auto& tracks = rp->tracks();
101cb93a386Sopenharmony_ci
102cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, skottie);
103cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks.size() == 2);
104cb93a386Sopenharmony_ci
105cb93a386Sopenharmony_ci    skottie->seekFrame(0);
106cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, !tracks[0]->isPlaying());
107cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, !tracks[1]->isPlaying());
108cb93a386Sopenharmony_ci
109cb93a386Sopenharmony_ci    skottie->seekFrame(20);
110cb93a386Sopenharmony_ci    REPORTER_ASSERT(r,  tracks[0]->isPlaying());
111cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, !tracks[1]->isPlaying());
112cb93a386Sopenharmony_ci    REPORTER_ASSERT(r,  tracks[0]->currentTime() == 0);
113cb93a386Sopenharmony_ci
114cb93a386Sopenharmony_ci    skottie->seekFrame(50);
115cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[0]->isPlaying());
116cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[1]->isPlaying());
117cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[0]->currentTime() == 3);
118cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[1]->currentTime() == 0);
119cb93a386Sopenharmony_ci
120cb93a386Sopenharmony_ci    skottie->seekFrame(70);
121cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[0]->isPlaying());
122cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[1]->isPlaying());
123cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[0]->currentTime() == 5);
124cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, tracks[1]->currentTime() == 2);
125cb93a386Sopenharmony_ci
126cb93a386Sopenharmony_ci    skottie->seekFrame(80);
127cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, !tracks[0]->isPlaying());
128cb93a386Sopenharmony_ci    REPORTER_ASSERT(r,  tracks[1]->isPlaying());
129cb93a386Sopenharmony_ci    REPORTER_ASSERT(r,  tracks[1]->currentTime() == 3);
130cb93a386Sopenharmony_ci
131cb93a386Sopenharmony_ci    skottie->seekFrame(100);
132cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, !tracks[0]->isPlaying());
133cb93a386Sopenharmony_ci    REPORTER_ASSERT(r, !tracks[1]->isPlaying());
134cb93a386Sopenharmony_ci}
135