// Copyright 2015 Google Inc. 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/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/dom_string_test_interface.h"

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

using ::testing::Return;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef InterfaceBindingsTest<DOMStringTestInterface> DOMStringBindingsTest;
}  // namespace

TEST_F(DOMStringBindingsTest, GetProperty) {
  EXPECT_CALL(test_mock(), property()).WillOnce(Return("mock_value"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property;", &result));
  EXPECT_STREQ("mock_value", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetProperty) {
  EXPECT_CALL(test_mock(), set_property(std::string("mock_value")));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = \"mock_value\";", &result));
  EXPECT_STREQ("mock_value", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetPropertyWithJapanese) {
  EXPECT_CALL(test_mock(), set_property(std::string("かわいいです")));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = \"かわいいです\";", &result));
  EXPECT_STREQ("かわいいです", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetPropertyWithChinese) {
  EXPECT_CALL(test_mock(), set_property(std::string("的")));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = \"\xe7\x9a\x84\";", &result));
  EXPECT_STREQ("的", result.c_str());
}

TEST_F(DOMStringBindingsTest, GetReadOnlyProperty) {
  EXPECT_CALL(test_mock(), read_only_property()).WillOnce(Return("mock_value"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.readOnlyProperty;", &result));
  EXPECT_STREQ("mock_value", result.c_str());
}

TEST_F(DOMStringBindingsTest, GetReadOnlyPropertyWithKorean) {
  EXPECT_CALL(test_mock(), read_only_property()).WillOnce(Return("대박"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.readOnlyProperty;", &result));
  EXPECT_STREQ("대박", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetReadOnlyProperty) {
  // Script executes with no error, but interface is not called.
  EXPECT_TRUE(EvaluateScript("test.readOnlyProperty = \"foo\";", NULL));
}

TEST_F(DOMStringBindingsTest, GetReadOnlyTokenProperty) {
  EXPECT_CALL(test_mock(), read_only_token_property())
      .WillOnce(Return(base::Token("mock_value")));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.readOnlyTokenProperty;", &result));
  EXPECT_STREQ("mock_value", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetNull) {
  EXPECT_CALL(test_mock(), set_property("null"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = null;", &result));
  EXPECT_STREQ("null", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetUndefined) {
  EXPECT_CALL(test_mock(), set_property("undefined"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = undefined;", &result));
  EXPECT_STREQ("undefined", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetBoolean) {
  EXPECT_CALL(test_mock(), set_property("true"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = true;", &result));
  EXPECT_STREQ("true", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetNaN) {
  EXPECT_CALL(test_mock(), set_property("NaN"));

  EXPECT_TRUE(EvaluateScript("test.property = NaN;"));
}

TEST_F(DOMStringBindingsTest, SetPositiveZero) {
  EXPECT_CALL(test_mock(), set_property("0"));

  EXPECT_TRUE(EvaluateScript("test.property = +0;"));
}

TEST_F(DOMStringBindingsTest, SetNegativeZero) {
  EXPECT_CALL(test_mock(), set_property("0"));

  EXPECT_TRUE(EvaluateScript("test.property = -0;"));
}

TEST_F(DOMStringBindingsTest, SetNumber) {
  EXPECT_CALL(test_mock(), set_property("50"));

  std::string result;
  EXPECT_TRUE(EvaluateScript("test.property = 50;", &result));
  EXPECT_STREQ("50", result.c_str());
}

TEST_F(DOMStringBindingsTest, SetInfinity) {
  EXPECT_CALL(test_mock(), set_property("Infinity"));

  EXPECT_TRUE(EvaluateScript("test.property = Infinity;"));
}

TEST_F(DOMStringBindingsTest, SetNegativeInfinity) {
  EXPECT_CALL(test_mock(), set_property("-Infinity"));

  EXPECT_TRUE(EvaluateScript("test.property = -Infinity;"));
}

TEST_F(DOMStringBindingsTest, SetNullAsEmptyString) {
  EXPECT_CALL(test_mock(), set_null_is_empty_property(""));
  EXPECT_TRUE(EvaluateScript("test.nullIsEmptyProperty = null;", NULL));
}

TEST_F(DOMStringBindingsTest, SetUndefinedAsEmptyString) {
  EXPECT_CALL(test_mock(), set_undefined_is_empty_property(""));
  EXPECT_TRUE(
      EvaluateScript("test.undefinedIsEmptyProperty = undefined;", NULL));

  EXPECT_CALL(test_mock(), set_nullable_undefined_is_empty_property(
                               base::optional<std::string>("")));
  EXPECT_TRUE(EvaluateScript(
      "test.nullableUndefinedIsEmptyProperty = undefined;", NULL));
}

}  // namespace testing
}  // namespace bindings
}  // namespace cobalt
