Repository: wemake-services/wemake-python-styleguide

Issue:
Reassigning variable to itself error (WPS434) false positive
# Bug report

<!--
Hi, thanks for submitting a bug. We appreciate that.

But, we will need some information about what's wrong to help you.
-->

## What's wrong

Flake8 fails on the following code with the error: `WPS434 Found reassigning variable to itself: dx`
```
$ cat test1.py 
"""Incorrect test."""

dx, dy = -dy, dx
$ flake8 test1.py 
test1.py:3:1: WPS434 Found reassigning variable to itself: dx
```

However, flake8 passes when changing the order of the assignments
```
$ cat test2.py 
"""Correct test."""

dy, dx = dx, -dy
$ flake8 test2.py
(No output)
```

## How it should be

There is no reassignment, the first case should also pass this rule. 

## System information

### flake8 information

```
{
  "dependencies": [],
  "platform": {
    "python_implementation": "CPython",
    "python_version": "3.8.5",
    "system": "Linux"
  },
  "plugins": [
    {
      "is_local": false,
      "plugin": "flake8-bandit",
      "version": "2.1.2"
    },
    {
      "is_local": false,
      "plugin": "flake8-broken-line",
      "version": "0.2.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-bugbear",
      "version": "19.8.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-comprehensions",
      "version": "3.3.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-darglint",
      "version": "1.6.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-debugger",
      "version": "3.2.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-docstrings",
      "version": "1.5.0, pydocstyle: 5.1.1"
    },
    {
      "is_local": false,
      "plugin": "flake8-eradicate",
      "version": "0.3.0"
    },
    {
      "is_local": false,
      "plugin": "flake8-string-format",
      "version": "0.2.3"
    },
    {
      "is_local": false,
      "plugin": "flake8_commas",
      "version": "2.0.0"
    },
    {
      "is_local": false,
      "plugin": "flake8_isort",
      "version": "3.0.1"
    },
    {
      "is_local": false,
      "plugin": "flake8_quotes",
      "version": "2.1.2"
    },
    {
      "is_local": false,
      "plugin": "mccabe",
      "version": "0.6.1"
    },
    {
      "is_local": false,
      "plugin": "naming",
      "version": "0.9.1"
    },
    {
      "is_local": false,
      "plugin": "pycodestyle",
      "version": "2.6.0"
    },
    {
      "is_local": false,
      "plugin": "pyflakes",
      "version": "2.2.0"
    },
    {
      "is_local": false,
      "plugin": "radon",
      "version": "4.3.2"
    },
    {
      "is_local": false,
      "plugin": "rst-docstrings",
      "version": "0.0.12"
    },
    {
      "is_local": false,
      "plugin": "wemake_python_styleguide",
      "version": "0.14.1"
    }
  ],
  "version": "3.8.4"
}
```

### pip information

