#!/usr/bin/env python2
# Copyright 2017 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 test for build_component"""

from __future__ import print_function
import unittest

from build_component import ParseVersion
from build_component import GetCurrentVersion
from build_component import DecideVersion
from build_component import GetPackageVersion
from build_component import FixPackageVersion
from build_component import GetCurrentPackageVersion

class TestBuildComponent(unittest.TestCase):
  """Tests for build_component"""

  def test_ParseVersion(self):
    self.assertEqual(ParseVersion('1.2.3.4.5'), [1, 2, 3, 4])
    self.assertEqual(ParseVersion('1.2.3.4'), [1, 2, 3, 4])
    self.assertEqual(ParseVersion('1.2.3'), [1, 2, 3])
    self.assertEqual(ParseVersion('1.2'), [])
    self.assertEqual(ParseVersion('1.2.3.a'), [1, 2, 3])

  def test_GetCurrentVersion(self):
    paths = ['gs://1.0.0.1/',
             'gs://1.0.1/',
             'gs://1.1.0/']
    self.assertEqual(GetCurrentVersion(paths), ('1.1.0', 'gs://1.1.0/'))

    paths = ['gs://1.0.0.1/',
             'gs://1.0.1/',
             'gs://1.1.0']
    self.assertEqual(GetCurrentVersion(paths), ('1.0.1', 'gs://1.0.1/'))

    paths = ['gs://1.0.0.1/',
             'gs://1.0.1/',
             'gs://1.1/', # invalid version
             'gs://invalidpath/']
    self.assertEqual(GetCurrentVersion(paths), ('1.0.1', 'gs://1.0.1/'))

    paths = []
    self.assertEqual(GetCurrentVersion(paths), ('0.0.0.0', None))

    paths = ['/invalid/path/',
             'gs://1.1.0']
    self.assertEqual(GetCurrentVersion(paths), ('0.0.0.0', None))

  def test_DecideVersion(self):
    self.assertEqual(DecideVersion('1.0.0.3', '1.0.0.1'), '1.0.0.2')
    self.assertEqual(DecideVersion('1.0.0.3', '1.0.0.4'), '1.0.0.5')
    self.assertEqual(DecideVersion('1.0.0.r-1', '1.0.0'), '1.0.0.1')
    self.assertEqual(DecideVersion('1.0.0.r-1', '1.0.0.1'), '1.0.0.2')
    self.assertEqual(DecideVersion('1.1.0.r-1', '1.0.0'), '1.1.0.1')
    self.assertEqual(DecideVersion('1.1.0.r-1', '1.0'), None)
    self.assertEqual(DecideVersion('1.1.r-1', '1.0.0'), None)
    self.assertEqual(DecideVersion('1.0.1', '1.0.2'), None)

  def test_GetPackageVersion(self):
    self.assertEqual(GetPackageVersion('abc-1.2.3-r0', 'abc'), '1.2.3-r0')
    self.assertEqual(GetPackageVersion('abc-def-1.2.3-r0', 'abc-def'),
                     '1.2.3-r0')
    self.assertEqual(GetPackageVersion('abc-1.2.3-r0', 'abc-def'), None)
    self.assertEqual(GetPackageVersion('abc-def-1.2.3-r0', 'abc'), None)
    self.assertEqual(GetPackageVersion('abc-def-1', 'abc-def'), '1.0.0')
    self.assertEqual(GetPackageVersion('abc-def-1.2', 'abc-def'), '1.2.0')
    self.assertEqual(GetPackageVersion('abc-def-1.2-r1', 'abc-def'), '1.2.0-r1')

  def test_GetCurrentPackageVersion(self):
    self.assertEqual(GetCurrentPackageVersion('', '[platform]'), '0.0.0.0')
    self.assertEqual(GetCurrentPackageVersion(None, '[platform]'), '0.0.0.0')

  def test_FixPackageVersion(self):
    self.assertEqual(FixPackageVersion('1.2.3-r0'), '1.2.3-r0')
    self.assertEqual(FixPackageVersion('1.2.3-0'), None)
    self.assertEqual(FixPackageVersion('1.2.3-'), None)
    self.assertEqual(FixPackageVersion('1.2.3'), '1.2.3')
    self.assertEqual(FixPackageVersion('1.2-r1'), '1.2.0-r1')
    self.assertEqual(FixPackageVersion('1-r0'), '1.0.0-r0')
    self.assertEqual(FixPackageVersion('-r0'), None)
    self.assertEqual(FixPackageVersion('1.-r0'), None)
    self.assertEqual(FixPackageVersion('1-0'), None)

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