#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for remove_indirect_calls"""

from __future__ import print_function

import io
import unittest

import remove_indirect_calls


def _run_test(input_lines):
  input_buf = io.BytesIO('\n'.join(input_lines))
  output_buf = io.BytesIO()
  remove_indirect_calls.run(input_buf, output_buf)
  return output_buf.getvalue().splitlines()


class Test(unittest.TestCase):
  """Tests"""

  def test_empty_profile(self):
    self.assertEqual(_run_test([]), [])

  def test_removal_on_real_world_code(self):
    # These are copied from an actual textual AFDO profile, but the names made
    # lints unhappy due to their length, so I had to be creative.
    profile_lines = """_ZLongSymbolName:52862:1766
 14: 2483
 8.1: _SomeInlinedSym:45413
  11: _AndAnother:35481
   2: 2483
   2.1: _YetAnother:25549
    3: 2483
    3.1: 351
    3.3: 2526 IndirectTarg1:675 Targ2:397 Targ3:77
  13.2: Whee:9932
   1.1: Whoo:9932
    0: BleepBloop:9932
     0: 2483
  """.strip().splitlines()

    expected_lines = """_ZLongSymbolName:52862:1766
 14: 2483
 8.1: _SomeInlinedSym:45413
  11: _AndAnother:35481
   2: 2483
   2.1: _YetAnother:25549
    3: 2483
    3.1: 351
    3.3: 2526
  13.2: Whee:9932
   1.1: Whoo:9932
    0: BleepBloop:9932
     0: 2483
  """.strip().splitlines()

    self.assertEqual(_run_test(profile_lines), expected_lines)


if __name__ == '__main__':
  unittest.main()