```
add-trailing-comma==2.0.1
apturl==0.5.2
astor==0.8.1
attrs==20.3.0
autopep8==1.5.4
backcall==0.2.0
bandit==1.7.0
blinker==1.4
boto3==1.16.63
botocore==1.19.63
cachetools==4.2.1
catfish==1.4.13
certifi==2019.11.28
cffi==1.14.4
chardet==3.0.4
Click==7.0
colorama==0.4.3
command-not-found==0.3
cryptography==2.8
cupshelpers==1.0
darglint==1.6.0
dbus-python==1.2.16
decorator==4.4.2
defer==1.0.6
distro==1.4.0
distro-info===0.23ubuntu1
docutils==0.16
ecdsa==0.16.1
entrypoints==0.3
enum34==1.1.6
eradicate==1.0
fake-bpy-module-2.90==20200907
flake8==3.8.4
flake8-bandit==2.1.2
flake8-broken-line==0.2.1
flake8-bugbear==19.8.0
flake8-commas==2.0.0
flake8-comprehensions==3.3.1
flake8-debugger==3.2.1
flake8-docstrings==1.5.0
flake8-eradicate==0.3.0
flake8-isort==3.0.1
flake8-polyfill==1.0.2
flake8-quotes==2.1.2
flake8-rst-docstrings==0.0.12
flake8-string-format==0.2.3
future==0.18.2
gitdb==4.0.5
GitPython==3.1.12
google-api-core==1.25.1
google-api-python-client==1.12.8
google-auth==1.24.0
google-auth-httplib2==0.0.4
google-cloud-core==1.5.0
google-cloud-storage==1.32.0
google-crc32c==1.1.2
google-resumable-media==1.2.0
googleapis-common-protos==1.52.0
httplib2==0.18.1
idna==2.8
ipython==7.20.0
ipython-genutils==0.2.0
isort==4.3.5
jedi==0.18.0
Jinja2==2.11.2
jmespath==0.10.0
keyring==18.0.1
language-selector==0.1
launchpadlib==1.10.13
lazr.restfulclient==0.14.2
lazr.uri==1.0.3
lightdm-gtk-greeter-settings==1.2.2
mando==0.6.4
MarkupSafe==1.1.1
mccabe==0.6.1
menulibre==2.2.1
mugshot==0.4.2
mypy==0.790
mypy-extensions==0.4.3
netifaces==0.10.4
numpy==1.15.1
oauthlib==3.1.0
olefile==0.46
onboard==1.4.1
parso==0.8.1
pbr==5.5.1
pep8-naming==0.9.1
pexpect==4.6.0
pickleshare==0.7.5
Pillow==6.2.0
prompt-toolkit==3.0.14
protobuf==3.14.0
psutil==5.5.1
psycopg2-binary==2.8.2
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycairo==1.16.2
pycodestyle==2.6.0
pycparser==2.20
pycups==1.9.73
pydocstyle==5.1.1
pyflakes==2.2.0
Pygments==2.7.4
PyGObject==3.36.0
PyJWT==1.7.1
pymacaroons==0.13.0
PyNaCl==1.3.0
python-apt==2.0.0+ubuntu0.20.4.4
python-dateutil==2.7.3
python-debian===0.1.36ubuntu1
python-jose==3.1.0
pytz==2021.1
PyYAML==5.3.1
radon==4.3.2
reportlab==3.5.34
requests==2.24.0
requests-unixsocket==0.2.0
restructuredtext-lint==1.3.2
rsa==4.7
s3transfer==0.3.4
screen-resolution-extra==0.0.0
SecretStorage==2.3.1
sgt-launcher==0.2.5
simplejson==3.16.0
six==1.14.0
smmap==3.0.5
snowballstemmer==2.1.0
SQLAlchemy==1.3.8
stevedore==3.3.0
systemd-python==234
testfixtures==6.17.1
tokenize-rt==4.1.0
toml==0.10.2
traitlets==5.0.5
typed-ast==1.4.2
typing-extensions==3.7.4.3
ubuntu-advantage-tools==20.3
ubuntu-drivers-common==0.0.0
ufw==0.36
unify==0.5
untokenize==0.1.1
uritemplate==3.0.1
urllib3==1.25.8
validators==0.18.2
wadllib==1.3.3
wcwidth==0.2.5
wemake-python-styleguide==0.14.1
xcffib==0.8.1
xenon==0.7.1
xkit==0.0.0
```


