[Piglit] [PATCH 17/49] unittests: port options_tests to py.test
Dylan Baker
dylan at pnwbakers.com
Fri Jul 29 18:39:03 UTC 2016
Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
---
unittests/framework/test_options.py | 221 ++++++++++++++++++++++++++++++++++++
unittests/options_tests.py | 208 ---------------------------------
2 files changed, 221 insertions(+), 208 deletions(-)
create mode 100644 unittests/framework/test_options.py
delete mode 100644 unittests/options_tests.py
diff --git a/unittests/framework/test_options.py b/unittests/framework/test_options.py
new file mode 100644
index 0000000..65ff946
--- /dev/null
+++ b/unittests/framework/test_options.py
@@ -0,0 +1,221 @@
+# Copyright (c) 2015-2016 Intel Corporation
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Tests for the options module."""
+
+from __future__ import (
+ absolute_import, division, print_function, unicode_literals
+)
+import re
+
+import pytest
+
+from framework import options
+
+# pylint: disable=protected-access
+# pylint: disable=invalid-name
+# pylint: disable=no-self-use
+
+_RETYPE = type(re.compile(''))
+
+
+def test_ReList_iterable_argument():
+ """options._ReList: handles an iterable argument correctly"""
+ test = options._ReList(['foo'])
+ assert isinstance(test[0], _RETYPE)
+
+
+class TestReList(object):
+ """Tests for the ReList class.
+
+ These particular tests don't mutate the state of ReList, and thus can be
+ run with the same instance over and over, other tests that do mutate the
+ state need a per test ReList instance.
+
+ """
+ @classmethod
+ def setup_class(cls):
+ cls.test = options._ReList(['foo'])
+
+ def test_eq(self):
+ """Test options._ReList.__eq__."""
+ test1 = ['foo']
+ test2 = options._ReList(['foo'])
+
+ with pytest.raises(TypeError):
+ assert self.test == test1
+
+ assert self.test == test2
+
+ def test_ne(self):
+ """Test hoptions._ReList.__ne__."""
+ test1 = ['bar']
+ test2 = options._ReList(['bar'])
+
+ with pytest.raises(TypeError):
+ assert self.test != test1
+
+ assert self.test != test2
+
+ def test_getitem(self):
+ """options._ReList.__getitem__: returns expected value."""
+ assert isinstance(self.test[0], _RETYPE)
+
+ def test_flags(self):
+ """options._ReList.__getitem__: sets flags correctly."""
+ assert self.test[0].flags & re.IGNORECASE != 0
+
+ def test_len(self):
+ """options._ReList.len: returns expected values."""
+ assert len(self.test) == 1
+
+ def test_to_json(self):
+ """options._ReList.to_json: returns expected values."""
+ assert self.test.to_json() == ['foo']
+
+
+class TestReListMutate(object):
+ """Tests for ReList that mutate state."""
+ test = None
+
+ def setup(self):
+ self.test = options._ReList(['foo'])
+
+ def test_relist_insert(self):
+ """options._ReList.len: inserts value as expected"""
+ obj = re.compile('bar', re.IGNORECASE)
+
+ self.test.insert(0, obj)
+
+ assert self.test[0] == obj
+
+ def test_relist_delitem(self):
+ """options._ReList.len: removes value as expected"""
+ del self.test[0]
+
+ assert len(self.test) == 0
+
+ def test_relist_setitem(self):
+ """options._ReList.__setitem__: replaces values"""
+ sentinel = re.compile('bar')
+ self.test[0] = sentinel
+
+ # The pattern must be tested because the flags on the re object might
+ # require it to be recompiled, thus they might not be the same object,
+ # or even be equal according to python (though they are for the
+ # purposes of this test)
+ assert self.test[0].pattern == sentinel.pattern
+
+
+class TestReListDescriptor(object):
+ """Test the ReListDescriptor class.
+
+ Since this class is a descriptor it needs to be attached to an object at
+ the class level.
+
+ """
+ test = None
+
+ @classmethod
+ def setup_class(cls):
+ """Create a test object."""
+ class _Test(object):
+ desc = options._ReListDescriptor('test_desc')
+ notexists = options._ReListDescriptor('test_notexists')
+
+ def __init__(self):
+ self.test_desc = options._ReList()
+
+ cls._test = _Test
+
+ def setup(self):
+ self.test = self._test()
+
+ def test_get_exists(self):
+ """options._ReListDescriptor.__get__: Returns value if it exists."""
+ assert self.test.desc == self.test.test_desc
+
+ def test_get_not_exists(self):
+ """options._ReListDescriptor.__get__: Returns new _ReList if it doesn't
+ exists."""
+ assert self.test.notexists == self.test.test_notexists # pylint: disable=no-member
+
+ def test_get_not_exists_fail(self, mocker):
+ """options._ReListDescriptor.__get__: Raises AttributError if name
+ doesn't exist and can't be created."""
+ mocker.patch('framework.options.setattr',
+ mocker.Mock(side_effect=Exception),
+ create=True)
+
+ with pytest.raises(AttributeError):
+ self.test.notexists # pylint: disable=pointless-statement
+
+ def test_set_relist(self):
+ """options._ReListDescriptor.__set__: assigns an ReList without
+ copying."""
+ val = options._ReList(['foo'])
+ self.test.desc = val
+ assert self.test.desc is val
+
+ def test_set_other(self):
+ """options._ReListDescriptor.__set__: converts other types to ReList"""
+ val = options._ReList(['foo'])
+ self.test.desc = ['foo']
+ assert self.test.desc == val
+
+ def test_delete(self):
+ """options._ReListDescriptor.__delete___: raises NotImplementedError"""
+ with pytest.raises(NotImplementedError):
+ del self.test.desc
+
+
+class TestFilterReList(object):
+ """Tests for FilterReList.
+
+ provides a unique instance per test, which protects against state mutation.
+
+ """
+ test = None
+
+ def setup(self):
+ self.test = options._FilterReList(['foo'])
+
+ def test_setitem(self):
+ """options._FilterReList.__setitem__: replaces '/' with '.'."""
+ self.test[0] = 'foo/bar'
+ assert self.test[0].pattern == 'foo.bar'
+
+ def test_filterrelist_insert(self):
+ """options._FilterReList.insert: replaces '/' with '.'."""
+ self.test.insert(0, 'foo/bar')
+ assert self.test[0].pattern == 'foo.bar'
+
+
+def test_options_clear():
+ """options.Options.clear(): resests options values to init state."""
+ baseline = options._Options()
+
+ test = options._Options()
+ test.execute = False
+ test.sync = True
+ test.exclude_filter.append('foo')
+ test.clear()
+
+ assert list(iter(baseline)) == list(iter(test))
diff --git a/unittests/options_tests.py b/unittests/options_tests.py
deleted file mode 100644
index ca03a0a..0000000
--- a/unittests/options_tests.py
+++ /dev/null
@@ -1,208 +0,0 @@
-# Copyright (c) 2015-2016 Intel Corporation
-
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-"""Tests for the options module."""
-
-from __future__ import (
- absolute_import, division, print_function, unicode_literals
-)
-import re
-
-try:
- from unittest import mock
-except ImportError:
- import mock
-
-import nose.tools as nt
-
-from . import utils
-from framework import options
-
-# pylint: disable=protected-access,line-too-long
-
-_RETYPE = type(re.compile(''))
-
-
- at utils.nose.no_error
-def test_relist_init():
- """options._ReList: inializes"""
- options._ReList()
-
-
-def test_relist_init_iterable():
- """options._ReList: handles an iterable argument correctly"""
- test = options._ReList(['foo'])
- nt.assert_is_instance(test[0], _RETYPE)
-
-
-def test_relist_eq():
- """options._ReList.__eq__: two ReLists are equal if their wrapped lists are equal"""
- test1 = options._ReList(['foo'])
- test2 = options._ReList(['foo'])
-
- nt.eq_(test1, test2)
-
-
- at nt.raises(TypeError)
-def test_relist_eq_other():
- """options._ReList.__eq__: raises TypeError if the other object is not an ReList"""
- test1 = options._ReList(['foo'])
- test2 = ['foo']
-
- nt.eq_(test1, test2)
-
-
-def test_relist_ne():
- """options._ReList.__ne__: two ReLists are not equal if their wrapped lists are not equal"""
- test1 = options._ReList(['foo'])
- test2 = options._ReList(['bar'])
-
- nt.assert_not_equal(test1, test2)
-
-
- at nt.raises(TypeError)
-def test_relist_ne_other():
- """options._ReList.__ne__: raises TypeError if the other object is not an ReList"""
- test1 = options._ReList(['foo'])
- test2 = ['bar']
-
- nt.eq_(test1, test2)
-
-
-class TestReList(object):
- """Some tests that can share state"""
- @classmethod
- def setup_class(cls):
- cls.test = options._ReList(['foo'])
-
- def test_getitem(self):
- """options._ReList.__getitem__: returns expected value"""
- nt.assert_is_instance(self.test[0], _RETYPE)
-
- def test_flags(self):
- """options._ReList.__getitem__: sets flags correctly"""
- nt.assert_not_equal(self.test[0].flags & re.IGNORECASE, 0)
-
- def test_len(self):
- """options._ReList.len: returns expected values"""
- nt.eq_(len(self.test), 1)
-
- def test_to_json(self):
- """options._ReList.to_json: returns expected values"""
- nt.eq_(self.test.to_json(), ['foo'])
-
-
-class TestReListDescriptor(object):
- @classmethod
- def setup_class(cls):
- class _Test(object):
- desc = options._ReListDescriptor('test_desc')
- notexists = options._ReListDescriptor('test_notexists')
-
- def __init__(self):
- self.test_desc = options._ReList()
-
- cls._test = _Test
-
- def setup(self):
- self.test = self._test()
-
- def test_get_exists(self):
- """options._ReListDescriptor.__get__: Returns value if it exists"""
- nt.eq_(self.test.desc, self.test.test_desc)
-
- def test_get_not_exists(self):
- """options._ReListDescriptor.__get__: Returns new _ReList if it doesn't exists"""
- nt.eq_(self.test.notexists, self.test.test_notexists) # pylint: disable=no-member
-
- @mock.patch('framework.options.setattr', mock.Mock(side_effect=Exception),
- create=True)
- @nt.raises(AttributeError)
- def test_get_not_exists_fail(self):
- """options._ReListDescriptor.__get__: Raises AttributError if name doesn't exist and can't be created"""
- self.test.notexists # pylint: disable=pointless-statement
-
- def test_set_relist(self):
- """options._ReListDescriptor.__set__: assigns an ReList directoy"""
- val = options._ReList(['foo'])
- self.test.desc = val
- nt.ok_(self.test.desc is val, msg='value not assigned directly')
-
- def test_set_other(self):
- """options._ReListDescriptor.__set__: converts other types to ReList"""
- val = options._ReList(['foo'])
- self.test.desc = ['foo']
- nt.eq_(self.test.desc, val)
-
- @nt.raises(NotImplementedError)
- def test_delete(self):
- """options._ReListDescriptor.__delete___: raises NotImplementedError"""
- del self.test.desc
-
-
-def test_relist_insert():
- """options._ReList.len: inserts value as expected"""
- test = options._ReList(['foo'])
- obj = re.compile('bar', re.IGNORECASE)
- test.insert(0, obj)
- nt.eq_(test[0], obj)
-
-
-def test_relist_delitem():
- """options._ReList.len: removes value as expected"""
- test = options._ReList(['foo'])
- del test[0]
- nt.eq_(len(test), 0)
-
-
-def test_relist_setitem():
- """options._ReList.__setitem__: adds value as expected"""
- canary = re.compile('bar')
-
- test = options._ReList([canary])
- test[0] = 'foo'
- nt.ok_(test[0] is not canary, msg='index value 0 wasn not replaced')
-
-
-def test_options_clear():
- """options.Options.clear(): resests options values to init state"""
- baseline = options._Options()
-
- test = options._Options()
- test.execute = False
- test.sync = True
- test.exclude_filter.append('foo')
- test.clear()
-
- nt.eq_(list(iter(baseline)), list(iter(test)))
-
-
-def test_filterrelist_set():
- """options._FilterReList.__setitem__: replaces '/' with '.'"""
- test = options._FilterReList(['foo'])
- test[0] = 'foo/bar'
- nt.eq_(test[0].pattern, 'foo.bar')
-
-
-def test_filterrelist_insert():
- """options._FilterReList.insert: replaces '/' with '.'"""
- test = options._FilterReList()
- test.insert(0, 'foo/bar')
- nt.eq_(test[0].pattern, 'foo.bar')
--
2.9.0
More information about the Piglit
mailing list