diff --git a/t/000-tear-env.t b/t/000-tear-env.t
new file mode 100644
index 0000000000000000000000000000000000000000..afe261a8a5ba3f10ec45a2f6b15d711743132ec9
--- /dev/null
+++ b/t/000-tear-env.t
@@ -0,0 +1,17 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Shell::Command;
+use Test::Most;
+
+chdir 't' or die $!;
+
+if (!-d 'etc') {
+	plan skip_all => 'No need to tear previous env.';
+}
+
+ok rm_rf 'etc';
+
+done_testing;
diff --git a/t/001-setup-env.t b/t/001-setup-env.t
new file mode 100644
index 0000000000000000000000000000000000000000..fb59f058e3f04826ced8230617f2e6e818f18ae3
--- /dev/null
+++ b/t/001-setup-env.t
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::Most;
+
+system ("mkdir -p t/etc");
+ok !$?;
+
+system ("mkdir -p t/etc/.vcsh_home");
+ok !$?;
+
+chdir 't/etc/' or die $!;
+
+system ("ln -s '../../vcsh'");
+ok !$?;
+
+done_testing;
diff --git a/t/100-init.t b/t/100-init.t
new file mode 100644
index 0000000000000000000000000000000000000000..b72686841e2ab3668a0d8f5be195947c831ad84a
--- /dev/null
+++ b/t/100-init.t
@@ -0,0 +1,54 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Cwd 'abs_path';
+use Test::Most;
+
+chdir 't/etc/' or die $!;
+
+$ENV{'HOME'} = abs_path ('.vcsh_home');
+
+my $output = `./vcsh status`;
+
+ok $output eq "", 'No repos set up yet.';
+
+$output = `./vcsh init test1`;
+
+ok $output eq "Initialized empty Git repository in " . $ENV{'HOME'} . "/.config/vcsh/repo.d/test1.git/\n";
+
+$output = `./vcsh status`;
+
+ok $output eq "test1:\n\n", 'Our new repo is there';
+
+chdir $ENV{"HOME"} . '/.config/vcsh/repo.d/test1.git/' or die $!;
+
+ok -f 'HEAD';
+ok -d 'branches';
+ok -f 'config';
+ok -f 'description';
+ok -d 'hooks';
+ok -d 'info';
+ok -d 'objects';
+ok -d 'refs';
+
+ok -f 'hooks/applypatch-msg.sample';
+ok -f 'hooks/commit-msg.sample';
+ok -f 'hooks/post-update.sample';
+ok -f 'hooks/pre-applypatch.sample';
+ok -f 'hooks/pre-commit.sample';
+ok -f 'hooks/pre-push.sample';
+ok -f 'hooks/pre-rebase.sample';
+ok -f 'hooks/prepare-commit-msg.sample';
+ok -f 'hooks/update.sample';
+
+ok -f 'info/exclude';
+
+ok -d 'objects/info';
+ok -d 'objects/pack';
+
+ok -d 'refs/heads';
+ok -d 'refs/tags';
+
+done_testing;
diff --git a/t/200-delete.t b/t/200-delete.t
new file mode 100644
index 0000000000000000000000000000000000000000..cd078714ad0c3c7396bc88c89966dd32f7ee0ed7
--- /dev/null
+++ b/t/200-delete.t
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Cwd 'abs_path';
+use Test::Most;
+
+chdir 't/etc/' or die $!;
+
+$ENV{'HOME'} = abs_path ('.vcsh_home');
+
+system ("echo 'Yes, do as I say' | ./vcsh delete test1");
+
+my $output = `./vcsh status`;
+
+ok $output eq "", 'No repos set up anymore.';
+
+done_testing;
diff --git a/t/999-tear-env.t b/t/999-tear-env.t
new file mode 100644
index 0000000000000000000000000000000000000000..afe261a8a5ba3f10ec45a2f6b15d711743132ec9
--- /dev/null
+++ b/t/999-tear-env.t
@@ -0,0 +1,17 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Shell::Command;
+use Test::Most;
+
+chdir 't' or die $!;
+
+if (!-d 'etc') {
+	plan skip_all => 'No need to tear previous env.';
+}
+
+ok rm_rf 'etc';
+
+done_testing;