/*
 * Copyright 2016 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/arbitrary_interface.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/object_type_bindings_interface.h"
#include "cobalt/bindings/testing/script_object_owner.h"

using cobalt::script::OpaqueHandleHolder;
using ::testing::_;
using ::testing::Invoke;
using ::testing::Return;
using ::testing::StrictMock;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
class EvaluateScriptTest
    : public InterfaceBindingsTest<ObjectTypeBindingsInterface> {};
}  // namespace

TEST_F(EvaluateScriptTest, TwoArguments) {
  std::string result;

  std::string script =
      "function fib(n) {\n"
      "  if (n <= 0) {\n"
      "    return 0;\n"
      "  } else if (n == 1) {\n"
      "    return 1;\n"
      "  } else {\n"
      "    return fib(n - 1) + fib(n - 2);\n"
      "  }\n"
      "}\n"
      "fib(8)";
  EXPECT_TRUE(EvaluateScript(script, &result));
  EXPECT_STREQ("21", result.c_str());
}

TEST_F(EvaluateScriptTest, ThreeArguments) {
  std::string script =
      "function fib(n) {\n"
      "  if (n <= 0) {\n"
      "    return 0;\n"
      "  } else if (n == 1) {\n"
      "    return 1;\n"
      "  } else {\n"
      "    return fib(n - 1) + fib(n - 2);\n"
      "  }\n"
      "}\n"
      "fib(8)";

  // Call with null out handle.
  scoped_refptr<StrictMock<ArbitraryInterface> > arbitrary_interface_mock(
      new StrictMock<ArbitraryInterface>());
  EXPECT_TRUE(EvaluateScript(script, arbitrary_interface_mock, NULL));

  // Call with non-null, but unset optional handle.
  base::optional<OpaqueHandleHolder::Reference> opaque_handle;
  EXPECT_TRUE(EvaluateScript(script, arbitrary_interface_mock, &opaque_handle));
  ASSERT_FALSE(opaque_handle->referenced_object().IsNull());

  EXPECT_CALL(test_mock(), object_property())
      .WillOnce(Return(&opaque_handle->referenced_object()));
  std::string result;
  EXPECT_TRUE(EvaluateScript("test.objectProperty == 21;", &result));
  EXPECT_STREQ("true", result.c_str());
}

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