/*
 * 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/nullable_types_test_interface.h"

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

using ::testing::InSequence;
using ::testing::Return;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef InterfaceBindingsTest<NullableTypesTestInterface>
    NullableTypesBindingsTest;
}  // namespace

TEST_F(NullableTypesBindingsTest, GetNullProperty) {
  InSequence in_sequence_dummy;
  std::string result;

  EXPECT_CALL(test_mock(), nullable_boolean_property())
      .WillOnce(Return(base::nullopt));
  EXPECT_TRUE(
      EvaluateScript("test.nullableBooleanProperty === null;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), nullable_numeric_property())
      .WillOnce(Return(base::nullopt));
  EXPECT_TRUE(
      EvaluateScript("test.nullableNumericProperty === null;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), nullable_string_property())
      .WillOnce(Return(base::nullopt));
  EXPECT_TRUE(EvaluateScript("test.nullableStringProperty === null;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), nullable_object_property())
      .WillOnce(Return(scoped_refptr<ArbitraryInterface>()));
  EXPECT_TRUE(EvaluateScript("test.nullableObjectProperty === null;", &result));
  EXPECT_STREQ("true", result.c_str());
}

TEST_F(NullableTypesBindingsTest, GetNonNullProperty) {
  InSequence in_sequence_dummy;
  std::string result;

  EXPECT_CALL(test_mock(), nullable_boolean_property())
      .WillOnce(Return(base::optional<bool>(true)));
  EXPECT_TRUE(
      EvaluateScript("test.nullableBooleanProperty === true;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), nullable_numeric_property())
      .WillOnce(Return(base::optional<int32_t>(5)));
  EXPECT_TRUE(EvaluateScript("test.nullableNumericProperty === 5;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), nullable_string_property())
      .WillOnce(Return(base::optional<std::string>("foo")));
  EXPECT_TRUE(
      EvaluateScript("test.nullableStringProperty === \"foo\";", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), nullable_object_property())
      .WillOnce(Return(make_scoped_refptr(new ArbitraryInterface())));
  EXPECT_TRUE(
      EvaluateScript("test.nullableObjectProperty.__proto__;", &result));
  EXPECT_STREQ("[object ArbitraryInterfacePrototype]", result.c_str());
}

TEST_F(NullableTypesBindingsTest, ReturnNullFromOperation) {
  InSequence in_sequence_dummy;
  std::string result;

  EXPECT_CALL(test_mock(), NullableBooleanOperation())
      .WillOnce(Return(base::nullopt));
  EXPECT_TRUE(
      EvaluateScript("test.nullableBooleanOperation() === null;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), NullableNumericOperation())
      .WillOnce(Return(base::nullopt));
  EXPECT_TRUE(
      EvaluateScript("test.nullableNumericOperation() === null;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), NullableStringOperation())
      .WillOnce(Return(base::nullopt));
  EXPECT_TRUE(
      EvaluateScript("test.nullableStringOperation() === null;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), NullableObjectOperation())
      .WillOnce(Return(scoped_refptr<ArbitraryInterface>()));
  EXPECT_TRUE(
      EvaluateScript("test.nullableObjectOperation() === null;", &result));
  EXPECT_STREQ("true", result.c_str());
}

TEST_F(NullableTypesBindingsTest, ReturnNonNullFromOperation) {
  InSequence in_sequence_dummy;
  std::string result;

  EXPECT_CALL(test_mock(), NullableBooleanOperation())
      .WillOnce(Return(base::optional<bool>(true)));
  EXPECT_TRUE(
      EvaluateScript("test.nullableBooleanOperation() === true;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), NullableNumericOperation())
      .WillOnce(Return(base::optional<int32_t>(5)));
  EXPECT_TRUE(
      EvaluateScript("test.nullableNumericOperation() === 5;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), NullableStringOperation())
      .WillOnce(Return(base::optional<std::string>("foo")));
  EXPECT_TRUE(
      EvaluateScript("test.nullableStringOperation() === \"foo\";", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), NullableObjectOperation())
      .WillOnce(Return(make_scoped_refptr(new ArbitraryInterface())));
  EXPECT_TRUE(
      EvaluateScript("test.nullableObjectOperation().__proto__;", &result));
  EXPECT_STREQ("[object ArbitraryInterfacePrototype]", result.c_str());
}


TEST_F(NullableTypesBindingsTest, SetNullProperty) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(),
              set_nullable_boolean_property(base::optional<bool>()));
  EXPECT_TRUE(EvaluateScript("test.nullableBooleanProperty = null;", NULL));

  EXPECT_CALL(test_mock(),
              set_nullable_numeric_property(base::optional<int32_t>()));
  EXPECT_TRUE(EvaluateScript("test.nullableNumericProperty = null;", NULL));

  EXPECT_CALL(test_mock(),
              set_nullable_string_property(base::optional<std::string>()));
  EXPECT_TRUE(EvaluateScript("test.nullableStringProperty = null;", NULL));

  EXPECT_CALL(test_mock(), set_nullable_object_property(
                               scoped_refptr<ArbitraryInterface>()));
  EXPECT_TRUE(EvaluateScript("test.nullableObjectProperty = null;", NULL));
}

TEST_F(NullableTypesBindingsTest, SetNonNullProperty) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(),
              set_nullable_boolean_property(base::optional<bool>(true)));
  EXPECT_TRUE(EvaluateScript("test.nullableBooleanProperty = true;", NULL));

  EXPECT_CALL(test_mock(),
              set_nullable_numeric_property(base::optional<int32_t>(5)));
  EXPECT_TRUE(EvaluateScript("test.nullableNumericProperty = 5;", NULL));

  EXPECT_CALL(test_mock(),
              set_nullable_string_property(base::optional<std::string>("foo")));
  EXPECT_TRUE(EvaluateScript("test.nullableStringProperty = \"foo\";", NULL));

  scoped_refptr<ArbitraryInterface> mock_interface = new ArbitraryInterface();
  EXPECT_CALL(test_mock(), NullableObjectOperation())
      .WillOnce(Return(mock_interface));
  EXPECT_CALL(test_mock(), set_nullable_object_property(mock_interface));
  EXPECT_TRUE(EvaluateScript(
      "test.nullableObjectProperty = test.nullableObjectOperation();", NULL));
}

TEST_F(NullableTypesBindingsTest, PassNullArgument) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), NullableBooleanArgument(base::optional<bool>()));
  EXPECT_TRUE(EvaluateScript("test.nullableBooleanArgument(null);", NULL));

  EXPECT_CALL(test_mock(), NullableNumericArgument(base::optional<int32_t>()));
  EXPECT_TRUE(EvaluateScript("test.nullableNumericArgument(null);", NULL));

  EXPECT_CALL(test_mock(),
              NullableStringArgument(base::optional<std::string>()));
  EXPECT_TRUE(EvaluateScript("test.nullableStringArgument(null);", NULL));

  EXPECT_CALL(test_mock(),
              NullableObjectArgument(scoped_refptr<ArbitraryInterface>()));
  EXPECT_TRUE(EvaluateScript("test.nullableObjectArgument(null);", NULL));
}

TEST_F(NullableTypesBindingsTest, PassNonNullArgument) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), NullableBooleanArgument(base::optional<bool>(true)));
  EXPECT_TRUE(EvaluateScript("test.nullableBooleanArgument(true);", NULL));

  EXPECT_CALL(test_mock(), NullableNumericArgument(base::optional<int32_t>(5)));
  EXPECT_TRUE(EvaluateScript("test.nullableNumericArgument(5);", NULL));

  EXPECT_CALL(test_mock(),
              NullableStringArgument(base::optional<std::string>("foo")));
  EXPECT_TRUE(EvaluateScript("test.nullableStringArgument(\"foo\");", NULL));

  scoped_refptr<ArbitraryInterface> mock_interface = new ArbitraryInterface();
  EXPECT_CALL(test_mock(), nullable_object_property())
      .WillOnce(Return(mock_interface));
  EXPECT_CALL(test_mock(), NullableObjectArgument(mock_interface));
  EXPECT_TRUE(EvaluateScript(
      "test.nullableObjectArgument(test.nullableObjectProperty);", NULL));
}

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