Home | History | Annotate | Download | only in bestflags
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 """Unit tests for the classes in module 'flags'.
      5 
      6 Part of the Chrome build flags optimization.
      7 """
      8 
      9 __author__ = 'yuhenglong (at] google.com (Yuheng Long)'
     10 
     11 import random
     12 import sys
     13 import unittest
     14 
     15 from flags import Flag
     16 from flags import FlagSet
     17 
     18 # The number of tests to test.
     19 NUM_TESTS = 20
     20 
     21 
     22 class FlagTest(unittest.TestCase):
     23   """This class tests the Flag class."""
     24 
     25   def testInit(self):
     26     """The value generated should fall within start and end of the spec.
     27 
     28     If the value is not specified, the value generated should fall within start
     29     and end of the spec.
     30     """
     31 
     32     for _ in range(NUM_TESTS):
     33       start = random.randint(1, sys.maxint - 1)
     34       end = random.randint(start + 1, sys.maxint)
     35 
     36       spec = 'flag=[%s-%s]' % (start, end)
     37 
     38       test_flag = Flag(spec)
     39 
     40       value = test_flag.GetValue()
     41 
     42       # If the value is not specified when the flag is constructed, a random
     43       # value is chosen. This value should fall within start and end of the
     44       # spec.
     45       assert start <= value and value < end
     46 
     47   def testEqual(self):
     48     """Test the equal operator (==) of the flag.
     49 
     50     Two flags are equal if and only if their spec and value are equal.
     51     """
     52 
     53     tests = range(NUM_TESTS)
     54 
     55     # Two tasks having the same spec and value should be equivalent.
     56     for test in tests:
     57       assert Flag(str(test), test) == Flag(str(test), test)
     58 
     59     # Two tasks having different flag set should be different.
     60     for test in tests:
     61       flag = Flag(str(test), test)
     62       other_flag_sets = [other for other in tests if test != other]
     63       for other_test in other_flag_sets:
     64         assert flag != Flag(str(other_test), other_test)
     65 
     66   def testFormattedForUse(self):
     67     """Test the FormattedForUse method of the flag.
     68 
     69     The FormattedForUse replaces the string within the [] with the actual value.
     70     """
     71 
     72     for _ in range(NUM_TESTS):
     73       start = random.randint(1, sys.maxint - 1)
     74       end = random.randint(start + 1, sys.maxint)
     75       value = random.randint(start, end - 1)
     76 
     77       spec = 'flag=[%s-%s]' % (start, end)
     78 
     79       test_flag = Flag(spec, value)
     80 
     81       # For numeric flag, the FormattedForUse replaces the string within the []
     82       # with the actual value.
     83       test_value = test_flag.FormattedForUse()
     84       actual_value = 'flag=%s' % value
     85 
     86       assert test_value == actual_value
     87 
     88     for _ in range(NUM_TESTS):
     89       value = random.randint(1, sys.maxint - 1)
     90 
     91       test_flag = Flag('flag', value)
     92 
     93       # For boolean flag, the FormattedForUse returns the spec.
     94       test_value = test_flag.FormattedForUse()
     95       actual_value = 'flag'
     96       assert test_value == actual_value
     97 
     98 
     99 class FlagSetTest(unittest.TestCase):
    100   """This class test the FlagSet class."""
    101 
    102   def testEqual(self):
    103     """Test the equal method of the Class FlagSet.
    104 
    105     Two FlagSet instances are equal if all their flags are equal.
    106     """
    107 
    108     flag_names = range(NUM_TESTS)
    109 
    110     # Two flag sets having the same flags should be equivalent.
    111     for flag_name in flag_names:
    112       spec = '%s' % flag_name
    113 
    114       assert FlagSet([Flag(spec)]) == FlagSet([Flag(spec)])
    115 
    116     # Two flag sets having different flags should be different.
    117     for flag_name in flag_names:
    118       spec = '%s' % flag_name
    119       flag_set = FlagSet([Flag(spec)])
    120       other_flag_sets = [other for other in flag_names if flag_name != other]
    121       for other_name in other_flag_sets:
    122         other_spec = '%s' % other_name
    123         assert flag_set != FlagSet([Flag(other_spec)])
    124 
    125   def testGetItem(self):
    126     """Test the get item method of the Class FlagSet.
    127 
    128     The flag set is also indexed by the specs. The flag set should return the
    129     appropriate flag given the spec.
    130     """
    131 
    132     tests = range(NUM_TESTS)
    133 
    134     specs = [str(spec) for spec in tests]
    135     flag_array = [Flag(spec) for spec in specs]
    136 
    137     flag_set = FlagSet(flag_array)
    138 
    139     # Created a dictionary of spec and flag, the flag set should return the flag
    140     # the same as this dictionary.
    141     spec_flag = dict(zip(specs, flag_array))
    142 
    143     for spec in spec_flag:
    144       assert flag_set[spec] == spec_flag[spec]
    145 
    146   def testContain(self):
    147     """Test the contain method of the Class FlagSet.
    148 
    149     The flag set is also indexed by the specs. The flag set should return true
    150     for spec if it contains a flag containing spec.
    151     """
    152 
    153     true_tests = range(NUM_TESTS)
    154     false_tests = range(NUM_TESTS, NUM_TESTS * 2)
    155 
    156     specs = [str(spec) for spec in true_tests]
    157 
    158     flag_set = FlagSet([Flag(spec) for spec in specs])
    159 
    160     for spec in specs:
    161       assert spec in flag_set
    162 
    163     for spec in false_tests:
    164       assert spec not in flag_set
    165 
    166   def testFormattedForUse(self):
    167     """Test the FormattedForUse method of the Class FlagSet.
    168 
    169     The output should be a sorted list of strings.
    170     """
    171 
    172     flag_names = range(NUM_TESTS)
    173     flag_names.reverse()
    174     flags = []
    175     result = []
    176 
    177     # Construct the flag set.
    178     for flag_name in flag_names:
    179       spec = '%s' % flag_name
    180       flags.append(Flag(spec))
    181       result.append(spec)
    182 
    183     flag_set = FlagSet(flags)
    184 
    185     # The results string should be sorted.
    186     assert sorted(result) == flag_set.FormattedForUse()
    187 
    188 
    189 if __name__ == '__main__':
    190   unittest.main()
    191