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
diff --git a/tests/conftest.py b/tests/conftest.py
index 1d7a24a..d4335fc 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -8,13 +8,12 @@
import textwrap
import difflib
import re
-import os
import sys
import contextlib
_unicode_marker = re.compile(r'u(\'[^\']*\')')
-_long_marker = re.compile(r'([0-9])L')
-_hexadecimal = re.compile(r'0x[0-9a-fA-F]+')
+_long_marker = re.compile(r'([0-9])L')
+_hexadecimal = re.compile(r'0x[0-9a-fA-F]+')
def _strip_and_dedent(s):
@@ -218,7 +217,7 @@
"""
# noinspection PyBroadException
try:
- import pybind11_tests
+ import pybind11_tests # noqa: F401 imported but unused
except Exception as e:
print("Failed to import pybind11_tests from pytest:")
print(" {}: {}".format(type(e).__name__, e))
diff --git a/tests/test_alias_initialization.py b/tests/test_alias_initialization.py
index b6d9e84..0ed9d2f 100644
--- a/tests/test_alias_initialization.py
+++ b/tests/test_alias_initialization.py
@@ -1,12 +1,11 @@
-import pytest
import gc
-def test_alias_delay_initialization(capture, msg):
- # A only initializes its trampoline class when we inherit from it; if we
- # just create and use an A instance directly, the trampoline initialization
- # is bypassed and we only initialize an A() instead (for performance
- # reasons)
+def test_alias_delay_initialization1(capture):
+ """A only initializes its trampoline class when we inherit from it; if we just
+ create and use an A instance directly, the trampoline initialization is bypassed
+ and we only initialize an A() instead (for performance reasons).
+ """
from pybind11_tests import A, call_f
class B(A):
@@ -37,14 +36,14 @@
PyA.~PyA()
"""
-def test_alias_delay_initialization(capture, msg):
- from pybind11_tests import A2, call_f
- # A2, unlike the above, is configured to always initialize the alias; while
- # the extra initialization and extra class layer has small virtual dispatch
- # performance penalty, it also allows us to do more things with the
- # trampoline class such as defining local variables and performing
- # construction/destruction.
+def test_alias_delay_initialization2(capture):
+ """A2, unlike the above, is configured to always initialize the alias; while
+ the extra initialization and extra class layer has small virtual dispatch
+ performance penalty, it also allows us to do more things with the trampoline
+ class such as defining local variables and performing construction/destruction.
+ """
+ from pybind11_tests import A2, call_f
class B2(A2):
def __init__(self):
diff --git a/tests/test_chrono.py b/tests/test_chrono.py
index b1d4dc7..94ca55c 100644
--- a/tests/test_chrono.py
+++ b/tests/test_chrono.py
@@ -47,7 +47,7 @@
from pybind11_tests import test_chrono3
import datetime
- # Get the difference betwen two times (a timedelta)
+ # Get the difference between two times (a timedelta)
date1 = datetime.datetime.today()
date2 = datetime.datetime.today()
diff = date2 - date1
diff --git a/tests/test_class_args.py b/tests/test_class_args.py
index a1fc21a..91b0320 100644
--- a/tests/test_class_args.py
+++ b/tests/test_class_args.py
@@ -1,5 +1,4 @@
-import pytest
def test_class_args():
# There's basically nothing to test here; just make sure the code compiled and declared its definition
diff --git a/tests/test_copy_move_policies.py b/tests/test_copy_move_policies.py
index 07f09f6..edcf380 100644
--- a/tests/test_copy_move_policies.py
+++ b/tests/test_copy_move_policies.py
@@ -13,5 +13,3 @@
with pytest.raises(RuntimeError) as excinfo:
lacking_move_ctor.get_one()
assert "the object is neither movable nor copyable!" in str(excinfo.value)
-
-
diff --git a/tests/test_docstring_options.py b/tests/test_docstring_options.py
index 9cd4993..66ad6b8 100644
--- a/tests/test_docstring_options.py
+++ b/tests/test_docstring_options.py
@@ -1,6 +1,6 @@
-from pybind11_tests import ConstructorStats
-def test_docstring_options(capture):
+
+def test_docstring_options():
from pybind11_tests import (test_function1, test_function2, test_function3,
test_function4, test_function5, test_function6,
test_function7, DocstringTestFoo)
diff --git a/tests/test_enum.py b/tests/test_enum.py
index 5dfdbbe..de5f3c6 100644
--- a/tests/test_enum.py
+++ b/tests/test_enum.py
@@ -30,10 +30,6 @@
assert not (UnscopedEnum.ETwo < UnscopedEnum.EOne)
assert not (2 < UnscopedEnum.EOne)
-def test_scoped_enum():
- from pybind11_tests import ScopedEnum, test_scoped_enum
-
- assert test_scoped_enum(ScopedEnum.Three) == "ScopedEnum::Three"
def test_scoped_enum():
from pybind11_tests import ScopedEnum, test_scoped_enum
@@ -56,6 +52,7 @@
assert ScopedEnum.Two >= ScopedEnum.Two
assert ScopedEnum.Three >= ScopedEnum.Two
+
def test_implicit_conversion():
from pybind11_tests import ClassWithUnscopedEnum
@@ -87,6 +84,7 @@
# Hashing test
assert str(x) == "{EMode.EFirstMode: 3, EMode.ESecondMode: 4}"
+
def test_binary_operators():
from pybind11_tests import Flags
@@ -108,4 +106,3 @@
state2 = ~state
assert state2 == -7
assert int(state ^ state2) == -1
-
diff --git a/tests/test_eval_call.py b/tests/test_eval_call.py
index a3349e2..53c7e72 100644
--- a/tests/test_eval_call.py
+++ b/tests/test_eval_call.py
@@ -1,4 +1,4 @@
# This file is called from 'test_eval.py'
if 'call_test2' in locals():
- call_test2(y)
+ call_test2(y) # noqa: F821 undefined name
diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py
index a9b4b05..0025e4e 100644
--- a/tests/test_exceptions.py
+++ b/tests/test_exceptions.py
@@ -69,6 +69,6 @@
with pytest.raises(MyException5) as excinfo:
try:
throws5()
- except MyException5_1 as e:
+ except MyException5_1:
raise RuntimeError("Exception error: caught child from parent")
assert msg(excinfo.value) == "this is a helper-defined translated exception"
diff --git a/tests/test_issues.py b/tests/test_issues.py
index 1b29ceb..5ed7d09 100644
--- a/tests/test_issues.py
+++ b/tests/test_issues.py
@@ -83,7 +83,6 @@
assert expect_float(12) == 12
-
def test_str_issue(msg):
"""Issue #283: __str__ called on uninitialized instance when constructor arguments invalid"""
from pybind11_tests.issues import StrIssue
@@ -153,8 +152,8 @@
o = OverrideTest("asdf")
# Not allowed (see associated .cpp comment)
- #i = o.str_ref()
- #assert o.str_ref() == "asdf"
+ # i = o.str_ref()
+ # assert o.str_ref() == "asdf"
assert o.str_value() == "asdf"
assert o.A_value().value == "hi"
@@ -167,15 +166,17 @@
def test_operators_notimplemented(capture):
from pybind11_tests.issues import OpTest1, OpTest2
with capture:
- C1, C2 = OpTest1(), OpTest2()
- C1 + C1
- C2 + C2
- C2 + C1
- C1 + C2
- assert capture == """Add OpTest1 with OpTest1
-Add OpTest2 with OpTest2
-Add OpTest2 with OpTest1
-Add OpTest2 with OpTest1"""
+ c1, c2 = OpTest1(), OpTest2()
+ c1 + c1
+ c2 + c2
+ c2 + c1
+ c1 + c2
+ assert capture == """
+ Add OpTest1 with OpTest1
+ Add OpTest2 with OpTest2
+ Add OpTest2 with OpTest1
+ Add OpTest2 with OpTest1
+ """
def test_iterator_rvpolicy():
@@ -185,7 +186,7 @@
assert list(make_iterator_1()) == [1, 2, 3]
assert list(make_iterator_2()) == [1, 2, 3]
- assert(type(make_iterator_1()) != type(make_iterator_2()))
+ assert not isinstance(make_iterator_1(), type(make_iterator_2()))
def test_dupe_assignment():
@@ -234,9 +235,9 @@
test_complex(2j)
assert capture == """
-1.0
-(0.0, 2.0)
-"""
+ 1.0
+ (0.0, 2.0)
+ """
def test_inheritance_override_def_static():
diff --git a/tests/test_keep_alive.py b/tests/test_keep_alive.py
index c83d5d2..0cef346 100644
--- a/tests/test_keep_alive.py
+++ b/tests/test_keep_alive.py
@@ -95,4 +95,3 @@
del p
gc.collect()
assert capture == "Releasing parent."
-
diff --git a/tests/test_methods_and_attributes.py b/tests/test_methods_and_attributes.py
index f97dd4e..28c0de5 100644
--- a/tests/test_methods_and_attributes.py
+++ b/tests/test_methods_and_attributes.py
@@ -113,7 +113,8 @@
def test_property_rvalue_policy():
"""When returning an rvalue, the return value policy is automatically changed from
- `reference(_internal)` to `move`. The following would not work otherwise."""
+ `reference(_internal)` to `move`. The following would not work otherwise.
+ """
from pybind11_tests import TestPropRVP
instance = TestPropRVP()
diff --git a/tests/test_multiple_inheritance.py b/tests/test_multiple_inheritance.py
index 7e1e086..581cf56 100644
--- a/tests/test_multiple_inheritance.py
+++ b/tests/test_multiple_inheritance.py
@@ -1,7 +1,6 @@
-import pytest
-def test_multiple_inheritance_cpp(msg):
+def test_multiple_inheritance_cpp():
from pybind11_tests import MIType
mt = MIType(3, 4)
@@ -10,7 +9,7 @@
assert mt.bar() == 4
-def test_multiple_inheritance_mix1(msg):
+def test_multiple_inheritance_mix1():
from pybind11_tests import Base2
class Base1:
@@ -31,7 +30,7 @@
assert mt.bar() == 4
-def test_multiple_inheritance_mix2(msg):
+def test_multiple_inheritance_mix2():
from pybind11_tests import Base1
class Base2:
@@ -52,7 +51,7 @@
assert mt.bar() == 4
-def test_multiple_inheritance_virtbase(msg):
+def test_multiple_inheritance_virtbase():
from pybind11_tests import Base12a, bar_base2a, bar_base2a_sharedptr
class MITypePy(Base12a):
diff --git a/tests/test_numpy_array.py b/tests/test_numpy_array.py
index cec0054..1c218a1 100644
--- a/tests/test_numpy_array.py
+++ b/tests/test_numpy_array.py
@@ -144,10 +144,10 @@
mutate_data, mutate_data_t, at_t, mutate_at_t)
for func in funcs:
with pytest.raises(IndexError) as excinfo:
- index_at(arr, 2, 0)
+ func(arr, 2, 0)
assert str(excinfo.value) == 'index 2 is out of bounds for axis 0 with size 2'
with pytest.raises(IndexError) as excinfo:
- index_at(arr, 0, 4)
+ func(arr, 0, 4)
assert str(excinfo.value) == 'index 4 is out of bounds for axis 1 with size 3'
@@ -166,50 +166,49 @@
def test_wrap():
from pybind11_tests.array import wrap
- def assert_references(A, B):
- assert A is not B
- assert A.__array_interface__['data'][0] == \
- B.__array_interface__['data'][0]
- assert A.shape == B.shape
- assert A.strides == B.strides
- assert A.flags.c_contiguous == B.flags.c_contiguous
- assert A.flags.f_contiguous == B.flags.f_contiguous
- assert A.flags.writeable == B.flags.writeable
- assert A.flags.aligned == B.flags.aligned
- assert A.flags.updateifcopy == B.flags.updateifcopy
- assert np.all(A == B)
- assert not B.flags.owndata
- assert B.base is A
- if A.flags.writeable and A.ndim == 2:
- A[0, 0] = 1234
- assert B[0, 0] == 1234
+ def assert_references(a, b):
+ assert a is not b
+ assert a.__array_interface__['data'][0] == b.__array_interface__['data'][0]
+ assert a.shape == b.shape
+ assert a.strides == b.strides
+ assert a.flags.c_contiguous == b.flags.c_contiguous
+ assert a.flags.f_contiguous == b.flags.f_contiguous
+ assert a.flags.writeable == b.flags.writeable
+ assert a.flags.aligned == b.flags.aligned
+ assert a.flags.updateifcopy == b.flags.updateifcopy
+ assert np.all(a == b)
+ assert not b.flags.owndata
+ assert b.base is a
+ if a.flags.writeable and a.ndim == 2:
+ a[0, 0] = 1234
+ assert b[0, 0] == 1234
- A1 = np.array([1, 2], dtype=np.int16)
- assert A1.flags.owndata and A1.base is None
- A2 = wrap(A1)
- assert_references(A1, A2)
+ a1 = np.array([1, 2], dtype=np.int16)
+ assert a1.flags.owndata and a1.base is None
+ a2 = wrap(a1)
+ assert_references(a1, a2)
- A1 = np.array([[1, 2], [3, 4]], dtype=np.float32, order='F')
- assert A1.flags.owndata and A1.base is None
- A2 = wrap(A1)
- assert_references(A1, A2)
+ a1 = np.array([[1, 2], [3, 4]], dtype=np.float32, order='F')
+ assert a1.flags.owndata and a1.base is None
+ a2 = wrap(a1)
+ assert_references(a1, a2)
- A1 = np.array([[1, 2], [3, 4]], dtype=np.float32, order='C')
- A1.flags.writeable = False
- A2 = wrap(A1)
- assert_references(A1, A2)
+ a1 = np.array([[1, 2], [3, 4]], dtype=np.float32, order='C')
+ a1.flags.writeable = False
+ a2 = wrap(a1)
+ assert_references(a1, a2)
- A1 = np.random.random((4, 4, 4))
- A2 = wrap(A1)
- assert_references(A1, A2)
+ a1 = np.random.random((4, 4, 4))
+ a2 = wrap(a1)
+ assert_references(a1, a2)
- A1 = A1.transpose()
- A2 = wrap(A1)
- assert_references(A1, A2)
+ a1 = a1.transpose()
+ a2 = wrap(a1)
+ assert_references(a1, a2)
- A1 = A1.diagonal()
- A2 = wrap(A1)
- assert_references(A1, A2)
+ a1 = a1.diagonal()
+ a2 = wrap(a1)
+ assert_references(a1, a2)
@pytest.requires_numpy
diff --git a/tests/test_python_types.py b/tests/test_python_types.py
index c296792..dcd5d62 100644
--- a/tests/test_python_types.py
+++ b/tests/test_python_types.py
@@ -314,6 +314,7 @@
assert test_nullopt(42) == 42
assert test_nullopt(43) == 43
+
@pytest.mark.skipif(not has_exp_optional, reason='no <experimental/optional>')
def test_exp_optional():
from pybind11_tests import double_or_zero_exp, half_or_none_exp, test_nullopt_exp
diff --git a/tests/test_sequences_and_iterators.py b/tests/test_sequences_and_iterators.py
index c83c4e5..76b9f43 100644
--- a/tests/test_sequences_and_iterators.py
+++ b/tests/test_sequences_and_iterators.py
@@ -2,7 +2,7 @@
def isclose(a, b, rel_tol=1e-05, abs_tol=0.0):
- """Like to math.isclose() from Python 3.5"""
+ """Like math.isclose() from Python 3.5"""
return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
diff --git a/tests/test_smart_ptr.py b/tests/test_smart_ptr.py
index acb0f61..8af2ae8 100644
--- a/tests/test_smart_ptr.py
+++ b/tests/test_smart_ptr.py
@@ -114,7 +114,8 @@
assert cstats.copy_assignments == 30
assert cstats.move_assignments == 0
-def test_unique_nodelete(capture):
+
+def test_unique_nodelete():
from pybind11_tests import MyObject4
o = MyObject4(23)
assert o.value == 23
@@ -122,4 +123,4 @@
assert cstats.alive() == 1
del o
cstats = ConstructorStats.get(MyObject4)
- assert cstats.alive() == 1 # Leak, but that's intentional
+ assert cstats.alive() == 1 # Leak, but that's intentional
diff --git a/tests/test_stl_binders.py b/tests/test_stl_binders.py
index ba62e51..c9bcc79 100644
--- a/tests/test_stl_binders.py
+++ b/tests/test_stl_binders.py
@@ -50,6 +50,7 @@
assert vv_c[i] == (i % 2 == 0)
assert str(vv_c) == "VectorBool[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]"
+
def test_map_string_double():
from pybind11_tests import MapStringDouble, UnorderedMapStringDouble
@@ -57,30 +58,17 @@
m['a'] = 1
m['b'] = 2.5
- keys = []
- for k in m: keys.append(k)
- 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 list(m) == ['a', 'b']
+ assert list(m.items()) == [('a', 1), ('b', 2.5)]
assert str(m) == "MapStringDouble{a: 1, b: 2.5}"
-
um = UnorderedMapStringDouble()
um['ua'] = 1.1
um['ub'] = 2.6
- keys = []
- for k in um: keys.append(k)
- assert sorted(keys) == ['ua', 'ub']
-
- 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)
+ assert sorted(list(um)) == ['ua', 'ub']
+ assert sorted(list(um.items())) == [('ua', 1.1), ('ub', 2.6)]
+ assert "UnorderedMapStringDouble" in str(um)
def test_map_string_double_const():
@@ -97,57 +85,56 @@
str(umc)
+
def test_noncopyable_vector():
- from pybind11_tests import ENC, get_vnc
+ from pybind11_tests import get_vnc
vnc = get_vnc(5)
for i in range(0, 5):
- assert(vnc[i].value == i+1)
+ assert vnc[i].value == i + 1
- i = 1
- for j in vnc:
- assert(j.value == i)
- i += 1
+ for i, j in enumerate(vnc, start=1):
+ assert j.value == i
+
def test_noncopyable_deque():
- from pybind11_tests import ENC, get_dnc
+ from pybind11_tests import get_dnc
dnc = get_dnc(5)
for i in range(0, 5):
- assert(dnc[i].value == i+1)
+ assert dnc[i].value == i + 1
i = 1
for j in dnc:
assert(j.value == i)
i += 1
+
def test_noncopyable_map():
- from pybind11_tests import ENC, get_mnc
+ from pybind11_tests import get_mnc
mnc = get_mnc(5)
for i in range(1, 6):
- assert(mnc[i].value == 10*i)
+ assert mnc[i].value == 10 * i
- i = 1
vsum = 0
for k, v in mnc.items():
- assert(v.value == 10*k)
+ assert v.value == 10 * k
vsum += v.value
- assert(vsum == 150)
+ assert vsum == 150
+
def test_noncopyable_unordered_map():
- from pybind11_tests import ENC, get_umnc
+ from pybind11_tests import get_umnc
mnc = get_umnc(5)
for i in range(1, 6):
- assert(mnc[i].value == 10*i)
+ assert mnc[i].value == 10 * i
- i = 1
vsum = 0
for k, v in mnc.items():
- assert(v.value == 10*k)
+ assert v.value == 10 * k
vsum += v.value
- assert(vsum == 150)
-
+ assert vsum == 150
diff --git a/tests/test_virtual_functions.py b/tests/test_virtual_functions.py
index 5d55d5e..eeecc23 100644
--- a/tests/test_virtual_functions.py
+++ b/tests/test_virtual_functions.py
@@ -76,20 +76,20 @@
def test_inheriting_repeat():
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):
return 99
- class VI_AT(A_Tpl):
+ class AT(A_Tpl):
def unlucky_number(self):
return 999
- obj = VI_AR()
+ obj = AR()
assert obj.say_something(3) == "hihihi"
assert obj.unlucky_number() == 99
assert obj.say_everything() == "hi 99"
- obj = VI_AT()
+ obj = AT()
assert obj.say_something(3) == "hihihi"
assert obj.unlucky_number() == 999
assert obj.say_everything() == "hi 999"
@@ -106,46 +106,46 @@
assert obj.lucky_number() == 888.0
assert obj.say_everything() == "B says hi 1 times 4444"
- class VI_CR(C_Repeat):
+ class CR(C_Repeat):
def lucky_number(self):
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.unlucky_number() == 4444
assert obj.lucky_number() == 889.25
assert obj.say_everything() == "B says hi 1 times 4444"
- class VI_CT(C_Tpl):
+ class CT(C_Tpl):
pass
- obj = VI_CT()
+ obj = CT()
assert obj.say_something(3) == "B says hi 3 times"
assert obj.unlucky_number() == 4444
assert obj.lucky_number() == 888.0
assert obj.say_everything() == "B says hi 1 times 4444"
- class VI_CCR(VI_CR):
+ class CCR(CR):
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.unlucky_number() == 4444
assert obj.lucky_number() == 8892.5
assert obj.say_everything() == "B says hi 1 times 4444"
- class VI_CCT(VI_CT):
+ class CCT(CT):
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.unlucky_number() == 4444
assert obj.lucky_number() == 888000.0
assert obj.say_everything() == "B says hi 1 times 4444"
- class VI_DR(D_Repeat):
+ class DR(D_Repeat):
def unlucky_number(self):
return 123
@@ -158,15 +158,15 @@
assert obj.lucky_number() == 888.0
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.unlucky_number() == 123
assert obj.lucky_number() == 42.0
assert obj.say_everything() == "B says hi 1 times 123"
- class VI_DT(D_Tpl):
+ class DT(D_Tpl):
def say_something(self, times):
- return "VI_DT says:" + (' quack' * times)
+ return "DT says:" + (' quack' * times)
def unlucky_number(self):
return 1234
@@ -174,32 +174,35 @@
def lucky_number(self):
return -4.25
- obj = VI_DT()
- assert obj.say_something(3) == "VI_DT says: quack quack quack"
+ obj = DT()
+ assert obj.say_something(3) == "DT says: quack quack quack"
assert obj.unlucky_number() == 1234
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):
- return "VI_DT2: " + ('QUACK' * times)
+ return "DT2: " + ('QUACK' * times)
def unlucky_number(self):
return -3
- class VI_BT(B_Tpl):
+ class BT(B_Tpl):
def say_something(self, times):
- return "VI_BT" * times
+ return "BT" * times
+
def unlucky_number(self):
return -7
+
def lucky_number(self):
return -1.375
- obj = VI_BT()
- assert obj.say_something(3) == "VI_BTVI_BTVI_BT"
+ obj = BT()
+ assert obj.say_something(3) == "BTBTBT"
assert obj.unlucky_number() == -7
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'),
reason="NCVirt test broken on ICPC")