2020-03-16 16:12:50 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# pylint: disable=consider-using-enumerate, import-error
|
|
|
|
|
|
|
|
import re
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import getopt
|
|
|
|
import tempfile
|
|
|
|
from getkey import getkey
|
|
|
|
|
|
|
|
|
|
|
|
def parse_call(call):
|
|
|
|
function = ''
|
|
|
|
arguments = ""
|
|
|
|
results = ""
|
|
|
|
search = re.search(r'// (.*):(.*)\s->\s(.*)', call, re.MULTILINE | re.DOTALL)
|
|
|
|
if search:
|
|
|
|
function = search.group(1)
|
|
|
|
arguments = search.group(2)
|
|
|
|
results = search.group(3)
|
|
|
|
if results.find("#") != -1:
|
|
|
|
results = results[:results.find("#")]
|
|
|
|
else:
|
|
|
|
search = re.search(r'// (.*)(.*)\s->\s(.*)', call, re.MULTILINE | re.DOTALL)
|
|
|
|
if search:
|
|
|
|
function = search.group(1)
|
|
|
|
arguments = search.group(2)
|
|
|
|
results = search.group(3)
|
|
|
|
if results.find("#") != -1:
|
|
|
|
results = results[:results.find("#")]
|
|
|
|
if function.find("wei") >= 0:
|
|
|
|
function = function[:function.find(",")]
|
|
|
|
return function.strip(), arguments.strip(), results.strip()
|
|
|
|
|
|
|
|
|
2021-12-21 14:26:54 +00:00
|
|
|
def colorize(left, right, index):
|
2020-03-16 16:12:50 +00:00
|
|
|
red = "\x1b[31m"
|
|
|
|
yellow = "\x1b[33m"
|
|
|
|
reset = "\x1b[0m"
|
|
|
|
colors = [red, yellow]
|
2021-12-21 14:26:54 +00:00
|
|
|
color = colors[index % len(colors)]
|
2021-01-21 15:17:01 +00:00
|
|
|
function, _arguments, _results = parse_call(right)
|
2020-03-16 16:12:50 +00:00
|
|
|
left = left.replace("compileAndRun", color + "compileAndRun" + reset)
|
|
|
|
right = right.replace("constructor", color + "constructor" + reset)
|
|
|
|
if function:
|
|
|
|
left = left.replace(function, color + function + reset)
|
|
|
|
right = right.replace(function, color + function + reset)
|
|
|
|
if left.find(function):
|
|
|
|
bottom = " " * (left.find(function) - 4) + right
|
|
|
|
else:
|
|
|
|
bottom = " " + right
|
|
|
|
return " " + left + "\n" + bottom # " {:<90} {:<90}\n{}".format(left, right, bottom)
|
|
|
|
|
|
|
|
|
|
|
|
def get_checks(content, sol_file_path):
|
|
|
|
constructors = []
|
|
|
|
checks = []
|
|
|
|
for line in content.split("\n"):
|
|
|
|
line = line.strip()
|
|
|
|
if line.startswith("compileAndRun"):
|
|
|
|
constructors.append(line)
|
|
|
|
if line.startswith("ABI_CHECK") or line.startswith("BOOST_REQUIRE"):
|
|
|
|
checks.append(line)
|
2021-08-23 16:22:51 +00:00
|
|
|
with open(sol_file_path, "r", encoding='utf8') as sol_file:
|
2021-04-26 04:33:14 +00:00
|
|
|
sol_constructors = []
|
|
|
|
sol_checks = []
|
|
|
|
inside_expectations = False
|
|
|
|
for line in sol_file.readlines():
|
|
|
|
if line.startswith("// constructor()"):
|
|
|
|
sol_constructors.append(line)
|
|
|
|
elif inside_expectations and line.startswith("// "):
|
|
|
|
sol_checks.append(line)
|
|
|
|
if line.startswith("// ----"):
|
|
|
|
inside_expectations = True
|
|
|
|
sol_file.close()
|
|
|
|
if len(constructors) == len(sol_constructors) == 1:
|
|
|
|
checks.insert(0, constructors[0])
|
|
|
|
sol_checks.insert(0, sol_constructors[0])
|
|
|
|
return checks, sol_checks
|
2020-03-16 16:12:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
def show_test(name, content, sol_file_path, current_test, test_count):
|
2021-04-26 04:33:14 +00:00
|
|
|
with tempfile.NamedTemporaryFile(delete=False) as cpp_file:
|
|
|
|
cpp_file.write(content.encode())
|
|
|
|
cpp_file.close()
|
|
|
|
|
|
|
|
os.system("clear")
|
|
|
|
print(str(current_test) + " / " + str(test_count) + " - " + name + "\n")
|
|
|
|
diff_env = os.getenv('DIFF', "/usr/local/bin/colordiff -a -d -w -y -W 200 ")
|
|
|
|
os.system(diff_env + " " + cpp_file.name + " " + sol_file_path)
|
|
|
|
os.unlink(cpp_file.name)
|
|
|
|
print("\n")
|
|
|
|
|
|
|
|
checks, sol_checks = get_checks(content, sol_file_path)
|
|
|
|
|
|
|
|
if len(checks) == len(sol_checks):
|
|
|
|
for i in range(0, len(checks)):
|
|
|
|
print(colorize(checks[i].strip(), sol_checks[i].strip(), i))
|
|
|
|
else:
|
|
|
|
print("warning: check count not matching. this should not happen!")
|
|
|
|
|
|
|
|
what = ""
|
|
|
|
print("\nContinue? (ENTER) Abort? (ANY OTHER KEY)")
|
|
|
|
while what != '\n':
|
|
|
|
what = getkey()
|
|
|
|
if what != '\n':
|
|
|
|
sys.exit(0)
|
|
|
|
print()
|
2020-03-16 16:12:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
def get_tests(e2e_path):
|
|
|
|
tests = []
|
|
|
|
for f in os.listdir(e2e_path):
|
|
|
|
if f.endswith(".sol"):
|
|
|
|
tests.append(f.replace(".sol", ""))
|
|
|
|
return tests
|
|
|
|
|
|
|
|
|
|
|
|
def process_input_file(e2e_path, input_file, interactive):
|
|
|
|
tests = get_tests(e2e_path)
|
2021-08-23 16:22:51 +00:00
|
|
|
with open(input_file, "r", encoding='utf8') as cpp_file:
|
2021-04-26 04:33:14 +00:00
|
|
|
inside_test = False
|
|
|
|
test_name = ""
|
|
|
|
inside_extracted_test = False
|
|
|
|
new_lines = 0
|
|
|
|
count = 0
|
|
|
|
test_content = ""
|
|
|
|
for line in cpp_file.readlines():
|
|
|
|
test = re.search(r'BOOST_AUTO_TEST_CASE\((.*)\)', line, re.M | re.I)
|
|
|
|
if test:
|
|
|
|
test_name = test.group(1)
|
|
|
|
inside_test = True
|
|
|
|
inside_extracted_test = inside_test & (test_name in tests)
|
|
|
|
if inside_extracted_test:
|
|
|
|
count = count + 1
|
|
|
|
|
2020-03-16 16:12:50 +00:00
|
|
|
if interactive and inside_extracted_test:
|
2021-04-26 04:33:14 +00:00
|
|
|
test_content = test_content + line
|
|
|
|
|
|
|
|
if not inside_extracted_test:
|
|
|
|
if line == "\n":
|
|
|
|
new_lines = new_lines + 1
|
|
|
|
else:
|
|
|
|
new_lines = 0
|
|
|
|
if not interactive and new_lines <= 1:
|
|
|
|
sys.stdout.write(line)
|
|
|
|
|
|
|
|
if line == "}\n":
|
|
|
|
if interactive and inside_extracted_test:
|
|
|
|
show_test(test_name, test_content.strip(), e2e_path + "/" + test_name + ".sol", count, len(tests))
|
|
|
|
test_content = ""
|
|
|
|
inside_test = False
|
|
|
|
cpp_file.close()
|
|
|
|
sys.stdout.flush()
|
2020-03-16 16:12:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
def main(argv):
|
|
|
|
interactive = False
|
|
|
|
input_file = None
|
|
|
|
try:
|
2021-01-21 15:17:01 +00:00
|
|
|
opts, _args = getopt.getopt(argv, "if:")
|
2020-03-16 16:12:50 +00:00
|
|
|
except getopt.GetoptError:
|
|
|
|
print("./remove-testcases.py [-i] [-f <full path to SolidityEndToEndTest.cpp>]")
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
for opt, arg in opts:
|
|
|
|
if opt == '-i':
|
|
|
|
interactive = True
|
|
|
|
elif opt in '-f':
|
|
|
|
input_file = arg
|
|
|
|
|
|
|
|
base_path = os.path.dirname(__file__)
|
|
|
|
|
|
|
|
if not input_file:
|
|
|
|
input_file = base_path + "/../../test/libsolidity/SolidityEndToEndTest.cpp"
|
|
|
|
|
|
|
|
e2e_path = base_path + "/../../test/libsolidity/semanticTests/extracted"
|
|
|
|
|
|
|
|
process_input_file(e2e_path, input_file, interactive)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main(sys.argv[1:])
|