#!/usr/bin/env python
# Copyright (c) 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.

import cStringIO
import logging
import os
import sys
import textwrap
import unittest

ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ROOT_DIR)

import reduce_debugline


class ReduceDebuglineTest(unittest.TestCase):
  _DECODED_DEBUGLINE = textwrap.dedent("""\
      Decoded dump of debug contents of section .debug_line:

      CU: ../../chrome/service/service_main.cc:
      File name                            Line number    Starting address
      service_main.cc                               21            0xa41210

      service_main.cc                               24            0xa4141f
      service_main.cc                               30            0xa4142b
      service_main.cc                               31            0xa4143e

      ../../base/message_loop.h:
      message_loop.h                               550            0xa41300

      message_loop.h                               551            0xa41310

      ../../base/logging.h:
      logging.h                                    246            0xa41710

      logging.h                                    247            0xa41726

      ../../base/logging.h:
      logging.h                                    846            0xa3fd90

      logging.h                                    846            0xa3fda0

      """)

  _EXPECTED_REDUCED_DEBUGLINE = [
      (0xa3fd90, '../../base/logging.h'),
      (0xa41210, '../../chrome/service/service_main.cc'),
      (0xa41300, '../../base/message_loop.h'),
      (0xa4141f, '../../chrome/service/service_main.cc'),
      (0xa41710, '../../base/logging.h'),
      ]

  def test(self):
    ranges_dict = reduce_debugline.reduce_decoded_debugline(
        cStringIO.StringIO(self._DECODED_DEBUGLINE))
    self.assertEqual(self._EXPECTED_REDUCED_DEBUGLINE, ranges_dict)


if __name__ == '__main__':
  logging.basicConfig(
      level=logging.DEBUG if '-v' in sys.argv else logging.ERROR,
      format='%(levelname)5s %(filename)15s(%(lineno)3d): %(message)s')
  unittest.main()
