Index: tools/nixysa/third_party/gflags-1.0/python/gflags_unittest.py |
=================================================================== |
--- tools/nixysa/third_party/gflags-1.0/python/gflags_unittest.py (revision 0) |
+++ tools/nixysa/third_party/gflags-1.0/python/gflags_unittest.py (revision 0) |
@@ -0,0 +1,1208 @@ |
+#!/usr/bin/env python |
+ |
+# Copyright (c) 2007, Google Inc. |
+# All rights reserved. |
+# |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following disclaimer |
+# in the documentation and/or other materials provided with the |
+# distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived from |
+# this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+"Unittest for flags.py module" |
+ |
+__pychecker__ = "no-local" # for unittest |
+ |
+ |
+import sys |
+import os |
+import shutil |
+import unittest |
+ |
+# We use the name 'flags' internally in this test, for historical reasons. |
+# Don't do this yourself! :-) Just do 'import gflags; FLAGS=gflags.FLAGS; etc' |
+import gflags as flags |
+FLAGS=flags.FLAGS |
+ |
+def MultiLineEqual(expected_help, help): |
+ """Returns True if expected_help == help. Otherwise returns False |
+ and logs the difference in a human-readable way. |
+ """ |
+ if help == expected_help: |
+ return True |
+ |
+ print "Error: FLAGS.MainModuleHelp() didn't return the expected result." |
+ print "Got:" |
+ print help |
+ print "[End of got]" |
+ |
+ help_lines = help.split('\n') |
+ expected_help_lines = expected_help.split('\n') |
+ |
+ num_help_lines = len(help_lines) |
+ num_expected_help_lines = len(expected_help_lines) |
+ |
+ if num_help_lines != num_expected_help_lines: |
+ print "Number of help lines = %d, expected %d" % ( |
+ num_help_lines, num_expected_help_lines) |
+ |
+ num_to_match = min(num_help_lines, num_expected_help_lines) |
+ |
+ for i in range(num_to_match): |
+ if help_lines[i] != expected_help_lines[i]: |
+ print "One discrepancy: Got:" |
+ print help_lines[i] |
+ print "Expected:" |
+ print expected_help_lines[i] |
+ break |
+ else: |
+ # If we got here, found no discrepancy, print first new line. |
+ if num_help_lines > num_expected_help_lines: |
+ print "New help line:" |
+ print help_lines[num_expected_help_lines] |
+ elif num_expected_help_lines > num_help_lines: |
+ print "Missing expected help line:" |
+ print expected_help_lines[num_help_lines] |
+ else: |
+ print "Bug in this test -- discrepancy detected but not found." |
+ |
+ return False |
+ |
+ |
+class FlagsUnitTest(unittest.TestCase): |
+ "Flags Unit Test" |
+ |
+ def test_flags(self): |
+ |
+ ############################################## |
+ # Test normal usage with no (expected) errors. |
+ |
+ # Define flags |
+ number_test_framework_flags = len(FLAGS.RegisteredFlags()) |
+ repeatHelp = "how many times to repeat (0-5)" |
+ flags.DEFINE_integer("repeat", 4, repeatHelp, |
+ lower_bound=0, short_name='r') |
+ flags.DEFINE_string("name", "Bob", "namehelp") |
+ flags.DEFINE_boolean("debug", 0, "debughelp") |
+ flags.DEFINE_boolean("q", 1, "quiet mode") |
+ flags.DEFINE_boolean("quack", 0, "superstring of 'q'") |
+ flags.DEFINE_boolean("noexec", 1, "boolean flag with no as prefix") |
+ flags.DEFINE_integer("x", 3, "how eXtreme to be") |
+ flags.DEFINE_integer("l", 0x7fffffff00000000L, "how long to be") |
+ flags.DEFINE_list('letters', 'a,b,c', "a list of letters") |
+ flags.DEFINE_enum("kwery", None, ['who', 'what', 'why', 'where', 'when'], |
+ "?") |
+ |
+ # Specify number of flags defined above. The short_name defined |
+ # for 'repeat' counts as an extra flag. |
+ number_defined_flags = 10 + 1 |
+ self.assertEqual(len(FLAGS.RegisteredFlags()), |
+ number_defined_flags + number_test_framework_flags) |
+ |
+ assert FLAGS.repeat == 4, "integer default values not set:" + FLAGS.repeat |
+ assert FLAGS.name == 'Bob', "default values not set:" + FLAGS.name |
+ assert FLAGS.debug == 0, "boolean default values not set:" + FLAGS.debug |
+ assert FLAGS.q == 1, "boolean default values not set:" + FLAGS.q |
+ assert FLAGS.x == 3, "integer default values not set:" + FLAGS.x |
+ assert FLAGS.l == 0x7fffffff00000000L, ("integer default values not set:" |
+ + FLAGS.l) |
+ assert FLAGS.letters == ['a', 'b', 'c'], "list default values not set:" \ |
+ + FLAGS.letters |
+ assert FLAGS.kwery is None, ("enum default None value not set:" |
+ + FLAGS.kwery) |
+ |
+ flag_values = FLAGS.FlagValuesDict() |
+ assert flag_values['repeat'] == 4 |
+ assert flag_values['name'] == 'Bob' |
+ assert flag_values['debug'] == 0 |
+ assert flag_values['r'] == 4 # short for of repeat |
+ assert flag_values['q'] == 1 |
+ assert flag_values['quack'] == 0 |
+ assert flag_values['x'] == 3 |
+ assert flag_values['l'] == 0x7fffffff00000000L |
+ assert flag_values['letters'] == ['a', 'b', 'c'] |
+ assert flag_values['kwery'] is None |
+ |
+ # Verify string form of defaults |
+ assert FLAGS['repeat'].default_as_str == "'4'" |
+ assert FLAGS['name'].default_as_str == "'Bob'" |
+ assert FLAGS['debug'].default_as_str == "'false'" |
+ assert FLAGS['q'].default_as_str == "'true'" |
+ assert FLAGS['quack'].default_as_str == "'false'" |
+ assert FLAGS['noexec'].default_as_str == "'true'" |
+ assert FLAGS['x'].default_as_str == "'3'" |
+ assert FLAGS['l'].default_as_str == "'9223372032559808512'" |
+ assert FLAGS['letters'].default_as_str == "'a,b,c'" |
+ |
+ # Verify that the iterator for flags yields all the keys |
+ keys = list(FLAGS) |
+ keys.sort() |
+ reg_flags = FLAGS.RegisteredFlags() |
+ reg_flags.sort() |
+ self.assertEqual(keys, reg_flags) |
+ |
+ # Parse flags |
+ # .. empty command line |
+ argv = ('./program',) |
+ argv = FLAGS(argv) |
+ assert len(argv) == 1, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ |
+ # .. non-empty command line |
+ argv = ('./program', '--debug', '--name=Bob', '-q', '--x=8') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 1, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert FLAGS['debug'].present == 1 |
+ FLAGS['debug'].present = 0 # Reset |
+ assert FLAGS['name'].present == 1 |
+ FLAGS['name'].present = 0 # Reset |
+ assert FLAGS['q'].present == 1 |
+ FLAGS['q'].present = 0 # Reset |
+ assert FLAGS['x'].present == 1 |
+ FLAGS['x'].present = 0 # Reset |
+ |
+ # Flags list |
+ self.assertEqual(len(FLAGS.RegisteredFlags()), |
+ number_defined_flags + number_test_framework_flags) |
+ assert 'name' in FLAGS.RegisteredFlags() |
+ assert 'debug' in FLAGS.RegisteredFlags() |
+ assert 'repeat' in FLAGS.RegisteredFlags() |
+ assert 'r' in FLAGS.RegisteredFlags() |
+ assert 'q' in FLAGS.RegisteredFlags() |
+ assert 'quack' in FLAGS.RegisteredFlags() |
+ assert 'x' in FLAGS.RegisteredFlags() |
+ assert 'l' in FLAGS.RegisteredFlags() |
+ assert 'letters' in FLAGS.RegisteredFlags() |
+ |
+ # has_key |
+ assert FLAGS.has_key('name') |
+ assert not FLAGS.has_key('name2') |
+ assert 'name' in FLAGS |
+ assert 'name2' not in FLAGS |
+ |
+ # try deleting a flag |
+ del FLAGS.r |
+ self.assertEqual(len(FLAGS.RegisteredFlags()), |
+ number_defined_flags - 1 + number_test_framework_flags) |
+ assert not 'r' in FLAGS.RegisteredFlags() |
+ |
+ # .. command line with extra stuff |
+ argv = ('./program', '--debug', '--name=Bob', 'extra') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ assert FLAGS['debug'].present == 1 |
+ FLAGS['debug'].present = 0 # Reset |
+ assert FLAGS['name'].present == 1 |
+ FLAGS['name'].present = 0 # Reset |
+ |
+ # Test reset |
+ argv = ('./program', '--debug') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 1, "wrong number of arguments pulled" |
+ assert argv[0] == './program', "program name not preserved" |
+ assert FLAGS['debug'].present == 1 |
+ assert FLAGS['debug'].value |
+ FLAGS.Reset() |
+ assert FLAGS['debug'].present == 0 |
+ assert not FLAGS['debug'].value |
+ |
+ # Test that reset restores default value when default value is None. |
+ argv = ('./program', '--kwery=who') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 1, "wrong number of arguments pulled" |
+ assert argv[0] == './program', "program name not preserved" |
+ assert FLAGS['kwery'].present == 1 |
+ assert FLAGS['kwery'].value == 'who' |
+ FLAGS.Reset() |
+ assert FLAGS['kwery'].present == 0 |
+ assert FLAGS['kwery'].value == None |
+ |
+ # Test integer argument passing |
+ argv = ('./program', '--x', '0x12345') |
+ argv = FLAGS(argv) |
+ self.assertEquals(FLAGS.x, 0x12345) |
+ self.assertEquals(type(FLAGS.x), int) |
+ |
+ argv = ('./program', '--x', '0x1234567890ABCDEF1234567890ABCDEF') |
+ argv = FLAGS(argv) |
+ self.assertEquals(FLAGS.x, 0x1234567890ABCDEF1234567890ABCDEF) |
+ self.assertEquals(type(FLAGS.x), long) |
+ |
+ # Treat 0-prefixed parameters as base-10, not base-8 |
+ argv = ('./program', '--x', '012345') |
+ argv = FLAGS(argv) |
+ self.assertEquals(FLAGS.x, 12345) |
+ self.assertEquals(type(FLAGS.x), int) |
+ |
+ argv = ('./program', '--x', '0123459') |
+ argv = FLAGS(argv) |
+ self.assertEquals(FLAGS.x, 123459) |
+ self.assertEquals(type(FLAGS.x), int) |
+ |
+ argv = ('./program', '--x', '0x123efg') |
+ try: |
+ argv = FLAGS(argv) |
+ raise AssertionError("failed to detect invalid hex argument") |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ argv = ('./program', '--x', '0X123efg') |
+ try: |
+ argv = FLAGS(argv) |
+ raise AssertionError("failed to detect invalid hex argument") |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ # Test boolean argument parsing |
+ flags.DEFINE_boolean("test0", None, "test boolean parsing") |
+ argv = ('./program', '--notest0') |
+ argv = FLAGS(argv) |
+ assert FLAGS.test0 == 0 |
+ |
+ flags.DEFINE_boolean("test1", None, "test boolean parsing") |
+ argv = ('./program', '--test1') |
+ argv = FLAGS(argv) |
+ assert FLAGS.test1 == 1 |
+ |
+ FLAGS.test0 = None |
+ argv = ('./program', '--test0=false') |
+ argv = FLAGS(argv) |
+ assert FLAGS.test0 == 0 |
+ |
+ FLAGS.test1 = None |
+ argv = ('./program', '--test1=true') |
+ argv = FLAGS(argv) |
+ assert FLAGS.test1 == 1 |
+ |
+ FLAGS.test0 = None |
+ argv = ('./program', '--test0=0') |
+ argv = FLAGS(argv) |
+ assert FLAGS.test0 == 0 |
+ |
+ FLAGS.test1 = None |
+ argv = ('./program', '--test1=1') |
+ argv = FLAGS(argv) |
+ assert FLAGS.test1 == 1 |
+ |
+ # Test booleans that already have 'no' as a prefix |
+ FLAGS.noexec = None |
+ argv = ('./program', '--nonoexec', '--name', 'Bob') |
+ argv = FLAGS(argv) |
+ assert FLAGS.noexec == 0 |
+ |
+ FLAGS.noexec = None |
+ argv = ('./program', '--name', 'Bob', '--noexec') |
+ argv = FLAGS(argv) |
+ assert FLAGS.noexec == 1 |
+ |
+ # Test unassigned booleans |
+ flags.DEFINE_boolean("testnone", None, "test boolean parsing") |
+ argv = ('./program',) |
+ argv = FLAGS(argv) |
+ assert FLAGS.testnone == None |
+ |
+ # Test get with default |
+ flags.DEFINE_boolean("testget1", None, "test parsing with defaults") |
+ flags.DEFINE_boolean("testget2", None, "test parsing with defaults") |
+ flags.DEFINE_boolean("testget3", None, "test parsing with defaults") |
+ flags.DEFINE_integer("testget4", None, "test parsing with defaults") |
+ argv = ('./program','--testget1','--notestget2') |
+ argv = FLAGS(argv) |
+ assert FLAGS.get('testget1', 'foo') == 1 |
+ assert FLAGS.get('testget2', 'foo') == 0 |
+ assert FLAGS.get('testget3', 'foo') == 'foo' |
+ assert FLAGS.get('testget4', 'foo') == 'foo' |
+ |
+ # test list code |
+ lists = [['hello','moo','boo','1'], |
+ [],] |
+ |
+ flags.DEFINE_list('testlist', '', 'test lists parsing') |
+ flags.DEFINE_spaceseplist('testspacelist', '', 'tests space lists parsing') |
+ |
+ for name, sep in (('testlist', ','), ('testspacelist', ' '), |
+ ('testspacelist', '\n')): |
+ for lst in lists: |
+ argv = ('./program', '--%s=%s' % (name, sep.join(lst))) |
+ argv = FLAGS(argv) |
+ self.assertEquals(getattr(FLAGS, name), lst) |
+ |
+ # Test help text |
+ flagsHelp = str(FLAGS) |
+ assert flagsHelp.find("repeat") != -1, "cannot find flag in help" |
+ assert flagsHelp.find(repeatHelp) != -1, "cannot find help string in help" |
+ |
+ # Test flag specified twice |
+ argv = ('./program', '--repeat=4', '--repeat=2', '--debug', '--nodebug') |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.get('repeat', None), 2) |
+ self.assertEqual(FLAGS.get('debug', None), 0) |
+ |
+ # Test MultiFlag with single default value |
+ flags.DEFINE_multistring('s_str', 'sing1', |
+ 'string option that can occur multiple times', |
+ short_name='s') |
+ self.assertEqual(FLAGS.get('s_str', None), [ 'sing1', ]) |
+ |
+ # Test MultiFlag with list of default values |
+ multi_string_defs = [ 'def1', 'def2', ] |
+ flags.DEFINE_multistring('m_str', multi_string_defs, |
+ 'string option that can occur multiple times', |
+ short_name='m') |
+ self.assertEqual(FLAGS.get('m_str', None), multi_string_defs) |
+ |
+ # Test flag specified multiple times with a MultiFlag |
+ argv = ('./program', '--m_str=str1', '-m', 'str2') |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.get('m_str', None), [ 'str1', 'str2', ]) |
+ |
+ # Test single-letter flags; should support both single and double dash |
+ argv = ('./program', '-q', '-x8') |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.get('q', None), 1) |
+ self.assertEqual(FLAGS.get('x', None), 8) |
+ |
+ argv = ('./program', '--q', '--x', '9', '--noqu') |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.get('q', None), 1) |
+ self.assertEqual(FLAGS.get('x', None), 9) |
+ # --noqu should match '--noquack since it's a unique prefix |
+ self.assertEqual(FLAGS.get('quack', None), 0) |
+ |
+ argv = ('./program', '--noq', '--x=10', '--qu') |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.get('q', None), 0) |
+ self.assertEqual(FLAGS.get('x', None), 10) |
+ self.assertEqual(FLAGS.get('quack', None), 1) |
+ |
+ #################################### |
+ # Test flag serialization code: |
+ |
+ oldtestlist = FLAGS.testlist |
+ oldtestspacelist = FLAGS.testspacelist |
+ |
+ argv = ('./program', |
+ FLAGS['test0'].Serialize(), |
+ FLAGS['test1'].Serialize(), |
+ FLAGS['testnone'].Serialize(), |
+ FLAGS['s_str'].Serialize()) |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS['test0'].Serialize(), '--notest0') |
+ self.assertEqual(FLAGS['test1'].Serialize(), '--test1') |
+ self.assertEqual(FLAGS['testnone'].Serialize(), '') |
+ self.assertEqual(FLAGS['s_str'].Serialize(), '--s_str=sing1') |
+ |
+ testlist1 = ['aa', 'bb'] |
+ testspacelist1 = ['aa', 'bb', 'cc'] |
+ FLAGS.testlist = list(testlist1) |
+ FLAGS.testspacelist = list(testspacelist1) |
+ argv = ('./program', |
+ FLAGS['testlist'].Serialize(), |
+ FLAGS['testspacelist'].Serialize()) |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.testlist, testlist1) |
+ self.assertEqual(FLAGS.testspacelist, testspacelist1) |
+ |
+ testlist1 = ['aa some spaces', 'bb'] |
+ testspacelist1 = ['aa', 'bb,some,commas,', 'cc'] |
+ FLAGS.testlist = list(testlist1) |
+ FLAGS.testspacelist = list(testspacelist1) |
+ argv = ('./program', |
+ FLAGS['testlist'].Serialize(), |
+ FLAGS['testspacelist'].Serialize()) |
+ argv = FLAGS(argv) |
+ self.assertEqual(FLAGS.testlist, testlist1) |
+ self.assertEqual(FLAGS.testspacelist, testspacelist1) |
+ |
+ FLAGS.testlist = oldtestlist |
+ FLAGS.testspacelist = oldtestspacelist |
+ |
+ #################################### |
+ # Test flag-update: |
+ |
+ def ArgsString(): |
+ flagnames = FLAGS.RegisteredFlags() |
+ |
+ flagnames.sort() |
+ nonbool_flags = ['--%s %s' % (name, FLAGS.get(name, None)) |
+ for name in flagnames |
+ if not isinstance(FLAGS[name], flags.BooleanFlag)] |
+ |
+ truebool_flags = ['--%s' % (name) |
+ for name in flagnames |
+ if isinstance(FLAGS[name], flags.BooleanFlag) and |
+ FLAGS.get(name, None)] |
+ falsebool_flags = ['--no%s' % (name) |
+ for name in flagnames |
+ if isinstance(FLAGS[name], flags.BooleanFlag) and |
+ not FLAGS.get(name, None)] |
+ return ' '.join(nonbool_flags + truebool_flags + falsebool_flags) |
+ |
+ argv = ('./program', '--repeat=3', '--name=giants', '--nodebug') |
+ FLAGS(argv) |
+ self.assertEqual(FLAGS.get('repeat', None), 3) |
+ self.assertEqual(FLAGS.get('name', None), 'giants') |
+ self.assertEqual(FLAGS.get('debug', None), 0) |
+ self.assertEqual(ArgsString(), |
+ "--kwery None " |
+ "--l 9223372032559808512 " |
+ "--letters ['a', 'b', 'c'] " |
+ "--m ['str1', 'str2'] --m_str ['str1', 'str2'] " |
+ "--name giants " |
+ "--repeat 3 " |
+ "--s ['sing1'] --s_str ['sing1'] " |
+ "--testget4 None --testlist [] " |
+ "--testspacelist [] --x 10 " |
+ "--noexec --quack " |
+ "--test1 " |
+ "--testget1 --no? --nodebug --nohelp --nohelpshort " |
+ "--noq --notest0 --notestget2 " |
+ "--notestget3 --notestnone") |
+ |
+ argv = ('./program', '--debug', '--m_str=upd1', '-s', 'upd2') |
+ FLAGS(argv) |
+ self.assertEqual(FLAGS.get('repeat', None), 3) |
+ self.assertEqual(FLAGS.get('name', None), 'giants') |
+ self.assertEqual(FLAGS.get('debug', None), 1) |
+ |
+ # items appended to existing non-default value lists for --m/--m_str |
+ # new value overwrites default value (not appended to it) for --s/--s_str |
+ self.assertEqual(ArgsString(), |
+ "--kwery None " |
+ "--l 9223372032559808512 " |
+ "--letters ['a', 'b', 'c'] " |
+ "--m ['str1', 'str2', 'upd1'] " |
+ "--m_str ['str1', 'str2', 'upd1'] " |
+ "--name giants " |
+ "--repeat 3 " |
+ "--s ['upd2'] --s_str ['upd2'] " |
+ "--testget4 None --testlist [] " |
+ "--testspacelist [] --x 10 " |
+ "--debug --noexec --quack " |
+ "--test1 " |
+ "--testget1 --no? --nohelp --nohelpshort " |
+ "--noq --notest0 --notestget2 " |
+ "--notestget3 --notestnone") |
+ |
+ |
+ #################################### |
+ # Test all kind of error conditions. |
+ |
+ # Duplicate flag detection |
+ try: |
+ flags.DEFINE_boolean("run", 0, "runhelp", short_name='q') |
+ raise AssertionError("duplicate flag detection failed") |
+ except flags.DuplicateFlag, e: |
+ pass |
+ |
+ try: |
+ flags.DEFINE_boolean("zoom1", 0, "runhelp z1", short_name='z') |
+ flags.DEFINE_boolean("zoom2", 0, "runhelp z2", short_name='z') |
+ raise AssertionError("duplicate flag detection failed") |
+ except flags.DuplicateFlag, e: |
+ pass |
+ |
+ # Make sure allow_override works |
+ try: |
+ flags.DEFINE_boolean("dup1", 0, "runhelp d11", short_name='u', |
+ allow_override=0) |
+ flag = FLAGS.FlagDict()['dup1'] |
+ self.assertEqual(flag.default, 0) |
+ |
+ flags.DEFINE_boolean("dup1", 1, "runhelp d12", short_name='u', |
+ allow_override=1) |
+ flag = FLAGS.FlagDict()['dup1'] |
+ self.assertEqual(flag.default, 1) |
+ except flags.DuplicateFlag, e: |
+ raise AssertionError("allow_override did not permit a flag duplication") |
+ |
+ # Make sure allow_override works |
+ try: |
+ flags.DEFINE_boolean("dup2", 0, "runhelp d21", short_name='u', |
+ allow_override=1) |
+ flag = FLAGS.FlagDict()['dup2'] |
+ self.assertEqual(flag.default, 0) |
+ |
+ flags.DEFINE_boolean("dup2", 1, "runhelp d22", short_name='u', |
+ allow_override=0) |
+ flag = FLAGS.FlagDict()['dup2'] |
+ self.assertEqual(flag.default, 1) |
+ except flags.DuplicateFlag, e: |
+ raise AssertionError("allow_override did not permit a flag duplication") |
+ |
+ # Make sure allow_override doesn't work with None default |
+ try: |
+ flags.DEFINE_boolean("dup3", 0, "runhelp d31", short_name='u', |
+ allow_override=0) |
+ flag = FLAGS.FlagDict()['dup3'] |
+ self.assertEqual(flag.default, 0) |
+ |
+ flags.DEFINE_boolean("dup3", None, "runhelp d32", short_name='u', |
+ allow_override=1) |
+ raise AssertionError('Cannot override a flag with a default of None') |
+ except flags.DuplicateFlag, e: |
+ pass |
+ |
+ # Make sure that when we override, the help string gets updated correctly |
+ flags.DEFINE_boolean("dup3", 0, "runhelp d31", short_name='u', |
+ allow_override=1) |
+ flags.DEFINE_boolean("dup3", 1, "runhelp d32", short_name='u', |
+ allow_override=1) |
+ self.assert_(str(FLAGS).find('runhelp d31') == -1) |
+ self.assert_(str(FLAGS).find('runhelp d32') != -1) |
+ |
+ # Make sure AppendFlagValues works |
+ new_flags = flags.FlagValues() |
+ flags.DEFINE_boolean("new1", 0, "runhelp n1", flag_values=new_flags) |
+ flags.DEFINE_boolean("new2", 0, "runhelp n2", flag_values=new_flags) |
+ self.assertEqual(len(new_flags.FlagDict()), 2) |
+ old_len = len(FLAGS.FlagDict()) |
+ FLAGS.AppendFlagValues(new_flags) |
+ self.assertEqual(len(FLAGS.FlagDict())-old_len, 2) |
+ self.assertEqual("new1" in FLAGS.FlagDict(), True) |
+ self.assertEqual("new2" in FLAGS.FlagDict(), True) |
+ |
+ # Make sure AppendFlagValues works with flags with shortnames. |
+ new_flags = flags.FlagValues() |
+ flags.DEFINE_boolean("new3", 0, "runhelp n3", flag_values=new_flags) |
+ flags.DEFINE_boolean("new4", 0, "runhelp n4", flag_values=new_flags, |
+ short_name="n4") |
+ self.assertEqual(len(new_flags.FlagDict()), 3) |
+ old_len = len(FLAGS.FlagDict()) |
+ FLAGS.AppendFlagValues(new_flags) |
+ self.assertEqual(len(FLAGS.FlagDict())-old_len, 3) |
+ self.assertTrue("new3" in FLAGS.FlagDict()) |
+ self.assertTrue("new4" in FLAGS.FlagDict()) |
+ self.assertTrue("n4" in FLAGS.FlagDict()) |
+ self.assertEqual(FLAGS.FlagDict()['n4'], FLAGS.FlagDict()['new4']) |
+ |
+ # Make sure AppendFlagValues fails on duplicates |
+ flags.DEFINE_boolean("dup4", 0, "runhelp d41") |
+ new_flags = flags.FlagValues() |
+ flags.DEFINE_boolean("dup4", 0, "runhelp d42", flag_values=new_flags) |
+ try: |
+ FLAGS.AppendFlagValues(new_flags) |
+ raise AssertionError("ignore_copy was not set but caused no exception") |
+ except flags.DuplicateFlag, e: |
+ pass |
+ |
+ # Integer out of bounds |
+ try: |
+ argv = ('./program', '--repeat=-4') |
+ FLAGS(argv) |
+ raise AssertionError('integer bounds exception not raised:' |
+ + str(FLAGS.repeat)) |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ # Non-integer |
+ try: |
+ argv = ('./program', '--repeat=2.5') |
+ FLAGS(argv) |
+ raise AssertionError("malformed integer value exception not raised") |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ # Missing required arugment |
+ try: |
+ argv = ('./program', '--name') |
+ FLAGS(argv) |
+ raise AssertionError("Flag argument required exception not raised") |
+ except flags.FlagsError: |
+ pass |
+ |
+ # Non-boolean arguments for boolean |
+ try: |
+ argv = ('./program', '--debug=goofup') |
+ FLAGS(argv) |
+ raise AssertionError("Illegal flag value exception not raised") |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ try: |
+ argv = ('./program', '--debug=42') |
+ FLAGS(argv) |
+ raise AssertionError("Illegal flag value exception not raised") |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ |
+ # Non-numeric argument for integer flag --repeat |
+ try: |
+ argv = ('./program', '--repeat', 'Bob', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Illegal flag value exception not raised") |
+ except flags.IllegalFlagValue: |
+ pass |
+ |
+ ################################################ |
+ # Code to test the flagfile=<> loading behavior |
+ ################################################ |
+ def _SetupTestFiles(self): |
+ """ Creates and sets up some dummy flagfile files with bogus flags""" |
+ |
+ # Figure out where to create temporary files |
+ tmp_path = '/tmp/flags_unittest' |
+ if os.path.exists(tmp_path): |
+ shutil.rmtree(tmp_path) |
+ os.makedirs(tmp_path) |
+ |
+ try: |
+ tmp_flag_file_1 = open((tmp_path + '/UnitTestFile1.tst'), 'w') |
+ tmp_flag_file_2 = open((tmp_path + '/UnitTestFile2.tst'), 'w') |
+ tmp_flag_file_3 = open((tmp_path + '/UnitTestFile3.tst'), 'w') |
+ except IOError, e_msg: |
+ print e_msg |
+ print 'FAIL\n File Creation problem in Unit Test' |
+ sys.exit(1) |
+ |
+ # put some dummy flags in our test files |
+ tmp_flag_file_1.write('#A Fake Comment\n') |
+ tmp_flag_file_1.write('--UnitTestMessage1=tempFile1!\n') |
+ tmp_flag_file_1.write('\n') |
+ tmp_flag_file_1.write('--UnitTestNumber=54321\n') |
+ tmp_flag_file_1.write('--noUnitTestBoolFlag\n') |
+ file_list = [tmp_flag_file_1.name] |
+ # this one includes test file 1 |
+ tmp_flag_file_2.write('//A Different Fake Comment\n') |
+ tmp_flag_file_2.write('--flagfile=%s\n' % tmp_flag_file_1.name) |
+ tmp_flag_file_2.write('--UnitTestMessage2=setFromTempFile2\n') |
+ tmp_flag_file_2.write('\t\t\n') |
+ tmp_flag_file_2.write('--UnitTestNumber=6789a\n') |
+ file_list.append(tmp_flag_file_2.name) |
+ # this file points to itself |
+ tmp_flag_file_3.write('--flagfile=%s\n' % tmp_flag_file_3.name) |
+ tmp_flag_file_3.write('--UnitTestMessage1=setFromTempFile3\n') |
+ tmp_flag_file_3.write('#YAFC\n') |
+ tmp_flag_file_3.write('--UnitTestBoolFlag\n') |
+ file_list.append(tmp_flag_file_3.name) |
+ |
+ tmp_flag_file_1.close() |
+ tmp_flag_file_2.close() |
+ tmp_flag_file_3.close() |
+ |
+ return file_list # these are just the file names |
+ # end SetupFiles def |
+ |
+ def _RemoveTestFiles(self, tmp_file_list): |
+ """Closes the files we just created. tempfile deletes them for us """ |
+ for file_name in tmp_file_list: |
+ try: |
+ os.remove(file_name) |
+ except OSError, e_msg: |
+ print '%s\n, Problem deleting test file' % e_msg |
+ #end RemoveTestFiles def |
+ |
+ def __DeclareSomeFlags(self): |
+ flags.DEFINE_string('UnitTestMessage1', 'Foo!', 'You Add Here.') |
+ flags.DEFINE_string('UnitTestMessage2', 'Bar!', 'Hello, Sailor!') |
+ flags.DEFINE_boolean('UnitTestBoolFlag', 0, 'Some Boolean thing') |
+ flags.DEFINE_integer('UnitTestNumber', 12345, 'Some integer', |
+ lower_bound=0) |
+ flags.DEFINE_list('UnitTestList', "1,2,3", 'Some list') |
+ |
+ def _UndeclareSomeFlags(self): |
+ FLAGS.__delattr__('UnitTestMessage1') |
+ FLAGS.__delattr__('UnitTestMessage2') |
+ FLAGS.__delattr__('UnitTestBoolFlag') |
+ FLAGS.__delattr__('UnitTestNumber') |
+ FLAGS.__delattr__('UnitTestList') |
+ |
+ #### Flagfile Unit Tests #### |
+ def testMethod_flagfiles_1(self): |
+ """ Test trivial case with no flagfile based options. """ |
+ self.__DeclareSomeFlags() |
+ fake_cmd_line = 'fooScript --UnitTestBoolFlag' |
+ fake_argv = fake_cmd_line.split(' ') |
+ FLAGS(fake_argv) |
+ self.assertEqual( FLAGS.UnitTestBoolFlag, 1) |
+ self.assertEqual( fake_argv, FLAGS.ReadFlagsFromFiles(fake_argv)) |
+ self._UndeclareSomeFlags() |
+ # end testMethodOne |
+ |
+ def testMethod_flagfiles_2(self): |
+ """Tests parsing one file + arguments off simulated argv""" |
+ self.__DeclareSomeFlags() |
+ tmp_files = self._SetupTestFiles() |
+ # specify our temp file on the fake cmd line |
+ fake_cmd_line = 'fooScript --q --flagfile=%s' % tmp_files[0] |
+ fake_argv = fake_cmd_line.split(' ') |
+ |
+ # We should see the original cmd line with the file's contents spliced in. |
+ # Note that these will be in REVERSE order from order encountered in file |
+ # This is done so arguements we encounter sooner will have priority. |
+ expected_results = ['fooScript', |
+ '--UnitTestMessage1=tempFile1!', |
+ '--UnitTestNumber=54321', |
+ '--noUnitTestBoolFlag', |
+ '--q'] |
+ test_results = FLAGS.ReadFlagsFromFiles(fake_argv) |
+ self.assertEqual(expected_results, test_results) |
+ self._RemoveTestFiles(tmp_files) |
+ self._UndeclareSomeFlags() |
+ # end testTwo def |
+ |
+ def testMethod_flagfiles_3(self): |
+ """Tests parsing nested files + arguments of simulated argv""" |
+ self.__DeclareSomeFlags() |
+ tmp_files = self._SetupTestFiles() |
+ # specify our temp file on the fake cmd line |
+ fake_cmd_line = ('fooScript --UnitTestNumber=77 --flagfile=%s' |
+ % tmp_files[1]) |
+ fake_argv = fake_cmd_line.split(' ') |
+ |
+ expected_results = ['fooScript', |
+ '--UnitTestMessage1=tempFile1!', |
+ '--UnitTestNumber=54321', |
+ '--noUnitTestBoolFlag', |
+ '--UnitTestMessage2=setFromTempFile2', |
+ '--UnitTestNumber=6789a', |
+ '--UnitTestNumber=77'] |
+ test_results = FLAGS.ReadFlagsFromFiles(fake_argv) |
+ self.assertEqual(expected_results, test_results) |
+ self._RemoveTestFiles(tmp_files) |
+ self._UndeclareSomeFlags() |
+ # end testThree def |
+ |
+ def testMethod_flagfiles_4(self): |
+ """Tests parsing self-referential files + arguments of simulated argv. |
+ This test should print a warning to stderr of some sort. |
+ """ |
+ self.__DeclareSomeFlags() |
+ tmp_files = self._SetupTestFiles() |
+ # specify our temp file on the fake cmd line |
+ fake_cmd_line = ('fooScript --flagfile=%s --noUnitTestBoolFlag' |
+ % tmp_files[2]) |
+ fake_argv = fake_cmd_line.split(' ') |
+ expected_results = ['fooScript', |
+ '--UnitTestMessage1=setFromTempFile3', |
+ '--UnitTestBoolFlag', |
+ '--noUnitTestBoolFlag' ] |
+ |
+ test_results = FLAGS.ReadFlagsFromFiles(fake_argv) |
+ self.assertEqual(expected_results, test_results) |
+ self._RemoveTestFiles(tmp_files) |
+ self._UndeclareSomeFlags() |
+ |
+ def test_flagfiles_user_path_expansion(self): |
+ """Test that user directory referenced paths (ie. ~/foo) are correctly |
+ expanded. This test depends on whatever account's running the unit test |
+ to have read/write access to their own home directory, otherwise it'll |
+ FAIL. |
+ """ |
+ self.__DeclareSomeFlags() |
+ fake_flagfile_item_style_1 = '--flagfile=~/foo.file' |
+ fake_flagfile_item_style_2 = '-flagfile=~/foo.file' |
+ |
+ expected_results = os.path.expanduser('~/foo.file') |
+ |
+ test_results = FLAGS.ExtractFilename(fake_flagfile_item_style_1) |
+ self.assertEqual(expected_results, test_results) |
+ |
+ test_results = FLAGS.ExtractFilename(fake_flagfile_item_style_2) |
+ self.assertEqual(expected_results, test_results) |
+ |
+ self._UndeclareSomeFlags() |
+ |
+ # end testFour def |
+ |
+ def test_no_touchy_non_flags(self): |
+ """ |
+ Test that the flags parser does not mutilate arguments which are |
+ not supposed to be flags |
+ """ |
+ self.__DeclareSomeFlags() |
+ fake_argv = ['fooScript', '--UnitTestBoolFlag', |
+ 'command', '--command_arg1', '--UnitTestBoom', '--UnitTestB'] |
+ argv = FLAGS(fake_argv) |
+ self.assertEqual(argv, fake_argv[:1] + fake_argv[2:]) |
+ self._UndeclareSomeFlags() |
+ |
+ def test_SetDefault(self): |
+ """ |
+ Test changing flag defaults. |
+ """ |
+ self.__DeclareSomeFlags() |
+ # Test that SetDefault changes both the default and the value, |
+ # and that the value is changed when one is given as an option. |
+ FLAGS['UnitTestMessage1'].SetDefault('New value') |
+ self.assertEqual(FLAGS.UnitTestMessage1, 'New value') |
+ self.assertEqual(FLAGS['UnitTestMessage1'].default_as_str,"'New value'") |
+ FLAGS([ 'dummyscript', '--UnitTestMessage1=Newer value' ]) |
+ self.assertEqual(FLAGS.UnitTestMessage1, 'Newer value') |
+ |
+ # Test that setting the default to None works correctly. |
+ FLAGS['UnitTestNumber'].SetDefault(None) |
+ self.assertEqual(FLAGS.UnitTestNumber, None) |
+ self.assertEqual(FLAGS['UnitTestNumber'].default_as_str, None) |
+ FLAGS([ 'dummyscript', '--UnitTestNumber=56' ]) |
+ self.assertEqual(FLAGS.UnitTestNumber, 56) |
+ |
+ # Test that setting the default to zero works correctly. |
+ FLAGS['UnitTestNumber'].SetDefault(0) |
+ self.assertEqual(FLAGS.UnitTestNumber, 0) |
+ self.assertEqual(FLAGS['UnitTestNumber'].default_as_str, "'0'") |
+ FLAGS([ 'dummyscript', '--UnitTestNumber=56' ]) |
+ self.assertEqual(FLAGS.UnitTestNumber, 56) |
+ |
+ # Test that setting the default to "" works correctly. |
+ FLAGS['UnitTestMessage1'].SetDefault("") |
+ self.assertEqual(FLAGS.UnitTestMessage1, "") |
+ self.assertEqual(FLAGS['UnitTestMessage1'].default_as_str, "''") |
+ FLAGS([ 'dummyscript', '--UnitTestMessage1=fifty-six' ]) |
+ self.assertEqual(FLAGS.UnitTestMessage1, "fifty-six") |
+ |
+ # Test that setting the default to false works correctly. |
+ FLAGS['UnitTestBoolFlag'].SetDefault(False) |
+ self.assertEqual(FLAGS.UnitTestBoolFlag, False) |
+ self.assertEqual(FLAGS['UnitTestBoolFlag'].default_as_str, "'false'") |
+ FLAGS([ 'dummyscript', '--UnitTestBoolFlag=true' ]) |
+ self.assertEqual(FLAGS.UnitTestBoolFlag, True) |
+ |
+ # Test that setting a list default works correctly. |
+ FLAGS['UnitTestList'].SetDefault('4,5,6') |
+ self.assertEqual(FLAGS.UnitTestList, ['4', '5', '6']) |
+ self.assertEqual(FLAGS['UnitTestList'].default_as_str, "'4,5,6'") |
+ FLAGS([ 'dummyscript', '--UnitTestList=7,8,9' ]) |
+ self.assertEqual(FLAGS.UnitTestList, ['7', '8', '9']) |
+ |
+ # Test that setting invalid defaults raises exceptions |
+ self.assertRaises(flags.IllegalFlagValue, |
+ FLAGS['UnitTestNumber'].SetDefault, 'oops') |
+ self.assertRaises(flags.IllegalFlagValue, |
+ FLAGS['UnitTestNumber'].SetDefault, -1) |
+ self.assertRaises(flags.IllegalFlagValue, |
+ FLAGS['UnitTestBoolFlag'].SetDefault, 'oops') |
+ |
+ self._UndeclareSomeFlags() |
+ |
+ def testMethod_ShortestUniquePrefixes(self): |
+ """ |
+ Test FlagValues.ShortestUniquePrefixes |
+ """ |
+ flags.DEFINE_string('a', '', '') |
+ flags.DEFINE_string('abc', '', '') |
+ flags.DEFINE_string('common_a_string', '', '') |
+ flags.DEFINE_boolean('common_b_boolean', 0, '') |
+ flags.DEFINE_boolean('common_c_boolean', 0, '') |
+ flags.DEFINE_boolean('common', 0, '') |
+ flags.DEFINE_integer('commonly', 0, '') |
+ flags.DEFINE_boolean('zz', 0, '') |
+ flags.DEFINE_integer('nozz', 0, '') |
+ |
+ shorter_flags = FLAGS.ShortestUniquePrefixes(FLAGS.FlagDict()) |
+ |
+ expected_results = {'nocommon_b_boolean': 'nocommon_b', |
+ 'common_c_boolean': 'common_c', |
+ 'common_b_boolean': 'common_b', |
+ 'a': 'a', |
+ 'abc': 'ab', |
+ 'zz': 'z', |
+ 'nozz': 'nozz', |
+ 'common_a_string': 'common_a', |
+ 'commonly': 'commonl', |
+ 'nocommon_c_boolean': 'nocommon_c', |
+ 'nocommon': 'nocommon', |
+ 'common': 'common'} |
+ |
+ for name, shorter in expected_results.iteritems(): |
+ self.assertEquals(shorter_flags[name], shorter) |
+ |
+ FLAGS.__delattr__('a') |
+ FLAGS.__delattr__('abc') |
+ FLAGS.__delattr__('common_a_string') |
+ FLAGS.__delattr__('common_b_boolean') |
+ FLAGS.__delattr__('common_c_boolean') |
+ FLAGS.__delattr__('common') |
+ FLAGS.__delattr__('commonly') |
+ FLAGS.__delattr__('zz') |
+ FLAGS.__delattr__('nozz') |
+ |
+ def test_twodasharg_first(self): |
+ flags.DEFINE_string("twodash_name", "Bob", "namehelp") |
+ flags.DEFINE_string("twodash_blame", "Rob", "blamehelp") |
+ argv = ('./program', |
+ '--', |
+ '--twodash_name=Harry') |
+ argv = FLAGS(argv) |
+ self.assertEqual('Bob', FLAGS.twodash_name) |
+ self.assertEqual(argv[1], '--twodash_name=Harry') |
+ |
+ def test_twodasharg_middle(self): |
+ flags.DEFINE_string("twodash2_name", "Bob", "namehelp") |
+ flags.DEFINE_string("twodash2_blame", "Rob", "blamehelp") |
+ argv = ('./program', |
+ '--twodash2_blame=Larry', |
+ '--', |
+ '--twodash2_name=Harry') |
+ argv = FLAGS(argv) |
+ self.assertEqual('Bob', FLAGS.twodash2_name) |
+ self.assertEqual('Larry', FLAGS.twodash2_blame) |
+ self.assertEqual(argv[1], '--twodash2_name=Harry') |
+ |
+ def test_onedasharg_first(self): |
+ flags.DEFINE_string("onedash_name", "Bob", "namehelp") |
+ flags.DEFINE_string("onedash_blame", "Rob", "blamehelp") |
+ argv = ('./program', |
+ '-', |
+ '--onedash_name=Harry') |
+ argv = FLAGS(argv) |
+ self.assertEqual(argv[1], '-') |
+ # TODO(csilvers): we should still parse --onedash_name=Harry as a |
+ # flag, but currently we don't (we stop flag processing as soon as |
+ # we see the first non-flag). |
+ |
+ def test_unrecognized_flags(self): |
+ # Unknown flag --nosuchflag |
+ try: |
+ argv = ('./program', '--nosuchflag', '--name=Bob', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag, e: |
+ assert e.flagname == 'nosuchflag' |
+ |
+ # Unknown flag -w (short option) |
+ try: |
+ argv = ('./program', '-w', '--name=Bob', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag, e: |
+ assert e.flagname == 'w' |
+ |
+ # Unknown flag --nosuchflagwithparam=foo |
+ try: |
+ argv = ('./program', '--nosuchflagwithparam=foo', '--name=Bob', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag, e: |
+ assert e.flagname == 'nosuchflagwithparam' |
+ |
+ # Allow unknown flag --nosuchflag if specified with undefok |
+ argv = ('./program', '--nosuchflag', '--name=Bob', |
+ '--undefok=nosuchflag', 'extra') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ |
+ # But not if the flagname is misspelled: |
+ try: |
+ argv = ('./program', '--nosuchflag', '--name=Bob', |
+ '--undefok=nosuchfla', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag, e: |
+ assert e.flagname == 'nosuchflag' |
+ |
+ try: |
+ argv = ('./program', '--nosuchflag', '--name=Bob', |
+ '--undefok=nosuchflagg', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag: |
+ assert e.flagname == 'nosuchflag' |
+ |
+ # Allow unknown short flag -w if specified with undefok |
+ argv = ('./program', '-w', '--name=Bob', '--undefok=w', 'extra') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ |
+ # Allow unknown flag --nosuchflagwithparam=foo if specified |
+ # with undefok |
+ argv = ('./program', '--nosuchflagwithparam=foo', '--name=Bob', |
+ '--undefok=nosuchflagwithparam', 'extra') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ |
+ # Even if undefok specifies multiple flags |
+ argv = ('./program', '--nosuchflag', '-w', '--nosuchflagwithparam=foo', |
+ '--name=Bob', |
+ '--undefok=nosuchflag,w,nosuchflagwithparam', |
+ 'extra') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ |
+ # However, not if undefok doesn't specify the flag |
+ try: |
+ argv = ('./program', '--nosuchflag', '--name=Bob', |
+ '--undefok=another_such', 'extra') |
+ FLAGS(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag, e: |
+ assert e.flagname == 'nosuchflag' |
+ |
+ # Make sure --undefok doesn't mask other option errors. |
+ try: |
+ # Provide an option requiring a parameter but not giving it one. |
+ argv = ('./program', '--undefok=name', '--name') |
+ FLAGS(argv) |
+ raise AssertionError("Missing option parameter exception not raised") |
+ except flags.UnrecognizedFlag: |
+ raise AssertionError("Wrong kind of error exception raised") |
+ except flags.FlagsError: |
+ pass |
+ |
+ # Test --undefok <list> |
+ argv = ('./program', '--nosuchflag', '-w', '--nosuchflagwithparam=foo', |
+ '--name=Bob', |
+ '--undefok', |
+ 'nosuchflag,w,nosuchflagwithparam', |
+ 'extra') |
+ argv = FLAGS(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ |
+ def test_nonglobal_flags(self): |
+ """Test use of non-global FlagValues""" |
+ nonglobal_flags = flags.FlagValues() |
+ flags.DEFINE_string("nonglobal_flag", "Bob", "flaghelp", nonglobal_flags) |
+ argv = ('./program', |
+ '--nonglobal_flag=Mary', |
+ 'extra') |
+ argv = nonglobal_flags(argv) |
+ assert len(argv) == 2, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ assert argv[1]=='extra', "extra argument not preserved" |
+ assert nonglobal_flags['nonglobal_flag'].value == 'Mary' |
+ |
+ def test_unrecognized_nonglobal_flags(self): |
+ """Test unrecognized non-global flags""" |
+ nonglobal_flags = flags.FlagValues() |
+ argv = ('./program', |
+ '--nosuchflag') |
+ try: |
+ argv = nonglobal_flags(argv) |
+ raise AssertionError("Unknown flag exception not raised") |
+ except flags.UnrecognizedFlag, e: |
+ assert e.flagname == 'nosuchflag' |
+ pass |
+ |
+ argv = ('./program', |
+ '--nosuchflag', |
+ '--undefok=nosuchflag') |
+ |
+ argv = nonglobal_flags(argv) |
+ assert len(argv) == 1, "wrong number of arguments pulled" |
+ assert argv[0]=='./program', "program name not preserved" |
+ |
+ def test_main_module_help(self): |
+ """Test MainModuleHelp()""" |
+ help = FLAGS.MainModuleHelp() |
+ |
+ # When this test is invoked on behalf of flags_unittest_2_2, |
+ # the main module has not defined any flags. Since there's |
+ # no easy way to run this script in our test environment |
+ # directly from python2.2, don't bother to test the output |
+ # of MainModuleHelp() in that scenario. |
+ if sys.version.startswith('2.2.'): |
+ return |
+ |
+ expected_help = "\n" + sys.argv[0] + ':' + """ |
+ --[no]debug: debughelp |
+ (default: 'false') |
+ -u,--[no]dup1: runhelp d12 |
+ (default: 'true') |
+ -u,--[no]dup2: runhelp d22 |
+ (default: 'true') |
+ -u,--[no]dup3: runhelp d32 |
+ (default: 'true') |
+ --[no]dup4: runhelp d41 |
+ (default: 'false') |
+ -?,--[no]help: show this help |
+ --[no]helpshort: show usage only for this module |
+ --kwery: <who|what|why|where|when>: ? |
+ --l: how long to be |
+ (default: '9223372032559808512') |
+ (an integer) |
+ --letters: a list of letters |
+ (default: 'a,b,c') |
+ (a comma separated list) |
+ -m,--m_str: string option that can occur multiple times; |
+ repeat this option to specify a list of values |
+ (default: "['def1', 'def2']") |
+ --name: namehelp |
+ (default: 'Bob') |
+ --[no]noexec: boolean flag with no as prefix |
+ (default: 'true') |
+ --[no]q: quiet mode |
+ (default: 'true') |
+ --[no]quack: superstring of 'q' |
+ (default: 'false') |
+ -r,--repeat: how many times to repeat (0-5) |
+ (default: '4') |
+ (a non-negative integer) |
+ -s,--s_str: string option that can occur multiple times; |
+ repeat this option to specify a list of values |
+ (default: "['sing1']") |
+ --[no]test0: test boolean parsing |
+ --[no]test1: test boolean parsing |
+ --[no]testget1: test parsing with defaults |
+ --[no]testget2: test parsing with defaults |
+ --[no]testget3: test parsing with defaults |
+ --testget4: test parsing with defaults |
+ (an integer) |
+ --testlist: test lists parsing |
+ (default: '') |
+ (a comma separated list) |
+ --[no]testnone: test boolean parsing |
+ --testspacelist: tests space lists parsing |
+ (default: '') |
+ (a whitespace separated list) |
+ --x: how eXtreme to be |
+ (default: '3') |
+ (an integer) |
+ -z,--[no]zoom1: runhelp z1 |
+ (default: 'false')""" |
+ |
+ if not MultiLineEqual(expected_help, help): |
+ self.fail() |
+ |
+ def test_create_flag_errors(self): |
+ # Since the exception classes are exposed, nothing stops users |
+ # from creating their own instances. This test makes sure that |
+ # people modifying the flags module understand that the external |
+ # mechanisms for creating the exceptions should continue to work. |
+ e = flags.FlagsError() |
+ e = flags.FlagsError("message") |
+ e = flags.DuplicateFlag() |
+ e = flags.DuplicateFlag("message") |
+ e = flags.IllegalFlagValue() |
+ e = flags.IllegalFlagValue("message") |
+ e = flags.UnrecognizedFlag() |
+ e = flags.UnrecognizedFlag("message") |
+ |
+def main(): |
+ unittest.main() |
+ |
+if __name__ == '__main__': |
+ main() |
Property changes on: tools/nixysa/third_party/gflags-1.0/python/gflags_unittest.py |
___________________________________________________________________ |
Added: svn:executable |
+ * |
Added: svn:eol-style |
+ LF |