#!/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())