Index: tools/telemetry/third_party/gsutilz/third_party/six/test_six.py |
diff --git a/tools/telemetry/third_party/gsutilz/third_party/six/test_six.py b/tools/telemetry/third_party/gsutilz/third_party/six/test_six.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0125d6b3fabf92890e32a243acba839ed2e91bf7 |
--- /dev/null |
+++ b/tools/telemetry/third_party/gsutilz/third_party/six/test_six.py |
@@ -0,0 +1,736 @@ |
+import operator |
+import sys |
+import types |
+ |
+import py |
+ |
+import six |
+ |
+ |
+def test_add_doc(): |
+ def f(): |
+ """Icky doc""" |
+ pass |
+ six._add_doc(f, """New doc""") |
+ assert f.__doc__ == "New doc" |
+ |
+ |
+def test_import_module(): |
+ from logging import handlers |
+ m = six._import_module("logging.handlers") |
+ assert m is handlers |
+ |
+ |
+def test_integer_types(): |
+ assert isinstance(1, six.integer_types) |
+ assert isinstance(-1, six.integer_types) |
+ assert isinstance(six.MAXSIZE + 23, six.integer_types) |
+ assert not isinstance(.1, six.integer_types) |
+ |
+ |
+def test_string_types(): |
+ assert isinstance("hi", six.string_types) |
+ assert isinstance(six.u("hi"), six.string_types) |
+ assert issubclass(six.text_type, six.string_types) |
+ |
+ |
+def test_class_types(): |
+ class X: |
+ pass |
+ class Y(object): |
+ pass |
+ assert isinstance(X, six.class_types) |
+ assert isinstance(Y, six.class_types) |
+ assert not isinstance(X(), six.class_types) |
+ |
+ |
+def test_text_type(): |
+ assert type(six.u("hi")) is six.text_type |
+ |
+ |
+def test_binary_type(): |
+ assert type(six.b("hi")) is six.binary_type |
+ |
+ |
+def test_MAXSIZE(): |
+ try: |
+ # This shouldn't raise an overflow error. |
+ six.MAXSIZE.__index__() |
+ except AttributeError: |
+ # Before Python 2.6. |
+ pass |
+ py.test.raises( |
+ (ValueError, OverflowError), |
+ operator.mul, [None], six.MAXSIZE + 1) |
+ |
+ |
+def test_lazy(): |
+ if six.PY3: |
+ html_name = "html.parser" |
+ else: |
+ html_name = "HTMLParser" |
+ assert html_name not in sys.modules |
+ mod = six.moves.html_parser |
+ assert sys.modules[html_name] is mod |
+ assert "htmlparser" not in six._MovedItems.__dict__ |
+ |
+ |
+try: |
+ import _tkinter |
+except ImportError: |
+ have_tkinter = False |
+else: |
+ have_tkinter = True |
+ |
+have_gdbm = True |
+try: |
+ import gdbm |
+except ImportError: |
+ try: |
+ import dbm.gnu |
+ except ImportError: |
+ have_gdbm = False |
+ |
+@py.test.mark.parametrize("item_name", |
+ [item.name for item in six._moved_attributes]) |
+def test_move_items(item_name): |
+ """Ensure that everything loads correctly.""" |
+ try: |
+ item = getattr(six.moves, item_name) |
+ if isinstance(item, types.ModuleType): |
+ __import__("six.moves." + item_name) |
+ except AttributeError: |
+ if item_name == "zip_longest" and sys.version_info < (2, 6): |
+ py.test.skip("zip_longest only available on 2.6+") |
+ except ImportError: |
+ if item_name == "winreg" and not sys.platform.startswith("win"): |
+ py.test.skip("Windows only module") |
+ if item_name.startswith("tkinter"): |
+ if not have_tkinter: |
+ py.test.skip("requires tkinter") |
+ if item_name == "tkinter_ttk" and sys.version_info[:2] <= (2, 6): |
+ py.test.skip("ttk only available on 2.7+") |
+ if item_name.startswith("dbm_gnu") and not have_gdbm: |
+ py.test.skip("requires gdbm") |
+ raise |
+ if sys.version_info[:2] >= (2, 6): |
+ assert item_name in dir(six.moves) |
+ |
+ |
+@py.test.mark.parametrize("item_name", |
+ [item.name for item in six._urllib_parse_moved_attributes]) |
+def test_move_items_urllib_parse(item_name): |
+ """Ensure that everything loads correctly.""" |
+ if item_name == "ParseResult" and sys.version_info < (2, 5): |
+ py.test.skip("ParseResult is only found on 2.5+") |
+ if item_name in ("parse_qs", "parse_qsl") and sys.version_info < (2, 6): |
+ py.test.skip("parse_qs[l] is new in 2.6") |
+ if sys.version_info[:2] >= (2, 6): |
+ assert item_name in dir(six.moves.urllib.parse) |
+ getattr(six.moves.urllib.parse, item_name) |
+ |
+ |
+@py.test.mark.parametrize("item_name", |
+ [item.name for item in six._urllib_error_moved_attributes]) |
+def test_move_items_urllib_error(item_name): |
+ """Ensure that everything loads correctly.""" |
+ if sys.version_info[:2] >= (2, 6): |
+ assert item_name in dir(six.moves.urllib.error) |
+ getattr(six.moves.urllib.error, item_name) |
+ |
+ |
+@py.test.mark.parametrize("item_name", |
+ [item.name for item in six._urllib_request_moved_attributes]) |
+def test_move_items_urllib_request(item_name): |
+ """Ensure that everything loads correctly.""" |
+ if sys.version_info[:2] >= (2, 6): |
+ assert item_name in dir(six.moves.urllib.request) |
+ getattr(six.moves.urllib.request, item_name) |
+ |
+ |
+@py.test.mark.parametrize("item_name", |
+ [item.name for item in six._urllib_response_moved_attributes]) |
+def test_move_items_urllib_response(item_name): |
+ """Ensure that everything loads correctly.""" |
+ if sys.version_info[:2] >= (2, 6): |
+ assert item_name in dir(six.moves.urllib.response) |
+ getattr(six.moves.urllib.response, item_name) |
+ |
+ |
+@py.test.mark.parametrize("item_name", |
+ [item.name for item in six._urllib_robotparser_moved_attributes]) |
+def test_move_items_urllib_robotparser(item_name): |
+ """Ensure that everything loads correctly.""" |
+ if sys.version_info[:2] >= (2, 6): |
+ assert item_name in dir(six.moves.urllib.robotparser) |
+ getattr(six.moves.urllib.robotparser, item_name) |
+ |
+ |
+def test_import_moves_error_1(): |
+ from six.moves.urllib.parse import urljoin |
+ from six import moves |
+ # In 1.4.1: AttributeError: 'Module_six_moves_urllib_parse' object has no attribute 'urljoin' |
+ assert moves.urllib.parse.urljoin |
+ |
+ |
+def test_import_moves_error_2(): |
+ from six import moves |
+ assert moves.urllib.parse.urljoin |
+ # In 1.4.1: ImportError: cannot import name urljoin |
+ from six.moves.urllib.parse import urljoin |
+ |
+ |
+def test_import_moves_error_3(): |
+ from six.moves.urllib.parse import urljoin |
+ # In 1.4.1: ImportError: cannot import name urljoin |
+ from six.moves.urllib_parse import urljoin |
+ |
+ |
+def test_from_imports(): |
+ from six.moves.queue import Queue |
+ assert isinstance(Queue, six.class_types) |
+ from six.moves.configparser import ConfigParser |
+ assert isinstance(ConfigParser, six.class_types) |
+ |
+ |
+def test_filter(): |
+ from six.moves import filter |
+ f = filter(lambda x: x % 2, range(10)) |
+ assert six.advance_iterator(f) == 1 |
+ |
+ |
+def test_filter_false(): |
+ from six.moves import filterfalse |
+ f = filterfalse(lambda x: x % 3, range(10)) |
+ assert six.advance_iterator(f) == 0 |
+ assert six.advance_iterator(f) == 3 |
+ assert six.advance_iterator(f) == 6 |
+ |
+def test_map(): |
+ from six.moves import map |
+ assert six.advance_iterator(map(lambda x: x + 1, range(2))) == 1 |
+ |
+ |
+def test_zip(): |
+ from six.moves import zip |
+ assert six.advance_iterator(zip(range(2), range(2))) == (0, 0) |
+ |
+ |
+@py.test.mark.skipif("sys.version_info < (2, 6)") |
+def test_zip_longest(): |
+ from six.moves import zip_longest |
+ it = zip_longest(range(2), range(1)) |
+ |
+ assert six.advance_iterator(it) == (0, 0) |
+ assert six.advance_iterator(it) == (1, None) |
+ |
+ |
+class TestCustomizedMoves: |
+ |
+ def teardown_method(self, meth): |
+ try: |
+ del six._MovedItems.spam |
+ except AttributeError: |
+ pass |
+ try: |
+ del six.moves.__dict__["spam"] |
+ except KeyError: |
+ pass |
+ |
+ |
+ def test_moved_attribute(self): |
+ attr = six.MovedAttribute("spam", "foo", "bar") |
+ if six.PY3: |
+ assert attr.mod == "bar" |
+ else: |
+ assert attr.mod == "foo" |
+ assert attr.attr == "spam" |
+ attr = six.MovedAttribute("spam", "foo", "bar", "lemma") |
+ assert attr.attr == "lemma" |
+ attr = six.MovedAttribute("spam", "foo", "bar", "lemma", "theorm") |
+ if six.PY3: |
+ assert attr.attr == "theorm" |
+ else: |
+ assert attr.attr == "lemma" |
+ |
+ |
+ def test_moved_module(self): |
+ attr = six.MovedModule("spam", "foo") |
+ if six.PY3: |
+ assert attr.mod == "spam" |
+ else: |
+ assert attr.mod == "foo" |
+ attr = six.MovedModule("spam", "foo", "bar") |
+ if six.PY3: |
+ assert attr.mod == "bar" |
+ else: |
+ assert attr.mod == "foo" |
+ |
+ |
+ def test_custom_move_module(self): |
+ attr = six.MovedModule("spam", "six", "six") |
+ six.add_move(attr) |
+ six.remove_move("spam") |
+ assert not hasattr(six.moves, "spam") |
+ attr = six.MovedModule("spam", "six", "six") |
+ six.add_move(attr) |
+ from six.moves import spam |
+ assert spam is six |
+ six.remove_move("spam") |
+ assert not hasattr(six.moves, "spam") |
+ |
+ |
+ def test_custom_move_attribute(self): |
+ attr = six.MovedAttribute("spam", "six", "six", "u", "u") |
+ six.add_move(attr) |
+ six.remove_move("spam") |
+ assert not hasattr(six.moves, "spam") |
+ attr = six.MovedAttribute("spam", "six", "six", "u", "u") |
+ six.add_move(attr) |
+ from six.moves import spam |
+ assert spam is six.u |
+ six.remove_move("spam") |
+ assert not hasattr(six.moves, "spam") |
+ |
+ |
+ def test_empty_remove(self): |
+ py.test.raises(AttributeError, six.remove_move, "eggs") |
+ |
+ |
+def test_get_unbound_function(): |
+ class X(object): |
+ def m(self): |
+ pass |
+ assert six.get_unbound_function(X.m) is X.__dict__["m"] |
+ |
+ |
+def test_get_method_self(): |
+ class X(object): |
+ def m(self): |
+ pass |
+ x = X() |
+ assert six.get_method_self(x.m) is x |
+ py.test.raises(AttributeError, six.get_method_self, 42) |
+ |
+ |
+def test_get_method_function(): |
+ class X(object): |
+ def m(self): |
+ pass |
+ x = X() |
+ assert six.get_method_function(x.m) is X.__dict__["m"] |
+ py.test.raises(AttributeError, six.get_method_function, hasattr) |
+ |
+ |
+def test_get_function_closure(): |
+ def f(): |
+ x = 42 |
+ def g(): |
+ return x |
+ return g |
+ cell = six.get_function_closure(f())[0] |
+ assert type(cell).__name__ == "cell" |
+ |
+ |
+def test_get_function_code(): |
+ def f(): |
+ pass |
+ assert isinstance(six.get_function_code(f), types.CodeType) |
+ if not hasattr(sys, "pypy_version_info"): |
+ py.test.raises(AttributeError, six.get_function_code, hasattr) |
+ |
+ |
+def test_get_function_defaults(): |
+ def f(x, y=3, b=4): |
+ pass |
+ assert six.get_function_defaults(f) == (3, 4) |
+ |
+ |
+def test_get_function_globals(): |
+ def f(): |
+ pass |
+ assert six.get_function_globals(f) is globals() |
+ |
+ |
+def test_dictionary_iterators(monkeypatch): |
+ def stock_method_name(iterwhat): |
+ """Given a method suffix like "lists" or "values", return the name |
+ of the dict method that delivers those on the version of Python |
+ we're running in.""" |
+ if six.PY3: |
+ return iterwhat |
+ return 'iter' + iterwhat |
+ |
+ class MyDict(dict): |
+ if not six.PY3: |
+ def lists(self, **kw): |
+ return [1, 2, 3] |
+ def iterlists(self, **kw): |
+ return iter([1, 2, 3]) |
+ f = MyDict.iterlists |
+ del MyDict.iterlists |
+ setattr(MyDict, stock_method_name('lists'), f) |
+ |
+ d = MyDict(zip(range(10), reversed(range(10)))) |
+ for name in "keys", "values", "items", "lists": |
+ meth = getattr(six, "iter" + name) |
+ it = meth(d) |
+ assert not isinstance(it, list) |
+ assert list(it) == list(getattr(d, name)()) |
+ py.test.raises(StopIteration, six.advance_iterator, it) |
+ record = [] |
+ def with_kw(*args, **kw): |
+ record.append(kw["kw"]) |
+ return old(*args) |
+ old = getattr(MyDict, stock_method_name(name)) |
+ monkeypatch.setattr(MyDict, stock_method_name(name), with_kw) |
+ meth(d, kw=42) |
+ assert record == [42] |
+ monkeypatch.undo() |
+ |
+ |
+def test_advance_iterator(): |
+ assert six.next is six.advance_iterator |
+ l = [1, 2] |
+ it = iter(l) |
+ assert six.next(it) == 1 |
+ assert six.next(it) == 2 |
+ py.test.raises(StopIteration, six.next, it) |
+ py.test.raises(StopIteration, six.next, it) |
+ |
+ |
+def test_iterator(): |
+ class myiter(six.Iterator): |
+ def __next__(self): |
+ return 13 |
+ assert six.advance_iterator(myiter()) == 13 |
+ class myitersub(myiter): |
+ def __next__(self): |
+ return 14 |
+ assert six.advance_iterator(myitersub()) == 14 |
+ |
+ |
+def test_callable(): |
+ class X: |
+ def __call__(self): |
+ pass |
+ def method(self): |
+ pass |
+ assert six.callable(X) |
+ assert six.callable(X()) |
+ assert six.callable(test_callable) |
+ assert six.callable(hasattr) |
+ assert six.callable(X.method) |
+ assert six.callable(X().method) |
+ assert not six.callable(4) |
+ assert not six.callable("string") |
+ |
+ |
+def test_create_bound_method(): |
+ class X(object): |
+ pass |
+ def f(self): |
+ return self |
+ x = X() |
+ b = six.create_bound_method(f, x) |
+ assert isinstance(b, types.MethodType) |
+ assert b() is x |
+ |
+ |
+if six.PY3: |
+ |
+ def test_b(): |
+ data = six.b("\xff") |
+ assert isinstance(data, bytes) |
+ assert len(data) == 1 |
+ assert data == bytes([255]) |
+ |
+ |
+ def test_u(): |
+ s = six.u("hi \u0439 \U00000439 \\ \\\\ \n") |
+ assert isinstance(s, str) |
+ assert s == "hi \u0439 \U00000439 \\ \\\\ \n" |
+ |
+else: |
+ |
+ def test_b(): |
+ data = six.b("\xff") |
+ assert isinstance(data, str) |
+ assert len(data) == 1 |
+ assert data == "\xff" |
+ |
+ |
+ def test_u(): |
+ s = six.u("hi \u0439 \U00000439 \\ \\\\ \n") |
+ assert isinstance(s, unicode) |
+ assert s == "hi \xd0\xb9 \xd0\xb9 \\ \\\\ \n".decode("utf8") |
+ |
+ |
+def test_u_escapes(): |
+ s = six.u("\u1234") |
+ assert len(s) == 1 |
+ |
+ |
+def test_unichr(): |
+ assert six.u("\u1234") == six.unichr(0x1234) |
+ assert type(six.u("\u1234")) is type(six.unichr(0x1234)) |
+ |
+ |
+def test_int2byte(): |
+ assert six.int2byte(3) == six.b("\x03") |
+ py.test.raises((OverflowError, ValueError), six.int2byte, 256) |
+ |
+ |
+def test_byte2int(): |
+ assert six.byte2int(six.b("\x03")) == 3 |
+ assert six.byte2int(six.b("\x03\x04")) == 3 |
+ py.test.raises(IndexError, six.byte2int, six.b("")) |
+ |
+ |
+def test_bytesindex(): |
+ assert six.indexbytes(six.b("hello"), 3) == ord("l") |
+ |
+ |
+def test_bytesiter(): |
+ it = six.iterbytes(six.b("hi")) |
+ assert six.next(it) == ord("h") |
+ assert six.next(it) == ord("i") |
+ py.test.raises(StopIteration, six.next, it) |
+ |
+ |
+def test_StringIO(): |
+ fp = six.StringIO() |
+ fp.write(six.u("hello")) |
+ assert fp.getvalue() == six.u("hello") |
+ |
+ |
+def test_BytesIO(): |
+ fp = six.BytesIO() |
+ fp.write(six.b("hello")) |
+ assert fp.getvalue() == six.b("hello") |
+ |
+ |
+def test_exec_(): |
+ def f(): |
+ l = [] |
+ six.exec_("l.append(1)") |
+ assert l == [1] |
+ f() |
+ ns = {} |
+ six.exec_("x = 42", ns) |
+ assert ns["x"] == 42 |
+ glob = {} |
+ loc = {} |
+ six.exec_("global y; y = 42; x = 12", glob, loc) |
+ assert glob["y"] == 42 |
+ assert "x" not in glob |
+ assert loc["x"] == 12 |
+ assert "y" not in loc |
+ |
+ |
+def test_reraise(): |
+ def get_next(tb): |
+ if six.PY3: |
+ return tb.tb_next.tb_next |
+ else: |
+ return tb.tb_next |
+ e = Exception("blah") |
+ try: |
+ raise e |
+ except Exception: |
+ tp, val, tb = sys.exc_info() |
+ try: |
+ six.reraise(tp, val, tb) |
+ except Exception: |
+ tp2, value2, tb2 = sys.exc_info() |
+ assert tp2 is Exception |
+ assert value2 is e |
+ assert tb is get_next(tb2) |
+ try: |
+ six.reraise(tp, val) |
+ except Exception: |
+ tp2, value2, tb2 = sys.exc_info() |
+ assert tp2 is Exception |
+ assert value2 is e |
+ assert tb2 is not tb |
+ try: |
+ six.reraise(tp, val, tb2) |
+ except Exception: |
+ tp2, value2, tb3 = sys.exc_info() |
+ assert tp2 is Exception |
+ assert value2 is e |
+ assert get_next(tb3) is tb2 |
+ try: |
+ six.reraise(tp, None, tb) |
+ except Exception: |
+ tp2, value2, tb2 = sys.exc_info() |
+ assert tp2 is Exception |
+ assert value2 is not val |
+ assert isinstance(value2, Exception) |
+ assert tb is get_next(tb2) |
+ |
+ |
+def test_print_(): |
+ save = sys.stdout |
+ out = sys.stdout = six.moves.StringIO() |
+ try: |
+ six.print_("Hello,", "person!") |
+ finally: |
+ sys.stdout = save |
+ assert out.getvalue() == "Hello, person!\n" |
+ out = six.StringIO() |
+ six.print_("Hello,", "person!", file=out) |
+ assert out.getvalue() == "Hello, person!\n" |
+ out = six.StringIO() |
+ six.print_("Hello,", "person!", file=out, end="") |
+ assert out.getvalue() == "Hello, person!" |
+ out = six.StringIO() |
+ six.print_("Hello,", "person!", file=out, sep="X") |
+ assert out.getvalue() == "Hello,Xperson!\n" |
+ out = six.StringIO() |
+ six.print_(six.u("Hello,"), six.u("person!"), file=out) |
+ result = out.getvalue() |
+ assert isinstance(result, six.text_type) |
+ assert result == six.u("Hello, person!\n") |
+ six.print_("Hello", file=None) # This works. |
+ out = six.StringIO() |
+ six.print_(None, file=out) |
+ assert out.getvalue() == "None\n" |
+ |
+ |
+@py.test.mark.skipif("sys.version_info[:2] >= (2, 6)") |
+def test_print_encoding(monkeypatch): |
+ # Fool the type checking in print_. |
+ monkeypatch.setattr(six, "file", six.BytesIO, raising=False) |
+ out = six.BytesIO() |
+ out.encoding = "utf-8" |
+ out.errors = None |
+ six.print_(six.u("\u053c"), end="", file=out) |
+ assert out.getvalue() == six.b("\xd4\xbc") |
+ out = six.BytesIO() |
+ out.encoding = "ascii" |
+ out.errors = "strict" |
+ py.test.raises(UnicodeEncodeError, six.print_, six.u("\u053c"), file=out) |
+ out.errors = "backslashreplace" |
+ six.print_(six.u("\u053c"), end="", file=out) |
+ assert out.getvalue() == six.b("\\u053c") |
+ |
+ |
+def test_print_exceptions(): |
+ py.test.raises(TypeError, six.print_, x=3) |
+ py.test.raises(TypeError, six.print_, end=3) |
+ py.test.raises(TypeError, six.print_, sep=42) |
+ |
+ |
+def test_with_metaclass(): |
+ class Meta(type): |
+ pass |
+ class X(six.with_metaclass(Meta)): |
+ pass |
+ assert type(X) is Meta |
+ assert issubclass(X, object) |
+ class Base(object): |
+ pass |
+ class X(six.with_metaclass(Meta, Base)): |
+ pass |
+ assert type(X) is Meta |
+ assert issubclass(X, Base) |
+ class Base2(object): |
+ pass |
+ class X(six.with_metaclass(Meta, Base, Base2)): |
+ pass |
+ assert type(X) is Meta |
+ assert issubclass(X, Base) |
+ assert issubclass(X, Base2) |
+ assert X.__mro__ == (X, Base, Base2, object) |
+ |
+ |
+def test_wraps(): |
+ def f(g): |
+ @six.wraps(g) |
+ def w(): |
+ return 42 |
+ return w |
+ def k(): |
+ pass |
+ original_k = k |
+ k = f(f(k)) |
+ assert hasattr(k, '__wrapped__') |
+ k = k.__wrapped__ |
+ assert hasattr(k, '__wrapped__') |
+ k = k.__wrapped__ |
+ assert k is original_k |
+ assert not hasattr(k, '__wrapped__') |
+ |
+ |
+def test_add_metaclass(): |
+ class Meta(type): |
+ pass |
+ class X: |
+ "success" |
+ X = six.add_metaclass(Meta)(X) |
+ assert type(X) is Meta |
+ assert issubclass(X, object) |
+ assert X.__module__ == __name__ |
+ assert X.__doc__ == "success" |
+ class Base(object): |
+ pass |
+ class X(Base): |
+ pass |
+ X = six.add_metaclass(Meta)(X) |
+ assert type(X) is Meta |
+ assert issubclass(X, Base) |
+ class Base2(object): |
+ pass |
+ class X(Base, Base2): |
+ pass |
+ X = six.add_metaclass(Meta)(X) |
+ assert type(X) is Meta |
+ assert issubclass(X, Base) |
+ assert issubclass(X, Base2) |
+ |
+ # Test a second-generation subclass of a type. |
+ class Meta1(type): |
+ m1 = "m1" |
+ class Meta2(Meta1): |
+ m2 = "m2" |
+ class Base: |
+ b = "b" |
+ Base = six.add_metaclass(Meta1)(Base) |
+ class X(Base): |
+ x = "x" |
+ X = six.add_metaclass(Meta2)(X) |
+ assert type(X) is Meta2 |
+ assert issubclass(X, Base) |
+ assert type(Base) is Meta1 |
+ assert "__dict__" not in vars(X) |
+ instance = X() |
+ instance.attr = "test" |
+ assert vars(instance) == {"attr": "test"} |
+ assert instance.b == Base.b |
+ assert instance.x == X.x |
+ |
+ # Test a class with slots. |
+ class MySlots(object): |
+ __slots__ = ["a", "b"] |
+ MySlots = six.add_metaclass(Meta1)(MySlots) |
+ |
+ assert MySlots.__slots__ == ["a", "b"] |
+ instance = MySlots() |
+ instance.a = "foo" |
+ py.test.raises(AttributeError, setattr, instance, "c", "baz") |
+ |
+ # Test a class with string for slots. |
+ class MyStringSlots(object): |
+ __slots__ = "ab" |
+ MyStringSlots = six.add_metaclass(Meta1)(MyStringSlots) |
+ assert MyStringSlots.__slots__ == "ab" |
+ instance = MyStringSlots() |
+ instance.ab = "foo" |
+ py.test.raises(AttributeError, setattr, instance, "a", "baz") |
+ py.test.raises(AttributeError, setattr, instance, "b", "baz") |
+ |
+ class MySlotsWeakref(object): |
+ __slots__ = "__weakref__", |
+ MySlotsWeakref = six.add_metaclass(Meta)(MySlotsWeakref) |
+ assert type(MySlotsWeakref) is Meta |