1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar #include "webm/callback.h"
9*103e46e4SHarish Mahendrakar
10*103e46e4SHarish Mahendrakar #include <cstdint>
11*103e46e4SHarish Mahendrakar
12*103e46e4SHarish Mahendrakar #include "gtest/gtest.h"
13*103e46e4SHarish Mahendrakar
14*103e46e4SHarish Mahendrakar #include "webm/buffer_reader.h"
15*103e46e4SHarish Mahendrakar #include "webm/element.h"
16*103e46e4SHarish Mahendrakar #include "webm/status.h"
17*103e46e4SHarish Mahendrakar
18*103e46e4SHarish Mahendrakar using webm::Action;
19*103e46e4SHarish Mahendrakar using webm::BufferReader;
20*103e46e4SHarish Mahendrakar using webm::Callback;
21*103e46e4SHarish Mahendrakar using webm::ElementMetadata;
22*103e46e4SHarish Mahendrakar using webm::Reader;
23*103e46e4SHarish Mahendrakar using webm::Status;
24*103e46e4SHarish Mahendrakar
25*103e46e4SHarish Mahendrakar namespace {
26*103e46e4SHarish Mahendrakar
TestCompletedOk(Status (Callback::* function)(const ElementMetadata &))27*103e46e4SHarish Mahendrakar void TestCompletedOk(Status (Callback::*function)(const ElementMetadata&)) {
28*103e46e4SHarish Mahendrakar Callback callback;
29*103e46e4SHarish Mahendrakar ElementMetadata metadata{};
30*103e46e4SHarish Mahendrakar
31*103e46e4SHarish Mahendrakar Status status = (callback.*function)(metadata);
32*103e46e4SHarish Mahendrakar EXPECT_EQ(Status::kOkCompleted, status.code);
33*103e46e4SHarish Mahendrakar }
34*103e46e4SHarish Mahendrakar
35*103e46e4SHarish Mahendrakar template <typename T>
TestCompletedOk(Status (Callback::* function)(const ElementMetadata &,const T &))36*103e46e4SHarish Mahendrakar void TestCompletedOk(Status (Callback::*function)(const ElementMetadata&,
37*103e46e4SHarish Mahendrakar const T&)) {
38*103e46e4SHarish Mahendrakar Callback callback;
39*103e46e4SHarish Mahendrakar ElementMetadata metadata{};
40*103e46e4SHarish Mahendrakar T object{};
41*103e46e4SHarish Mahendrakar
42*103e46e4SHarish Mahendrakar Status status = (callback.*function)(metadata, object);
43*103e46e4SHarish Mahendrakar EXPECT_EQ(Status::kOkCompleted, status.code);
44*103e46e4SHarish Mahendrakar }
45*103e46e4SHarish Mahendrakar
TestAction(Status (Callback::* function)(const ElementMetadata &,Action *),Action expected)46*103e46e4SHarish Mahendrakar void TestAction(Status (Callback::*function)(const ElementMetadata&, Action*),
47*103e46e4SHarish Mahendrakar Action expected) {
48*103e46e4SHarish Mahendrakar Callback callback;
49*103e46e4SHarish Mahendrakar ElementMetadata metadata{};
50*103e46e4SHarish Mahendrakar Action action;
51*103e46e4SHarish Mahendrakar
52*103e46e4SHarish Mahendrakar Status status = (callback.*function)(metadata, &action);
53*103e46e4SHarish Mahendrakar EXPECT_EQ(Status::kOkCompleted, status.code);
54*103e46e4SHarish Mahendrakar EXPECT_EQ(expected, action);
55*103e46e4SHarish Mahendrakar }
56*103e46e4SHarish Mahendrakar
57*103e46e4SHarish Mahendrakar template <typename T>
TestAction(Status (Callback::* function)(const ElementMetadata &,const T &,Action *),Action expected)58*103e46e4SHarish Mahendrakar void TestAction(Status (Callback::*function)(const ElementMetadata&, const T&,
59*103e46e4SHarish Mahendrakar Action*),
60*103e46e4SHarish Mahendrakar Action expected) {
61*103e46e4SHarish Mahendrakar Callback callback;
62*103e46e4SHarish Mahendrakar ElementMetadata metadata{};
63*103e46e4SHarish Mahendrakar T t{};
64*103e46e4SHarish Mahendrakar Action action;
65*103e46e4SHarish Mahendrakar
66*103e46e4SHarish Mahendrakar Status status = (callback.*function)(metadata, t, &action);
67*103e46e4SHarish Mahendrakar EXPECT_EQ(Status::kOkCompleted, status.code);
68*103e46e4SHarish Mahendrakar EXPECT_EQ(expected, action);
69*103e46e4SHarish Mahendrakar }
70*103e46e4SHarish Mahendrakar
71*103e46e4SHarish Mahendrakar template <typename T>
TestRead(Status (Callback::* function)(const T &,Reader *,std::uint64_t *))72*103e46e4SHarish Mahendrakar void TestRead(Status (Callback::*function)(const T&, Reader*, std::uint64_t*)) {
73*103e46e4SHarish Mahendrakar Callback callback;
74*103e46e4SHarish Mahendrakar Status status;
75*103e46e4SHarish Mahendrakar T metadata{};
76*103e46e4SHarish Mahendrakar BufferReader reader = {0x00, 0x01, 0x02, 0x03};
77*103e46e4SHarish Mahendrakar std::uint64_t bytes_remaining = 4;
78*103e46e4SHarish Mahendrakar
79*103e46e4SHarish Mahendrakar status = (callback.*function)(metadata, &reader, &bytes_remaining);
80*103e46e4SHarish Mahendrakar EXPECT_EQ(Status::kOkCompleted, status.code);
81*103e46e4SHarish Mahendrakar EXPECT_EQ(static_cast<std::uint64_t>(0), bytes_remaining);
82*103e46e4SHarish Mahendrakar }
83*103e46e4SHarish Mahendrakar
84*103e46e4SHarish Mahendrakar class CallbackTest : public testing::Test {};
85*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnElementBegin)86*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnElementBegin) {
87*103e46e4SHarish Mahendrakar TestAction(&Callback::OnElementBegin, Action::kRead);
88*103e46e4SHarish Mahendrakar }
89*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnUnknownElement)90*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnUnknownElement) {
91*103e46e4SHarish Mahendrakar TestRead(&Callback::OnUnknownElement);
92*103e46e4SHarish Mahendrakar }
93*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnEbml)94*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnEbml) { TestCompletedOk(&Callback::OnEbml); }
95*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnVoid)96*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnVoid) { TestRead(&Callback::OnVoid); }
97*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnSegmentBegin)98*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnSegmentBegin) {
99*103e46e4SHarish Mahendrakar TestAction(&Callback::OnSegmentBegin, Action::kRead);
100*103e46e4SHarish Mahendrakar }
101*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnSeek)102*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnSeek) { TestCompletedOk(&Callback::OnSeek); }
103*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnInfo)104*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnInfo) { TestCompletedOk(&Callback::OnInfo); }
105*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnClusterBegin)106*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnClusterBegin) {
107*103e46e4SHarish Mahendrakar TestAction(&Callback::OnClusterBegin, Action::kRead);
108*103e46e4SHarish Mahendrakar }
109*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnSimpleBlockBegin)110*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnSimpleBlockBegin) {
111*103e46e4SHarish Mahendrakar TestAction(&Callback::OnSimpleBlockBegin, Action::kRead);
112*103e46e4SHarish Mahendrakar }
113*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnSimpleBlockEnd)114*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnSimpleBlockEnd) {
115*103e46e4SHarish Mahendrakar TestCompletedOk(&Callback::OnSimpleBlockEnd);
116*103e46e4SHarish Mahendrakar }
117*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnBlockGroupBegin)118*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnBlockGroupBegin) {
119*103e46e4SHarish Mahendrakar TestAction(&Callback::OnBlockGroupBegin, Action::kRead);
120*103e46e4SHarish Mahendrakar }
121*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnBlockBegin)122*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnBlockBegin) {
123*103e46e4SHarish Mahendrakar TestAction(&Callback::OnBlockBegin, Action::kRead);
124*103e46e4SHarish Mahendrakar }
125*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnBlockEnd)126*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnBlockEnd) { TestCompletedOk(&Callback::OnBlockEnd); }
127*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnBlockGroupEnd)128*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnBlockGroupEnd) {
129*103e46e4SHarish Mahendrakar TestCompletedOk(&Callback::OnBlockGroupEnd);
130*103e46e4SHarish Mahendrakar }
131*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnFrame)132*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnFrame) { TestRead(&Callback::OnFrame); }
133*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnClusterEnd)134*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnClusterEnd) { TestCompletedOk(&Callback::OnClusterEnd); }
135*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnTrackEntry)136*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnTrackEntry) { TestCompletedOk(&Callback::OnTrackEntry); }
137*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnCuePoint)138*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnCuePoint) { TestCompletedOk(&Callback::OnCuePoint); }
139*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnEditionEntry)140*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnEditionEntry) {
141*103e46e4SHarish Mahendrakar TestCompletedOk(&Callback::OnEditionEntry);
142*103e46e4SHarish Mahendrakar }
143*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnTag)144*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnTag) { TestCompletedOk(&Callback::OnTag); }
145*103e46e4SHarish Mahendrakar
TEST_F(CallbackTest,OnSegmentEnd)146*103e46e4SHarish Mahendrakar TEST_F(CallbackTest, OnSegmentEnd) { TestCompletedOk(&Callback::OnSegmentEnd); }
147*103e46e4SHarish Mahendrakar
148*103e46e4SHarish Mahendrakar } // namespace
149