Test now fails if not testcases are run.
diff --git a/test/test.py b/test/test.py
index 9df75ff..896b9f5 100644
--- a/test/test.py
+++ b/test/test.py
@@ -1,4 +1,4 @@
-import os, json, sys, io, traceback
+import os, json, sys, io, traceback, argparse
 import pytoml as toml
 
 def _testbench_literal(type, text, value):
@@ -12,51 +12,63 @@
     return {'type': _type_table.get(type, type), 'value': text}
 
 def _main():
+    ap = argparse.ArgumentParser()
+    ap.add_argument('-d', '--dir', action='append')
+    ap.add_argument('testcase', nargs='*')
+    args = ap.parse_args()
+
+    if not args.dir:
+        args.dir = [os.path.join(os.path.split(__file__)[0], 'toml-test/tests')]
+
     succeeded = []
     failed = []
 
-    for top, dirnames, fnames in os.walk('./toml-test/tests'):
-        for fname in fnames:
-            if not fname.endswith('.toml'):
-                continue
-
-            if sys.argv[1:] and not any(arg in fname for arg in sys.argv[1:]):
-                continue
-
-            parse_error = None
-            try:
-                with open(os.path.join(top, fname), 'rb') as fin:
-                    parsed = toml.load(fin)
-            except toml.TomlError:
-                parsed = None
-                parse_error = sys.exc_info()
-            else:
-                dumped = toml.dumps(parsed)
-                parsed2 = toml.loads(dumped)
-                if parsed != parsed2:
-                    failed.append((fname, None))
+    for path in args.dir:
+        if not os.path.isdir(path):
+            print('error: not a dir: {}'.format(path))
+            return 2
+        for top, dirnames, fnames in os.walk(path):
+            for fname in fnames:
+                if not fname.endswith('.toml'):
                     continue
 
-                with open(os.path.join(top, fname), 'rb') as fin:
-                    parsed = toml.load(fin, translate=_testbench_literal)
+                if args.testcase and not any(arg in fname for arg in args.testcase):
+                    continue
 
-            try:
-                with io.open(os.path.join(top, fname[:-5] + '.json'), 'rt', encoding='utf-8') as fin:
-                    bench = json.load(fin)
-            except IOError:
-                bench = None
+                parse_error = None
+                try:
+                    with open(os.path.join(top, fname), 'rb') as fin:
+                        parsed = toml.load(fin)
+                except toml.TomlError:
+                    parsed = None
+                    parse_error = sys.exc_info()
+                else:
+                    dumped = toml.dumps(parsed)
+                    parsed2 = toml.loads(dumped)
+                    if parsed != parsed2:
+                        failed.append((fname, None))
+                        continue
 
-            if parsed != bench:
-                failed.append((fname, parsed, bench, parse_error))
-            else:
-                succeeded.append(fname)
+                    with open(os.path.join(top, fname), 'rb') as fin:
+                        parsed = toml.load(fin, translate=_testbench_literal)
+
+                try:
+                    with io.open(os.path.join(top, fname[:-5] + '.json'), 'rt', encoding='utf-8') as fin:
+                        bench = json.load(fin)
+                except IOError:
+                    bench = None
+
+                if parsed != bench:
+                    failed.append((fname, parsed, bench, parse_error))
+                else:
+                    succeeded.append(fname)
 
     for f, parsed, bench, e in failed:
         print('failed: {}\n{}\n{}'.format(f, json.dumps(parsed, indent=4), json.dumps(bench, indent=4)))
         if e:
             traceback.print_exception(*e)
     print('succeeded: {}'.format(len(succeeded)))
-    return 1 if failed else 0
+    return 1 if failed or not succeeded else 0
 
 if __name__ == '__main__':
     sys.exit(_main())