# tests/arguments.py --------------------------------------------*- python -*- # # This source file is part of the Swift.org open source project # # Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors # Licensed under Apache License v2.0 with Runtime Library Exception # # See https://swift.org/LICENSE.txt for license information # See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors # # ---------------------------------------------------------------------------- import argparse import os import sys import unittest try: # py2 from StringIO import StringIO except ImportError: # py3 from io import StringIO from swift_build_support.arguments import ( action as argaction, type as argtype, ) class ArgumentsTypeTestCase(unittest.TestCase): def test_bool(self): self.assertTrue(argtype.bool("1")) self.assertTrue(argtype.bool("true")) self.assertTrue(argtype.bool("True")) self.assertFalse(argtype.bool("0")) self.assertFalse(argtype.bool("false")) self.assertFalse(argtype.bool("False")) self.assertRaises(argparse.ArgumentTypeError, argtype.bool, 'foobar') self.assertRaises(argparse.ArgumentTypeError, argtype.bool, 'TRUE') self.assertRaises(argparse.ArgumentTypeError, argtype.bool, 'FALSE') def test_shell_split(self): self.assertEqual( argtype.shell_split("-BAR=\"foo bar\" -BAZ='foo,bar',-QUX $baz"), ['-BAR=foo bar', '-BAZ=foo,bar', '-QUX', '$baz']) def test_clang_compiler_version(self): self.assertEqual( argtype.clang_compiler_version('1.23.456').components, ("1", "23", "456", None)) self.assertEqual( argtype.clang_compiler_version('1.2.3').components, ("1", "2", "3", None)) self.assertEqual( argtype.clang_compiler_version('1.2.3.4').components, ("1", "2", "3", "4")) self.assertEqual( argtype.clang_compiler_version('12.34.56').components, ("12", "34", "56", None)) self.assertEqual( argtype.clang_compiler_version('12.34.56.78').components, ("12", "34", "56", "78")) self.assertRaises( argparse.ArgumentTypeError, argtype.clang_compiler_version, "ver1.2.3") self.assertRaises( argparse.ArgumentTypeError, argtype.clang_compiler_version, "1.beta2.3") self.assertRaises( argparse.ArgumentTypeError, argtype.clang_compiler_version, "1.2.preview3") self.assertRaises( argparse.ArgumentTypeError, argtype.clang_compiler_version, "1.2.3-rc4") self.assertRaises( argparse.ArgumentTypeError, argtype.clang_compiler_version, "1..2") def test_executable(self): python = sys.executable self.assertTrue(os.path.isabs(argtype.executable(python))) # On this test directory, specifying "../../build-script-impl" returns # absolute path of build-script-impl impl = os.path.join("..", "..", "build-script-impl") cwd = os.getcwd() os.chdir(os.path.dirname(__file__)) self.assertTrue(os.path.isabs(argtype.executable(impl))) os.chdir(cwd) self.assertRaises( argparse.ArgumentTypeError, argtype.executable, __file__) # this file is not executable self.assertRaises( argparse.ArgumentTypeError, argtype.executable, os.path.dirname(__file__)) self.assertRaises( argparse.ArgumentTypeError, argtype.executable, "/bin/example-command-not-exist") self.assertRaises( argparse.ArgumentTypeError, argtype.executable, "../example-command-not-exist") class ArgumentsActionTestCase(unittest.TestCase): def test_unavailable(self): orig_stderr = sys.stderr parser = argparse.ArgumentParser() parser.add_argument("--foo") parser.add_argument( "--do-not-use", "--never-ever", action=argaction.unavailable) args, unknown_args = parser.parse_known_args( ['--foo', 'bar', '--baz', 'qux']) self.assertEqual(args.foo, 'bar') self.assertEqual(unknown_args, ['--baz', 'qux']) self.assertFalse(hasattr(args, 'sentinel')) stderr = StringIO() sys.stderr = stderr self.assertRaises( SystemExit, parser.parse_known_args, ['--foo', 'bar', '--do-not-use', 'baz']) self.assertIn('--do-not-use', stderr.getvalue()) stderr = StringIO() sys.stderr = stderr self.assertRaises( SystemExit, parser.parse_known_args, ['--foo', 'bar', '--never-ever=baz']) self.assertIn('--never-ever', stderr.getvalue()) sys.stderr = orig_stderr def test_concat(self): # Has default parser = argparse.ArgumentParser() parser.add_argument( "--str-opt", action=argaction.concat, default="def") parser.add_argument( "--list-opt", action=argaction.concat, type=argtype.shell_split, default=["def"]) self.assertEqual( parser.parse_args(['--str-opt', '12', '--str-opt=42']), argparse.Namespace(str_opt="def1242", list_opt=["def"])) self.assertEqual( parser.parse_args(['--list-opt', 'foo 12', '--list-opt=bar 42']), argparse.Namespace( str_opt="def", list_opt=["def", "foo", "12", "bar", "42"])) # Default less parser = argparse.ArgumentParser() parser.add_argument( "--str-opt", action=argaction.concat) parser.add_argument( "--list-opt", action=argaction.concat, type=argtype.shell_split) self.assertEqual( parser.parse_args(['--str-opt', '12', '--str-opt=42']), argparse.Namespace(str_opt="1242", list_opt=None)) self.assertEqual( parser.parse_args(['--list-opt', 'foo 12', '--list-opt=bar 42']), argparse.Namespace( str_opt=None, list_opt=["foo", "12", "bar", "42"])) def test_optional_bool(self): parser = argparse.ArgumentParser() parser.add_argument( "--test-default-default", action=argaction.optional_bool) parser.add_argument( "--test-default-true", action=argaction.optional_bool, default=True) parser.add_argument( "--test-default-false", action=argaction.optional_bool, default=False) args, unknown_args = parser.parse_known_args([]) self.assertEqual(args.test_default_default, False) self.assertEqual(args.test_default_true, True) self.assertEqual(args.test_default_false, False) args, unknown_args = parser.parse_known_args( ['--test-default-default', '0', '--test-default-true', '0', '--test-default-false', '0']) self.assertEqual(args.test_default_default, False) self.assertEqual(args.test_default_true, False) self.assertEqual(args.test_default_false, False) args, unknown_args = parser.parse_known_args( ['--test-default-default', '1', '--test-default-true', '1', '--test-default-false', '1']) self.assertEqual(args.test_default_default, True) self.assertEqual(args.test_default_true, True) self.assertEqual(args.test_default_false, True) args, unknown_args = parser.parse_known_args( ['--test-default-default', '--test-default-true', '--test-default-false']) self.assertEqual(args.test_default_default, True) self.assertEqual(args.test_default_true, True) self.assertEqual(args.test_default_false, True)