OpenRAM/compiler/tests/00_code_format_check_test.py

154 lines
4.9 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# See LICENSE for licensing information.
#
2021-01-22 20:23:28 +01:00
# Copyright (c) 2016-2021 Regents of the University of California and The Board
2019-06-14 17:43:41 +02:00
# of Regents for the Oklahoma Agricultural and Mechanical College
# (acting for and on behalf of Oklahoma State University)
# All rights reserved.
#
2016-11-08 18:57:35 +01:00
import unittest
from testutils import *
import sys, os,re
2016-11-08 18:57:35 +01:00
import globals
import debug
class code_format_test(openram_test):
2016-11-08 18:57:35 +01:00
"Run a test to check for tabs instead of spaces in the all source files."
def runTest(self):
source_code_dir = os.environ["OPENRAM_HOME"]
2016-11-08 18:57:35 +01:00
source_codes = setup_files(source_code_dir)
errors = 0
# Check for tabs or carriage returns
2016-11-08 18:57:35 +01:00
for code in source_codes:
if re.search("gdsMill", code):
continue
errors += check_file_format_tab(code)
2020-11-03 15:29:17 +01:00
errors += check_file_format_carriage(code)
errors += check_file_format_whitespace(code)
2016-11-08 18:57:35 +01:00
for code in source_codes:
if re.search("gdsMill", code):
continue
if re.search("debug.py$", code):
continue
if re.search("openram.py$", code):
continue
if re.search("testutils.py$", code):
2018-10-15 22:23:31 +02:00
continue
if re.search("gen_stimulus.py$", code):
continue
2016-11-08 18:57:35 +01:00
errors += check_print_output(code)
2016-11-08 18:57:35 +01:00
# fails if there are any tabs in any files
self.assertEqual(errors, 0)
def setup_files(path):
files = []
for (dir, _, current_files) in os.walk(path):
for f in current_files:
2022-07-22 17:11:14 +02:00
files.append(os.path.join(dir, f))
2016-11-08 18:57:35 +01:00
nametest = re.compile("\.py$", re.IGNORECASE)
2018-10-15 22:23:31 +02:00
select_files = list(filter(nametest.search, files))
2016-11-08 18:57:35 +01:00
return select_files
def check_file_format_tab(file_name):
"""
Check if any files contain tabs and return the number of tabs.
"""
2016-11-08 18:57:35 +01:00
f = open(file_name, "r+b")
key_positions = []
for num, line in enumerate(f, 1):
if b'\t' in line:
2016-11-08 18:57:35 +01:00
key_positions.append(num)
if len(key_positions) > 0:
if len(key_positions)>10:
line_numbers = key_positions[:10] + [" ..."]
else:
line_numbers = key_positions
2016-11-08 18:57:35 +01:00
debug.info(0, '\nFound ' + str(len(key_positions)) + ' tabs in ' +
str(file_name) + ' (lines ' + ",".join(str(x) for x in line_numbers) + ')')
f.close()
return len(key_positions)
def check_file_format_carriage(file_name):
"""
2020-11-03 15:29:17 +01:00
Check if file contains carriage returns at the end of lines
and return the number of carriage return lines.
"""
f = open(file_name, 'r+b')
key_positions = []
for num, line in enumerate(f.readlines()):
if b'\r\n' in line:
key_positions.append(num)
if len(key_positions) > 0:
if len(key_positions)>10:
line_numbers = key_positions[:10] + [" ..."]
else:
2022-07-22 17:15:27 +02:00
line_numbers = key_positions
debug.info(0, '\nFound ' + str(len(key_positions)) + ' carriage returns in ' +
str(file_name) + ' (lines ' + ",".join(str(x) for x in line_numbers) + ')')
f.close()
2016-11-08 18:57:35 +01:00
return len(key_positions)
def check_file_format_whitespace(file_name):
"""
Check if file contains a line with whitespace at the end
and return the number of these lines.
"""
f = open(file_name, "r")
key_positions = []
for num, line in enumerate(f.readlines()):
if re.match(r".*[ \t]$", line):
key_positions.append(num)
if len(key_positions) > 0:
if len(key_positions) > 10:
line_numbers = key_positions[:10] + [" ..."]
else:
line_numbers = key_positions
debug.info(0, "\nFound " + str(len(key_positions)) + " ending whitespace in " +
str(file_name) + " (lines " + ",".join(str(x) for x in line_numbers) + ")")
f.close()
return len(key_positions)
2016-11-08 18:57:35 +01:00
def check_print_output(file_name):
"""Check if any files (except debug.py) call the _print_ function. We should
use the debug output with verbosity instead!"""
skip_files = ["printGDS.py", "uniquifyGDS.py", "processGDS.py", "model_data_util.py"]
base_file_name = os.path.basename(file_name)
if base_file_name in skip_files:
return(0)
2016-11-08 18:57:35 +01:00
file = open(file_name, "r+b")
2018-10-15 22:23:31 +02:00
line = file.read().decode('utf-8')
2016-11-08 18:57:35 +01:00
# skip comments with a hash
line = re.sub(r'#.*', '', line)
# skip doc string comments
line=re.sub(r'\"\"\"[^\"]*\"\"\"', '', line, flags=re.S|re.M)
2018-10-15 22:23:31 +02:00
count = len(re.findall("[^p]+print\(", line))
2016-11-08 18:57:35 +01:00
if count > 0:
debug.info(0, "\nFound " + str(count) +
" _print_ calls " + str(file_name))
2018-10-15 22:23:31 +02:00
file.close()
2016-11-08 18:57:35 +01:00
return(count)
# run the test from the command line
2016-11-08 18:57:35 +01:00
if __name__ == "__main__":
(OPTS, args) = globals.parse_args()
del sys.argv[1:]
header(__file__, OPTS.tech_name)
unittest.main(testRunner=debugTestRunner())