use strict; use warnings; use Test::More; use Test::Differences; use File::Spec; use HTML::Tiny; use TextMate::JumpTo qw(jumpto); my $manifest = File::Spec->rel2abs( 'MANIFEST' ); my $h = HTML::Tiny->new; my @cases = ( { name => 'empty args', args => [], expect_error => qr{one\s+or\s+more}, }, { name => 'odd args', args => ['file'], expect_error => qr{needs\s+a\s+list}, }, { name => 'file only, MANIFEST', args => [ file => 'MANIFEST' ], expect => [ [ "txmt://open?url=file%3a%2f%2f" . $h->url_encode( $manifest ), undef ] ], }, { name => 'background MANIFEST', args => [ file => 'MANIFEST', bg => 1 ], expect => [ [ "txmt://open?url=file%3a%2f%2f" . $h->url_encode( $manifest ), 1 ] ], }, { name => 'file, line, col, MANIFEST', args => [ file => 'MANIFEST', line => 10, column => 3 ], expect => [ [ "txmt://open?column=3&line=10&url=file%3a%2f%2f" . $h->url_encode( $manifest ), undef ] ], }, ); plan tests => 2 * @cases; { my @log = (); no warnings 'redefine'; *TextMate::JumpTo::_open = sub { push @log, [@_] }; sub get_log { splice @log } } for my $test ( @cases ) { my $name = $test->{name}; eval { jumpto( @{ $test->{args} } ) }; if ( my $err = $test->{expect_error} ) { like $@, $err, "$name: error OK"; pass "$name: dummy"; } else { ok !$@, "$name: no error OK"; eq_or_diff [ get_log() ], $test->{expect}, "$name: result OK"; } }