/*
 * 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 "base/memory/ref_counted.h"
#include "cobalt/bindings/testing/arbitrary_interface.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/nested_put_forwards_interface.h"
#include "cobalt/bindings/testing/put_forwards_interface.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::Return;
using ::testing::StrictMock;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
typedef InterfaceBindingsTest<PutForwardsInterface> PutForwardsTest;
typedef InterfaceBindingsTest<NestedPutForwardsInterface> NestedPutForwardsTest;
}  // namespace

TEST_F(PutForwardsTest, ForwardsToInterface) {
  scoped_refptr<StrictMock<ArbitraryInterface> > arbitrary_interface_mock(
      new StrictMock<ArbitraryInterface>());
  EXPECT_CALL(test_mock(), forwarding_attribute())
      .WillOnce(Return(arbitrary_interface_mock));
  EXPECT_CALL(*arbitrary_interface_mock, set_arbitrary_property("apple"));
  EXPECT_TRUE(EvaluateScript("test.forwardingAttribute = 'apple';", NULL));
}

TEST_F(PutForwardsTest, StaticForwardsToInterface) {
  scoped_refptr<StrictMock<ArbitraryInterface> > arbitrary_interface_mock(
      new StrictMock<ArbitraryInterface>());
  EXPECT_CALL(PutForwardsInterface::static_methods_mock.Get(),
              static_forwarding_attribute())
      .WillOnce(Return(arbitrary_interface_mock));
  EXPECT_CALL(*arbitrary_interface_mock, set_arbitrary_property("orange"));
  EXPECT_TRUE(EvaluateScript(
      "PutForwardsInterface.staticForwardingAttribute = 'orange';", NULL));
}

TEST_F(NestedPutForwardsTest, ForwardsToNestedInterface) {
  scoped_refptr<StrictMock<PutForwardsInterface> > puts_forward_interface_mock(
      new StrictMock<PutForwardsInterface>());
  scoped_refptr<StrictMock<ArbitraryInterface> > arbitrary_interface_mock(
      new StrictMock<ArbitraryInterface>());
  EXPECT_CALL(test_mock(), nested_forwarding_attribute())
      .WillOnce(Return(puts_forward_interface_mock));
  EXPECT_CALL(*puts_forward_interface_mock, forwarding_attribute())
      .WillOnce(Return(arbitrary_interface_mock));
  EXPECT_CALL(*arbitrary_interface_mock, set_arbitrary_property("banana"));
  EXPECT_TRUE(
      EvaluateScript("test.nestedForwardingAttribute = 'banana';", NULL));
}
}  // namespace testing
}  // namespace bindings
}  // namespace cobalt
