|
3 | 3 | from pathlib import Path
|
4 | 4 | import sys
|
5 | 5 | from tempfile import TemporaryDirectory
|
6 |
| -from typing import Any, List, Optional, Set, Tuple |
| 6 | +from typing import Any, Iterable, List, Optional, Set, Tuple |
7 | 7 | from typing_extensions import Literal
|
8 | 8 | import unittest
|
9 | 9 | from unittest import TestCase
|
10 | 10 |
|
11 | 11 | from tap import Tap
|
12 | 12 |
|
13 | 13 |
|
| 14 | +def stringify(arg_list: Iterable[Any]) -> List[str]: |
| 15 | + """Converts an iterable of arguments of any type to a list of strings. |
| 16 | +
|
| 17 | + :param arg_list: An iterable of arguments of any type. |
| 18 | + :return: A list of the arguments as strings. |
| 19 | + """ |
| 20 | + return [str(arg) for arg in arg_list] |
| 21 | + |
| 22 | + |
14 | 23 | class EdgeCaseTests(TestCase):
|
15 | 24 | def test_empty(self) -> None:
|
16 | 25 | class EmptyTap(Tap):
|
@@ -113,8 +122,113 @@ def test_both_assigned_okay(self):
|
113 | 122 | self.assertEqual(args.arg_list_str_required, ['hi', 'there'])
|
114 | 123 |
|
115 | 124 |
|
116 |
| -class OptionalTests(TestCase): |
117 |
| - pass |
| 125 | +# TODO: need to implement list[str] etc. |
| 126 | +# class ParameterizedStandardCollectionTap(Tap): |
| 127 | +# arg_list_str: list[str] |
| 128 | +# arg_list_int: list[int] |
| 129 | +# arg_list_int_default: list[int] = [1, 2, 5] |
| 130 | +# arg_set_float: set[float] |
| 131 | +# arg_set_str_default: set[str] = ['one', 'two', 'five'] |
| 132 | +# arg_tuple_int: tuple[int, ...] |
| 133 | +# arg_tuple_float_default: tuple[float, float, float] = (1.0, 2.0, 5.0) |
| 134 | +# arg_tuple_str_override: tuple[str, str] = ('hi', 'there') |
| 135 | +# arg_optional_list_int: Optional[list[int]] = None |
| 136 | + |
| 137 | + |
| 138 | +# class ParameterizedStandardCollectionTests(TestCase): |
| 139 | +# @unittest.skipIf(sys.version_info < (3, 9), 'Parameterized standard collections (e.g., list[int]) introduced in Python 3.9') |
| 140 | +# def test_parameterized_standard_collection(self): |
| 141 | +# arg_list_str = ['a', 'b', 'pi'] |
| 142 | +# arg_list_int = [-2, -5, 10] |
| 143 | +# arg_set_float = {3.54, 2.235} |
| 144 | +# arg_tuple_int = (-4, 5, 9, 103) |
| 145 | +# arg_tuple_str_override = ('why', 'so', 'many', 'tests?') |
| 146 | +# arg_optional_list_int = [5, 4, 3] |
| 147 | + |
| 148 | +# args = ParameterizedStandardCollectionTap().parse_args([ |
| 149 | +# '--arg_list_str', *arg_list_str, |
| 150 | +# '--arg_list_int', *[str(var) for var in arg_list_int], |
| 151 | +# '--arg_set_float', *[str(var) for var in arg_set_float], |
| 152 | +# '--arg_tuple_int', *[str(var) for var in arg_tuple_int], |
| 153 | +# '--arg_tuple_str_override', *arg_tuple_str_override, |
| 154 | +# '--arg_optional_list_int', *[str(var) for var in arg_optional_list_int] |
| 155 | +# ]) |
| 156 | + |
| 157 | +# self.assertEqual(args.arg_list_str, arg_list_str) |
| 158 | +# self.assertEqual(args.arg_list_int, arg_list_int) |
| 159 | +# self.assertEqual(args.arg_list_int_default, ParameterizedStandardCollectionTap.arg_list_int_default) |
| 160 | +# self.assertEqual(args.arg_set_float, arg_set_float) |
| 161 | +# self.assertEqual(args.arg_set_str_default, ParameterizedStandardCollectionTap.arg_set_str_default) |
| 162 | +# self.assertEqual(args.arg_tuple_int, arg_tuple_int) |
| 163 | +# self.assertEqual(args.arg_tuple_float_default, ParameterizedStandardCollectionTap.arg_tuple_float_default) |
| 164 | +# self.assertEqual(args.arg_tuple_str_override, arg_tuple_str_override) |
| 165 | +# self.assertEqual(args.arg_optional_list_int, arg_optional_list_int) |
| 166 | + |
| 167 | + |
| 168 | +class NestedOptionalTypesTap(Tap): |
| 169 | + list_bool: Optional[List[bool]] |
| 170 | + list_int: Optional[List[int]] |
| 171 | + list_str: Optional[List[str]] |
| 172 | + set_bool: Optional[Set[bool]] |
| 173 | + set_int: Optional[Set[int]] |
| 174 | + set_str: Optional[Set[str]] |
| 175 | + # tuple_bool: Optional[Tuple[bool]] |
| 176 | + # tuple_int: Optional[Tuple[int]] |
| 177 | + # tuple_str: Optional[Tuple[str]] |
| 178 | + # tuple_pair: Optional[Tuple[bool, str, int]] |
| 179 | + # tuple_arbitrary_len_bool: Optional[Tuple[bool, ...]] |
| 180 | + # tuple_arbitrary_len_int: Optional[Tuple[int, ...]] |
| 181 | + # tuple_arbitrary_len_str: Optional[Tuple[str, ...]] |
| 182 | + |
| 183 | + |
| 184 | +class NestedOptionalTypeTests(TestCase): |
| 185 | + |
| 186 | + def test_nested_optional_types(self): |
| 187 | + list_bool = [True, False] |
| 188 | + list_int = [0, 1, 2] |
| 189 | + list_str = ['a', 'bee', 'cd', 'ee'] |
| 190 | + set_bool = {True, False, True} |
| 191 | + set_int = {0, 1} |
| 192 | + set_str = {'a', 'bee', 'cd'} |
| 193 | + tuple_bool = (False,) |
| 194 | + tuple_int = (0,) |
| 195 | + tuple_str = ('a',) |
| 196 | + tuple_pair = (False, 'a', 1) |
| 197 | + tuple_arbitrary_len_bool = (True, False, False) |
| 198 | + tuple_arbitrary_len_int = (1, 2, 3, 4) |
| 199 | + tuple_arbitrary_len_str = ('a', 'b') |
| 200 | + |
| 201 | + args = NestedOptionalTypesTap().parse_args([ |
| 202 | + '--list_bool', *stringify(list_bool), |
| 203 | + '--list_int', *stringify(list_int), |
| 204 | + '--list_str', *stringify(list_str), |
| 205 | + '--set_bool', *stringify(set_bool), |
| 206 | + '--set_int', *stringify(set_int), |
| 207 | + '--set_str', *stringify(set_str), |
| 208 | + # '--tuple_bool', *stringify(tuple_bool), |
| 209 | + # '--tuple_int', *stringify(tuple_int), |
| 210 | + # '--tuple_str', *stringify(tuple_str), |
| 211 | + # '--tuple_pair', *stringify(tuple_pair), |
| 212 | + # '--tuple_arbitrary_len_bool', *stringify(tuple_arbitrary_len_bool), |
| 213 | + # '--tuple_arbitrary_len_int', *stringify(tuple_arbitrary_len_int), |
| 214 | + # '--tuple_arbitrary_len_str', *stringify(tuple_arbitrary_len_str), |
| 215 | + ]) |
| 216 | + |
| 217 | + self.assertEqual(args.list_bool, list_bool) |
| 218 | + self.assertEqual(args.list_int, list_int) |
| 219 | + self.assertEqual(args.list_str, list_str) |
| 220 | + |
| 221 | + self.assertEqual(args.set_bool, set_bool) |
| 222 | + self.assertEqual(args.set_int, set_int) |
| 223 | + self.assertEqual(args.set_str, set_str) |
| 224 | + |
| 225 | + self.assertEqual(args.tuple_bool, tuple_bool) |
| 226 | + self.assertEqual(args.tuple_int, tuple_int) |
| 227 | + self.assertEqual(args.tuple_str, tuple_str) |
| 228 | + self.assertEqual(args.tuple_pair, tuple_pair) |
| 229 | + self.assertEqual(args.tuple_arbitrary_len_bool, tuple_arbitrary_len_bool) |
| 230 | + self.assertEqual(args.tuple_arbitrary_len_int, tuple_arbitrary_len_int) |
| 231 | + self.assertEqual(args.tuple_arbitrary_len_str, tuple_arbitrary_len_str) |
118 | 232 |
|
119 | 233 |
|
120 | 234 | class ComplexTypeTap(Tap):
|
@@ -147,7 +261,6 @@ def test_complex_types(self):
|
147 | 261 | self.assertEqual(args.set_path, set_path)
|
148 | 262 | self.assertEqual(args.tuple_path, tuple_path)
|
149 | 263 |
|
150 |
| - |
151 | 264 | class Person:
|
152 | 265 | def __init__(self, name: str):
|
153 | 266 | self.name = name
|
|
0 commit comments