#!/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_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()
