You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
4.0 KiB
99 lines
4.0 KiB
#!/usr/bin/env python3
|
|
import subprocess
|
|
import os
|
|
|
|
IRBuild_ptn = '"{}" "-emit-ir" "-o" "{}" "{}"'
|
|
ExeGen_ptn = '"clang" "{}" "-o" "{}" "{}" "../../lib/lib.c"'
|
|
Exe_ptn = '"{}"'
|
|
|
|
def eval(EXE_PATH, TEST_BASE_PATH, optimization):
|
|
cnt = 0
|
|
passed = 0
|
|
print('===========TEST START===========')
|
|
print('now in {}'.format(TEST_BASE_PATH))
|
|
dir_succ = True
|
|
for case in testcases:
|
|
cnt += 1
|
|
print('Case %s:' % case, end='')
|
|
TEST_PATH = TEST_BASE_PATH + case
|
|
SY_PATH = TEST_BASE_PATH + case + '.sy'
|
|
LL_PATH = TEST_BASE_PATH + case + '.ll'
|
|
INPUT_PATH = TEST_BASE_PATH + case + '.in'
|
|
OUTPUT_PATH = TEST_BASE_PATH + case + '.out'
|
|
need_input = testcases[case]
|
|
|
|
IRBuild_result = subprocess.run(IRBuild_ptn.format(EXE_PATH, LL_PATH, SY_PATH), shell=True, stderr=subprocess.PIPE)
|
|
if IRBuild_result.returncode == 0:
|
|
input_option = None
|
|
if need_input:
|
|
with open(INPUT_PATH, "rb") as fin:
|
|
input_option = fin.read()
|
|
|
|
try:
|
|
subprocess.run(ExeGen_ptn.format(optimization, TEST_PATH, LL_PATH), shell=True, stderr=subprocess.PIPE)
|
|
result = subprocess.run(Exe_ptn.format(TEST_PATH), shell=True, input=input_option, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
out = result.stdout.split(b'\n')
|
|
if result.returncode != b'':
|
|
out.append(str(result.returncode).encode())
|
|
for i in range(len(out)-1, -1, -1):
|
|
out[i] = out[i].strip(b'\r')
|
|
if out[i] == b'':
|
|
out.remove(b'')
|
|
case_succ = True
|
|
with open(OUTPUT_PATH, "rb") as fout:
|
|
print(out[i])
|
|
i = 0
|
|
for line in fout.readlines():
|
|
line = line.strip(b'\r').strip(b'\n')
|
|
if line == '':
|
|
continue
|
|
if out[i] != line:
|
|
dir_succ = False
|
|
case_succ = False
|
|
i = i + 1
|
|
if case_succ:
|
|
passed += 1
|
|
print('\t\033[32mPass\033[0m')
|
|
else:
|
|
print('\t\033[31mWrong Answer\033[0m')
|
|
except Exception as _:
|
|
dir_succ = False
|
|
print(_, end='')
|
|
print('\t\033[31mCodeGen or CodeExecute Fail\033[0m')
|
|
finally:
|
|
subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH])
|
|
subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH + ".o"])
|
|
subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH + ".ll"])
|
|
|
|
else:
|
|
dir_succ = False
|
|
print('\t\033[31mIRBuild Fail\033[0m')
|
|
if dir_succ:
|
|
print('\t\033[32mSuccess\033[0m in dir {}'.format(TEST_BASE_PATH))
|
|
else:
|
|
print('\t\033[31mFail\033[0m in dir {}'.format(TEST_BASE_PATH))
|
|
print(f'\t\033[32mPassed: {passed}, Total: {cnt} \033[0m')
|
|
print('============TEST END============')
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# you can only modify this to add your testcase
|
|
TEST_DIRS = [
|
|
'./test/',
|
|
'./function_test2021/',
|
|
]
|
|
# you can only modify this to add your testcase
|
|
|
|
optimization = "-O3" # -O0 -O1 -O2 -O3 -O4(currently = -O3) -Ofast
|
|
for TEST_BASE_PATH in TEST_DIRS:
|
|
testcases = {} # { name: need_input }
|
|
EXE_PATH = os.path.abspath('../../build/SysYFCompiler')
|
|
testcase_list = list(map(lambda x: x.split('.'), os.listdir(TEST_BASE_PATH)))
|
|
testcase_list.sort()
|
|
for i in range(len(testcase_list)):
|
|
testcases[testcase_list[i][0]] = False
|
|
for i in range(len(testcase_list)):
|
|
testcases[testcase_list[i][0]] = testcases[testcase_list[i][0]] | (testcase_list[i][1] == 'in')
|
|
eval(EXE_PATH, TEST_BASE_PATH, optimization=optimization)
|