summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2013-12-15 15:41:12 +0800
committerLAN-TW <lantw44@gmail.com>2013-12-15 15:41:12 +0800
commitf7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5 (patch)
treec12914e5e3549e4c2178f257e8c919cfa67a12b7
parent02152c4279c4adff47f57d0b39ac82a447bfacc7 (diff)
downloadsp2013-f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5.tar.gz
sp2013-f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5.tar.zst
sp2013-f7f3fa8bf9bce5872558e20eb4be5c4ecf5db5a5.zip
HW3: 加入測試用工具
-rw-r--r--hw3/Makefile.am4
-rw-r--r--hw3/alltest.sh.in51
-rw-r--r--hw3/configure.ac1
-rw-r--r--hw3/genrand.c63
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;
+}