#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS 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()
