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

using ::testing::MatchesRegex;

namespace cobalt {
namespace bindings {
namespace testing {

namespace {
class StackTraceTest : public BindingsTestBase {};
}  // namespace

TEST_F(StackTraceTest, GetStackTrace) {
  std::string result;

  // We expect the to be in bar (line 2), called from foo (line 6),
  // called from foo (line 8) 4 times, called outside of a function (line
  // 11).
  std::string script =
      "function bar() {\n"
      "return getStackTrace();\n"
      "}\n"
      "function foo(depth) {\n"
      "  if  (depth <= 0) {\n"
      "    return bar();\n"
      "  } else {\n"
      "    return foo(depth - 1);\n"
      "  }\n"
      "}\n"
      "foo(4)";
  EXPECT_TRUE(EvaluateScript(script, &result));

  // Expect that bar is on top.
  std::string match_line = "bar @ [object BindingsTestBase]:2";
  size_t position = result.find(match_line);
  EXPECT_TRUE(position != std::string::npos);
  // Expect a foo at line 6.
  match_line = "foo @ [object BindingsTestBase]:6";
  position = result.find(match_line, ++position);
  EXPECT_TRUE(position != std::string::npos);
  // Expect 4 subsequent foos at line 8.
  match_line = "foo @ [object BindingsTestBase]:8";
  for (int i = 0; i < 4; ++i) {
    position = result.find(match_line, ++position);
    EXPECT_TRUE(position != std::string::npos);
  }
  // Expect global code at line 11.
  match_line = "global code @ [object BindingsTestBase]:11";
  position = result.find(match_line, ++position);
  EXPECT_TRUE(position != std::string::npos);
}

TEST_F(StackTraceTest, UnnamedFunction) {
  std::string result;

  // There should be a stack entry for the anonymous function.
  std::string script =
      "function foo(fun) {\n"
      "  return fun();\n"
      "}\n"
      "foo(function() { return getStackTrace();})";
  EXPECT_TRUE(EvaluateScript(script, &result));

  std::string match_line = "[object BindingsTestBase]:4";
  size_t position = result.find(match_line);
  EXPECT_TRUE(position != std::string::npos);
}

#if defined(ENGINE_SUPPORTS_STACK_TRACE_COLUMNS)
// Test for column numbers in stack trace. Behavior varies somewhat
// across engines & versions so, don't check actual column values.
TEST_F(StackTraceTest, GetStackTraceColumns) {
  std::string result;

  const std::string script =
      "function bar() {\n"
      "// Add extra statements to shift the error right.\n"
      "  var x; var y; return getStackTrace(); var z;\n"
      "}\n"
      "function multiArg(in1, in2) {\n"
      "  return in2;\n"
      "}\n"
      "multiArg(0, bar());";

  EXPECT_TRUE(EvaluateScript(script, &result));
  const std::string expected =
      "bar @ \\[object BindingsTestBase\\]:3:\\d+\n"
      "global code @ \\[object BindingsTestBase\\]:8:\\d+";
  EXPECT_THAT(result, MatchesRegex(expected));
}
#endif  // ENGINE_SUPPORTS_STACK_TRACE_COLUMNS

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