// Copyright 2021 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 "media/formats/webm/webm_projection_parser.h"

#include "media/base/mock_media_log.h"
#include "media/formats/webm/webm_constants.h"
#include "media/formats/webm/webm_video_client.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::StrictMock;

namespace media {

// Matchers for verifying common media log entry strings.
MATCHER(UnexpectedProjectionId, "") {
  return CONTAINS_STRING(arg, "Unexpected id in Projection: 0x");
}

MATCHER(UnexpectedProjectionType, "") {
  return CONTAINS_STRING(arg, "Unexpected value for ProjectionType: 0x");
}

MATCHER(UnexpectedMultipleValuesForProjectionType, "") {
  return CONTAINS_STRING(arg, "Multiple values for id: 0x7671");
}

MATCHER(UnexpectedMultipleValuesForYaw, "") {
  return CONTAINS_STRING(arg, "Multiple values for id: 0x7673");
}

MATCHER(UnexpectedMultipleValuesForPitch, "") {
  return CONTAINS_STRING(arg, "Multiple values for id: 0x7674");
}

MATCHER(UnexpectedMultipleValuesForRoll, "") {
  return CONTAINS_STRING(arg, "Multiple values for id: 0x7675");
}

MATCHER(UnexpectedProjectionYaw, "") {
  return CONTAINS_STRING(arg, "Value not within valid range. id: 0x7673 val:");
}

MATCHER(UnexpectedProjectionPitch, "") {
  return CONTAINS_STRING(arg, "Value not within valid range. id: 0x7674 val:");
}

MATCHER(UnexpectedProjectionRoll, "") {
  return CONTAINS_STRING(arg, "Value not within valid range. id: 0x7675 val:");
}

MATCHER(MissingProjectionType, "") {
  return CONTAINS_STRING(
      arg, "Projection element is incomplete; ProjectionType required.");
}

MATCHER(MissingProjectionPoseYaw, "") {
  return CONTAINS_STRING(
      arg, "Projection element is incomplete; ProjectionPoseYaw required.");
}

MATCHER(MissingProjectionPosePitch, "") {
  return CONTAINS_STRING(
      arg, "Projection element is incomplete; ProjectionPosePitch required.");
}

MATCHER(MissingProjectionPoseRoll, "") {
  return CONTAINS_STRING(
      arg, "Projection element is incomplete; ProjectionPoseRoll required.");
}

class WebMProjectionParserTest : public testing::Test {
 public:
  WebMProjectionParserTest()
      : projection_parser_(&media_log_), webm_video_client_(&media_log_) {}

  bool OnUInt(int id, int64_t val) {
    return projection_parser_.OnUInt(id, val);
  }

  bool OnFloat(int id, double val) {
    return projection_parser_.OnFloat(id, val);
  }

  WebMParserClient* VideoClientOnListStart(int id) {
    return webm_video_client_.OnListStart(id);
  }

  void VideoClientOnListEnd(int id) { webm_video_client_.OnListEnd(id); }

  bool VideoClientOnUInt(int id, int64_t val) {
    return webm_video_client_.OnUInt(id, val);
  }

  StrictMock<MockMediaLog> media_log_;
  WebMProjectionParser projection_parser_;
  WebMVideoClient webm_video_client_;
};

TEST_F(WebMProjectionParserTest, UnexpectedInt) {
  EXPECT_MEDIA_LOG(UnexpectedProjectionId());
  OnUInt(kWebMIdPrimaryBChromaticityX, 1);
}

TEST_F(WebMProjectionParserTest, UnexpectedFloat) {
  EXPECT_MEDIA_LOG(UnexpectedProjectionId());
  OnFloat(kWebMIdPrimaryBChromaticityX, 0);
}

TEST_F(WebMProjectionParserTest, InvalidProjectionType) {
  EXPECT_MEDIA_LOG(UnexpectedProjectionType());
  OnUInt(kWebMIdProjectionType, 4);
}

TEST_F(WebMProjectionParserTest, MultipleProjectionType) {
  OnUInt(kWebMIdProjectionType, 1);
  EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForProjectionType());
  OnUInt(kWebMIdProjectionType, 1);
}

TEST_F(WebMProjectionParserTest, InvalidProjectionYaw) {
  EXPECT_MEDIA_LOG(UnexpectedProjectionYaw());
  OnFloat(kWebMIdProjectionPoseYaw, 181);
}

TEST_F(WebMProjectionParserTest, InvalidProjectionPitch) {
  EXPECT_MEDIA_LOG(UnexpectedProjectionPitch());
  OnFloat(kWebMIdProjectionPosePitch, 91);
}

TEST_F(WebMProjectionParserTest, InvalidProjectionRoll) {
  EXPECT_MEDIA_LOG(UnexpectedProjectionRoll());
  OnFloat(kWebMIdProjectionPoseRoll, 181);
}

TEST_F(WebMProjectionParserTest, MultipleProjectionYaw) {
  OnFloat(kWebMIdProjectionPoseYaw, 180);
  EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForYaw());
  OnFloat(kWebMIdProjectionPoseYaw, 180);
}

TEST_F(WebMProjectionParserTest, MultipleProjectionPitch) {
  OnFloat(kWebMIdProjectionPosePitch, 90);
  EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForPitch());
  OnFloat(kWebMIdProjectionPosePitch, 90);
}

TEST_F(WebMProjectionParserTest, MultipleProjectionRoll) {
  OnFloat(kWebMIdProjectionPoseRoll, 180);
  EXPECT_MEDIA_LOG(UnexpectedMultipleValuesForRoll());
  OnFloat(kWebMIdProjectionPoseRoll, 180);
}

TEST_F(WebMProjectionParserTest, MissingProjectionType) {
  VideoClientOnListStart(kWebMIdProjection);
  EXPECT_MEDIA_LOG(MissingProjectionType());
  VideoClientOnListEnd(kWebMIdProjection);
}

TEST_F(WebMProjectionParserTest, MissingProjectionPosYaw) {
  auto* parser = VideoClientOnListStart(kWebMIdProjection);
  parser->OnUInt(kWebMIdProjectionType, 1);
  EXPECT_MEDIA_LOG(MissingProjectionPoseYaw());
  VideoClientOnListEnd(kWebMIdProjection);
}

TEST_F(WebMProjectionParserTest, MissingProjectionPosePitch) {
  auto* parser = VideoClientOnListStart(kWebMIdProjection);
  parser->OnUInt(kWebMIdProjectionType, 1);
  parser->OnFloat(kWebMIdProjectionPoseYaw, 90);
  EXPECT_MEDIA_LOG(MissingProjectionPosePitch());
  VideoClientOnListEnd(kWebMIdProjection);
}

TEST_F(WebMProjectionParserTest, MissingProjectionPoseRoll) {
  auto* parser = VideoClientOnListStart(kWebMIdProjection);
  parser->OnUInt(kWebMIdProjectionType, 1);
  parser->OnFloat(kWebMIdProjectionPoseYaw, 90);
  parser->OnFloat(kWebMIdProjectionPosePitch, 90);
  EXPECT_MEDIA_LOG(MissingProjectionPoseRoll());
  VideoClientOnListEnd(kWebMIdProjection);
}

}  // namespace media
