blob: 04da7d8922009dd1064582957fef7ed4a2225b02 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "../timestamp_extrapolator.h"
#include "gtest/gtest.h"
constexpr uint64_t k48000HzDualPCMBytesPerSecond = 48000 * sizeof(uint16_t) * 2;
constexpr uint64_t k48000HzDualPCMByteDuration =
ZX_SEC(1) / 48000 / sizeof(uint16_t) / 2;
TEST(TimestampExtrapolator, InformIsSuperceded) {
TimestampExtrapolator extrapolator(ZX_SEC(1), k48000HzDualPCMBytesPerSecond);
extrapolator.Inform(10, 0);
extrapolator.Inform(100, 101);
EXPECT_EQ(*extrapolator.Extrapolate(100), 101u);
}
TEST(TimestampExtrapolator, EmptyWithoutInformation) {
TimestampExtrapolator extrapolator(ZX_SEC(1), k48000HzDualPCMBytesPerSecond);
EXPECT_EQ(extrapolator.Extrapolate(1), std::nullopt);
}
TEST(TimestampExtrapolator, RealTime) {
TimestampExtrapolator extrapolator(ZX_SEC(1), k48000HzDualPCMBytesPerSecond);
extrapolator.Inform(0, 0);
EXPECT_EQ(*extrapolator.Extrapolate(1), k48000HzDualPCMByteDuration);
extrapolator.Inform(0, 200);
EXPECT_EQ(*extrapolator.Extrapolate(1), 200 + k48000HzDualPCMByteDuration);
}
TEST(TimestampExtrapolator, FastTime) {
TimestampExtrapolator extrapolator(ZX_SEC(2), k48000HzDualPCMBytesPerSecond);
extrapolator.Inform(1000, 0);
EXPECT_EQ(*extrapolator.Extrapolate(1001), k48000HzDualPCMByteDuration * 2);
}
TEST(TimestampExtrapolator, SlowTime) {
TimestampExtrapolator extrapolator(ZX_SEC(1) / 2,
k48000HzDualPCMBytesPerSecond);
extrapolator.Inform(0, 0);
EXPECT_EQ(*extrapolator.Extrapolate(2), k48000HzDualPCMByteDuration);
}
TEST(TimestampExtrapolator, TimestampIsConsumed) {
TimestampExtrapolator extrapolator(ZX_SEC(1), k48000HzDualPCMBytesPerSecond);
extrapolator.Inform(0, 0);
EXPECT_TRUE(extrapolator.Extrapolate(0).has_value());
EXPECT_FALSE(extrapolator.Extrapolate(1).has_value());
}
TEST(TimestampExtrapolator, TimestampOnlyCarriesWithoutTimebase) {
TimestampExtrapolator extrapolator;
extrapolator.Inform(100, 234);
EXPECT_TRUE(extrapolator.has_information());
EXPECT_FALSE(extrapolator.Extrapolate(101).has_value());
// Should not have value because all extrapolation attempts are consuming.
EXPECT_FALSE(extrapolator.Extrapolate(100).has_value());
extrapolator.Inform(100, 234);
EXPECT_EQ(*extrapolator.Extrapolate(100), 234u);
}