Discussion:
codecov[bot]: # [Codecov](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services) Report
> Merging [#2070](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services) (d503265) into [master](https://codecov.io/gh/wemake-services/wemake-python-styleguide/commit/b52a00e6069b8f0b467ed7d74077e9343ed7f944?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services) (b52a00e) will **not change** coverage.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070/graphs/tree.svg?width=650&height=150&src=pr&token=yMZCKw0D02&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services)](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services)

```diff
@@            Coverage Diff            @@
##            master     #2070   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          118       118           
  Lines         6209      6207    -2     
  Branches      1382      1380    -2     
=========================================
- Hits          6209      6207    -2     
```


| [Impacted Files](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services) | Coverage Δ | |
|---|---|---|
| [...emake\_python\_styleguide/logic/naming/name\_nodes.py](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services#diff-d2VtYWtlX3B5dGhvbl9zdHlsZWd1aWRlL2xvZ2ljL25hbWluZy9uYW1lX25vZGVzLnB5) | `100.00% <100.00%> (ø)` | |
| [...python\_styleguide/visitors/ast/naming/variables.py](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services#diff-d2VtYWtlX3B5dGhvbl9zdHlsZWd1aWRlL3Zpc2l0b3JzL2FzdC9uYW1pbmcvdmFyaWFibGVzLnB5) | `100.00% <100.00%> (ø)` | |
| [...emake\_python\_styleguide/visitors/ast/decorators.py](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services#diff-d2VtYWtlX3B5dGhvbl9zdHlsZWd1aWRlL3Zpc2l0b3JzL2FzdC9kZWNvcmF0b3JzLnB5) | `100.00% <0.00%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services). Last update [b52a00e...d503265](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/2070?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=wemake-services).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a9bec257..52fc1209 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,17 +15,23 @@ Semantic versioning in our case means:
   There are no major releases right now: we are still at `0.x.y` version.
   But, in the future we might change the configuration names / logic,
   change the client facing API, change code conventions signigicantly, etc.
-  
-  
-## 0.15.3 WIP
+
+
+## 0.15.3
 
 ### Bugfixes
 
+- Fixes crash on `python3.10`
 - Fixes `UselessReturningElseViolation` to not report `else` with `break` #1958
+- Fixes `ReassigningVariableToItselfViolation` to not report on `x = (x,)` #1807
+- Fixes `ReassigningVariableToItselfViolation` to extract variables
+  from unary operators #1874
+- Fixes that `f'{some:,}'` was considered too complex #1921
 
 ### Misc
 
-- Adds documentation (and test) for how to run project on Jupyter Notebooks
+- Adds documentation (and tests) for how to run project on Jupyter Notebooks
+- Updates `mypy` to `0.902` and fixes type issues
 
 
 ## 0.15.2
diff --git a/poetry.lock b/poetry.lock
index a642944f..2cdfc940 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -176,7 +176,7 @@ msgpack = ["msgpack-python (>=0.5,<0.6)"]
 
 [[package]]
 name = "certifi"
-version = "2020.12.5"
+version = "2021.5.30"
 description = "Python package for providing Mozilla's CA Bundle."
 category = "dev"
 optional = false
@@ -561,11 +561,11 @@ smmap = ">=3.0.1,<5"
 
 [[package]]
 name = "gitpython"
-version = "3.1.17"
+version = "3.1.18"
 description = "Python Git Library"
 category = "main"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [package.dependencies]
 gitdb = ">=4.0.1,<5"
@@ -909,7 +909,7 @@ python-versions = "*"
 
 [[package]]
 name = "more-itertools"
-version = "8.7.0"
+version = "8.8.0"
 description = "More routines for operating on iterables, beyond itertools"
 category = "dev"
 optional = false
@@ -917,7 +917,7 @@ python-versions = ">=3.5"
 
 [[package]]
 name = "mypy"
-version = "0.812"
+version = "0.902"
 description = "Optional static typing for Python"
 category = "dev"
 optional = false
@@ -925,11 +925,13 @@ python-versions = ">=3.5"
 
 [package.dependencies]
 mypy-extensions = ">=0.4.3,<0.5.0"
-typed-ast = ">=1.4.0,<1.5.0"
+toml = "*"
+typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""}
 typing-extensions = ">=3.7.4"
 
 [package.extras]
 dmypy = ["psutil (>=4.0)"]
+python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
 
 [[package]]
 name = "mypy-extensions"
@@ -1303,7 +1305,7 @@ docutils = ">=0.11,<1.0"
 
 [[package]]
 name = "ruamel.yaml"
-version = "0.17.4"
+version = "0.17.9"
 description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
 category = "dev"
 optional = false
@@ -1460,11 +1462,11 @@ test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-htmlhelp"
-version = "1.0.3"
+version = "2.0.0"
 description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
 category = "dev"
 optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.6"
 
 [package.extras]
 lint = ["flake8", "mypy", "docutils-stubs"]
@@ -1503,7 +1505,7 @@ test = ["pytest"]
 
 [[package]]
 name = "sphinxcontrib-serializinghtml"
-version = "1.1.4"
+version = "1.1.5"
 description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
 category = "dev"
 optional = false
@@ -1624,7 +1626,7 @@ python-versions = "*"
 
 [[package]]
 name = "typing-inspect"
-version = "0.6.0"
+version = "0.7.1"
 description = "Runtime inspection utilities for typing module."
 category = "dev"
 optional = false
@@ -1636,16 +1638,16 @@ typing-extensions = ">=3.7.4"
 
 [[package]]
 name = "urllib3"
-version = "1.26.4"
+version = "1.26.5"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
 
 [package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
 secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
-brotli = ["brotlipy (>=0.6.0)"]
 
 [[package]]
 name = "wasmer"
@@ -1697,7 +1699,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.6"
-content-hash = "8207e4cc59e50935ed92d265c535bbe5943f356771eaae3575f38848f266637a"
+content-hash = "95cc5e1148d4e18025e6d9b2d11c13f11bbb2eae0d0c23f215410396eab341b4"
 
 [metadata.files]
 added-value = [
@@ -1764,8 +1766,8 @@ cachy = [
     {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"},
 ]
 certifi = [
-    {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"},
-    {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"},
+    {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
+    {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
 ]
 chardet = [
     {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
@@ -1946,8 +1948,8 @@ gitdb = [
     {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"},
 ]
 gitpython = [
-    {file = "GitPython-3.1.17-py3-none-any.whl", hash = "sha256:29fe82050709760081f588dd50ce83504feddbebdc4da6956d02351552b1c135"},
-    {file = "GitPython-3.1.17.tar.gz", hash = "sha256:ee24bdc93dce357630764db659edaf6b8d664d4ff5447ccfeedd2dc5c253f41e"},
+    {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"},
+    {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"},
 ]
 grimp = [
     {file = "grimp-1.2.3.tar.gz", hash = "sha256:bfee2e3290844a4b6e008f67c07dab54f38703fc0bf0161119a54731ba1bed0d"},
@@ -2140,32 +2142,33 @@ mistune = [
     {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"},
 ]
 more-itertools = [
-    {file = "more-itertools-8.7.0.tar.gz", hash = "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713"},
-    {file = "more_itertools-8.7.0-py3-none-any.whl", hash = "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced"},
+    {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"},
+    {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"},
 ]
 mypy = [
-    {file = "mypy-0.812-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49"},
-    {file = "mypy-0.812-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c"},
-    {file = "mypy-0.812-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521"},
-    {file = "mypy-0.812-cp35-cp35m-win_amd64.whl", hash = "sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"},
-    {file = "mypy-0.812-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a"},
-    {file = "mypy-0.812-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c"},
-    {file = "mypy-0.812-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6"},
-    {file = "mypy-0.812-cp36-cp36m-win_amd64.whl", hash = "sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064"},
-    {file = "mypy-0.812-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56"},
-    {file = "mypy-0.812-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8"},
-    {file = "mypy-0.812-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7"},
-    {file = "mypy-0.812-cp37-cp37m-win_amd64.whl", hash = "sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564"},
-    {file = "mypy-0.812-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506"},
-    {file = "mypy-0.812-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5"},
-    {file = "mypy-0.812-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66"},
-    {file = "mypy-0.812-cp38-cp38-win_amd64.whl", hash = "sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e"},
-    {file = "mypy-0.812-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a"},
-    {file = "mypy-0.812-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a"},
-    {file = "mypy-0.812-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97"},
-    {file = "mypy-0.812-cp39-cp39-win_amd64.whl", hash = "sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df"},
-    {file = "mypy-0.812-py3-none-any.whl", hash = "sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4"},
-    {file = "mypy-0.812.tar.gz", hash = "sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119"},
+    {file = "mypy-0.902-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3f12705eabdd274b98f676e3e5a89f247ea86dc1af48a2d5a2b080abac4e1243"},
+    {file = "mypy-0.902-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2f9fedc1f186697fda191e634ac1d02f03d4c260212ccb018fabbb6d4b03eee8"},
+    {file = "mypy-0.902-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0756529da2dd4d53d26096b7969ce0a47997123261a5432b48cc6848a2cb0bd4"},
+    {file = "mypy-0.902-cp35-cp35m-win_amd64.whl", hash = "sha256:68a098c104ae2b75e946b107ef69dd8398d54cb52ad57580dfb9fc78f7f997f0"},
+    {file = "mypy-0.902-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cd01c599cf9f897b6b6c6b5d8b182557fb7d99326bcdf5d449a0fbbb4ccee4b9"},
+    {file = "mypy-0.902-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e89880168c67cf4fde4506b80ee42f1537ad66ad366c101d388b3fd7d7ce2afd"},
+    {file = "mypy-0.902-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ebe2bc9cb638475f5d39068d2dbe8ae1d605bb8d8d3ff281c695df1670ab3987"},
+    {file = "mypy-0.902-cp36-cp36m-win_amd64.whl", hash = "sha256:f89bfda7f0f66b789792ab64ce0978e4a991a0e4dd6197349d0767b0f1095b21"},
+    {file = "mypy-0.902-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:746e0b0101b8efec34902810047f26a8c80e1efbb4fc554956d848c05ef85d76"},
+    {file = "mypy-0.902-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0190fb77e93ce971954c9e54ea61de2802065174e5e990c9d4c1d0f54fbeeca2"},
+    {file = "mypy-0.902-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:b5dfcd22c6bab08dfeded8d5b44bdcb68c6f1ab261861e35c470b89074f78a70"},
+    {file = "mypy-0.902-cp37-cp37m-win_amd64.whl", hash = "sha256:b5ba1f0d5f9087e03bf5958c28d421a03a4c1ad260bf81556195dffeccd979c4"},
+    {file = "mypy-0.902-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9ef5355eaaf7a23ab157c21a44c614365238a7bdb3552ec3b80c393697d974e1"},
+    {file = "mypy-0.902-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:517e7528d1be7e187a5db7f0a3e479747307c1b897d9706b1c662014faba3116"},
+    {file = "mypy-0.902-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:fd634bc17b1e2d6ce716f0e43446d0d61cdadb1efcad5c56ca211c22b246ebc8"},
+    {file = "mypy-0.902-cp38-cp38-win_amd64.whl", hash = "sha256:fc4d63da57ef0e8cd4ab45131f3fe5c286ce7dd7f032650d0fbc239c6190e167"},
+    {file = "mypy-0.902-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:353aac2ce41ddeaf7599f1c73fed2b75750bef3b44b6ad12985a991bc002a0da"},
+    {file = "mypy-0.902-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae94c31bb556ddb2310e4f913b706696ccbd43c62d3331cd3511caef466871d2"},
+    {file = "mypy-0.902-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8be7bbd091886bde9fcafed8dd089a766fa76eb223135fe5c9e9798f78023a20"},
+    {file = "mypy-0.902-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:4efc67b9b3e2fddbe395700f91d5b8deb5980bfaaccb77b306310bd0b9e002eb"},
+    {file = "mypy-0.902-cp39-cp39-win_amd64.whl", hash = "sha256:9f1d74eeb3f58c7bd3f3f92b8f63cb1678466a55e2c4612bf36909105d0724ab"},
+    {file = "mypy-0.902-py3-none-any.whl", hash = "sha256:a26d0e53e90815c765f91966442775cf03b8a7514a4e960de7b5320208b07269"},
+    {file = "mypy-0.902.tar.gz", hash = "sha256:9236c21194fde5df1b4d8ebc2ef2c1f2a5dc7f18bcbea54274937cae2e20a01c"},
 ]
 mypy-extensions = [
     {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
@@ -2330,8 +2333,8 @@ restructuredtext-lint = [
     {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"},
 ]
 "ruamel.yaml" = [
-    {file = "ruamel.yaml-0.17.4-py3-none-any.whl", hash = "sha256:ac79fb25f5476e8e9ed1c53b8a2286d2c3f5dde49eb37dbcee5c7eb6a8415a22"},
-    {file = "ruamel.yaml-0.17.4.tar.gz", hash = "sha256:44bc6b54fddd45e4bc0619059196679f9e8b79c027f4131bb072e6a22f4d5e28"},
+    {file = "ruamel.yaml-0.17.9-py3-none-any.whl", hash = "sha256:8873a6f5516e0d848c92418b0b006519c0566b6cd0dcee7deb9bf399e2bd204f"},
+    {file = "ruamel.yaml-0.17.9.tar.gz", hash = "sha256:374373b4743aee9f6d9f40bea600fe020a7ac7ae36b838b4a6a93f72b584a14c"},
 ]
 "ruamel.yaml.clib" = [
     {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"},
@@ -2407,8 +2410,8 @@ sphinxcontrib-devhelp = [
     {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"},
 ]
 sphinxcontrib-htmlhelp = [
-    {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"},
-    {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"},
+    {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"},
+    {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"},
 ]
 sphinxcontrib-jsmath = [
     {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
@@ -2422,8 +2425,8 @@ sphinxcontrib-qthelp = [
     {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"},
 ]
 sphinxcontrib-serializinghtml = [
-    {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"},
-    {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"},
+    {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"},
+    {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"},
 ]
 stevedore = [
     {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"},
@@ -2498,13 +2501,13 @@ typing-extensions = [
     {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"},
 ]
 typing-inspect = [
-    {file = "typing_inspect-0.6.0-py2-none-any.whl", hash = "sha256:de08f50a22955ddec353876df7b2545994d6df08a2f45d54ac8c05e530372ca0"},
-    {file = "typing_inspect-0.6.0-py3-none-any.whl", hash = "sha256:3b98390df4d999a28cf5b35d8b333425af5da2ece8a4ea9e98f71e7591347b4f"},
-    {file = "typing_inspect-0.6.0.tar.gz", hash = "sha256:8f1b1dd25908dbfd81d3bebc218011531e7ab614ba6e5bf7826d887c834afab7"},
+    {file = "typing_inspect-0.7.1-py2-none-any.whl", hash = "sha256:b1f56c0783ef0f25fb064a01be6e5407e54cf4a4bf4f3ba3fe51e0bd6dcea9e5"},
+    {file = "typing_inspect-0.7.1-py3-none-any.whl", hash = "sha256:3cd7d4563e997719a710a3bfe7ffb544c6b72069b6812a02e9b414a8fa3aaa6b"},
+    {file = "typing_inspect-0.7.1.tar.gz", hash = "sha256:047d4097d9b17f46531bf6f014356111a1b6fb821a24fe7ac909853ca2a782aa"},
 ]
 urllib3 = [
-    {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"},
-    {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"},
+    {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"},
+    {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"},
 ]
 wasmer = [
     {file = "wasmer-1.0.0-cp36-cp36m-macosx_10_7_x86_64.whl", hash = "sha256:0d755a93184380f9785e1f8269b070f4a4a3285ae0f7f9571cfaf2ea215b102d"},
@@ -2517,7 +2520,6 @@ wasmer = [
     {file = "wasmer-1.0.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a08be93aff695ce3be871994f726716b68bef36bd583bccad75778359cd273df"},
     {file = "wasmer-1.0.0-cp38-none-win_amd64.whl", hash = "sha256:8b13214b5dcc84d43f4c44e2309442497f19137561afada7f34babad89365355"},
     {file = "wasmer-1.0.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:1fada13fb536f44e12d7c98c557f5b7a55df94389d3cb90964193dcc8e16f0fa"},
-    {file = "wasmer-1.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f390a54e26775456602f21d5d7d62dbad487f6a1022cab4379d7eac2c812d7ce"},
     {file = "wasmer-1.0.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:04e5d51eed336be0e1bf1445aa032fc34466b77220c26732b8990df872f29e92"},
     {file = "wasmer-1.0.0-cp39-none-win_amd64.whl", hash = "sha256:690c5ed46a98e91bc638f52a25e5011c5baa1ef0581f414018eb7aa0e7f844bc"},
     {file = "wasmer-1.0.0-py3-none-any.whl", hash = "sha256:427e9c5e5301a453a09b8b9ceb8c793d85411b8f45e54c9c0d801566dd8d214e"},
diff --git a/pyproject.toml b/pyproject.toml
index f60cbbe4..8fe1ae65 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -89,7 +89,7 @@ snapshottest = "^0.6"
 hypothesis = "^6.14"
 hypothesmith = "^0.1"
 
-mypy = "^0.812"
+mypy = "^0.902"
 
 docutils = "^0.17"
 sphinx = "^4.0"
diff --git a/wemake_python_styleguide/logic/naming/name_nodes.py b/wemake_python_styleguide/logic/naming/name_nodes.py
index e1795dcf..fdc77105 100644
--- a/wemake_python_styleguide/logic/naming/name_nodes.py
+++ b/wemake_python_styleguide/logic/naming/name_nodes.py
@@ -74,11 +74,11 @@ def get_variables_from_node(node: ast.AST) -> List[str]:
 
     if naive_attempt:
         names.append(naive_attempt)
-    elif isinstance(node, ast.Tuple):
+    elif isinstance(node, ast.Tuple) and len(node.elts) > 1:
+        # If tuple has just a single variable, we want to ignore it:
+        # like `x = (x,)`
         for subnode in node.elts:
-            extracted_name = get_variables_from_node(subnode)
-            if extracted_name:
-                names.extend(extracted_name)
+            names.extend(get_variables_from_node(subnode))
     return names
 
 
@@ -100,7 +100,9 @@ def extract_name(node: ast.AST) -> Optional[str]:
 
     """
     if isinstance(node, ast.Starred):
-        node = node.value
+        return extract_name(node.value)
+    if isinstance(node, ast.UnaryOp):
+        return extract_name(node.operand)
     if isinstance(node, ast.Name):
         return node.id
     return None
diff --git a/wemake_python_styleguide/types.py b/wemake_python_styleguide/types.py
index ef1bdf10..e3bce0c2 100644
--- a/wemake_python_styleguide/types.py
+++ b/wemake_python_styleguide/types.py
@@ -125,6 +125,9 @@ class ConfigurationOptions(Protocol):
 
     """
 
+    def __hash__(self) -> int:
+        """We need these options to be hashable."""
+
     # General:
     @property
     def min_name_length(self) -> int:
diff --git a/wemake_python_styleguide/visitors/ast/builtins.py b/wemake_python_styleguide/visitors/ast/builtins.py
index 810759ac..5eb81a11 100644
--- a/wemake_python_styleguide/visitors/ast/builtins.py
+++ b/wemake_python_styleguide/visitors/ast/builtins.py
@@ -186,10 +186,12 @@ class WrongFormatStringVisitor(base.BaseNodeVisitor):
             TooComplexFormattedStringViolation
 
         """
-        self._check_complex_formatted_string(node)
-
-        # We don't allow `f` strings by default:
-        self.add_violation(consistency.FormattedStringViolation(node))
+        if not isinstance(nodes.get_parent(node), ast.FormattedValue):
+            # We don't allow `f` strings by default,
+            # But, we need this condition to make sure that this
+            # is not a part of complex string format like `f"Count={count:,}"`:
+            self._check_complex_formatted_string(node)
+            self.add_violation(consistency.FormattedStringViolation(node))
         self.generic_visit(node)
 
     def _check_complex_formatted_string(self, node: ast.JoinedStr) -> None:
@@ -261,8 +263,7 @@ class WrongFormatStringVisitor(base.BaseNodeVisitor):
                 isinstance(part, self._single_use_types)
                 for part in chained_parts
             ) == 1
-        # All chaining with fewer elements is fine!
-        return True
+        return True  # All chaining with fewer elements is fine!
 
 
 @final
diff --git a/wemake_python_styleguide/visitors/ast/naming/variables.py b/wemake_python_styleguide/visitors/ast/naming/variables.py
index 7b0d52d8..405cb0a1 100644
--- a/wemake_python_styleguide/visitors/ast/naming/variables.py
+++ b/wemake_python_styleguide/visitors/ast/naming/variables.py
@@ -91,6 +91,11 @@ class WrongVariableAssignmentVisitor(BaseNodeVisitor):
             return  # This is not a variable, but a class property
 
         var_values = name_nodes.get_variables_from_node(node.value)
+        if len(names) <= 1 < len(var_values):
+            # It means that we have something like `x = (y, z)`
+            # or even `x = (x, y)`, which is also fine. See #1807
+            return
+
         for var_name, var_value in itertools.zip_longest(names, var_values):
             if var_name == var_value:
                 self.add_violation(
diff --git a/wemake_python_styleguide/visitors/ast/statements.py b/wemake_python_styleguide/visitors/ast/statements.py
index 7fbb5b73..771641aa 100644
--- a/wemake_python_styleguide/visitors/ast/statements.py
+++ b/wemake_python_styleguide/visitors/ast/statements.py
@@ -196,7 +196,6 @@ class StatementsWithBodiesVisitor(BaseNodeVisitor):
 
             if len(previous_var & current_var) == 1:
                 current_var ^= previous_var
-
             previous_var = current_var
 
     def _check_useless_node(


Test patch:
diff --git a/tests/test_visitors/test_ast/test_builtins/test_strings/test_formatted_string.py b/tests/test_visitors/test_ast/test_builtins/test_strings/test_formatted_string.py
index af7b3f90..29f8202f 100644
--- a/tests/test_visitors/test_ast/test_builtins/test_strings/test_formatted_string.py
+++ b/tests/test_visitors/test_ast/test_builtins/test_strings/test_formatted_string.py
@@ -53,6 +53,9 @@ f_triple_lookup = "f'{arr[0][1][2]}'"
 f_double_call_arg = "f'{foo()(arg)}'"
 f_single_chained_functions = "f'{f1().f2()}'"
 
+# regression 1921
+f_string_comma_format = 'f"Count={count:,}"'
+
 
 @pytest.mark.parametrize('code', [
     regular_string,
@@ -132,6 +135,7 @@ def test_complex_f_string(assert_errors, parse_ast_tree, code, default_options):
     f_true_index,
     f_none_index,
     f_byte_index,
+    f_string_comma_format,
 ])
 def test_simple_f_string(assert_errors, parse_ast_tree, code, default_options):
     """Testing that non complex ``f`` strings are allowed."""
diff --git a/tests/test_visitors/test_ast/test_conditions/test_implicit_complex_compare.py b/tests/test_visitors/test_ast/test_conditions/test_implicit_complex_compare.py
index e244b8b9..1c32009e 100644
--- a/tests/test_visitors/test_ast/test_conditions/test_implicit_complex_compare.py
+++ b/tests/test_visitors/test_ast/test_conditions/test_implicit_complex_compare.py
@@ -7,7 +7,7 @@ from wemake_python_styleguide.visitors.ast.conditions import (
     ImplicitBoolPatternsVisitor,
 )
 
-# Wrong:
+# Won't match our rule with any values:
 
 less_or_less = '{0} < {1} or {2} < {3}'
 less_or_more = '{0} < {1} or {2} > {3}'
@@ -25,7 +25,7 @@ moreeq_or_more = '{0} >= {1} or {2} > {3}'
 more_or_moreeq = '{0} > {1} or {2} >= {3}'
 moreeq_or_moreeq = '{0} >= {1} or {2} >= {3}'
 
-# Correct:
+# Will match our rule with some values:
 
 more_and_more = '{0} > {1} and {2} > {3}'  # a > b > c
 less_and_less = '{0} < {1} and {2} < {3}'  # a < b < c
diff --git a/tests/test_visitors/test_ast/test_keywords/test_consistency_returning/test_consistency_return_variables.py b/tests/test_visitors/test_ast/test_keywords/test_consistency_returning/test_consistency_return_variables.py
index 51848e7d..ee9b70d1 100644
--- a/tests/test_visitors/test_ast/test_keywords/test_consistency_returning/test_consistency_return_variables.py
+++ b/tests/test_visitors/test_ast/test_keywords/test_consistency_returning/test_consistency_return_variables.py
@@ -159,6 +159,12 @@ def some():
     return x[0], y, z
 """
 
+correct_example24 = """
+def some():
+    x = 1
+    return -x
+"""
+
 # Wrong:
 
 wrong_example1 = """
@@ -375,6 +381,7 @@ def test_wrong_return_variable(
     correct_example21,
     correct_example22,
     correct_example23,
+    correct_example24,
 ])
 def test_correct_return_statements(
     assert_errors,
diff --git a/tests/test_visitors/test_ast/test_naming/test_variable_self_reassignment.py b/tests/test_visitors/test_ast/test_naming/test_variable_self_reassignment.py
index ad6dca6a..131e5f29 100644
--- a/tests/test_visitors/test_ast/test_naming/test_variable_self_reassignment.py
+++ b/tests/test_visitors/test_ast/test_naming/test_variable_self_reassignment.py
@@ -71,6 +71,22 @@ class MyClass(object):
     MyValue = MyValue
 """
 
+# regression 1807
+right_tuplelize1 = 'my_var = (my_var,)'
+right_tuplelize2 = 'my_var = (other,)'
+right_tuplelize3 = 'my_var = (my_var, my_var)'
+right_tuplelize4 = 'my_var = (my_var, other)'
+right_tuplelize5 = 'my_var = (other, my_var)'
+
+# regression 1874
+right_swap1 = 'dx, dy = -dy, dx'
+right_swap2 = 'dy, dx = dx, -dy'
+right_swap3 = 'dx, dy = --dy, dx'
+right_swap4 = 'dx, dy = +dy, -dx'
+right_swap5 = 'dx, dy = dy, dx'
+right_swap6 = 'dy, dx = dx, dy'
+
+
 # Wrong:
 
 wrong_fragment = """
@@ -240,6 +256,17 @@ def test_self_variable_reassignment_triple(
     right_parts_unused3,
     right_parts_unused4,
     right_class_reassignment,
+    right_tuplelize1,
+    right_tuplelize2,
+    right_tuplelize3,
+    right_tuplelize4,
+    right_tuplelize5,
+    right_swap1,
+    right_swap2,
+    right_swap3,
+    right_swap4,
+    right_swap5,
+    right_swap6,
 ])
 def test_correct_variable_reassignment(
     assert_errors,
diff --git a/tests/test_visitors/test_ast/test_statements/test_almost_swapped.py b/tests/test_visitors/test_ast/test_statements/test_almost_swapped.py
index 8e3197a4..c2a213f8 100644
--- a/tests/test_visitors/test_ast/test_statements/test_almost_swapped.py
+++ b/tests/test_visitors/test_ast/test_statements/test_almost_swapped.py
@@ -24,10 +24,16 @@ a = b
 b = temp
 """
 
+wrong_double_swap = """
+dx, dy = dy, dx
+dx, dy = dy, dx
+"""
+
 
 @pytest.mark.parametrize('code', [
     wrong_swapped_variables,
     wrong_swapped_variables_with_temp,
+    wrong_double_swap,
 ])
 def test_wrong_swapped_variables(
     assert_errors,