blob: 2c3cf0fdf2d76e4bd4ed075942127dae2f6ecd60 [file] [log] [blame]
# 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)