summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@unpythonic.net>2006-10-06 21:07:21 +0000
committerJeff Epler <jepler@unpythonic.net>2006-10-06 21:07:21 +0000
commitcb088f1f866999f8a608f97ba718c15c674ac676 (patch)
treee48f7b46fbb497d1dbd4c2255671e18964ae3acf
parente62e512259ca0226bb7805db4da6bb786ecbf723 (diff)
downloadlinuxcnc-cb088f1f866999f8a608f97ba718c15c674ac676.tar.gz
linuxcnc-cb088f1f866999f8a608f97ba718c15c674ac676.zip
add the beginnings of a test suite
-rwxr-xr-xscripts/runtests71
-rw-r--r--tests/README87
-rw-r--r--tests/basic/README1
-rw-r--r--tests/basic/expected0
-rw-r--r--tests/basic/test.hal0
-rw-r--r--tests/stepgen.0/expected3500
-rw-r--r--tests/stepgen.0/test.hal22
-rw-r--r--tests/stepgen.1/expected3500
-rw-r--r--tests/stepgen.1/test.hal23
-rw-r--r--tests/stepgen.2/README2
-rwxr-xr-xtests/stepgen.2/checkresult7
-rw-r--r--tests/stepgen.2/test.hal22
12 files changed, 7235 insertions, 0 deletions
diff --git a/scripts/runtests b/scripts/runtests
new file mode 100755
index 000000000..f883fa691
--- /dev/null
+++ b/scripts/runtests
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+case "$0" in
+ */*) MYDIR="${0%/*}" ;;
+ *) MYDIR="`type -path $0`"; MYDIR="${MYDIR%/*}"
+esac
+
+NUM=0
+FAIL=0
+XFAIL=0
+
+TMPDIR=`mktemp -d /tmp/runtest.XXXXXX`
+trap "rm -rf $TMPDIR" 0 1 2 3 9 15
+
+find $* -name test.hal > $TMPDIR/alltests
+
+while read testname; do
+ NUM=$(($NUM+1))
+ testdir=$(dirname $testname)
+ echo "Running test: $testdir" 1>&2
+ $MYDIR/halrun -f $testname > $testdir/result 2> $testdir/stderr
+ exitcode=$?
+ if [ $exitcode -ne 0 ]; then
+ reason="halrun exited with $exitcode"
+ else
+ if [ -e $testdir/checkresult ]; then
+ $testdir/checkresult $testdir/result
+ exitcode=$?
+ reason="checkresult exited with $exitcode"
+ elif [ -f $testdir/expected ]; then
+ cmp -s $testdir/expected $testdir/result
+ exitcode=$?
+ reason="result differed from expected"
+ if [ $exitcode -ne 0 ]; then
+ diff -U1 $testdir/expected $testdir/result > $TMPDIR/diff
+ SIZE=$(wc -l < $TMPDIR/diff)
+ if [ $SIZE -lt 15 ]; then
+ cat $TMPDIR/diff
+ else
+ OMIT=$((SIZE-15))
+ head -15 $TMPDIR/diff
+ echo "($OMIT more lines omitted)"
+ fi
+ fi
+ else
+ exitcode=1
+ reason="Neither result nor checkresult existed"
+ fi
+ fi
+ if [ $exitcode -ne 0 ]; then
+ if [ -f $testdir/xfail ]; then
+ XFAIL=$(($XFAIL+1))
+ echo "** $testdir: XFAIL: $reason"
+ else
+ FAIL=$(($FAIL+1))
+ echo "** $testdir: FAIL: $reason"
+ fi
+ else
+ if [ -f $testdir/xfail ]; then
+ echo "** $testdir: XPASS: Passed, but was expected to fail"
+ fi
+ fi
+done < $TMPDIR/alltests
+
+SUCC=$((NUM-FAIL-XFAIL))
+if [ $XFAIL -eq 0 ]; then
+echo "Runtest: $NUM tests run, $SUCC successful, $FAIL failed"
+else
+echo "Runtest: $NUM tests run, $SUCC successful, $FAIL failed + $XFAIL expected"
+fi
+if [ $FAIL -ne 0 ]; then exit 1; else exit 0; fi
diff --git a/tests/README b/tests/README
new file mode 100644
index 000000000..ce0192b8d
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,87 @@
+The HAL test suite
+~~~~~~~~~~~~~~~~~~~
+The tests in these directories serve to test the behavior of HAL components.
+
+Each subdirectory of this directory may contain a test item. The runtests
+script recurses through the directory structure, so multiple tests could
+be structured as
+ tests/
+ xyz.0
+ xyz.1
+ xyz.2
+or
+ tests/
+ xyz/
+ 0
+ 1
+ 2
+
+
+Two types of tests are supported: Regression tests, in which the output is
+tested against a "known good" output, and functional tests, in which the
+output is fed to a program that can determine whether it is correct or not
+
+
+Running the tests
+~~~~~~~~~~~~~~~~~
+Currently, tests only work with the "run in place" configuration. They
+can be run by executing (from the top emc2 directory)
+ scripts/runtests tests
+A subset of the tests can also be run:
+ scripts/runtests tests/xyz tests/a*
+The directories named on the commandline are searched recursively for
+'test.hal' files, and a directory with such a file is assumed to contain a
+regression test or a functional test.
+
+
+Regression Tests
+~~~~~~~~~~~~~~~~
+A regression test should consist of these three files:
+ README
+ A human-readable file describing the test
+ test.hal
+ A script that will be executed with halrun -f
+ expected
+ A file whose contents are compared with the stdout of
+ halrun -f test.hal
+
+A typical regression test will load several components, usually including
+'threads' and 'sample', then collect samples from some number of calls
+to the realtime thread, then exit.
+
+Regression test "test.hal" files will almost always include the line
+ setexact_for_test_suite_only
+which causes HAL to act as though the requested base_period was available.
+Otherwise, results will differ slightly depending on the actual base_period
+and regression tests will fail.
+
+The test passes if the expected and actual output are identical.
+Otherwise, the test fails.
+
+
+Functional Tests
+~~~~~~~~~~~~~~~~
+A functional test should consist of three files:
+ README
+ A human-readable file describing the test
+ test.hal
+ A script that will be executed with halrun -f
+ checkresult
+ An executable file (such as a shell or python script)
+ which determines if the stdout of
+ halrun -f test.hal
+ indicates success or failure
+
+Regression test "test.hal" files will often include the line
+ setexact_for_test_suite_only
+which causes HAL to act as though the requested base_period was available.
+Otherwise, results will differ slightly depending on the actual base_period,
+which could affect whether 'checkresult' gives an accurate result.
+
+A typical regression test will load several components, usually including
+'threads' and 'sample', then collect samples from some number of calls
+to the realtime thread, then exit. 'checkresult' will look at the output
+and see if it indicates success.
+
+The test passes if the command "checkresult actual" returns a shell
+success value (exit code 0). Otherwise, the test fails.
diff --git a/tests/basic/README b/tests/basic/README
new file mode 100644
index 000000000..78040b0b3
--- /dev/null
+++ b/tests/basic/README
@@ -0,0 +1 @@
+Tests that 'halrun' on an empty file produces no output
diff --git a/tests/basic/expected b/tests/basic/expected
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/basic/expected
diff --git a/tests/basic/test.hal b/tests/basic/test.hal
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/basic/test.hal
diff --git a/tests/stepgen.0/expected b/tests/stepgen.0/expected
new file mode 100644
index 000000000..721e4957b
--- /dev/null
+++ b/tests/stepgen.0/expected
@@ -0,0 +1,3500 @@
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
diff --git a/tests/stepgen.0/test.hal b/tests/stepgen.0/test.hal
new file mode 100644
index 000000000..41f69e461
--- /dev/null
+++ b/tests/stepgen.0/test.hal
@@ -0,0 +1,22 @@
+setexact_for_test_suite_only
+
+loadrt sampler cfg=bb depth=4096
+loadrt stepgen step_type=0
+loadrt threads name1=fast period1=100000
+
+linkpp stepgen.0.dir sampler.0.pin.0
+linkpp stepgen.0.step sampler.0.pin.1
+
+addf stepgen.update-freq fast
+addf stepgen.make-pulses fast
+addf stepgen.capture-position fast
+addf sampler.0 fast
+
+setp stepgen.0.maxvel .15
+setp stepgen.0.maxaccel 2
+setp stepgen.0.position-cmd .04
+setp stepgen.0.enable 1
+setp stepgen.0.position-scale 32000
+
+start
+loadusr -w halsampler -n 3500
diff --git a/tests/stepgen.1/expected b/tests/stepgen.1/expected
new file mode 100644
index 000000000..db03d0a1c
--- /dev/null
+++ b/tests/stepgen.1/expected
@@ -0,0 +1,3500 @@
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+1 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 1
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+0 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
+1 0
diff --git a/tests/stepgen.1/test.hal b/tests/stepgen.1/test.hal
new file mode 100644
index 000000000..4a772e217
--- /dev/null
+++ b/tests/stepgen.1/test.hal
@@ -0,0 +1,23 @@
+setexact_for_test_suite_only
+
+loadrt sampler cfg=bb depth=4096
+loadrt stepgen step_type=2
+loadrt threads name1=fast period1=100000
+
+linkpp stepgen.0.phase-A sampler.0.pin.0
+linkpp stepgen.0.phase-B sampler.0.pin.1
+
+
+addf stepgen.update-freq fast
+addf stepgen.make-pulses fast
+addf stepgen.capture-position fast
+addf sampler.0 fast
+
+setp stepgen.0.maxvel .15
+setp stepgen.0.maxaccel 2
+setp stepgen.0.position-cmd .04
+setp stepgen.0.enable 1
+setp stepgen.0.position-scale 32000
+
+start
+loadusr -w halsampler -n 3500
diff --git a/tests/stepgen.2/README b/tests/stepgen.2/README
new file mode 100644
index 000000000..5912f560e
--- /dev/null
+++ b/tests/stepgen.2/README
@@ -0,0 +1,2 @@
+This is a functional test of 'stepgen'. It checks that the the "step"
+output is asserted the correct number of times over a move.
diff --git a/tests/stepgen.2/checkresult b/tests/stepgen.2/checkresult
new file mode 100755
index 000000000..86cf15d9d
--- /dev/null
+++ b/tests/stepgen.2/checkresult
@@ -0,0 +1,7 @@
+#!/bin/sh
+COUNT=0
+while read i j; do
+ if [ $j -eq 1 ]; then COUNT=$((COUNT+1)); fi
+done < $1
+
+test $COUNT -eq 1280
diff --git a/tests/stepgen.2/test.hal b/tests/stepgen.2/test.hal
new file mode 100644
index 000000000..41f69e461
--- /dev/null
+++ b/tests/stepgen.2/test.hal
@@ -0,0 +1,22 @@
+setexact_for_test_suite_only
+
+loadrt sampler cfg=bb depth=4096
+loadrt stepgen step_type=0
+loadrt threads name1=fast period1=100000
+
+linkpp stepgen.0.dir sampler.0.pin.0
+linkpp stepgen.0.step sampler.0.pin.1
+
+addf stepgen.update-freq fast
+addf stepgen.make-pulses fast
+addf stepgen.capture-position fast
+addf sampler.0 fast
+
+setp stepgen.0.maxvel .15
+setp stepgen.0.maxaccel 2
+setp stepgen.0.position-cmd .04
+setp stepgen.0.enable 1
+setp stepgen.0.position-scale 32000
+
+start
+loadusr -w halsampler -n 3500