diff options
author | LAN-TW <lantw44@gmail.com> | 2013-12-15 15:41:12 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-12-15 15:41:12 +0800 |
commit | f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5 (patch) | |
tree | c12914e5e3549e4c2178f257e8c919cfa67a12b7 | |
parent | 02152c4279c4adff47f57d0b39ac82a447bfacc7 (diff) | |
download | sp2013-f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5.tar.gz sp2013-f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5.tar.zst sp2013-f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5.zip |
HW3: 加入測試用工具
-rw-r--r-- | hw3/Makefile.am | 4 | ||||
-rw-r--r-- | hw3/alltest.sh.in | 51 | ||||
-rw-r--r-- | hw3/configure.ac | 1 | ||||
-rw-r--r-- | hw3/genrand.c | 63 |
4 files changed, 119 insertions, 0 deletions
diff --git a/hw3/Makefile.am b/hw3/Makefile.am index 89c7d5b..f83be39 100644 --- a/hw3/Makefile.am +++ b/hw3/Makefile.am @@ -1,10 +1,14 @@ EXTRA_DIST = Makefile.simple README.txt +TESTS = alltest.sh bin_PROGRAMS = merger +check_PROGRAMS = genrand noinst_LIBRARIES = libsphw3.a libsphw3_a_SOURCES = xwrap.c xwrap.h merger_SOURCES = merger.c merger_CFLAGS = -pthread merger_LDADD = $(top_builddir)/libsphw3.a +genrand_SOURCES = genrand.c +genrand_LDADD = $(top_builddir)/libsphw3.a dist-hook: cp -a $(distdir)/Makefile.simple $(distdir)/Makefile diff --git a/hw3/alltest.sh.in b/hw3/alltest.sh.in new file mode 100644 index 0000000..24c0c82 --- /dev/null +++ b/hw3/alltest.sh.in @@ -0,0 +1,51 @@ +#! /bin/sh + +B="@top_builddir@" +T="${B}/testcases" + +runtest () { + if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then + echo "Usage: runtest length segment_size out_dir" + exit 1 + fi + + SI="${3}/test-${1}-ss.in" + SO="${3}/test-${1}-ss.out" + if [ -z "$MERGE_NOCHECK" ]; then + O="${3}/test-${1}-ss-${2}.out" + else + O="/dev/null" + fi + + if [ "$2" = "0" ]; then + ${B}/genrand "$1" 1> "${SI}" 2> "${SO}" + return 0 + fi + + printf " ... " > /dev/tty + time -p sh -c "${B}/merger \"$2\" < \"${SI}\" | tail -n 1 > \"${O}\"" 2>&1 \ + | head -n 2 | tr "\n" " " > /dev/tty + if [ -z "$MERGE_NOCHECK" ]; then + cmp "${SO}" "${O}" + return $? + fi +} + +mkdir -p "${T}" +for len in 100 10000 1000000 10000000; do + echo "Generating testcases for (length) = ($len)" > /dev/tty + runtest $len 0 "${T}" + for ssr in 1 2 5 10 25 100; do + ss="$(( $len / $ssr ))" + printf "Running test for (length, segment_size) = (%s, %s)" \ + "$len" "$ss" > /dev/tty + if runtest $len $ss "${T}"; then :; else + exit 1 + fi + printf "\n" > /dev/tty + done +done + +if [ -z "$MERGE_NOCHECK" ]; then + rm -rf "${T}" +fi diff --git a/hw3/configure.ac b/hw3/configure.ac index 97e80a8..6321730 100644 --- a/hw3/configure.ac +++ b/hw3/configure.ac @@ -21,4 +21,5 @@ AC_TYPE_SIZE_T AC_FUNC_MALLOC AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([alltest.sh], [chmod a+x alltest.sh]) AC_OUTPUT diff --git a/hw3/genrand.c b/hw3/genrand.c new file mode 100644 index 0000000..1ed7adc --- /dev/null +++ b/hw3/genrand.c @@ -0,0 +1,63 @@ +#include "xwrap.h" + +#include <inttypes.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <time.h> +#include <unistd.h> + +static int qsort_cb (const void* a, const void* b) { + int32_t aa = *(int32_t*)a; + int32_t bb = *(int32_t*)b; + if (aa > bb) { + return 1; + } else if (aa < bb) { + return -1; + } else { + return 0; + } +} + +static void print_seq (FILE* fp, int32_t* s, long len) { + for (int i = 0; i < len; i++) { + if (i) { + putc (' ', fp); + } + fprintf (fp, "%" PRId32, s[i]); + } + putc ('\n', fp); +} + +int main (int argc, char* argv[]) { + if (argc < 2) { + fprintf (stderr, "Usage: %s length\n", argv[0]); + return 1; + } + + long len; + if (xatol (argv[1], &len) < 0) { + fprintf (stderr, "%s: %s is not a valid length\n", argv[0], argv[1]); + return 2; + } + if (len <= 0) { + fprintf (stderr, "%s: %s is not a positive number\n", argv[0], argv[1]); + return 2; + } + + srandom (time (NULL) + getpid () + getppid () + getuid ()); + + int32_t* s = xmalloc (sizeof (int32_t) * len); + for (long i = 0; i < len; i++) { + s[i] = random (); + } + printf ("%ld\n", len); + print_seq (stdout, s, len); + + qsort (s, len, sizeof (int32_t), qsort_cb); + print_seq (stderr, s, len); + + free (s); + + return 0; +} |