33import linecache
44import unittest
55import os .path
6+ import tempfile
67from test import support
78
89
910FILENAME = linecache .__file__
1011NONEXISTENT_FILENAME = FILENAME + '.missing'
1112INVALID_NAME = '!@$)(!@#_1'
1213EMPTY = ''
13- TESTS = 'inspect_fodder inspect_fodder2 mapping_tests'
14- TESTS = TESTS .split ()
1514TEST_PATH = os .path .dirname (__file__ )
1615MODULES = "linecache abc" .split ()
1716MODULE_PATH = os .path .dirname (FILENAME )
@@ -37,6 +36,65 @@ def f():
3736 return 3''' # No ending newline
3837
3938
39+ class TempFile :
40+
41+ def setUp (self ):
42+ super ().setUp ()
43+ with tempfile .NamedTemporaryFile (delete = False ) as fp :
44+ self .file_name = fp .name
45+ fp .write (self .file_byte_string )
46+ self .addCleanup (support .unlink , self .file_name )
47+
48+
49+ class GetLineTestsGoodData (TempFile ):
50+ # file_list = ['list\n', 'of\n', 'good\n', 'strings\n']
51+
52+ def setUp (self ):
53+ self .file_byte_string = '' .join (self .file_list ).encode ('utf-8' )
54+ super ().setUp ()
55+
56+ def test_getline (self ):
57+ with open (self .file_name ) as fp :
58+ for index , line in enumerate (fp ):
59+ if not line .endswith ('\n ' ):
60+ line += '\n '
61+
62+ cached_line = linecache .getline (self .file_name , index + 1 )
63+ self .assertEqual (line , cached_line )
64+
65+ def test_getlines (self ):
66+ lines = linecache .getlines (self .file_name )
67+ self .assertEqual (lines , self .file_list )
68+
69+
70+ class GetLineTestsBadData (TempFile ):
71+ # file_byte_string = b'Bad data goes here'
72+
73+ def test_getline (self ):
74+ self .assertRaises ((SyntaxError , UnicodeDecodeError ),
75+ linecache .getline , self .file_name , 1 )
76+
77+ def test_getlines (self ):
78+ self .assertRaises ((SyntaxError , UnicodeDecodeError ),
79+ linecache .getlines , self .file_name )
80+
81+
82+ class EmptyFile (GetLineTestsGoodData , unittest .TestCase ):
83+ file_list = []
84+
85+
86+ class SingleEmptyLine (GetLineTestsGoodData , unittest .TestCase ):
87+ file_list = ['\n ' ]
88+
89+
90+ class GoodUnicode (GetLineTestsGoodData , unittest .TestCase ):
91+ file_list = ['á\n ' , 'b\n ' , 'abcdef\n ' , 'ááááá\n ' ]
92+
93+
94+ class BadUnicode (GetLineTestsBadData , unittest .TestCase ):
95+ file_byte_string = b'\x80 abc'
96+
97+
4098class LineCacheTests (unittest .TestCase ):
4199
42100 def test_getline (self ):
@@ -53,13 +111,6 @@ def test_getline(self):
53111 self .assertEqual (getline (EMPTY , 1 ), EMPTY )
54112 self .assertEqual (getline (INVALID_NAME , 1 ), EMPTY )
55113
56- # Check whether lines correspond to those from file iteration
57- for entry in TESTS :
58- filename = os .path .join (TEST_PATH , entry ) + '.py'
59- with open (filename ) as file :
60- for index , line in enumerate (file ):
61- self .assertEqual (line , getline (filename , index + 1 ))
62-
63114 # Check module loading
64115 for entry in MODULES :
65116 filename = os .path .join (MODULE_PATH , entry ) + '.py'
@@ -80,12 +131,13 @@ def test_no_ending_newline(self):
80131
81132 def test_clearcache (self ):
82133 cached = []
83- for entry in TESTS :
84- filename = os .path .join (TEST_PATH , entry ) + '.py'
134+ for entry in MODULES :
135+ filename = os .path .join (MODULE_PATH , entry ) + '.py'
85136 cached .append (filename )
86137 linecache .getline (filename , 1 )
87138
88139 # Are all files cached?
140+ self .assertNotEqual (cached , [])
89141 cached_empty = [fn for fn in cached if fn not in linecache .cache ]
90142 self .assertEqual (cached_empty , [])
91143
0 commit comments