TestMediaSpan.cpp (3120B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include <gtest/gtest.h> 8 #include <stdint.h> 9 10 #include "MediaSpan.h" 11 12 using namespace mozilla; 13 14 already_AddRefed<MediaByteBuffer> makeBuffer(uint8_t aStart, uint8_t aEnd) { 15 RefPtr<MediaByteBuffer> buffer(new MediaByteBuffer); 16 for (uint8_t i = aStart; i <= aEnd; i++) { 17 buffer->AppendElement(i); 18 } 19 return buffer.forget(); 20 } 21 22 bool IsRangeAt(const MediaSpan& aSpan, uint8_t aStart, uint8_t aEnd, 23 size_t aAt) { 24 size_t length = size_t(aEnd) - size_t(aStart) + 1; 25 if (aAt + length > aSpan.Length()) { 26 return false; 27 } 28 for (size_t i = 0; i < length; i++) { 29 if (aSpan[aAt + i] != uint8_t(aStart + i)) { 30 return false; 31 } 32 } 33 return true; 34 } 35 36 bool IsRange(const MediaSpan& aSpan, uint8_t aStart, uint8_t aEnd) { 37 return IsRangeAt(aSpan, aStart, aEnd, 0); 38 } 39 40 TEST(MediaSpan, AppendToFromSpan) 41 { 42 RefPtr<MediaByteBuffer> buffer1 = makeBuffer(0, 9); 43 MediaSpan span1 = MediaSpan(buffer1); 44 EXPECT_EQ(span1.Length(), size_t(10)); 45 EXPECT_TRUE(IsRange(span1, 0, 9)); 46 47 MediaSpan span2 = span1.From(5); 48 49 EXPECT_EQ(span2.Length(), size_t(5)); 50 EXPECT_TRUE(IsRange(span2, 5, 9)); 51 RefPtr<MediaByteBuffer> buffer2 = makeBuffer(10, 19); 52 EXPECT_EQ(buffer2->Length(), size_t(10)); 53 span2.Append(buffer2); 54 55 // Span2 should be: [5...19] 56 EXPECT_EQ(span2.Length(), size_t(15)); 57 EXPECT_TRUE(IsRange(span2, 5, 19)); 58 59 // Span1 should not be modified by the append to span2. 60 EXPECT_EQ(span1.Length(), size_t(10)); 61 EXPECT_TRUE(IsRange(span1, 0, 9)); 62 } 63 64 TEST(MediaSpan, AppendToToSpan) 65 { 66 RefPtr<MediaByteBuffer> buffer1 = makeBuffer(0, 9); 67 MediaSpan span1 = MediaSpan(buffer1); 68 EXPECT_EQ(span1.Length(), size_t(10)); 69 EXPECT_TRUE(IsRange(span1, 0, 9)); 70 71 MediaSpan span2 = span1.To(5); 72 73 // Span2 should be [0...4] 74 EXPECT_EQ(span2.Length(), size_t(5)); 75 EXPECT_TRUE(IsRange(span2, 0, 4)); 76 RefPtr<MediaByteBuffer> buffer2 = makeBuffer(10, 19); 77 EXPECT_EQ(buffer2->Length(), size_t(10)); 78 span2.Append(buffer2); 79 80 // Span2 should be: [0...4][10...19] 81 EXPECT_EQ(span2.Length(), size_t(15)); 82 EXPECT_TRUE(IsRangeAt(span2, 0, 4, 0)); 83 EXPECT_TRUE(IsRangeAt(span2, 10, 19, 5)); 84 85 // Span1 should not be modified by the append to span2. 86 EXPECT_EQ(span1.Length(), size_t(10)); 87 EXPECT_TRUE(IsRange(span1, 0, 9)); 88 } 89 90 TEST(MediaSpan, RemoveFront) 91 { 92 RefPtr<MediaByteBuffer> buffer1 = makeBuffer(0, 9); 93 MediaSpan span1 = MediaSpan(buffer1); 94 EXPECT_EQ(span1.Length(), size_t(10)); 95 EXPECT_TRUE(IsRange(span1, 0, 9)); 96 97 MediaSpan span2(span1); 98 EXPECT_EQ(span2.Length(), size_t(10)); 99 100 span2.RemoveFront(5); 101 102 // Span2 should now be [5...9] 103 EXPECT_EQ(span2.Length(), size_t(5)); 104 EXPECT_TRUE(IsRange(span2, 5, 9)); 105 106 // Span1 should be unaffected. 107 EXPECT_EQ(span1.Length(), size_t(10)); 108 EXPECT_TRUE(IsRange(span1, 0, 9)); 109 }