#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 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 fetch_gn_descs.py."""

from __future__ import print_function

import io
import unittest

import fetch_gn_descs

# pylint: disable=protected-access


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

  def test_fix_result_removes_uninteresting_items(self):
    items = {
        '//uninteresting:a': {},
        '//uninteresting:b': {
            'sources': ['whee'],
        },
        '//uninteresting:c': {
            'configs': ['whee'],
        },
        '//uninteresting:d': {
            'sources': [],
            'configs': [],
        },
        '//interesting:a': {
            'sources': ['a'],
            'configs': ['b'],
        },
        '//interesting:b': {
            'sources': ['d'],
            'configs': ['c'],
        },
    }

    expected_items = {
        '//interesting:a': items['//interesting:a'],
        '//interesting:b': items['//interesting:b'],
    }

    self.assertDictEqual(
        fetch_gn_descs._fix_result('/', '/', '/', items), expected_items)

  def test_fix_result_translates_paths_in_out_dir(self):
    items = {
        '//interesting:a': {
            'sources': ['//out_dir/foo', '//out_dir'],
            'configs': ['b'],
        },
    }

    expected_items = {
        '//interesting:a': {
            'sources': ['//out_translated/foo', '//out_translated/'],
            'configs': ['b'],
        },
    }

    self.assertDictEqual(
        fetch_gn_descs._fix_result(
            rename_out='//out_translated',
            out_dir='/chromium/src/out_dir',
            chromium_root='/chromium',
            gn_desc=items,
        ),
        expected_items,
    )

  def test_gn_desc_output_parsing_skips_pre_json_warnings(self):
    gn_desc = io.StringIO('\n'.join((
        'foo',
        'warning: "{" is bad',
        '{"bar": "baz",',
        ' "qux": true}',
    )))

    warnings, desc_json = fetch_gn_descs._parse_gn_desc_output(gn_desc)
    self.assertEqual(warnings, '\n'.join((
        'foo',
        'warning: "{" is bad',
    )))
    self.assertEqual(desc_json, {
        'bar': 'baz',
        'qux': True,
    })

  def test_gn_desc_output_parsing_issues_no_warnings_if_none_are_present(self):
    gn_desc = io.StringIO('{"bar": "baz"}')
    warnings, desc_json = fetch_gn_descs._parse_gn_desc_output(gn_desc)
    self.assertEqual(warnings, '')
    self.assertEqual(desc_json, {'bar': 'baz'})

    gn_desc = io.StringIO('\n  \n\t\n{"bar": "baz"}')
    warnings, desc_json = fetch_gn_descs._parse_gn_desc_output(gn_desc)
    self.assertEqual(warnings, '')
    self.assertEqual(desc_json, {'bar': 'baz'})


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