// Copyright 2022 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/dom/media_settings.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace dom {
namespace {

TEST(MediaSettingsImplTest, Empty) {
  MediaSettingsImpl impl;

  EXPECT_FALSE(impl.GetSourceBufferEvictExtraInBytes());
  EXPECT_FALSE(impl.GetMinimumProcessorCountToOffloadAlgorithm());
  EXPECT_FALSE(impl.IsAsynchronousReductionEnabled());
  EXPECT_FALSE(impl.IsAvoidCopyingArrayBufferEnabled());
  EXPECT_FALSE(impl.IsCallingEndedWhenClosedEnabled());
  EXPECT_FALSE(impl.GetMaxSizeForImmediateJob());
  EXPECT_FALSE(impl.GetMaxSourceBufferAppendSizeInBytes());
  EXPECT_FALSE(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds());
  EXPECT_FALSE(impl.IsPaintingVideoBackgroundToBlack());
}

TEST(MediaSettingsImplTest, SunnyDay) {
  MediaSettingsImpl impl;

  ASSERT_TRUE(impl.Set("MediaSource.SourceBufferEvictExtraInBytes", 100));
  ASSERT_TRUE(
      impl.Set("MediaSource.MinimumProcessorCountToOffloadAlgorithm", 101));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAsynchronousReduction", 1));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAvoidCopyingArrayBuffer", 1));
  ASSERT_TRUE(impl.Set("MediaSource.EnableCallingEndedWhenClosed", 1));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSizeForImmediateJob", 103));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 100000));
  ASSERT_TRUE(
      impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 100001));
  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 1));

  EXPECT_EQ(impl.GetSourceBufferEvictExtraInBytes().value(), 100);
  EXPECT_EQ(impl.GetMinimumProcessorCountToOffloadAlgorithm().value(), 101);
  EXPECT_TRUE(impl.IsAsynchronousReductionEnabled().value());
  EXPECT_TRUE(impl.IsAvoidCopyingArrayBufferEnabled().value());
  EXPECT_TRUE(impl.IsCallingEndedWhenClosedEnabled().value());
  EXPECT_EQ(impl.GetMaxSizeForImmediateJob().value(), 103);
  EXPECT_EQ(impl.GetMaxSourceBufferAppendSizeInBytes().value(), 100000);
  EXPECT_EQ(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds().value(),
            100001);
  EXPECT_TRUE(impl.IsPaintingVideoBackgroundToBlack().value());
}

TEST(MediaSettingsImplTest, RainyDay) {
  MediaSettingsImpl impl;

  ASSERT_FALSE(impl.Set("MediaSource.SourceBufferEvictExtraInBytes", -100));
  ASSERT_FALSE(
      impl.Set("MediaSource.MinimumProcessorCountToOffloadAlgorithm", -101));
  ASSERT_FALSE(impl.Set("MediaSource.EnableAsynchronousReduction", 2));
  ASSERT_FALSE(impl.Set("MediaSource.EnableAvoidCopyingArrayBuffer", 2));
  ASSERT_FALSE(impl.Set("MediaSource.EnableCallingEndedWhenClosed", 2));
  ASSERT_FALSE(impl.Set("MediaSource.MaxSizeForImmediateJob", -103));
  ASSERT_FALSE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 0));
  ASSERT_FALSE(
      impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 0));
  ASSERT_FALSE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 2));

  EXPECT_FALSE(impl.GetSourceBufferEvictExtraInBytes());
  EXPECT_FALSE(impl.GetMinimumProcessorCountToOffloadAlgorithm());
  EXPECT_FALSE(impl.IsAsynchronousReductionEnabled());
  EXPECT_FALSE(impl.IsAvoidCopyingArrayBufferEnabled());
  EXPECT_FALSE(impl.IsCallingEndedWhenClosedEnabled());
  EXPECT_FALSE(impl.GetMaxSizeForImmediateJob());
  EXPECT_FALSE(impl.GetMaxSourceBufferAppendSizeInBytes());
  EXPECT_FALSE(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds());
  EXPECT_FALSE(impl.IsPaintingVideoBackgroundToBlack());
}

