import tempfile, subprocess, ctypes, os, sys def c_wrapper(file): print("Compiling", file) temp = tempfile.mktemp(prefix="lib-compile-") print(temp) if subprocess.run(["gcc", file, "-o", temp, "-shared", "-fPIC", "-march=native"]).returncode != 0: raise ValueError("compilation failed") library = ctypes.CDLL(temp) entry = library.entry entry.restype = ctypes.c_bool def wrapper(s1, s2): return entry(s1.encode("ascii"), s2.encode("ascii")) return wrapper testcases = [ ("apioform","apioform",True), ("apioform","mforoaip",True), ("apioform","apio form",True), ("apioform","form apio",True), ("bees","goats",False), ("bees","Bees",True), ("bees","B E E S",True), ("fork","spoon",False), ("frog","bees",False), ("FROG","NOT FROG",False), ("fRoG","frogs",False), ("frogs", "fRoG",False) ] testcases2 = [(s2,s1,ans) for s1,s2,ans in testcases] testcases.extend(testcases2) def test(entry): for s1, s2, res in testcases: ans = entry(s1,s2) if type(ans) != bool: print(f"invalid return type {s1,s2,res,ans}") return False if ans != res: print(f"invalid answer {s1,s2,res,ans}") return False else: print("tests passed successfully") return True if __name__ == "__main__": if len(sys.argv) != 3: sys.exit("usage: {sys.argv[0]} py or {sys.argv[0]} c ") if sys.argv[1] == "py": import importlib entry = importlib.import_module(sys.argv[2]).entry elif sys.argv[1] == "c": entry = c_wrapper(sys.argv[2]) else: sys.exit("usage: {sys.argv[0]} py or {sys.argv[0]} c ") res = test(entry) sys.exit(0 if res else 1)