def test_name_conflicts(self): # Some names like "self", "cls", "tuple", "itemgetter", and "property" # failed when used as field names. Test to make sure these now work. T = BagType('T', ('itemgetter', 'property', 'self', 'cls', 'tuple')) t = T(1, 2, 3, 4, 5) self.assertEqual(t, (1, 2, 3, 4, 5)) newt = t._replace(itemgetter=10, property=20, self=30, cls=40, tuple=50) self.assertEqual(newt, (10, 20, 30, 40, 50)) # Broader test of all interesting names taken from the code, old # template, and an example words = { 'Alias', 'At', 'AttributeError', 'Build', 'Bypass', 'Create', 'Encountered', 'Expected', 'Field', 'For', 'Got', 'Helper', 'IronPython', 'Jython', 'KeyError', 'Make', 'Modify', 'Note', 'OrderedDict', 'Point', 'Return', 'Returns', 'Type', 'TypeError', 'Used', 'Validate', 'ValueError', 'Variables', 'a', 'accessible', 'add', 'added', 'all', 'also', 'an', 'arg_list', 'args', 'arguments', 'automatically', 'be', 'build', 'builtins', 'but', 'by', 'cannot', 'class_namespace', 'classmethod', 'cls', 'collections', 'convert', 'copy', 'created', 'creation', 'd', 'debugging', 'defined', 'dict', 'dictionary', 'doc', 'docstring', 'docstrings', 'duplicate', 'effect', 'either', 'enumerate', 'environments', 'error', 'example', 'exec', 'f', 'f_globals', 'field', 'field_names', 'fields', 'formatted', 'frame', 'function', 'functions', 'generate', 'getter', 'got', 'greater', 'has', 'help', 'identifiers', 'indexable', 'instance', 'instantiate', 'interning', 'introspection', 'isidentifier', 'isinstance', 'itemgetter', 'iterable', 'join', 'keyword', 'keywords', 'kwds', 'len', 'like', 'list', 'map', 'maps', 'message', 'metadata', 'method', 'methods', 'module', 'module_name', 'must', 'name', 'named', 'namedtuple', 'namedtuple_', 'names', 'namespace', 'needs', 'new', 'nicely', 'num_fields', 'number', 'object', 'of', 'operator', 'option', 'p', 'particular', 'pickle', 'pickling', 'plain', 'pop', 'positional', 'property', 'r', 'regular', 'rename', 'replace', 'replacing', 'repr', 'repr_fmt', 'representation', 'result', 'reuse_itemgetter', 's', 'seen', 'sequence', 'set', 'side', 'specified', 'split', 'start', 'startswith', 'step', 'str', 'string', 'strings', 'subclass', 'sys', 'targets', 'than', 'the', 'their', 'this', 'to', 'tuple_new', 'type', 'typename', 'underscore', 'unexpected', 'unpack', 'up', 'use', 'used', 'user', 'valid', 'values', 'variable', 'verbose', 'where', 'which', 'work', 'x', 'y', 'z', 'zip' } sorted_words = tuple(sorted(words)) T = BagType('T', sorted_words) # test __new__ values = tuple(range(len(words))) t = T(*values) self.assertEqual(t, values) t = T(**dict(zip(T._attrs, values))) self.assertEqual(t, values) # test _make t = T._make(values) self.assertEqual(t, values) # exercise __repr__ repr(t) # test _asdict self.assertEqual(t._asdict(), dict(zip(T._fields, values))) # test _replace t = T._make(values) newvalues = tuple(v * 10 for v in values) newt = t._replace(**dict(zip(T._fields, newvalues))) self.assertEqual(newt, newvalues) # test _fields self.assertEqual(T._attrs, sorted_words) # test __getnewargs__ self.assertEqual(t.__getnewargs__(), values)
def test_odd_sizes(self): Zero = BagType("Zero", ()) self.assertEqual(Zero(), ()) self.assertEqual(Zero._make([]), ()) self.assertEqual(repr(Zero()), "Zero()") self.assertEqual(Zero()._asdict(), {}) self.assertEqual(Zero()._fields, ()) Dot = BagType("Dot", ("d",)) self.assertEqual(Dot(1), (1,)) self.assertEqual(Dot._make([1]), (1,)) self.assertEqual(Dot(1).d, 1) self.assertEqual(repr(Dot(1)), "Dot(d=1)") self.assertEqual(Dot(1)._asdict(), {"d": 1}) self.assertEqual(Dot(1)._replace(d=999), (999,)) self.assertEqual(Dot(1)._fields, ("d",)) n = 5000 if sys.version_info >= (3, 7) else 254 names = list(set("".join([choice(string.ascii_letters) for j in range(10)]) for i in range(n))) n = len(names) Big = BagType("Big", names) b = Big(*range(n)) self.assertEqual(b, tuple(range(n))) self.assertEqual(Big._make(range(n)), tuple(range(n))) for pos, name in enumerate(names): self.assertEqual(getattr(b, name), pos) repr(b) # make sure repr() doesn't blow-up d = b._asdict() d_expected = dict(zip(names, range(n))) self.assertEqual(d, d_expected) b2 = b._replace(**dict([(names[1], 999), (names[-5], 42)])) b2_expected = list(range(n)) b2_expected[1] = 999 b2_expected[-5] = 42 self.assertEqual(b2, tuple(b2_expected)) self.assertEqual(b._fields, tuple(names))
def test_odd_sizes(self): Zero = BagType('Zero', ()) self.assertEqual(Zero(), ()) self.assertEqual(Zero._make([]), ()) self.assertEqual(repr(Zero()), 'Zero()') self.assertEqual(Zero()._asdict(), {}) self.assertEqual(Zero()._fields, ()) Dot = BagType('Dot', ('d', )) self.assertEqual(Dot(1), (1, )) self.assertEqual(Dot._make([1]), (1, )) self.assertEqual(Dot(1).d, 1) self.assertEqual(repr(Dot(1)), 'Dot(d=1)') self.assertEqual(Dot(1)._asdict(), {'d': 1}) self.assertEqual(Dot(1)._replace(d=999), (999, )) self.assertEqual(Dot(1)._fields, ('d', )) n = 5000 if sys.version_info >= (3, 7) else 254 names = list(set(''.join([choice(string.ascii_letters) for j in range(10)]) for i in range(n))) n = len(names) Big = BagType('Big', names) b = Big(*range(n)) self.assertEqual(b, tuple(range(n))) self.assertEqual(Big._make(range(n)), tuple(range(n))) for pos, name in enumerate(names): self.assertEqual(getattr(b, name), pos) repr(b) # make sure repr() doesn't blow-up d = b._asdict() d_expected = dict(zip(names, range(n))) self.assertEqual(d, d_expected) b2 = b._replace(**dict([(names[1], 999), (names[-5], 42)])) b2_expected = list(range(n)) b2_expected[1] = 999 b2_expected[-5] = 42 self.assertEqual(b2, tuple(b2_expected)) self.assertEqual(b._fields, tuple(names))
def test_name_conflicts(self): # Some names like "self", "cls", "tuple", "itemgetter", and "property" # failed when used as field names. Test to make sure these now work. T = BagType("T", ("itemgetter", "property", "self", "cls", "tuple")) t = T(1, 2, 3, 4, 5) self.assertEqual(t, (1, 2, 3, 4, 5)) newt = t._replace(itemgetter=10, property=20, self=30, cls=40, tuple=50) self.assertEqual(newt, (10, 20, 30, 40, 50)) # Broader test of all interesting names taken from the code, old # template, and an example words = { "Alias", "At", "AttributeError", "Build", "Bypass", "Create", "Encountered", "Expected", "Field", "For", "Got", "Helper", "IronPython", "Jython", "KeyError", "Make", "Modify", "Note", "OrderedDict", "Point", "Return", "Returns", "Type", "TypeError", "Used", "Validate", "ValueError", "Variables", "a", "accessible", "add", "added", "all", "also", "an", "arg_list", "args", "arguments", "automatically", "be", "build", "builtins", "but", "by", "cannot", "class_namespace", "classmethod", "cls", "collections", "convert", "copy", "created", "creation", "d", "debugging", "defined", "dict", "dictionary", "doc", "docstring", "docstrings", "duplicate", "effect", "either", "enumerate", "environments", "error", "example", "exec", "f", "f_globals", "field", "field_names", "fields", "formatted", "frame", "function", "functions", "generate", "getter", "got", "greater", "has", "help", "identifiers", "indexable", "instance", "instantiate", "interning", "introspection", "isidentifier", "isinstance", "itemgetter", "iterable", "join", "keyword", "keywords", "kwds", "len", "like", "list", "map", "maps", "message", "metadata", "method", "methods", "module", "module_name", "must", "name", "named", "namedtuple", "namedtuple_", "names", "namespace", "needs", "new", "nicely", "num_fields", "number", "object", "of", "operator", "option", "p", "particular", "pickle", "pickling", "plain", "pop", "positional", "property", "r", "regular", "rename", "replace", "replacing", "repr", "repr_fmt", "representation", "result", "reuse_itemgetter", "s", "seen", "sequence", "set", "side", "specified", "split", "start", "startswith", "step", "str", "string", "strings", "subclass", "sys", "targets", "than", "the", "their", "this", "to", "tuple_new", "type", "typename", "underscore", "unexpected", "unpack", "up", "use", "used", "user", "valid", "values", "variable", "verbose", "where", "which", "work", "x", "y", "z", "zip", } sorted_words = tuple(sorted(words)) T = BagType("T", sorted_words) # test __new__ values = tuple(range(len(words))) t = T(*values) self.assertEqual(t, values) t = T(**dict(zip(T._attrs, values))) self.assertEqual(t, values) # test _make t = T._make(values) self.assertEqual(t, values) # exercise __repr__ repr(t) # test _asdict self.assertEqual(t._asdict(), dict(zip(T._fields, values))) # test _replace t = T._make(values) newvalues = tuple(v * 10 for v in values) newt = t._replace(**dict(zip(T._fields, newvalues))) self.assertEqual(newt, newvalues) # test _fields self.assertEqual(T._attrs, sorted_words) # test __getnewargs__ self.assertEqual(t.__getnewargs__(), values)