TEST(MediaSettingsImplTest, ZeroValuesWork) {
  MediaSettingsImpl impl;

  ASSERT_TRUE(impl.Set("MediaSource.SourceBufferEvictExtraInBytes", 0));
  ASSERT_TRUE(
      impl.Set("MediaSource.MinimumProcessorCountToOffloadAlgorithm", 0));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAsynchronousReduction", 0));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAvoidCopyingArrayBuffer", 0));
  ASSERT_TRUE(impl.Set("MediaSource.EnableCallingEndedWhenClosed", 0));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSizeForImmediateJob", 0));
  // O is an invalid value for "MediaSource.MaxSourceBufferAppendSizeInBytes".
  // O is an invalid value for
  // "MediaElement.TimeupdateEventIntervalInMilliseconds".
  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 0));

  EXPECT_EQ(impl.GetSourceBufferEvictExtraInBytes().value(), 0);
  EXPECT_EQ(impl.GetMinimumProcessorCountToOffloadAlgorithm().value(), 0);
  EXPECT_FALSE(impl.IsAsynchronousReductionEnabled().value());
  EXPECT_FALSE(impl.IsAvoidCopyingArrayBufferEnabled().value());
  EXPECT_FALSE(impl.IsCallingEndedWhenClosedEnabled().value());
  EXPECT_EQ(impl.GetMaxSizeForImmediateJob().value(), 0);
  EXPECT_FALSE(impl.IsPaintingVideoBackgroundToBlack().value());
}

TEST(MediaSettingsImplTest, Updatable) {
  MediaSettingsImpl impl;

  ASSERT_TRUE(impl.Set("MediaSource.SourceBufferEvictExtraInBytes", 0));
  ASSERT_TRUE(
      impl.Set("MediaSource.MinimumProcessorCountToOffloadAlgorithm", 0));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAsynchronousReduction", 0));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAvoidCopyingArrayBuffer", 0));
  ASSERT_TRUE(impl.Set("MediaSource.EnableCallingEndedWhenClosed", 0));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSizeForImmediateJob", 0));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 1));
  ASSERT_TRUE(
      impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 1));
  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 0));

  ASSERT_TRUE(impl.Set("MediaSource.SourceBufferEvictExtraInBytes", 1));
  ASSERT_TRUE(
      impl.Set("MediaSource.MinimumProcessorCountToOffloadAlgorithm", 1));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAsynchronousReduction", 1));
  ASSERT_TRUE(impl.Set("MediaSource.EnableAvoidCopyingArrayBuffer", 1));
  ASSERT_TRUE(impl.Set("MediaSource.EnableCallingEndedWhenClosed", 1));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSizeForImmediateJob", 1));
  ASSERT_TRUE(impl.Set("MediaSource.MaxSourceBufferAppendSizeInBytes", 2));
  ASSERT_TRUE(
      impl.Set("MediaElement.TimeupdateEventIntervalInMilliseconds", 2));
  ASSERT_TRUE(impl.Set("MediaElement.PaintingVideoBackgroundToBlack", 1));

  EXPECT_EQ(impl.GetSourceBufferEvictExtraInBytes().value(), 1);
  EXPECT_EQ(impl.GetMinimumProcessorCountToOffloadAlgorithm().value(), 1);
  EXPECT_TRUE(impl.IsAsynchronousReductionEnabled().value());
  EXPECT_TRUE(impl.IsAvoidCopyingArrayBufferEnabled().value());
  EXPECT_TRUE(impl.IsCallingEndedWhenClosedEnabled().value());
  EXPECT_EQ(impl.GetMaxSizeForImmediateJob().value(), 1);
  EXPECT_EQ(impl.GetMaxSourceBufferAppendSizeInBytes().value(), 2);
  EXPECT_EQ(impl.GetMediaElementTimeupdateEventIntervalInMilliseconds().value(),
            2);
  EXPECT_TRUE(impl.IsPaintingVideoBackgroundToBlack().value());
}

TEST(MediaSettingsImplTest, InvalidSettingNames) {
  MediaSettingsImpl impl;

  ASSERT_FALSE(impl.Set("MediaSource.Invalid", 0));
  ASSERT_FALSE(impl.Set("MediaElement.Invalid", 1));
  ASSERT_FALSE(impl.Set("Invalid.SourceBufferEvictExtraInBytes", 0));
  ASSERT_FALSE(impl.Set("Invalid.TimeupdateEventIntervalInMilliseconds", 1));
}

}  // namespace
}  // namespace dom
}  // namespace cobalt
