From a9de3ce5439a030d59584daa540dfb5d9928ef92 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 4 Jun 2018 19:07:49 +0300 Subject: [PATCH] PY-30249: For params declared as heterogeneous list -- use union [1, '2'] means argument is int | str --- .../pyTestParametrized/PyTestParamterized.kt | 3 ++- .../testCompletion/after_test_parametrized.txt | 16 +++++++++++----- .../testData/testCompletion/test_parametrized.py | 16 +++++++++++----- .../testing/PyTestFixtureAndParametrizedTest.kt | 2 +- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/python/src/com/jetbrains/python/testing/pyTestParametrized/PyTestParamterized.kt b/python/src/com/jetbrains/python/testing/pyTestParametrized/PyTestParamterized.kt index acf589bcd518..3d656f63db40 100644 --- a/python/src/com/jetbrains/python/testing/pyTestParametrized/PyTestParamterized.kt +++ b/python/src/com/jetbrains/python/testing/pyTestParametrized/PyTestParamterized.kt @@ -58,7 +58,8 @@ private fun getParametersFromDecorator(decorator: PyDecorator, evalContext: Type //Could be union of tuples val members = iteratedItemType.members for (i in 0 until parameterTypes.size) { - parameterTypes[i] = PyUnionType.union(members.map { (it as? PyTupleType)?.getElementType(i) }) + // If iterated elements is tuple -- open it. Otherwise use as union + parameterTypes[i] = PyUnionType.union(members.map { (it as? PyTupleType)?.getElementType(i) ?: it }) } } is PyTupleType -> iteratedItemType.elementTypes.forEachIndexed { i, type -> if (parameterTypes.size > i) parameterTypes[i] = type } diff --git a/python/testData/testCompletion/after_test_parametrized.txt b/python/testData/testCompletion/after_test_parametrized.txt index aa4c5f97130e..0d294d17899f 100644 --- a/python/testData/testCompletion/after_test_parametrized.txt +++ b/python/testData/testCompletion/after_test_parametrized.txt @@ -8,11 +8,17 @@ import pytest @pytest.mark.parametrize("x", [0, 1]) @pytest.mark.parametrize("y", [2, 3]) def test_returns_correct_result(test_input, expected, x, y): # False positive: unused parameters - y.bit_length() - x.bit_length() - test_input.__len__() - expected.bit_length() + y.bit_length() # + x.bit_length() # + test_input.__len__() # + expected.bit_length() # @pytest.mark.parametrize(('x', 'y'), [(1, 2, 3, 4)]) # Too many values in tuple, should be 2 def test_wrong_number_of_parameters(x, y): - x.bit_length() + x.bit_length() # + +@pytest.mark.parametrize("y", ['2', 3]) +def test_foo(y): + y.bit_length() # + y.__xor__( )# + y.upper()# \ No newline at end of file diff --git a/python/testData/testCompletion/test_parametrized.py b/python/testData/testCompletion/test_parametrized.py index c160eaafad2f..231c4015ca9d 100644 --- a/python/testData/testCompletion/test_parametrized.py +++ b/python/testData/testCompletion/test_parametrized.py @@ -8,11 +8,17 @@ import pytest @pytest.mark.parametrize("x", [0, 1]) @pytest.mark.parametrize("y", [2, 3]) def test_returns_correct_result(test_input, expected, x, y): # False positive: unused parameters - y.bit_len - x.bit_len - test_input.len - expected.bit_len + y.bit_len# + x.bit_len# + test_input.len# + expected.bit_len# @pytest.mark.parametrize(('x', 'y'), [(1, 2, 3, 4)]) # Too many values in tuple, should be 2 def test_wrong_number_of_parameters(x, y): - x.bit_len + x.bit_len# + +@pytest.mark.parametrize("y", ['2', 3]) +def test_foo(y): + y.bit_len# + y.__xor# + y.uppe# \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/testing/PyTestFixtureAndParametrizedTest.kt b/python/testSrc/com/jetbrains/python/testing/PyTestFixtureAndParametrizedTest.kt index 85fbc9577767..8b7d5352933c 100644 --- a/python/testSrc/com/jetbrains/python/testing/PyTestFixtureAndParametrizedTest.kt +++ b/python/testSrc/com/jetbrains/python/testing/PyTestFixtureAndParametrizedTest.kt @@ -27,7 +27,7 @@ class PyTestFixtureAndParametrizedTest : PyTestCase() { fun testTypeCompletion() { myFixture.copyDirectoryToProject(".", ".") myFixture.configureByFile("test_parametrized.py") - myFixture.completeBasicAllCarets(null) + myFixture.completeBasicAllCarets('\t') myFixture.checkResultByFile("after_test_parametrized.txt") }