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