The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package LaTeX::TikZ::TestHelper;

use strict;
use warnings;

use Test::More ();

use Mouse::Exporter;

Mouse::Exporter->setup_import_methods(
 as_is => [ qw<using check is_point_ok> ],
);

my $tikz;

sub using {
 $tikz = $_[0] if defined $_[0];

 return $tikz;
}

sub check {
 my ($set, $desc, $exp) = @_;

 local $Test::Builder::Level = $Test::Builder::Level + 1;

 my ($head, $decl, $body) = eval {
  $tikz->render(ref $set eq 'ARRAY' ? @$set : $set);
 };
 Test::More::is($@, '', "$desc: no error");

 unless (ref $exp eq 'ARRAY') {
  $exp = [ split /\n/, $exp ];
 }
 unshift @$exp, '\begin{tikzpicture}';
 push    @$exp, '\end{tikzpicture}';

 Test::More::is_deeply($body, $exp, "$desc: body");

 return $head, $decl, $body;
}

sub is_point_ok {
 my ($p, $x, $y, $desc) = @_;

 my $ok = Test::More::isa_ok($p, 'LaTeX::TikZ::Point', "$desc isa point");
 if ($ok) {
  Test::More::cmp_ok($p->x, '==', $x, "$desc x coordinate is right");
  Test::More::cmp_ok($p->y, '==', $y, "$desc y coordinate is right");
 } else {
  Test::More::fail("$desc placeholder $_") for 1, 2;
 }
}

1;