Commit bad17402 authored by Dean Moldovan's avatar Dean Moldovan Committed by Wenzel Jakob
Browse files

Add checks to maintain a consistent Python code style and prevent bugs (#515)

A flake8 configuration is included in setup.cfg and the checks are
executed automatically on Travis:

* Ensures a consistent PEP8 code style
* Does basic linting to prevent possible bugs
parent df815469
...@@ -50,6 +50,7 @@ def test_vector_bool(): ...@@ -50,6 +50,7 @@ def test_vector_bool():
assert vv_c[i] == (i % 2 == 0) assert vv_c[i] == (i % 2 == 0)
assert str(vv_c) == "VectorBool[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]" assert str(vv_c) == "VectorBool[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]"
def test_map_string_double(): def test_map_string_double():
from pybind11_tests import MapStringDouble, UnorderedMapStringDouble from pybind11_tests import MapStringDouble, UnorderedMapStringDouble
...@@ -57,30 +58,17 @@ def test_map_string_double(): ...@@ -57,30 +58,17 @@ def test_map_string_double():
m['a'] = 1 m['a'] = 1
m['b'] = 2.5 m['b'] = 2.5
keys = [] assert list(m) == ['a', 'b']
for k in m: keys.append(k) assert list(m.items()) == [('a', 1), ('b', 2.5)]
assert keys == ['a', 'b']
key_values = []
for k, v in m.items(): key_values.append( (k, v) )
assert key_values == [('a', 1), ('b', 2.5) ]
assert str(m) == "MapStringDouble{a: 1, b: 2.5}" assert str(m) == "MapStringDouble{a: 1, b: 2.5}"
um = UnorderedMapStringDouble() um = UnorderedMapStringDouble()
um['ua'] = 1.1 um['ua'] = 1.1
um['ub'] = 2.6 um['ub'] = 2.6
keys = [] assert sorted(list(um)) == ['ua', 'ub']
for k in um: keys.append(k) assert sorted(list(um.items())) == [('ua', 1.1), ('ub', 2.6)]
assert sorted(keys) == ['ua', 'ub'] assert "UnorderedMapStringDouble" in str(um)
key_values = []
for k, v in um.items(): key_values.append( (k, v) )
assert sorted(key_values) == [('ua', 1.1), ('ub', 2.6) ]
str(um)
def test_map_string_double_const(): def test_map_string_double_const():
...@@ -97,57 +85,56 @@ def test_map_string_double_const(): ...@@ -97,57 +85,56 @@ def test_map_string_double_const():
str(umc) str(umc)
def test_noncopyable_vector(): def test_noncopyable_vector():
from pybind11_tests import ENC, get_vnc from pybind11_tests import get_vnc
vnc = get_vnc(5) vnc = get_vnc(5)
for i in range(0, 5): for i in range(0, 5):
assert(vnc[i].value == i+1) assert vnc[i].value == i + 1
for i, j in enumerate(vnc, start=1):
assert j.value == i
i = 1
for j in vnc:
assert(j.value == i)
i += 1
def test_noncopyable_deque(): def test_noncopyable_deque():
from pybind11_tests import ENC, get_dnc from pybind11_tests import get_dnc
dnc = get_dnc(5) dnc = get_dnc(5)
for i in range(0, 5): for i in range(0, 5):
assert(dnc[i].value == i+1) assert dnc[i].value == i + 1
i = 1 i = 1
for j in dnc: for j in dnc:
assert(j.value == i) assert(j.value == i)
i += 1 i += 1
def test_noncopyable_map(): def test_noncopyable_map():
from pybind11_tests import ENC, get_mnc from pybind11_tests import get_mnc
mnc = get_mnc(5) mnc = get_mnc(5)
for i in range(1, 6): for i in range(1, 6):
assert(mnc[i].value == 10*i) assert mnc[i].value == 10 * i
i = 1
vsum = 0 vsum = 0
for k, v in mnc.items(): for k, v in mnc.items():
assert(v.value == 10*k) assert v.value == 10 * k
vsum += v.value vsum += v.value
assert(vsum == 150) assert vsum == 150
def test_noncopyable_unordered_map(): def test_noncopyable_unordered_map():
from pybind11_tests import ENC, get_umnc from pybind11_tests import get_umnc
mnc = get_umnc(5) mnc = get_umnc(5)
for i in range(1, 6): for i in range(1, 6):
assert(mnc[i].value == 10*i) assert mnc[i].value == 10 * i
i = 1
vsum = 0 vsum = 0
for k, v in mnc.items(): for k, v in mnc.items():
assert(v.value == 10*k) assert v.value == 10 * k
vsum += v.value vsum += v.value
assert(vsum == 150) assert vsum == 150
...@@ -76,20 +76,20 @@ def test_override(capture, msg): ...@@ -76,20 +76,20 @@ def test_override(capture, msg):
def test_inheriting_repeat(): def test_inheriting_repeat():
from pybind11_tests import A_Repeat, B_Repeat, C_Repeat, D_Repeat, A_Tpl, B_Tpl, C_Tpl, D_Tpl from pybind11_tests import A_Repeat, B_Repeat, C_Repeat, D_Repeat, A_Tpl, B_Tpl, C_Tpl, D_Tpl
class VI_AR(A_Repeat): class AR(A_Repeat):
def unlucky_number(self): def unlucky_number(self):
return 99 return 99
class VI_AT(A_Tpl): class AT(A_Tpl):
def unlucky_number(self): def unlucky_number(self):
return 999 return 999
obj = VI_AR() obj = AR()
assert obj.say_something(3) == "hihihi" assert obj.say_something(3) == "hihihi"
assert obj.unlucky_number() == 99 assert obj.unlucky_number() == 99
assert obj.say_everything() == "hi 99" assert obj.say_everything() == "hi 99"
obj = VI_AT() obj = AT()
assert obj.say_something(3) == "hihihi" assert obj.say_something(3) == "hihihi"
assert obj.unlucky_number() == 999 assert obj.unlucky_number() == 999
assert obj.say_everything() == "hi 999" assert obj.say_everything() == "hi 999"
...@@ -106,46 +106,46 @@ def test_inheriting_repeat(): ...@@ -106,46 +106,46 @@ def test_inheriting_repeat():
assert obj.lucky_number() == 888.0 assert obj.lucky_number() == 888.0
assert obj.say_everything() == "B says hi 1 times 4444" assert obj.say_everything() == "B says hi 1 times 4444"
class VI_CR(C_Repeat): class CR(C_Repeat):
def lucky_number(self): def lucky_number(self):
return C_Repeat.lucky_number(self) + 1.25 return C_Repeat.lucky_number(self) + 1.25
obj = VI_CR() obj = CR()
assert obj.say_something(3) == "B says hi 3 times" assert obj.say_something(3) == "B says hi 3 times"
assert obj.unlucky_number() == 4444 assert obj.unlucky_number() == 4444
assert obj.lucky_number() == 889.25 assert obj.lucky_number() == 889.25
assert obj.say_everything() == "B says hi 1 times 4444" assert obj.say_everything() == "B says hi 1 times 4444"
class VI_CT(C_Tpl): class CT(C_Tpl):
pass pass
obj = VI_CT() obj = CT()
assert obj.say_something(3) == "B says hi 3 times" assert obj.say_something(3) == "B says hi 3 times"
assert obj.unlucky_number() == 4444 assert obj.unlucky_number() == 4444
assert obj.lucky_number() == 888.0 assert obj.lucky_number() == 888.0
assert obj.say_everything() == "B says hi 1 times 4444" assert obj.say_everything() == "B says hi 1 times 4444"
class VI_CCR(VI_CR): class CCR(CR):
def lucky_number(self): def lucky_number(self):
return VI_CR.lucky_number(self) * 10 return CR.lucky_number(self) * 10
obj = VI_CCR() obj = CCR()
assert obj.say_something(3) == "B says hi 3 times" assert obj.say_something(3) == "B says hi 3 times"
assert obj.unlucky_number() == 4444 assert obj.unlucky_number() == 4444
assert obj.lucky_number() == 8892.5 assert obj.lucky_number() == 8892.5
assert obj.say_everything() == "B says hi 1 times 4444" assert obj.say_everything() == "B says hi 1 times 4444"
class VI_CCT(VI_CT): class CCT(CT):
def lucky_number(self): def lucky_number(self):
return VI_CT.lucky_number(self) * 1000 return CT.lucky_number(self) * 1000
obj = VI_CCT() obj = CCT()
assert obj.say_something(3) == "B says hi 3 times" assert obj.say_something(3) == "B says hi 3 times"
assert obj.unlucky_number() == 4444 assert obj.unlucky_number() == 4444
assert obj.lucky_number() == 888000.0 assert obj.lucky_number() == 888000.0
assert obj.say_everything() == "B says hi 1 times 4444" assert obj.say_everything() == "B says hi 1 times 4444"
class VI_DR(D_Repeat): class DR(D_Repeat):
def unlucky_number(self): def unlucky_number(self):
return 123 return 123
...@@ -158,15 +158,15 @@ def test_inheriting_repeat(): ...@@ -158,15 +158,15 @@ def test_inheriting_repeat():
assert obj.lucky_number() == 888.0 assert obj.lucky_number() == 888.0
assert obj.say_everything() == "B says hi 1 times 4444" assert obj.say_everything() == "B says hi 1 times 4444"
obj = VI_DR() obj = DR()
assert obj.say_something(3) == "B says hi 3 times" assert obj.say_something(3) == "B says hi 3 times"
assert obj.unlucky_number() == 123 assert obj.unlucky_number() == 123
assert obj.lucky_number() == 42.0 assert obj.lucky_number() == 42.0
assert obj.say_everything() == "B says hi 1 times 123" assert obj.say_everything() == "B says hi 1 times 123"
class VI_DT(D_Tpl): class DT(D_Tpl):
def say_something(self, times): def say_something(self, times):
return "VI_DT says:" + (' quack' * times) return "DT says:" + (' quack' * times)
def unlucky_number(self): def unlucky_number(self):
return 1234 return 1234
...@@ -174,32 +174,35 @@ def test_inheriting_repeat(): ...@@ -174,32 +174,35 @@ def test_inheriting_repeat():
def lucky_number(self): def lucky_number(self):
return -4.25 return -4.25
obj = VI_DT() obj = DT()
assert obj.say_something(3) == "VI_DT says: quack quack quack" assert obj.say_something(3) == "DT says: quack quack quack"
assert obj.unlucky_number() == 1234 assert obj.unlucky_number() == 1234
assert obj.lucky_number() == -4.25 assert obj.lucky_number() == -4.25
assert obj.say_everything() == "VI_DT says: quack 1234" assert obj.say_everything() == "DT says: quack 1234"
class VI_DT2(VI_DT): class DT2(DT):
def say_something(self, times): def say_something(self, times):
return "VI_DT2: " + ('QUACK' * times) return "DT2: " + ('QUACK' * times)
def unlucky_number(self): def unlucky_number(self):
return -3 return -3
class VI_BT(B_Tpl): class BT(B_Tpl):
def say_something(self, times): def say_something(self, times):
return "VI_BT" * times return "BT" * times
def unlucky_number(self): def unlucky_number(self):
return -7 return -7
def lucky_number(self): def lucky_number(self):
return -1.375 return -1.375
obj = VI_BT() obj = BT()
assert obj.say_something(3) == "VI_BTVI_BTVI_BT" assert obj.say_something(3) == "BTBTBT"
assert obj.unlucky_number() == -7 assert obj.unlucky_number() == -7
assert obj.lucky_number() == -1.375 assert obj.lucky_number() == -1.375
assert obj.say_everything() == "VI_BT -7" assert obj.say_everything() == "BT -7"
@pytest.mark.skipif(not hasattr(pybind11_tests, 'NCVirt'), @pytest.mark.skipif(not hasattr(pybind11_tests, 'NCVirt'),
reason="NCVirt test broken on ICPC") reason="NCVirt test broken on ICPC")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment