blob: 77a7aa15f532b6593d7d70cd53871075cdc2dbc4 [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 <gtest/gtest.h>
#include "../timestamp_extrapolator.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);
}