// Copyright 2017 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 "starboard/accessibility.h"
#include "starboard/memory.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace starboard {
namespace nplb {
namespace {

TEST(SbAccessibilityTest, CanCallGetTextToSpeechSettings) {
  SbAccessibilityTextToSpeechSettings settings = {0};
  EXPECT_TRUE(SbAccessibilityGetTextToSpeechSettings(&settings));
}

TEST(SbAccessibilityTest, CallTextToSpeechWithInvalidArgument) {
  // |settings| should be zero-initialized.
  SbAccessibilityTextToSpeechSettings settings = {1};
  EXPECT_FALSE(SbAccessibilityGetTextToSpeechSettings(&settings));

  // Argument should not be NULL.
  EXPECT_FALSE(SbAccessibilityGetTextToSpeechSettings(NULL));
}

TEST(SbAccessibilityTest, CanCallGetDisplaySettings) {
  SbAccessibilityDisplaySettings settings = {0};
  EXPECT_TRUE(SbAccessibilityGetDisplaySettings(&settings));
}

TEST(SbAccessibilityTest, CallDisplayWithInvalidArgument) {
  // |settings| should be zero-initialized.
  SbAccessibilityDisplaySettings settings = {1};
  EXPECT_FALSE(SbAccessibilityGetDisplaySettings(&settings));

  // Argument should not be NULL.
  EXPECT_FALSE(SbAccessibilityGetDisplaySettings(NULL));
}

TEST(SbAccessibilityTest, CallGetCaptionSettingsWithInvalidArgument) {
  // |settings| should be zero-initialized.
  const int kInvalidValue = 0xFE;
  SbAccessibilityCaptionSettings settings;
  memset(&settings, kInvalidValue, sizeof(settings));
  EXPECT_FALSE(SbAccessibilityGetCaptionSettings(&settings));

  // Argument should not be NULL.
  EXPECT_FALSE(SbAccessibilityGetCaptionSettings(NULL));
}

TEST(SbAccessibilityTest, GetCaptionSettingsReturnIsValid) {
  // |settings| should be zero-initialized.
  SbAccessibilityCaptionSettings settings;
  const int kValidInitialValue = 0;
  memset(&settings, kValidInitialValue, sizeof(settings));
  EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings));

  if (settings.background_color_state !=
      kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.background_color, kSbAccessibilityCaptionColorBlue);
    EXPECT_LE(settings.background_color, kSbAccessibilityCaptionColorYellow);
  }

  if (settings.background_opacity_state !=
      kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.background_opacity,
              kSbAccessibilityCaptionOpacityPercentage0);
    EXPECT_LE(settings.background_opacity,
              kSbAccessibilityCaptionOpacityPercentage100);
  }

  if (settings.character_edge_style_state !=
      kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.character_edge_style,
              kSbAccessibilityCaptionCharacterEdgeStyleNone);
    EXPECT_LE(settings.character_edge_style,
              kSbAccessibilityCaptionCharacterEdgeStyleDropShadow);
  }

  if (settings.font_color_state != kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.font_color, kSbAccessibilityCaptionColorBlue);
    EXPECT_LE(settings.font_color, kSbAccessibilityCaptionColorYellow);
  }

  if (settings.font_family_state != kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.font_family, kSbAccessibilityCaptionFontFamilyCasual);
    EXPECT_LE(settings.font_family,
              kSbAccessibilityCaptionFontFamilySmallCapitals);
  }

  if (settings.font_opacity_state != kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.font_opacity, kSbAccessibilityCaptionOpacityPercentage0);
    EXPECT_LE(settings.font_opacity,
              kSbAccessibilityCaptionOpacityPercentage100);
  }

  if (settings.font_size_state != kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.font_size, kSbAccessibilityCaptionFontSizePercentage25);
    EXPECT_LE(settings.font_size, kSbAccessibilityCaptionFontSizePercentage300);
  }

  if (settings.window_color_state != kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.window_color, kSbAccessibilityCaptionColorBlue);
    EXPECT_LE(settings.window_color, kSbAccessibilityCaptionColorYellow);
  }

  if (settings.window_opacity_state !=
      kSbAccessibilityCaptionStateUnsupported) {
    EXPECT_GE(settings.window_opacity,
              kSbAccessibilityCaptionOpacityPercentage0);
    EXPECT_LE(settings.window_opacity,
              kSbAccessibilityCaptionOpacityPercentage100);
  }
}

TEST(SbAccessibilityTest, CallSetCaptionsEnabled) {
  SbAccessibilityCaptionSettings settings;
  const int kValidInitialValue = 0;
  memset(&settings, kValidInitialValue, sizeof(settings));
  EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings));

  if (settings.supports_is_enabled && settings.supports_set_enabled) {
    // Try changing the enabled state.
    EXPECT_TRUE(SbAccessibilitySetCaptionsEnabled(!settings.is_enabled));

    SbAccessibilityCaptionSettings settings2;
    memset(&settings2, kValidInitialValue, sizeof(settings2));
    EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings2));
    EXPECT_NE(settings.is_enabled, settings2.is_enabled);

    // Reset the enabled state so the unit test doesn't propagate a new setting.
    EXPECT_TRUE(SbAccessibilitySetCaptionsEnabled(settings.is_enabled));

    SbAccessibilityCaptionSettings settings3;
    memset(&settings3, kValidInitialValue, sizeof(settings3));
    EXPECT_TRUE(SbAccessibilityGetCaptionSettings(&settings3));
    EXPECT_EQ(settings.is_enabled, settings3.is_enabled);
  }
}

}  // namespace
}  // namespace nplb
}  // namespace starboard
