| // Copyright (c) 2016 The WebM project authors. All Rights Reserved. |
| // |
| // Use of this source code is governed by a BSD-style license |
| // that can be found in the LICENSE file in the root of the source |
| // tree. An additional intellectual property rights grant can be found |
| // in the file PATENTS. All contributing project authors may |
| // be found in the AUTHORS file in the root of the source tree. |
| #include "webm/callback.h" |
| |
| #include <cstdint> |
| |
| #include "gtest/gtest.h" |
| |
| #include "webm/buffer_reader.h" |
| #include "webm/element.h" |
| #include "webm/status.h" |
| |
| using webm::Action; |
| using webm::BufferReader; |
| using webm::Callback; |
| using webm::ElementMetadata; |
| using webm::Reader; |
| using webm::Status; |
| |
| namespace { |
| |
| void TestCompletedOk(Status (Callback::*function)(const ElementMetadata&)) { |
| Callback callback; |
| ElementMetadata metadata{}; |
| |
| Status status = (callback.*function)(metadata); |
| EXPECT_EQ(Status::kOkCompleted, status.code); |
| } |
| |
| template <typename T> |
| void TestCompletedOk(Status (Callback::*function)(const ElementMetadata&, |
| const T&)) { |
| Callback callback; |
| ElementMetadata metadata{}; |
| T object{}; |
| |
| Status status = (callback.*function)(metadata, object); |
| EXPECT_EQ(Status::kOkCompleted, status.code); |
| } |
| |
| void TestAction(Status (Callback::*function)(const ElementMetadata&, Action*), |
| Action expected) { |
| Callback callback; |
| ElementMetadata metadata{}; |
| Action action; |
| |
| Status status = (callback.*function)(metadata, &action); |
| EXPECT_EQ(Status::kOkCompleted, status.code); |
| EXPECT_EQ(expected, action); |
| } |
| |
| template <typename T> |
| void TestAction(Status (Callback::*function)(const ElementMetadata&, const T&, |
| Action*), |
| Action expected) { |
| Callback callback; |
| ElementMetadata metadata{}; |
| T t{}; |
| Action action; |
| |
| Status status = (callback.*function)(metadata, t, &action); |
| EXPECT_EQ(Status::kOkCompleted, status.code); |
| EXPECT_EQ(expected, action); |
| } |
| |
| template <typename T> |
| void TestRead(Status (Callback::*function)(const T&, Reader*, std::uint64_t*)) { |
| Callback callback; |
| Status status; |
| T metadata{}; |
| BufferReader reader = {0x00, 0x01, 0x02, 0x03}; |
| std::uint64_t bytes_remaining = 4; |
| |
| status = (callback.*function)(metadata, &reader, &bytes_remaining); |
| EXPECT_EQ(Status::kOkCompleted, status.code); |
| EXPECT_EQ(0, bytes_remaining); |
| } |
| |
| class CallbackTest : public testing::Test {}; |
| |
| TEST_F(CallbackTest, OnElementBegin) { |
| TestAction(&Callback::OnElementBegin, Action::kRead); |
| } |
| |
| TEST_F(CallbackTest, OnUnknownElement) { |
| TestRead(&Callback::OnUnknownElement); |
| } |
| |
| TEST_F(CallbackTest, OnEbml) { TestCompletedOk(&Callback::OnEbml); } |
| |
| TEST_F(CallbackTest, OnVoid) { TestRead(&Callback::OnVoid); } |
| |
| TEST_F(CallbackTest, OnSegmentBegin) { |
| TestAction(&Callback::OnSegmentBegin, Action::kRead); |
| } |
| |
| TEST_F(CallbackTest, OnSeek) { TestCompletedOk(&Callback::OnSeek); } |
| |
| TEST_F(CallbackTest, OnInfo) { TestCompletedOk(&Callback::OnInfo); } |
| |
| TEST_F(CallbackTest, OnClusterBegin) { |
| TestAction(&Callback::OnClusterBegin, Action::kRead); |
| } |
| |
| TEST_F(CallbackTest, OnSimpleBlockBegin) { |
| TestAction(&Callback::OnSimpleBlockBegin, Action::kRead); |
| } |
| |
| TEST_F(CallbackTest, OnSimpleBlockEnd) { |
| TestCompletedOk(&Callback::OnSimpleBlockEnd); |
| } |
| |
| TEST_F(CallbackTest, OnBlockGroupBegin) { |
| TestAction(&Callback::OnBlockGroupBegin, Action::kRead); |
| } |
| |
| TEST_F(CallbackTest, OnBlockBegin) { |
| TestAction(&Callback::OnBlockBegin, Action::kRead); |
| } |
| |
| TEST_F(CallbackTest, OnBlockEnd) { TestCompletedOk(&Callback::OnBlockEnd); } |
| |
| TEST_F(CallbackTest, OnBlockGroupEnd) { |
| TestCompletedOk(&Callback::OnBlockGroupEnd); |
| } |
| |
| TEST_F(CallbackTest, OnFrame) { TestRead(&Callback::OnFrame); } |
| |
| TEST_F(CallbackTest, OnClusterEnd) { TestCompletedOk(&Callback::OnClusterEnd); } |
| |
| TEST_F(CallbackTest, OnTrackEntry) { TestCompletedOk(&Callback::OnTrackEntry); } |
| |
| TEST_F(CallbackTest, OnCuePoint) { TestCompletedOk(&Callback::OnCuePoint); } |
| |
| TEST_F(CallbackTest, OnEditionEntry) { |
| TestCompletedOk(&Callback::OnEditionEntry); |
| } |
| |
| TEST_F(CallbackTest, OnTag) { TestCompletedOk(&Callback::OnTag); } |
| |
| TEST_F(CallbackTest, OnSegmentEnd) { TestCompletedOk(&Callback::OnSegmentEnd); } |
| |
| } // namespace |