#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# 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"""


import io
import unittest

from afdo_redaction import remove_indirect_calls


def _run_test(input_lines):
    input_buf = io.StringIO("\n".join(input_lines))
    output_buf = io.StringIO()
    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()
