Added a shell script (t/t9700-perl-git.sh) that sets up a git repository and a perl script (t/t9700/test.pl) that runs the actual tests. Signed-off-by: Lea Wiemann <LeWiemann@xxxxxxxxx> --- Hi everyone! Here's my first draft for a test suite for Git.pm. It doesn't test all of Git.pm yet, but I'll add more tests later. Comments are appreciated! My test-fu didn't suffice for testing the command methods (which are responsible for calling git), and I'm not currently planning to. I'm hoping to add more coverage to the constructor (Git->repository) though. Something I'm not sure about yet is how to test failure cases -- for instance, there are a couple of methods in Git.pm that return undef for $E->value (i.e. exit code) == 1, but die for $E->value > 1. The latter case I can't currently test. Ideas how to test those cases cleanly (i.e. how to simulate/mock an exit code > 1) are very welcome. (Petr:) There's some serious strangeness going on where calling wc_chdir causes all subsequent commands to fail (marked as TODO at the end). I've spent half an hour unsuccessfully trying to track down the error. It would be great if you (or anyone else with more Git experience than me) could have a look at this. -- Lea t/t9700-perl-git.sh | 40 +++++++++++++++++++++++++++++ t/t9700/test.pl | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 0 deletions(-) create mode 100755 t/t9700-perl-git.sh create mode 100755 t/t9700/test.pl diff --git a/t/t9700-perl-git.sh b/t/t9700-perl-git.sh new file mode 100755 index 0000000..735ada1 --- /dev/null +++ b/t/t9700-perl-git.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# +# Copyright (c) 2008 Lea Wiemann +# + +test_description='perl interface (Git.pm)' +. ./test-lib.sh + +# set up test repository + +test_expect_success \ + 'set up test repository' \ + 'echo "*.test" > .gitignore && + + echo "test file 1" > file1 && + echo "test file 2" > file2 && + mkdir directory1 && + echo "in directory1" >> directory1/file && + mkdir directory2 && + echo "in directory2" >> directory2/file && + git add . && + git commit -m "first commit" && + git rev-parse HEAD > revisions.test && + + git tag -- --silly-name && + + echo "changed file 1" > file1 && + git add . && + git commit -m "second commit" && + git rev-parse HEAD >> revisions.test && + + git-config --add color.test.slot1 green && + (git-config --get-color color.test.slot1 red; echo foo) > x + ' + +test_external_without_stderr \ + 'Perl API' \ + perl ../t9700/test.pl + +test_done diff --git a/t/t9700/test.pl b/t/t9700/test.pl new file mode 100755 index 0000000..c8d5c64 --- /dev/null +++ b/t/t9700/test.pl @@ -0,0 +1,70 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +use Test::More qw(no_plan); +use Cwd; +use File::Basename; + +BEGIN { use_ok('Git') } +require_ok('Git'); + +# set up +#our $repo_dir = "trash directory"; +our $abs_repo_dir = Cwd->cwd; +ok(our $r = Git->repository(Directory => "."), "open repository"); +ok((open REVISIONS, 'revisions.test' and chomp(our @revisions = <REVISIONS>)), + "(read revisions)"); + +# ident +like($r->ident("aUthor"), qr/^A U Thor <author\@example.com> [0-9]+ \+0000$/, + "ident scalar: author (type)"); +like($r->ident("cOmmitter"), qr/^C O Mitter <committer\@example.com> [0-9]+ \+0000$/, + "ident scalar: committer (type)"); +is($r->ident("invalid"), "invalid", "ident scalar: invalid ident string (no parsing)"); +my ($name, $email, $time_tz) = $r->ident('author'); +is_deeply([$name, $email], ["A U Thor", "author\@example.com"], + "ident array: author"); +like($time_tz, qr/[0-9]+ \+0000/, "ident array: author"); +is_deeply([$r->ident("Name <email> 123 +0000")], ["Name", "email", "123 +0000"], + "ident array: ident string"); +is_deeply([$r->ident("invalid")], [], "ident array: invalid ident string"); +# ident_person +is($r->ident_person("aUthor"), "A U Thor <author\@example.com>", + "ident_person: author (type)"); +is($r->ident_person("Name <email> 123 +0000"), "Name <email>", + "ident_person: ident string"); +is($r->ident_person("Name", "email", "123 +0000"), "Name <email>", + "ident_person: array"); + +# parse_rev +is($r->parse_rev("HEAD"), $revisions[-1], "parse_rev: 'HEAD'"); +is($r->parse_rev("HEAD^"), $revisions[-2], "parse_rev: 'HEAD^'"); +is($r->parse_rev($revisions[0]), $revisions[0], "parse_rev: SHA1"); +is($r->parse_rev("--silly-name"), $revisions[0], "parse_rev: tag"); +is($r->parse_rev("nonexistent"), undef, "parse_rev: nonexistent name"); +is($r->parse_rev("0" x 40), "0" x 40, "parse_rev: nonexistent SHA1"); + +# colors +our $ansi_green = "\x1b[32m"; +# Cannot test $r->get_colorbool("color.foo")) since our stdout is not +# a terminal. + +# paths +is($r->get_color("color.test.slot1", "red"), $ansi_green, "get_color"); +is($r->repo_path, "./.git", "repo_path"); +is($r->wc_path, $abs_repo_dir . "/", "wc_path"); +is($r->wc_subdir, "", "wc_subdir initial"); +$r->wc_chdir("directory1"); +is($r->wc_subdir, "directory1", "wc_subdir after wc_chdir"); +TODO: { + local $TODO = "commands do not work after wc_chdir"; + # Failure output is active even when in non-verbose mode and + # thus annoying, and the ANSI codes mess up the output on top + # of that. Thus we simply skip these tests while they fail. + todo_skip 'get_color after wc_chdir', 2; + is($r->get_color("color.test.slot1", "red"), $ansi_green, "get_color after wc_chdir"); + is($r->parse_rev("HEAD"), $revisions[-1], "parse_rev after wc_chdir"); +} + -- 1.5.5.GIT -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html