// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/common/stack_frame.h"

#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

using base::UTF8ToUTF16;

namespace extensions {

namespace {

void AssertStackFrameValid(const std::string& text,
                           size_t line,
                           size_t column,
                           const std::string& source,
                           const std::string& function) {
  base::string16 utf16_text = base::UTF8ToUTF16(text);
  scoped_ptr<StackFrame> frame = StackFrame::CreateFromText(utf16_text);

  ASSERT_TRUE(frame.get()) << "Failed to create frame from '" << text << "'";
  EXPECT_EQ(line, frame->line_number);
  EXPECT_EQ(column, frame->column_number);
  EXPECT_EQ(base::UTF8ToUTF16(source), frame->source);
  EXPECT_EQ(base::UTF8ToUTF16(function), frame->function);
}

void AssertStackFrameInvalid(const std::string& text) {
  base::string16 utf16_text = base::UTF8ToUTF16(text);
  scoped_ptr<StackFrame> frame = StackFrame::CreateFromText(utf16_text);
  ASSERT_FALSE(frame.get()) << "Errantly created frame from '" << text << "'";
}

}  // namespace

TEST(StackFrameUnitTest, ParseStackFramesFromText) {
  AssertStackFrameValid(
      "function_name (https://www.url.com/foo.html:100:201)",
      100u, 201u, "https://www.url.com/foo.html", "function_name");
  AssertStackFrameValid(
      "(anonymous function) (https://www.url.com/foo.html:100:201)",
      100u, 201u, "https://www.url.com/foo.html", "(anonymous function)");
  AssertStackFrameValid(
      "Function.target.(anonymous function) (internals::SafeBuiltins:19:14)",
      19u, 14u, "internals::SafeBuiltins",
      "Function.target.(anonymous function)");
  AssertStackFrameValid(
      "internal-item:://fpgohbggpmcpeedljibghijiclejiklo/script.js:6:12",
      6u, 12u, "internal-item:://fpgohbggpmcpeedljibghijiclejiklo/script.js",
      "(anonymous function)");

  // No delimiting ':' between line/column numbers.
  AssertStackFrameInvalid(
      "function_name (https://www.url.com/foo.html:100201)");
  // No line number.
  AssertStackFrameInvalid("function_name (https://www.url.com/foo.html::201)");
  // No line number or delimiting ':'.
  AssertStackFrameInvalid("function_name (https://www.url.com/foo.html201)");
  // No leading '(' around url, line, column.
  AssertStackFrameInvalid(
      "function_name https://www.url.com/foo.html:100:201)");
  // No trailing ')'.
  AssertStackFrameInvalid(
      "function_name (https://www.url.com/foo.html:100:201");
  // Trailing ' '.
  AssertStackFrameInvalid(
      "function_name (https://www.url.com/foo.html:100:201) ");
  // Invalid column number.
  AssertStackFrameInvalid(
      "function_name (https://www.url.com/foo.html:100:201a)");
  // Negative column number.
  AssertStackFrameInvalid(
      "function_name (https://www.url.com/foo.html:100:-201)");
  // Extra trailing ')'
  AssertStackFrameInvalid(
      "function_name (https://www.url.com/foo.html:100:201))");
}

}  // namespace extensions
