|
2 | 2 | from mypy.nodes import CONTRAVARIANT, INVARIANT, COVARIANT
|
3 | 3 | from mypy.subtypes import is_subtype
|
4 | 4 | from mypy.test.typefixture import TypeFixture, InterfaceTypeFixture
|
5 |
| -from mypy.types import Type, Instance, UnpackType |
| 5 | +from mypy.types import Type, Instance, UnpackType, TupleType |
6 | 6 |
|
7 | 7 |
|
8 | 8 | class SubtypingSuite(Suite):
|
@@ -217,6 +217,89 @@ def test_type_var_tuple(self) -> None:
|
217 | 217 | Instance(self.fx.gvi, [self.fx.anyt]),
|
218 | 218 | )
|
219 | 219 |
|
| 220 | + def test_type_var_tuple_with_prefix_suffix(self) -> None: |
| 221 | + self.assert_subtype( |
| 222 | + Instance(self.fx.gvi, [self.fx.a, UnpackType(self.fx.ss)]), |
| 223 | + Instance(self.fx.gvi, [self.fx.a, UnpackType(self.fx.ss)]), |
| 224 | + ) |
| 225 | + self.assert_subtype( |
| 226 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b, UnpackType(self.fx.ss)]), |
| 227 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b, UnpackType(self.fx.ss)]), |
| 228 | + ) |
| 229 | + self.assert_not_subtype( |
| 230 | + Instance(self.fx.gvi, [self.fx.a, UnpackType(self.fx.ss)]), |
| 231 | + Instance(self.fx.gvi, [self.fx.b, UnpackType(self.fx.ss)]), |
| 232 | + ) |
| 233 | + self.assert_not_subtype( |
| 234 | + Instance(self.fx.gvi, [self.fx.a, UnpackType(self.fx.ss)]), |
| 235 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b, UnpackType(self.fx.ss)]), |
| 236 | + ) |
| 237 | + |
| 238 | + self.assert_subtype( |
| 239 | + Instance(self.fx.gvi, [UnpackType(self.fx.ss), self.fx.a]), |
| 240 | + Instance(self.fx.gvi, [UnpackType(self.fx.ss), self.fx.a]), |
| 241 | + ) |
| 242 | + self.assert_not_subtype( |
| 243 | + Instance(self.fx.gvi, [UnpackType(self.fx.ss), self.fx.a]), |
| 244 | + Instance(self.fx.gvi, [UnpackType(self.fx.ss), self.fx.b]), |
| 245 | + ) |
| 246 | + self.assert_not_subtype( |
| 247 | + Instance(self.fx.gvi, [UnpackType(self.fx.ss), self.fx.a]), |
| 248 | + Instance(self.fx.gvi, [UnpackType(self.fx.ss), self.fx.a, self.fx.b]), |
| 249 | + ) |
| 250 | + |
| 251 | + self.assert_subtype( |
| 252 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b, UnpackType(self.fx.ss), self.fx.c]), |
| 253 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b, UnpackType(self.fx.ss), self.fx.c]), |
| 254 | + ) |
| 255 | + self.assert_not_subtype( |
| 256 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b, UnpackType(self.fx.ss), self.fx.c]), |
| 257 | + Instance(self.fx.gvi, [self.fx.a, UnpackType(self.fx.ss), self.fx.b, self.fx.c]), |
| 258 | + ) |
| 259 | + |
| 260 | + def test_type_var_tuple_unpacked_tuple(self) -> None: |
| 261 | + self.assert_subtype( |
| 262 | + Instance(self.fx.gvi, [ |
| 263 | + UnpackType(TupleType( |
| 264 | + [self.fx.a, self.fx.b], fallback=Instance(self.fx.std_tuplei, [self.fx.o]), |
| 265 | + )) |
| 266 | + ]), |
| 267 | + Instance(self.fx.gvi, [self.fx.a, self.fx.b]), |
| 268 | + ) |
| 269 | + self.assert_subtype( |
| 270 | + Instance(self.fx.gvi, [ |
| 271 | + UnpackType(TupleType( |
| 272 | + [self.fx.a, self.fx.b], fallback=Instance(self.fx.std_tuplei, [self.fx.o]), |
| 273 | + )) |
| 274 | + ]), |
| 275 | + Instance(self.fx.gvi, [self.fx.anyt, self.fx.anyt]), |
| 276 | + ) |
| 277 | + self.assert_not_subtype( |
| 278 | + Instance(self.fx.gvi, [ |
| 279 | + UnpackType(TupleType( |
| 280 | + [self.fx.a, self.fx.b], fallback=Instance(self.fx.std_tuplei, [self.fx.o]), |
| 281 | + )) |
| 282 | + ]), |
| 283 | + Instance(self.fx.gvi, [self.fx.a]), |
| 284 | + ) |
| 285 | + self.assert_not_subtype( |
| 286 | + Instance(self.fx.gvi, [ |
| 287 | + UnpackType(TupleType( |
| 288 | + [self.fx.a, self.fx.b], fallback=Instance(self.fx.std_tuplei, [self.fx.o]), |
| 289 | + )) |
| 290 | + ]), |
| 291 | + # Order flipped here. |
| 292 | + Instance(self.fx.gvi, [self.fx.b, self.fx.a]), |
| 293 | + ) |
| 294 | + |
| 295 | + def test_type_var_tuple_unpacked_variable_length_tuple(self) -> None: |
| 296 | + self.assert_strict_subtype( |
| 297 | + Instance(self.fx.gvi, [self.fx.a, self.fx.a]), |
| 298 | + Instance(self.fx.gvi, [ |
| 299 | + UnpackType(Instance(self.fx.std_tuplei, [self.fx.a])), |
| 300 | + ]), |
| 301 | + ) |
| 302 | + |
220 | 303 | # IDEA: Maybe add these test cases (they are tested pretty well in type
|
221 | 304 | # checker tests already):
|
222 | 305 | # * more interface subtyping test cases
|
|
0 commit comments