// 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/boolean_type_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<BooleanTypeTestInterface> BooleanTypeBindingsTest;
}  // namespace

// Boolean conversion algorithm: https://www.w3.org/TR/WebIDL/#es-boolean
// ToBoolean operation: http://es5.github.io/#x9.2

TEST_F(BooleanTypeBindingsTest, GetBooleanProperty) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), boolean_property()).WillOnce(Return(true));
  EXPECT_TRUE(EvaluateScript("var result = test.booleanProperty;", NULL));

  std::string result;
  EXPECT_TRUE(EvaluateScript("typeof result;", &result));
  EXPECT_STREQ("boolean", result.c_str());

  EXPECT_TRUE(EvaluateScript("result;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), boolean_property()).WillOnce(Return(false));
  EXPECT_TRUE(EvaluateScript("var result = test.booleanProperty;", NULL));

  EXPECT_TRUE(EvaluateScript("typeof result;", &result));
  EXPECT_STREQ("boolean", result.c_str());

  EXPECT_TRUE(EvaluateScript("result;", &result));
  EXPECT_STREQ("false", result.c_str());
}

TEST_F(BooleanTypeBindingsTest, BooleanReturnValue) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), BooleanReturnOperation()).WillOnce(Return(true));
  EXPECT_TRUE(
      EvaluateScript("var result = test.booleanReturnOperation();", NULL));

  std::string result;
  EXPECT_TRUE(EvaluateScript("typeof result;", &result));
  EXPECT_STREQ("boolean", result.c_str());

  EXPECT_TRUE(EvaluateScript("result;", &result));
  EXPECT_STREQ("true", result.c_str());

  EXPECT_CALL(test_mock(), BooleanReturnOperation()).WillOnce(Return(false));
  EXPECT_TRUE(
      EvaluateScript("var result = test.booleanReturnOperation();", NULL));

  EXPECT_TRUE(EvaluateScript("typeof result;", &result));
  EXPECT_STREQ("boolean", result.c_str());

  EXPECT_TRUE(EvaluateScript("result;", &result));
  EXPECT_STREQ("false", result.c_str());
}

TEST_F(BooleanTypeBindingsTest, SetBooleanProperty) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), set_boolean_property(true));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = true;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = false;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = undefined;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = null;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = 0;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = NaN;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(true));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = 1;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(true));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = -1;", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(true));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = \"string\";", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = \"\";", NULL));

  // An arbitrary non-null object should convert to 'true'
  EXPECT_CALL(test_mock(), set_boolean_property(true));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = test;", NULL));
}

TEST_F(BooleanTypeBindingsTest, BooleanArgumentOperation) {
  InSequence in_sequence_dummy;

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(true));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(true);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(false));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(false);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(false));
  EXPECT_TRUE(
      EvaluateScript("test.booleanArgumentOperation(undefined);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(false));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(null);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(false));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(0);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(false));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(NaN);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(true));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(1);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(true));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(-1);", NULL));

  EXPECT_CALL(test_mock(), BooleanArgumentOperation(true));
  EXPECT_TRUE(
      EvaluateScript("test.booleanArgumentOperation(\"string\");", NULL));

  EXPECT_CALL(test_mock(), set_boolean_property(false));
  EXPECT_TRUE(EvaluateScript("test.booleanProperty = \"\";", NULL));

  // An arbitrary non-null object should convert to 'true'
  EXPECT_CALL(test_mock(), BooleanArgumentOperation(true));
  EXPECT_TRUE(EvaluateScript("test.booleanArgumentOperation(test);", NULL));
}

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