"""Tests for branch_utils."""

from __future__ import absolute_import
import os
import sys
import unittest

# Allow imports from cq/scripts folder
sys.path.insert(
    0,
    os.path.realpath(os.path.join(os.path.dirname(__file__), os.pardir)))
from helpers import branch_utils


class BranchUtilsTest(unittest.TestCase):

  def testAnyBranchAlwaysLaterThanNone(self):
    """Test that the master branch is always the latest branch."""
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('master', None))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('0.00', None))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('3.45', None))

  def testMasterBranchAlwaysLatest(self):
    """Test that the master branch is always the latest branch."""
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('master', 'master'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('master', '2.34'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('master', '0.00'))
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('3.45', 'master'))
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('0.00', 'master'))

  def testNamedBranchLatest(self):
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('pi-tv-dev', 'master'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('pi-tv-dev', '2.34'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('pi-tv-dev', '0.00'))

  def testAndroidTvBranchLatest(self):
    self.assertTrue(branch_utils.is_branch_equal_to_or_later_than(
        'android12-5.4-boreal', None))
    self.assertTrue(branch_utils.is_branch_equal_to_or_later_than(
        'android12-5.4-boreal', 'master'))
    self.assertTrue(branch_utils.is_branch_equal_to_or_later_than(
        'android12-5.4-boreal', '2.34'))
    # Android TV release branch.
    self.assertTrue(branch_utils.is_branch_equal_to_or_later_than(
        'android12-5.4-boreal-factory', None))
    self.assertTrue(branch_utils.is_branch_equal_to_or_later_than(
        'android12-5.4-boreal-factory', 'master'))
    self.assertTrue(branch_utils.is_branch_equal_to_or_later_than(
        'android12-5.4-boreal-factory', '2.34'))

  def testBasicBranchComparison(self):
    """Test that branches compare properly to one another."""
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('1.21', '2.34'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('2.34', '1.21'))
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('2.1', '11.1'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('11.1', '2.1'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.21', '1.21'))

  def testBranchesWithSameMajorDifferentMinor(self):
    """Test that branches with the same major revision compare properly."""
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('1.21', '1.22'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.22', '1.21'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.100', '1.23'))
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('1.23', '1.100'))

  def testBranchesWithSameMajorAndMinorDifferentVersion(self):
    """Test same major, minor, but with a different verison."""
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('1.21', '1.21a'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.21a', '1.21'))
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('1.21a', '1.21b'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.21b', '1.21a'))
    self.assertFalse(
        branch_utils.is_branch_equal_to_or_later_than('1.21d', '1.22'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.22', '1.21d'))
    self.assertTrue(
        branch_utils.is_branch_equal_to_or_later_than('1.21d', '1.21d'))

  def testReleaseBranches(self):
    self.assertFalse(branch_utils.is_release_branch(None))
    self.assertFalse(branch_utils.is_release_branch(''))
    self.assertFalse(branch_utils.is_release_branch('master'))
    self.assertFalse(branch_utils.is_release_branch('estelle'))
    self.assertFalse(branch_utils.is_release_branch('android12-5.4-boreal'))
    self.assertTrue(branch_utils.is_release_branch('1.36'))
    self.assertTrue(branch_utils.is_release_branch('1.36a'))
    self.assertTrue(branch_utils.is_release_branch('1.36_sdk_estelle'))
    self.assertTrue(branch_utils.is_release_branch(
        'android12-5.4-boreal-factory'))
    self.assertTrue(branch_utils.is_release_branch(
        'android12-5.4-boreal-ota12'))

  def testMasterBranches(self):
    self.assertFalse(branch_utils.is_master_branch(None))
    self.assertFalse(branch_utils.is_master_branch(''))
    self.assertFalse(branch_utils.is_master_branch('estelle'))
    self.assertFalse(branch_utils.is_master_branch('1.36'))
    self.assertFalse(branch_utils.is_master_branch('1.36a'))
    self.assertFalse(branch_utils.is_master_branch('1.36_sdk_estelle'))
    self.assertTrue(branch_utils.is_master_branch('master'))

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