aboutsummaryrefslogtreecommitdiff
path: root/bestflags/flags_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'bestflags/flags_test.py')
-rw-r--r--bestflags/flags_test.py190
1 files changed, 190 insertions, 0 deletions
diff --git a/bestflags/flags_test.py b/bestflags/flags_test.py
new file mode 100644
index 00000000..dbbea77c
--- /dev/null
+++ b/bestflags/flags_test.py
@@ -0,0 +1,190 @@
+# Copyright (c) 2013 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 the classes in module 'flags'.
+
+Part of the Chrome build flags optimization.
+"""
+
+__author__ = 'yuhenglong@google.com (Yuheng Long)'
+
+import random
+import sys
+import unittest
+
+from flags import Flag
+from flags import FlagSet
+
+# The number of tests to test.
+NUM_TESTS = 20
+
+
+class FlagTest(unittest.TestCase):
+ """This class tests the Flag class."""
+
+ def testInit(self):
+ """The value generated should fall within start and end of the spec.
+
+ If the value is not specified, the value generated should fall within start
+ and end of the spec.
+ """
+
+ for _ in range(NUM_TESTS):
+ start = random.randint(1, sys.maxint - 1)
+ end = random.randint(start + 1, sys.maxint)
+
+ spec = 'flag=[%s-%s]' % (start, end)
+
+ test_flag = Flag(spec)
+
+ value = test_flag.GetValue()
+
+ # If the value is not specified when the flag is constructed, a random
+ # value is chosen. This value should fall within start and end of the
+ # spec.
+ assert start <= value and value < end
+
+ def testEqual(self):
+ """Test the equal operator (==) of the flag.
+
+ Two flags are equal if and only if their spec and value are equal.
+ """
+
+ tests = range(NUM_TESTS)
+
+ # Two tasks having the same spec and value should be equivalent.
+ for test in tests:
+ assert Flag(str(test), test) == Flag(str(test), test)
+
+ # Two tasks having different flag set should be different.
+ for test in tests:
+ flag = Flag(str(test), test)
+ other_flag_sets = [other for other in tests if test != other]
+ for other_test in other_flag_sets:
+ assert flag != Flag(str(other_test), other_test)
+
+ def testFormattedForUse(self):
+ """Test the FormattedForUse method of the flag.
+
+ The FormattedForUse replaces the string within the [] with the actual value.
+ """
+
+ for _ in range(NUM_TESTS):
+ start = random.randint(1, sys.maxint - 1)
+ end = random.randint(start + 1, sys.maxint)
+ value = random.randint(start, end - 1)
+
+ spec = 'flag=[%s-%s]' % (start, end)
+
+ test_flag = Flag(spec, value)
+
+ # For numeric flag, the FormattedForUse replaces the string within the []
+ # with the actual value.
+ test_value = test_flag.FormattedForUse()
+ actual_value = 'flag=%s' % value
+
+ assert test_value == actual_value
+
+ for _ in range(NUM_TESTS):
+ value = random.randint(1, sys.maxint - 1)
+
+ test_flag = Flag('flag', value)
+
+ # For boolean flag, the FormattedForUse returns the spec.
+ test_value = test_flag.FormattedForUse()
+ actual_value = 'flag'
+ assert test_value == actual_value
+
+
+class FlagSetTest(unittest.TestCase):
+ """This class test the FlagSet class."""
+
+ def testEqual(self):
+ """Test the equal method of the Class FlagSet.
+
+ Two FlagSet instances are equal if all their flags are equal.
+ """
+
+ flag_names = range(NUM_TESTS)
+
+ # Two flag sets having the same flags should be equivalent.
+ for flag_name in flag_names:
+ spec = '%s' % flag_name
+
+ assert FlagSet([Flag(spec)]) == FlagSet([Flag(spec)])
+
+ # Two flag sets having different flags should be different.
+ for flag_name in flag_names:
+ spec = '%s' % flag_name
+ flag_set = FlagSet([Flag(spec)])
+ other_flag_sets = [other for other in flag_names if flag_name != other]
+ for other_name in other_flag_sets:
+ other_spec = '%s' % other_name
+ assert flag_set != FlagSet([Flag(other_spec)])
+
+ def testGetItem(self):
+ """Test the get item method of the Class FlagSet.
+
+ The flag set is also indexed by the specs. The flag set should return the
+ appropriate flag given the spec.
+ """
+
+ tests = range(NUM_TESTS)
+
+ specs = [str(spec) for spec in tests]
+ flag_array = [Flag(spec) for spec in specs]
+
+ flag_set = FlagSet(flag_array)
+
+ # Created a dictionary of spec and flag, the flag set should return the flag
+ # the same as this dictionary.
+ spec_flag = dict(zip(specs, flag_array))
+
+ for spec in spec_flag:
+ assert flag_set[spec] == spec_flag[spec]
+
+ def testContain(self):
+ """Test the contain method of the Class FlagSet.
+
+ The flag set is also indexed by the specs. The flag set should return true
+ for spec if it contains a flag containing spec.
+ """
+
+ true_tests = range(NUM_TESTS)
+ false_tests = range(NUM_TESTS, NUM_TESTS * 2)
+
+ specs = [str(spec) for spec in true_tests]
+
+ flag_set = FlagSet([Flag(spec) for spec in specs])
+
+ for spec in specs:
+ assert spec in flag_set
+
+ for spec in false_tests:
+ assert spec not in flag_set
+
+ def testFormattedForUse(self):
+ """Test the FormattedForUse method of the Class FlagSet.
+
+ The output should be a sorted list of strings.
+ """
+
+ flag_names = range(NUM_TESTS)
+ flag_names.reverse()
+ flags = []
+ result = []
+
+ # Construct the flag set.
+ for flag_name in flag_names:
+ spec = '%s' % flag_name
+ flags.append(Flag(spec))
+ result.append(spec)
+
+ flag_set = FlagSet(flags)
+
+ # The results string should be sorted.
+ assert sorted(result) == flag_set.FormattedForUse()
+
+
+if __name__ == '__main__':
+ unittest.main()