#!/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.

"""Unit tests for create_pkg_info."""

from __future__ import print_function

import io
import unittest

import create_pkg_info


class CreatePkgInfoTest(unittest.TestCase):
  """All the tests."""

  INPUT_LINES = [
      'app-arch/gzip-1.9',
      'dev-libs/popt-1.16-r2',
      'app-emulation/docker-credential-helpers-0.6.3-r1',
      '_not.real-category1+/_not-real_package1-12.34.56.78',
      ' _not.real-category1+/_not-real_package2-12.34.56.78-r26 ',
      '  _not.real-category1+/_not-real_package3-12.34.56.78_rc3  ',
      '   _not.real-category1+/_not-real_package4-12.34.56.78_rc3-r26   ',
      '    _not.real-category1+/_not-real_package5-12.34.56.78_pre2_rc3-r26   ',
      '_not.real-category2+/_not-real_package1-12.34.56.78q',
      '_not.real-category2+/_not-real_package2-12.34.56.78q-r26',
      '_not.real-category2+/_not-real_package3-12.34.56.78q_rc3',
      '_not.real-category2+/_not-real_package4-12.34.56.78q_rc3-r26',
      '_not.real-category2+/_not-real_package5-12.34.56.78q_pre2_rc3-r26'
  ]

  EXPECTED_LIST = [
      {'category': 'app-arch', 'package': 'gzip', 'version_no_rev': '1.9',
       'revision': None},
      {'category': 'dev-libs', 'package': 'popt', 'version_no_rev': '1.16',
       'revision': '2'},
      {'category': 'app-emulation', 'package': 'docker-credential-helpers',
       'version_no_rev': '0.6.3', 'revision': '1'},
      {'category': '_not.real-category1+', 'package': '_not-real_package1',
       'version_no_rev': '12.34.56.78', 'revision': None},
      {'category': '_not.real-category1+', 'package': '_not-real_package2',
       'version_no_rev': '12.34.56.78', 'revision': '26'},
      {'category': '_not.real-category1+', 'package': '_not-real_package3',
       'version_no_rev': '12.34.56.78_rc3', 'revision': None},
      {'category': '_not.real-category1+', 'package': '_not-real_package4',
       'version_no_rev': '12.34.56.78_rc3', 'revision': '26'},
      {'category': '_not.real-category1+', 'package': '_not-real_package5',
       'version_no_rev': '12.34.56.78_pre2_rc3', 'revision': '26'},
      {'category': '_not.real-category2+', 'package': '_not-real_package1',
       'version_no_rev': '12.34.56.78q', 'revision': None},
      {'category': '_not.real-category2+', 'package': '_not-real_package2',
       'version_no_rev': '12.34.56.78q', 'revision': '26'},
      {'category': '_not.real-category2+', 'package': '_not-real_package3',
       'version_no_rev': '12.34.56.78q_rc3', 'revision': None},
      {'category': '_not.real-category2+', 'package': '_not-real_package4',
       'version_no_rev': '12.34.56.78q_rc3', 'revision': '26'},
      {'category': '_not.real-category2+', 'package': '_not-real_package5',
       'version_no_rev': '12.34.56.78q_pre2_rc3', 'revision': '26'}
  ]

  EXPECTED_JSON = """{
    "installedPackages": [
        {
            "category": "app-arch",
            "name": "gzip",
            "version": "1.9"
        },
        {
            "category": "dev-libs",
            "name": "popt",
            "version": "1.16",
            "revision": "2"
        },
        {
            "category": "app-emulation",
            "name": "docker-credential-helpers",
            "version": "0.6.3",
            "revision": "1"
        },
        {
            "category": "_not.real-category1+",
            "name": "_not-real_package1",
            "version": "12.34.56.78"
        },
        {
            "category": "_not.real-category1+",
            "name": "_not-real_package2",
            "version": "12.34.56.78",
            "revision": "26"
        },
        {
            "category": "_not.real-category1+",
            "name": "_not-real_package3",
            "version": "12.34.56.78_rc3"
        },
        {
            "category": "_not.real-category1+",
            "name": "_not-real_package4",
            "version": "12.34.56.78_rc3",
            "revision": "26"
        },
        {
            "category": "_not.real-category1+",
            "name": "_not-real_package5",
            "version": "12.34.56.78_pre2_rc3",
            "revision": "26"
        },
        {
            "category": "_not.real-category2+",
            "name": "_not-real_package1",
            "version": "12.34.56.78q"
        },
        {
            "category": "_not.real-category2+",
            "name": "_not-real_package2",
            "version": "12.34.56.78q",
            "revision": "26"
        },
        {
            "category": "_not.real-category2+",
            "name": "_not-real_package3",
            "version": "12.34.56.78q_rc3"
        },
        {
            "category": "_not.real-category2+",
            "name": "_not-real_package4",
            "version": "12.34.56.78q_rc3",
            "revision": "26"
        },
        {
            "category": "_not.real-category2+",
            "name": "_not-real_package5",
            "version": "12.34.56.78q_pre2_rc3",
            "revision": "26"
        }
    ]
}"""

  def __init__(self, *args, **kwargs):
    unittest.TestCase.__init__(self, *args, **kwargs)
    self.maxDiff = None

  def testCreateList(self):
    self.assertEqual(
        create_pkg_info.CreateList(self.INPUT_LINES),
        self.EXPECTED_LIST)

  def testWriteJson(self):
    mock_file = io.StringIO()
    create_pkg_info.WriteJson(self.EXPECTED_LIST, mock_file)
    self.assertEqual(mock_file.getvalue(), self.EXPECTED_JSON)
    mock_file.close()


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