/*
 * 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/static_properties_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 {
namespace {
typedef BindingsTestBase StaticPropertiesBindingsTest;
}  // namespace
}  // namespace

TEST_F(StaticPropertiesBindingsTest, StaticFunction) {
  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              StaticFunction());
  EXPECT_TRUE(
      EvaluateScript("StaticPropertiesInterface.staticFunction();", NULL));
}

TEST_F(StaticPropertiesBindingsTest,
       StaticOverloadedOperationByNumberOfArguments) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              StaticFunction());
  EXPECT_TRUE(
      EvaluateScript("StaticPropertiesInterface.staticFunction();", NULL));

  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              StaticFunction(_, _, A<int32_t>()));
  EXPECT_TRUE(EvaluateScript(
      "StaticPropertiesInterface.staticFunction(6, 8, 9);", NULL));

  EXPECT_CALL(
      StaticPropertiesInterface::static_methods_mock.Get(),
      StaticFunction(_, _, A<const scoped_refptr<ArbitraryInterface>&>()));
  EXPECT_TRUE(
      EvaluateScript("StaticPropertiesInterface.staticFunction(6, 8, new "
                     "ArbitraryInterface());",
                     NULL));
}

TEST_F(StaticPropertiesBindingsTest, StaticOverloadedOperationByType) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              StaticFunction(A<int32_t>()));
  EXPECT_TRUE(
      EvaluateScript("StaticPropertiesInterface.staticFunction(4);", NULL));

  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              StaticFunction(A<const std::string&>()));
  EXPECT_TRUE(EvaluateScript(
      "StaticPropertiesInterface.staticFunction(\"foo\");", NULL));
}

TEST_F(StaticPropertiesBindingsTest, GetStaticAttribute) {
  std::string result;
  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              static_attribute()).WillOnce(Return("test_string"));
  EXPECT_TRUE(
      EvaluateScript("StaticPropertiesInterface.staticAttribute;", &result));
  EXPECT_STREQ("test_string", result.c_str());
}

TEST_F(StaticPropertiesBindingsTest, SetStaticAttribute) {
  EXPECT_CALL(StaticPropertiesInterface::static_methods_mock.Get(),
              set_static_attribute(std::string("test_string")));
  EXPECT_TRUE(EvaluateScript(
      "StaticPropertiesInterface.staticAttribute = \"test_string\";", NULL));
}

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