/*
 * 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/arbitrary_interface.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/operations_test_interface.h"

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

using ::testing::_;
using ::testing::A;
using ::testing::InSequence;
using ::testing::Return;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef InterfaceBindingsTest<OperationsTestInterface> OperationsBindingsTest;
}  // namespace

TEST_F(OperationsBindingsTest, OperationIsPrototypeProperty) {
  std::string result;
  EXPECT_TRUE(
      EvaluateScript("test.hasOwnProperty(\"voidFunctionNoArgs\");", &result));
  EXPECT_STREQ("false", result.c_str());

  EXPECT_TRUE(EvaluateScript(
      "Object.getPrototypeOf(test).hasOwnProperty(\"voidFunctionNoArgs\");",
      &result));
  EXPECT_STREQ("true", result.c_str());
}

TEST_F(OperationsBindingsTest, LengthPropertyIsSet) {
  std::string result;
  EXPECT_TRUE(EvaluateScript("test.voidFunctionNoArgs.length;", &result));
  EXPECT_STREQ("0", result.c_str());

  EXPECT_TRUE(EvaluateScript("test.voidFunctionStringArg.length;", &result));
  EXPECT_STREQ("1", result.c_str());
}

TEST_F(OperationsBindingsTest, VoidFunction) {
  EXPECT_CALL(test_mock(), VoidFunctionNoArgs());

  EXPECT_TRUE(EvaluateScript("test.voidFunctionNoArgs();", NULL));
}

TEST_F(OperationsBindingsTest, LongFunction) {
  EXPECT_CALL(test_mock(), LongFunctionNoArgs()).WillOnce(Return(5));

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

TEST_F(OperationsBindingsTest, StringFunction) {
  EXPECT_CALL(test_mock(), StringFunctionNoArgs())
      .WillOnce(Return("mock_value"));

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

TEST_F(OperationsBindingsTest, ObjectFunction) {
  scoped_refptr<ArbitraryInterface> object = new ArbitraryInterface();

  EXPECT_CALL(test_mock(), ObjectFunctionNoArgs()).WillOnce(Return(object));
  EXPECT_TRUE(
      EvaluateScript("var object = test.objectFunctionNoArgs();", NULL));

  EXPECT_CALL(*object, ArbitraryFunction());
  EXPECT_TRUE(EvaluateScript("object.arbitraryFunction();", NULL));
}

TEST_F(OperationsBindingsTest, VoidFunctionStringArg) {
  EXPECT_CALL(test_mock(), VoidFunctionStringArg("mock_value"));
  EXPECT_TRUE(
      EvaluateScript("test.voidFunctionStringArg(\"mock_value\");", NULL));
}

TEST_F(OperationsBindingsTest, VoidFunctionLongArg) {
  EXPECT_CALL(test_mock(), VoidFunctionLongArg(42));
  EXPECT_TRUE(EvaluateScript("test.voidFunctionLongArg(42);", NULL));
}

TEST_F(OperationsBindingsTest, VoidFunctionObjectArg) {
  scoped_refptr<ArbitraryInterface> object = new ArbitraryInterface();

  EXPECT_CALL(test_mock(), ObjectFunctionNoArgs()).WillOnce(Return(object));
  EXPECT_TRUE(
      EvaluateScript("var object = test.objectFunctionNoArgs();", NULL));

  EXPECT_CALL(test_mock(), VoidFunctionObjectArg(object));
  EXPECT_TRUE(EvaluateScript("test.voidFunctionObjectArg(object);", NULL));
}

TEST_F(OperationsBindingsTest, OptionalArguments) {
  EXPECT_CALL(test_mock(), OptionalArguments(4));
  EXPECT_TRUE(EvaluateScript("test.optionalArguments(4);", NULL));

  EXPECT_CALL(test_mock(), OptionalArguments(4, 1));
  EXPECT_TRUE(EvaluateScript("test.optionalArguments(4, 1);", NULL));

  EXPECT_CALL(test_mock(), OptionalArguments(4, 1, -6));
  EXPECT_TRUE(EvaluateScript("test.optionalArguments(4, 1, -6);", NULL));

  EXPECT_CALL(test_mock(), OptionalArgumentWithDefault(2.718));
  EXPECT_TRUE(EvaluateScript("test.optionalArgumentWithDefault();", NULL));

  EXPECT_CALL(test_mock(), OptionalArgumentWithDefault(3.14));
  EXPECT_TRUE(EvaluateScript("test.optionalArgumentWithDefault(3.14);", NULL));
}

TEST_F(OperationsBindingsTest, OverloadedOperationByNumberOfArguments) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), OverloadedFunction());
  EXPECT_TRUE(EvaluateScript("test.overloadedFunction();", NULL));

  EXPECT_CALL(test_mock(), OverloadedFunction(_, _, A<int32_t>()));
  EXPECT_TRUE(EvaluateScript("test.overloadedFunction(6, 8, 9);", NULL));

  EXPECT_CALL(
      test_mock(),
      OverloadedFunction(_, _, A<const scoped_refptr<ArbitraryInterface>&>()));
  EXPECT_TRUE(EvaluateScript(
      "test.overloadedFunction(6, 8, new ArbitraryInterface());", NULL));
}

TEST_F(OperationsBindingsTest, OverloadedOperationInvalidNumberOfArguments) {
  InSequence in_sequence_dummy;

  EXPECT_TRUE(EvaluateScript(
      "var error = null;"
      "try { test.overloadedFunction(1, 2); }"
      "catch(e) { error = e; }",
      NULL));
  std::string result;
  EXPECT_TRUE(EvaluateScript(
      "Object.getPrototypeOf(error) === TypeError.prototype;", &result));
  EXPECT_STREQ("true", result.c_str());
}

TEST_F(OperationsBindingsTest, OverloadedOperationByType) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), OverloadedFunction(A<int32_t>()));
  EXPECT_TRUE(EvaluateScript("test.overloadedFunction(4);", NULL));

  EXPECT_CALL(test_mock(), OverloadedFunction(A<const std::string&>()));
  EXPECT_TRUE(EvaluateScript("test.overloadedFunction(\"foo\");", NULL));
}

TEST_F(OperationsBindingsTest, StaticMethodNotPartOfOverloadSet) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(OperationsTestInterface::static_methods_mock.Get(),
              OverloadedFunction(_));
  EXPECT_TRUE(
      EvaluateScript("OperationsTestInterface.overloadedFunction(6.1);", NULL));

  EXPECT_CALL(OperationsTestInterface::static_methods_mock.Get(),
              OverloadedFunction(_, _));
  EXPECT_TRUE(EvaluateScript(
      "OperationsTestInterface.overloadedFunction(4, 8);", NULL));
}

TEST_F(OperationsBindingsTest, OverloadedOperationByOptionality) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), OverloadedNullable(A<int32_t>()));
  EXPECT_TRUE(EvaluateScript("test.overloadedNullable(5);", NULL));

  EXPECT_CALL(test_mock(), OverloadedNullable(base::optional<bool>()));
  EXPECT_TRUE(EvaluateScript("test.overloadedNullable(null);", NULL));
}

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