// Copyright 2023 The Chromium 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 "quiche/quic/moqt/moqt_subscribe_windows.h"

#include <cstdint>
#include <optional>

#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/platform/api/quic_expect_bug.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/common/platform/api/quiche_export.h"

namespace moqt {

namespace test {

class QUICHE_EXPORT SubscribeWindowTest : public quic::test::QuicTest {
 public:
  SubscribeWindowTest() {}

  const uint64_t subscribe_id_ = 2;
  const Location start_{4, 0};
  const uint64_t end_ = 5;
};

TEST_F(SubscribeWindowTest, Queries) {
  SubscribeWindow window(start_, end_);
  EXPECT_TRUE(window.InWindow(Location(4, 0)));
  EXPECT_TRUE(window.InWindow(Location(5, UINT64_MAX)));
  EXPECT_FALSE(window.InWindow(Location(6, 0)));
  EXPECT_FALSE(window.InWindow(Location(3, 12)));
}

TEST_F(SubscribeWindowTest, AddQueryRemoveStreamIdSubgroup) {
  SendStreamMap stream_map(MoqtForwardingPreference::kSubgroup);
  stream_map.AddStream(Location{4, 0}, 2);
  EXPECT_EQ(stream_map.GetStreamForSequence(Location(5, 0)), std::nullopt);
  stream_map.AddStream(Location{5, 2}, 6);
  EXPECT_QUIC_BUG(stream_map.AddStream(Location{5, 3}, 6),
                  "Stream already added");
  EXPECT_EQ(stream_map.GetStreamForSequence(Location(4, 1)), 2);
  EXPECT_EQ(stream_map.GetStreamForSequence(Location(5, 0)), 6);
  stream_map.RemoveStream(Location{5, 1}, 6);
  EXPECT_EQ(stream_map.GetStreamForSequence(Location(5, 2)), std::nullopt);
}

TEST_F(SubscribeWindowTest, UpdateStartEnd) {
  SubscribeWindow window(start_, end_);
  EXPECT_TRUE(window.TruncateStart(start_.next()));
  EXPECT_TRUE(window.TruncateEnd(end_ - 1));
  EXPECT_FALSE(window.InWindow(start_));
  EXPECT_FALSE(window.InWindow(Location(end_, 0)));
  // Widens start_ again.
  EXPECT_FALSE(window.TruncateStart(start_));
  // Widens end_ again.
  EXPECT_FALSE(window.TruncateEnd(end_));
  EXPECT_TRUE(window.TruncateEnd(Location(end_ - 1, 10)));
  EXPECT_TRUE(window.InWindow(Location(end_ - 1, 10)));
  EXPECT_FALSE(window.InWindow(Location(end_ - 1, 11)));
}

}  // namespace test

}  // namespace moqt
