#!/usr/bin/env python from __future__ import print_function import ctypes import random import gmpapi import wrappers import glob import sys import os from optparse import OptionParser from gmpapi import void from gmpapi import ilong from gmpapi import ulong from gmpapi import mpz_t from gmpapi import voidp from gmpapi import size_t from gmpapi import size_tp from gmpapi import iint from gmpapi import charp from gmpapi import mpq_t def print_failure(line, test): print("FAIL: {}@{}".format(line, test)) def run_tests(test_file, options): passes = 0 failures = 0 fail_lines = [] for (line, test) in enumerate(open(test_file), start=1): if test.startswith("#"): continue if options.skip > 0 and line < options.skip: continue name, args = test.split("|") if options.verbose or (options.progress > 0 and line % options.progress == 0): print("TEST: {}@{}".format(line, test), end="") api = gmpapi.get_api(name) wrapper = wrappers.get_wrapper(name) input_args = args.split(",") if len(api.params) != len(input_args): raise RuntimeError( "Mismatch in args length: {} != {}".format( len(api.params), len(input_args) ) ) call_args = [] for i in range(len(api.params)): param = api.params[i] if param == mpz_t: call_args.append(bytes(input_args[i]).encode("utf-8")) elif param == mpq_t: call_args.append(bytes(input_args[i]).encode("utf-8")) elif param == ulong: call_args.append(ctypes.c_ulong(int(input_args[i]))) elif param == ilong: call_args.append(ctypes.c_long(int(input_args[i]))) elif param == voidp or param == size_tp: call_args.append(ctypes.c_void_p(None)) elif param == size_t: call_args.append(ctypes.c_size_t(int(input_args[i]))) elif param == iint: call_args.append(ctypes.c_int(int(input_args[i]))) # pass null for charp elif param == charp: if input_args[i] == "NULL": call_args.append(ctypes.c_void_p(None)) else: call_args.append(bytes(input_args[i]).encode("utf-8")) else: raise RuntimeError("Unknown param type: {}".format(param)) res = wrappers.run_test( wrapper, line, name, gmp_test_so, imath_test_so, *call_args ) if not res: failures += 1 print_failure(line, test) fail_lines.append((line, test)) else: passes += 1 return (passes, failures, fail_lines) def parse_args(): parser = OptionParser() parser.add_option( "-f", "--fork", help="fork() before each operation", action="store_true", default=False, ) parser.add_option( "-v", "--verbose", help="print PASS and FAIL tests", action="store_true", default=False, ) parser.add_option( "-p", "--progress", help="print progress every N tests ", metavar="N", type="int", default=0, ) parser.add_option( "-s", "--skip", help="skip to test N", metavar="N", type="int", default=0 ) return parser.parse_args() if __name__ == "__main__": (options, tests) = parse_args() gmp_test_so = ctypes.cdll.LoadLibrary("gmp_test.so") imath_test_so = ctypes.cdll.LoadLibrary("imath_test.so") wrappers.verbose = options.verbose wrappers.fork = options.fork total_pass = 0 total_fail = 0 all_fail_lines = [] for test_file in tests: print("Running tests in {}".format(test_file)) (passes, failures, fail_lines) = run_tests(test_file, options) print( " Tests: {}. Passes: {}. Failures: {}.".format( passes + failures, passes, failures ) ) total_pass += passes total_fail += failures all_fail_lines += fail_lines print("=" * 70) print("Total") print( " Tests: {}. Passes: {}. Failures: {}.".format( total_pass + total_fail, total_pass, total_fail ) ) if len(all_fail_lines) > 0: print("Failing Tests:") for (line, test) in all_fail_lines: print(test.rstrip())