// Copyright 2015 The Cobalt Authors. 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 <limits>

#include "base/stringprintf.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/extended_idl_attributes_interface.h"

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

using ::testing::Return;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef InterfaceBindingsTest<ExtendedIDLAttributesInterface>
    ExtendedAttributesTest;
}  // namespace

TEST_F(ExtendedAttributesTest, CallWithEnvironmentSettings) {
  EXPECT_CALL(test_mock(), CallWithSettings(environment_settings_.get()));
  EXPECT_TRUE(EvaluateScript("test.callWithSettings();", NULL));
}

TEST_F(ExtendedAttributesTest, ClampArgument) {
  EXPECT_CALL(test_mock(), ClampArgument(std::numeric_limits<uint16_t>::max()));
  EXPECT_TRUE(EvaluateScript(StringPrintf("test.clampArgument(%u);",
                                          std::numeric_limits<uint32_t>::max()),
                             NULL));
}

TEST_F(ExtendedAttributesTest, ImplementedAsAttributeGetter) {
  EXPECT_CALL(test_mock(), attribute_default()).WillOnce(Return(true));
  EXPECT_TRUE(EvaluateScript("var result = test.default;", 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(), attribute_default()).WillOnce(Return(false));
  EXPECT_TRUE(EvaluateScript("var result = test.default;", 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(ExtendedAttributesTest, ImplementedAsAttributeSetter) {
  EXPECT_CALL(test_mock(), set_attribute_default(true));
  EXPECT_TRUE(EvaluateScript(StringPrintf("test.default = true;"), NULL));

  EXPECT_CALL(test_mock(), set_attribute_default(false));
  EXPECT_TRUE(EvaluateScript(StringPrintf("test.default = false;"), NULL));
}

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