diff --git a/tests/data/bt1.bed b/tests/data/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..1ae9665dd3b4c86d819700d7d9b1df37146baa94
--- /dev/null
+++ b/tests/data/bt1.bed
@@ -0,0 +1,10 @@
+I	0	5	a(I:0-5:+)	.	+
+I	0	5	b(I:0-5:-)	.	-
+I	0	10	c(I:0-10:+)	.	+
+I	0	10	d(I:0-10:-)	.	-
+I	5	10	e(I:5-10:+)	.	+
+I	5	10	f(I:5-10:-)	.	-
+I	5	20	g(I:5-20:+)	.	+
+I	5	20	h(I:5-20:-)	.	-
+I	10	15	i(I:10-15:+)	.	+
+I	10	15	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m0/bt1.bed b/tests/data/shifted/m0/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..1ae9665dd3b4c86d819700d7d9b1df37146baa94
--- /dev/null
+++ b/tests/data/shifted/m0/bt1.bed
@@ -0,0 +1,10 @@
+I	0	5	a(I:0-5:+)	.	+
+I	0	5	b(I:0-5:-)	.	-
+I	0	10	c(I:0-10:+)	.	+
+I	0	10	d(I:0-10:-)	.	-
+I	5	10	e(I:5-10:+)	.	+
+I	5	10	f(I:5-10:-)	.	-
+I	5	20	g(I:5-20:+)	.	+
+I	5	20	h(I:5-20:-)	.	-
+I	10	15	i(I:10-15:+)	.	+
+I	10	15	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m1/bt1.bed b/tests/data/shifted/m1/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..9e73706ca2fffde9a0e7e1d95dc7e0e3d0502055
--- /dev/null
+++ b/tests/data/shifted/m1/bt1.bed
@@ -0,0 +1,10 @@
+#I	-1	4	a(I:0-5:+)	.	+
+I	1	6	b(I:0-5:-)	.	-
+#I	-1	9	c(I:0-10:+)	.	+
+I	1	11	d(I:0-10:-)	.	-
+I	4	9	e(I:5-10:+)	.	+
+I	6	11	f(I:5-10:-)	.	-
+I	4	19	g(I:5-20:+)	.	+
+I	6	21	h(I:5-20:-)	.	-
+I	9	14	i(I:10-15:+)	.	+
+I	11	16	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m10/bt1.bed b/tests/data/shifted/m10/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..30fc82fe85b6b346f7d1eebd457c7180da01ab32
--- /dev/null
+++ b/tests/data/shifted/m10/bt1.bed
@@ -0,0 +1,10 @@
+#I	-10	-5	a(I:0-5:+)	.	+
+I	10	15	b(I:0-5:-)	.	-
+#I	-10	0	c(I:0-10:+)	.	+
+I	10	20	d(I:0-10:-)	.	-
+#I	-5	0	e(I:5-10:+)	.	+
+I	15	20	f(I:5-10:-)	.	-
+#I	-5	10	g(I:5-20:+)	.	+
+I	15	30	h(I:5-20:-)	.	-
+I	0	5	i(I:10-15:+)	.	+
+I	20	25	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m11/bt1.bed b/tests/data/shifted/m11/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..6279924b29adfd2a6eb01c8cc56b6ac095d2ea31
--- /dev/null
+++ b/tests/data/shifted/m11/bt1.bed
@@ -0,0 +1,10 @@
+#I	-11	-6	a(I:0-5:+)	.	+
+I	11	16	b(I:0-5:-)	.	-
+#I	-11	-1	c(I:0-10:+)	.	+
+I	11	21	d(I:0-10:-)	.	-
+#I	-6	-1	e(I:5-10:+)	.	+
+I	16	21	f(I:5-10:-)	.	-
+#I	-6	9	g(I:5-20:+)	.	+
+I	16	31	h(I:5-20:-)	.	-
+#I	-1	4	i(I:10-15:+)	.	+
+I	21	26	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m19/bt1.bed b/tests/data/shifted/m19/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..ea3b92285bc57333f7a2c97d31573556e0890ec1
--- /dev/null
+++ b/tests/data/shifted/m19/bt1.bed
@@ -0,0 +1,10 @@
+#I	-19	-14	a(I:0-5:+)	.	+
+I	19	24	b(I:0-5:-)	.	-
+#I	-19	-9	c(I:0-10:+)	.	+
+I	19	29	d(I:0-10:-)	.	-
+#I	-14	-9	e(I:5-10:+)	.	+
+I	24	29	f(I:5-10:-)	.	-
+#I	-14	1	g(I:5-20:+)	.	+
+I	24	39	h(I:5-20:-)	.	-
+#I	-9	-4	i(I:10-15:+)	.	+
+I	29	34	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m20/bt1.bed b/tests/data/shifted/m20/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..4ad9d02fd94631e7516033660e16f23656d781a7
--- /dev/null
+++ b/tests/data/shifted/m20/bt1.bed
@@ -0,0 +1,10 @@
+#I	-20	-15	a(I:0-5:+)	.	+
+I	20	25	b(I:0-5:-)	.	-
+#I	-20	-10	c(I:0-10:+)	.	+
+I	20	30	d(I:0-10:-)	.	-
+#I	-15	-10	e(I:5-10:+)	.	+
+I	25	30	f(I:5-10:-)	.	-
+#I	-15	0	g(I:5-20:+)	.	+
+I	25	40	h(I:5-20:-)	.	-
+#I	-10	-5	i(I:10-15:+)	.	+
+I	30	35	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m21/bt1.bed b/tests/data/shifted/m21/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..a0a67540684e33dad2ab50dcd8e44b8a5ff34c2d
--- /dev/null
+++ b/tests/data/shifted/m21/bt1.bed
@@ -0,0 +1,10 @@
+#I	-21	-16	a(I:0-5:+)	.	+
+I	21	26	b(I:0-5:-)	.	-
+#I	-21	-11	c(I:0-10:+)	.	+
+I	21	31	d(I:0-10:-)	.	-
+#I	-16	-11	e(I:5-10:+)	.	+
+I	26	31	f(I:5-10:-)	.	-
+#I	-16	-1	g(I:5-20:+)	.	+
+I	26	41	h(I:5-20:-)	.	-
+#I	-11	-6	i(I:10-15:+)	.	+
+I	31	36	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m4/bt1.bed b/tests/data/shifted/m4/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..d96672e82c4c8fc70e01e013d5b539597782eb6b
--- /dev/null
+++ b/tests/data/shifted/m4/bt1.bed
@@ -0,0 +1,10 @@
+#I	-4	1	a(I:0-5:+)	.	+
+I	4	9	b(I:0-5:-)	.	-
+#I	-4	6	c(I:0-10:+)	.	+
+I	4	14	d(I:0-10:-)	.	-
+I	1	6	e(I:5-10:+)	.	+
+I	9	14	f(I:5-10:-)	.	-
+I	1	16	g(I:5-20:+)	.	+
+I	9	24	h(I:5-20:-)	.	-
+I	6	11	i(I:10-15:+)	.	+
+I	14	19	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m5/bt1.bed b/tests/data/shifted/m5/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..b7c40949ee5e73fad4c5bc0688593c2e432f1067
--- /dev/null
+++ b/tests/data/shifted/m5/bt1.bed
@@ -0,0 +1,10 @@
+#I	-5	0	a(I:0-5:+)	.	+
+I	5	10	b(I:0-5:-)	.	-
+#I	-5	5	c(I:0-10:+)	.	+
+I	5	15	d(I:0-10:-)	.	-
+I	0	5	e(I:5-10:+)	.	+
+I	10	15	f(I:5-10:-)	.	-
+I	0	15	g(I:5-20:+)	.	+
+I	10	25	h(I:5-20:-)	.	-
+I	5	10	i(I:10-15:+)	.	+
+I	15	20	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m6/bt1.bed b/tests/data/shifted/m6/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..da19eec0a9e10af8a1e291123ddab385c07c7bef
--- /dev/null
+++ b/tests/data/shifted/m6/bt1.bed
@@ -0,0 +1,10 @@
+#I	-6	-1	a(I:0-5:+)	.	+
+I	6	11	b(I:0-5:-)	.	-
+#I	-6	4	c(I:0-10:+)	.	+
+I	6	16	d(I:0-10:-)	.	-
+#I	-1	4	e(I:5-10:+)	.	+
+I	11	16	f(I:5-10:-)	.	-
+#I	-1	14	g(I:5-20:+)	.	+
+I	11	26	h(I:5-20:-)	.	-
+I	4	9	i(I:10-15:+)	.	+
+I	16	21	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/m9/bt1.bed b/tests/data/shifted/m9/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..9d7fecbee559c15023ad412787e84e805831b9e5
--- /dev/null
+++ b/tests/data/shifted/m9/bt1.bed
@@ -0,0 +1,10 @@
+#I	-9	-4	a(I:0-5:+)	.	+
+I	9	14	b(I:0-5:-)	.	-
+#I	-9	1	c(I:0-10:+)	.	+
+I	9	19	d(I:0-10:-)	.	-
+#I	-4	1	e(I:5-10:+)	.	+
+I	14	19	f(I:5-10:-)	.	-
+#I	-4	11	g(I:5-20:+)	.	+
+I	14	29	h(I:5-20:-)	.	-
+I	1	6	i(I:10-15:+)	.	+
+I	19	24	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p0/bt1.bed b/tests/data/shifted/p0/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..1ae9665dd3b4c86d819700d7d9b1df37146baa94
--- /dev/null
+++ b/tests/data/shifted/p0/bt1.bed
@@ -0,0 +1,10 @@
+I	0	5	a(I:0-5:+)	.	+
+I	0	5	b(I:0-5:-)	.	-
+I	0	10	c(I:0-10:+)	.	+
+I	0	10	d(I:0-10:-)	.	-
+I	5	10	e(I:5-10:+)	.	+
+I	5	10	f(I:5-10:-)	.	-
+I	5	20	g(I:5-20:+)	.	+
+I	5	20	h(I:5-20:-)	.	-
+I	10	15	i(I:10-15:+)	.	+
+I	10	15	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p1/bt1.bed b/tests/data/shifted/p1/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..4371a2cbd8a3e766aff42bf1195e2da089cfeb3f
--- /dev/null
+++ b/tests/data/shifted/p1/bt1.bed
@@ -0,0 +1,10 @@
+I	1	6	a(I:0-5:+)	.	+
+#I	-1	4	b(I:0-5:-)	.	-
+I	1	11	c(I:0-10:+)	.	+
+#I	-1	9	d(I:0-10:-)	.	-
+I	6	11	e(I:5-10:+)	.	+
+I	4	9	f(I:5-10:-)	.	-
+I	6	21	g(I:5-20:+)	.	+
+I	4	19	h(I:5-20:-)	.	-
+I	11	16	i(I:10-15:+)	.	+
+I	9	14	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p10/bt1.bed b/tests/data/shifted/p10/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..5e85143dbb8aae4c97607f37cacf7f075d3853ea
--- /dev/null
+++ b/tests/data/shifted/p10/bt1.bed
@@ -0,0 +1,10 @@
+I	10	15	a(I:0-5:+)	.	+
+#I	-10	-5	b(I:0-5:-)	.	-
+I	10	20	c(I:0-10:+)	.	+
+#I	-10	0	d(I:0-10:-)	.	-
+I	15	20	e(I:5-10:+)	.	+
+#I	-5	0	f(I:5-10:-)	.	-
+I	15	30	g(I:5-20:+)	.	+
+#I	-5	10	h(I:5-20:-)	.	-
+I	20	25	i(I:10-15:+)	.	+
+I	0	5	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p11/bt1.bed b/tests/data/shifted/p11/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..761e6858251ec76de7635e8fb5e405fa5d6c6e40
--- /dev/null
+++ b/tests/data/shifted/p11/bt1.bed
@@ -0,0 +1,10 @@
+I	11	16	a(I:0-5:+)	.	+
+#I	-11	-6	b(I:0-5:-)	.	-
+I	11	21	c(I:0-10:+)	.	+
+#I	-11	-1	d(I:0-10:-)	.	-
+I	16	21	e(I:5-10:+)	.	+
+#I	-6	1	f(I:5-10:-)	.	-
+I	16	31	g(I:5-20:+)	.	+
+#I	-6	9	h(I:5-20:-)	.	-
+I	21	26	i(I:10-15:+)	.	+
+#I	-1	4	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p19/bt1.bed b/tests/data/shifted/p19/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..d80bd8b715f91de9c739358ec032cc6a68546c52
--- /dev/null
+++ b/tests/data/shifted/p19/bt1.bed
@@ -0,0 +1,10 @@
+I	19	24	a(I:0-5:+)	.	+
+#I	-19	-14	b(I:0-5:-)	.	-
+I	19	29	c(I:0-10:+)	.	+
+#I	-19	-9	d(I:0-10:-)	.	-
+I	24	29	e(I:5-10:+)	.	+
+#I	-14	-9	f(I:5-10:-)	.	-
+I	24	39	g(I:5-20:+)	.	+
+#I	-14	1	h(I:5-20:-)	.	-
+I	29	34	i(I:10-15:+)	.	+
+#I	-9	-4	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p20/bt1.bed b/tests/data/shifted/p20/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..d72aaaef7f5ae13d700e0fe934941c8b992e3733
--- /dev/null
+++ b/tests/data/shifted/p20/bt1.bed
@@ -0,0 +1,10 @@
+I	20	25	a(I:0-5:+)	.	+
+#I	-20	-15	b(I:0-5:-)	.	-
+I	20	30	c(I:0-10:+)	.	+
+#I	-20	-10	d(I:0-10:-)	.	-
+I	25	30	e(I:5-10:+)	.	+
+#I	-15	-10	f(I:5-10:-)	.	-
+I	25	40	g(I:5-20:+)	.	+
+#I	-15	0	h(I:5-20:-)	.	-
+I	30	35	i(I:10-15:+)	.	+
+#I	-10	-5	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p21/bt1.bed b/tests/data/shifted/p21/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..6cafac3606188d36411e238b53456f69b59eca3b
--- /dev/null
+++ b/tests/data/shifted/p21/bt1.bed
@@ -0,0 +1,10 @@
+I	21	26	a(I:0-5:+)	.	+
+#I	-21	-16	b(I:0-5:-)	.	-
+I	21	31	c(I:0-10:+)	.	+
+#I	-21	-11	d(I:0-10:-)	.	-
+I	26	31	e(I:5-10:+)	.	+
+#I	-16	-11	f(I:5-10:-)	.	-
+I	26	41	g(I:5-20:+)	.	+
+#I	-16	-1	h(I:5-20:-)	.	-
+I	31	36	i(I:10-15:+)	.	+
+#I	-11	-6	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p4/bt1.bed b/tests/data/shifted/p4/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..6c26b2390615fc6ae96ff3de478e53b9aef3f168
--- /dev/null
+++ b/tests/data/shifted/p4/bt1.bed
@@ -0,0 +1,10 @@
+I	4	9	a(I:0-5:+)	.	+
+#I	-4	1	b(I:0-5:-)	.	-
+I	4	14	c(I:0-10:+)	.	+
+#I	-4	6	d(I:0-10:-)	.	-
+I	9	14	e(I:5-10:+)	.	+
+I	1	6	f(I:5-10:-)	.	-
+I	9	24	g(I:5-20:+)	.	+
+I	1	16	h(I:5-20:-)	.	-
+I	14	19	i(I:10-15:+)	.	+
+I	6	11	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p5/bt1.bed b/tests/data/shifted/p5/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..db85793255a755fffd2039a358e4abdd490d5bc5
--- /dev/null
+++ b/tests/data/shifted/p5/bt1.bed
@@ -0,0 +1,10 @@
+I	5	10	a(I:0-5:+)	.	+
+#I	-5	0	b(I:0-5:-)	.	-
+I	5	15	c(I:0-10:+)	.	+
+#I	-5	5	d(I:0-10:-)	.	-
+I	10	15	e(I:5-10:+)	.	+
+I	0	5	f(I:5-10:-)	.	-
+I	10	25	g(I:5-20:+)	.	+
+I	0	15	h(I:5-20:-)	.	-
+I	15	20	i(I:10-15:+)	.	+
+I	5	10	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p6/bt1.bed b/tests/data/shifted/p6/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..fce8c22d7525b4838944d52ea74ffa18d2c719fd
--- /dev/null
+++ b/tests/data/shifted/p6/bt1.bed
@@ -0,0 +1,10 @@
+I	6	11	a(I:0-5:+)	.	+
+#I	-6	-1	b(I:0-5:-)	.	-
+I	6	16	c(I:0-10:+)	.	+
+#I	-6	4	d(I:0-10:-)	.	-
+I	11	16	e(I:5-10:+)	.	+
+#I	-1	4	f(I:5-10:-)	.	-
+I	11	26	g(I:5-20:+)	.	+
+#I	-1	14	h(I:5-20:-)	.	-
+I	16	21	i(I:10-15:+)	.	+
+I	4	9	j(I:10-15:-)	.	-
diff --git a/tests/data/shifted/p9/bt1.bed b/tests/data/shifted/p9/bt1.bed
new file mode 100644
index 0000000000000000000000000000000000000000..26dc92518dd9fd55dc8ef715e57fc9c1e98d9887
--- /dev/null
+++ b/tests/data/shifted/p9/bt1.bed
@@ -0,0 +1,10 @@
+I	9	14	a(I:0-5:+)	.	+
+#I	-9	-4	b(I:0-5:-)	.	-
+I	9	19	c(I:0-10:+)	.	+
+#I	-9	1	d(I:0-10:-)	.	-
+I	14	19	e(I:5-10:+)	.	+
+#I	-4	1	f(I:5-10:-)	.	-
+I	14	29	g(I:5-20:+)	.	+
+#I	-4	11	h(I:5-20:-)	.	-
+I	19	24	i(I:10-15:+)	.	+
+I	1	6	j(I:10-15:-)	.	-
diff --git a/tests/test_bam25prime.py b/tests/test_bam25prime.py
new file mode 100755
index 0000000000000000000000000000000000000000..e2c76b33edff4805e8437372e39b3f5402d246ec
--- /dev/null
+++ b/tests/test_bam25prime.py
@@ -0,0 +1,126 @@
+#!/usr/bin/env python3
+"""
+Test cases for bam25prime.
+"""
+
+import unittest
+from collections import namedtuple
+from pathlib import Path
+from bam25prime import (
+    BedTool, make_bed_shifter, make_bed_shift_checker)
+
+
+Interval = namedtuple("Interval", ["chrom", "start", "stop", "strand"])
+
+THIS_DIR = Path("__file__").resolve().parent
+data_dir = THIS_DIR.joinpath("data")
+
+
+def load_interval_dict(bed_path):
+    """
+    Build a dict to store intervals allowing easy comparison between
+    obtained and expected results using bed names (4th column) as keys.
+    """
+    itvl_dict = {}
+    with open(bed_path) as fh:
+        for line in fh:
+            if len(line.strip()) == 0 or line[0] == "#":
+                continue
+            (
+                chrom, start, stop,
+                name, _, strand, *_) = line.strip().split("\t")
+            assert name not in itvl_dict, f"Non unique name: {name}"
+            itvl_dict[name] = Interval(
+                chrom, int(start), int(stop), strand)
+    return itvl_dict
+
+
+def compare_itvl_dicts(observed, expected):
+    """
+    Compute the sets of interval names:
+    * missing in the observed
+    * spurious in the observed
+    * different in the observed
+    Return a (missing, spurious, different) tuple.
+    """
+    obs_names = set(observed.keys())
+    exp_names = set(expected.keys())
+    missing = exp_names - obs_names
+    spurious = obs_names - exp_names
+    common = obs_names & exp_names
+    different = set()
+    for itvl_name in common:
+        if observed[itvl_name] != expected[itvl_name]:
+            different.add(itvl_name)
+    return (missing, spurious, different)
+
+
+def check_shifter(bed_path, s_name, shifter, checker):
+    bt = BedTool(bed_path)
+    bed_name = bed_path.stem
+    msg_base = f"{bed_name} transformed with {s_name}"
+    print(msg_base)
+    expected = load_interval_dict(
+        data_dir.joinpath("shifted", s_name, f"{bed_name}.bed"))
+    #print("bt")
+    #print(bt)
+    #print(bt)
+    #shifted_1 = bt.each(shifter).saveas()
+    #print("  shifted")
+    #print(shifted_1)
+    #print(shifted_1)
+    #shifted_2 = shifted_1.remove_invalid().saveas()
+    shifted_2 = bt.filter(checker).each(shifter).remove_invalid().saveas()
+    #print(" invalid removed")
+    #print(shifted_2)
+    #print(shifted_2)
+    shifted = shifted_2.sort()
+    #print("  sorted")
+    #print(shifted)
+    #print(shifted)
+    observed = load_interval_dict(shifted.fn)
+    #print(observed)
+    (missing, spurious, different) = compare_itvl_dicts(
+        observed, expected)
+    msg = "\n".join([
+        msg_base,
+        f"\tMissing: {missing}",
+        f"\tSpurious: {spurious}",
+        f"\tDifferent: {different}"])
+    return (missing, spurious, different, msg)
+
+
+class TestBam25prime(unittest.TestCase):
+    def test_shift_pos(self):
+        shifters = {
+            f"p{shift}": (
+                make_bed_shifter(shift),
+                make_bed_shift_checker(shift))
+            for shift in [0, 1, 4, 5, 6, 9, 10, 11, 19, 20, 21]
+        }
+        for bed_path in data_dir.glob("*.bed"):
+            for (s_name, (shifter, checker)) in shifters.items():
+                (missing, spurious, different, msg) = check_shifter(
+                    bed_path, s_name, shifter, checker)
+                self.assertFalse(
+                    missing | spurious | different,
+                    msg)
+
+    def test_shift_neg(self):
+        shifters = {
+            f"m{shift}": (
+                make_bed_shifter(-shift),
+                make_bed_shift_checker(-shift))
+            for shift in [0, 1, 4, 5, 6, 9, 10, 11, 19, 20, 21]
+        }
+        for bed_path in data_dir.glob("*.bed"):
+            for (s_name, (shifter, checker)) in shifters.items():
+                (missing, spurious, different, msg) = check_shifter(
+                    bed_path, s_name, shifter, checker)
+                self.assertFalse(
+                    missing | spurious | different,
+                    msg)
+
+
+if __name__ == "__main__":
+    unittest.main()