def test_parser_lex_filename(self): # Do not use a string to avoid issues due to string interning. name = object() self.assertEqual(sys.getrefcount(name), 2) f = io.BytesIO(b"") f.name = object() self.assertEqual(sys.getrefcount(f.name), 2) builder = lexer.LexBuilder() parser = _parser.Parser(builder) iterator = parser.lex(f, filename=name) tokens = list(iterator) # The Parser object keeps references to the input file and to # the name while iterating over the tokens in the input file. self.assertEqual(sys.getrefcount(name), 3) self.assertEqual(sys.getrefcount(f), 3) # The name attribute of the file object is not referenced. self.assertEqual(sys.getrefcount(f.name), 2) del parser del iterator # Once the Parser object is gone we should have just the local # reference to the file object and two references to name. self.assertEqual(sys.getrefcount(name), 2) self.assertEqual(sys.getrefcount(f), 2)
def test_lex_lineno(self): f = io.BytesIO(b"1.0") builder = lexer.LexBuilder() parser = _parser.Parser(builder) tokens = list(parser.lex(f, lineno=42)) token, lineno, matched, value = tokens[0] self.assertEqual(lineno, 42)
def test_parser_lex_multi(self): file1 = io.BytesIO(b"") file1.name = object() self.assertEqual(sys.getrefcount(file1.name), 2) file2 = io.BytesIO(b"") file2.name = object() self.assertEqual(sys.getrefcount(file2.name), 2) builder = lexer.LexBuilder() parser = _parser.Parser(builder) tokens = list(parser.lex(file1)) tokens = list(parser.lex(file2)) del parser # Once the Parser object is gone we should have just the local # references to the file objects and one references to the names. self.assertEqual(sys.getrefcount(file1), 2) self.assertEqual(sys.getrefcount(file1.name), 2) self.assertEqual(sys.getrefcount(file2), 2) self.assertEqual(sys.getrefcount(file2.name), 2)
def test_parser_lex(self): # Do not use a string to avoid issues due to string interning. name = object() # Note that passing name as an argument to sys.getrefcount() # counts as one reference, thus the minimum reference count # returned for any object is 2. self.assertEqual(sys.getrefcount(name), 2) f = io.BytesIO(b"") f.name = name # One more refernece from the 'name' attriute. self.assertEqual(sys.getrefcount(name), 3) # Just one reference to the BytesIO object. self.assertEqual(sys.getrefcount(f), 2) builder = lexer.LexBuilder() parser = _parser.Parser(builder) iterator = parser.lex(f) # The Parser object keeps references to the input file and to # the name while iterating over the tokens in the input file. self.assertEqual(sys.getrefcount(name), 4) self.assertEqual(sys.getrefcount(f), 3) # The iterator holds one reference to the parser. self.assertEqual(sys.getrefcount(parser), 3) tokens = list(iterator) # Just the EOL token. self.assertEqual(len(tokens), 1) # Once done scanning is completed the Parser object still has # references to the input file and to the name. self.assertEqual(sys.getrefcount(name), 4) self.assertEqual(sys.getrefcount(f), 3) del parser del iterator # Once the Parser object is gone we should have just the local # reference to the file object and two references to name. self.assertEqual(sys.getrefcount(name), 3) self.assertEqual(sys.getrefcount(f), 2) del f # With the file object gone there is one reference to name. self.assertEqual(sys.getrefcount(name), 2)