X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2Fstemmatology.git;a=blobdiff_plain;f=t%2Ftext_tradition_directory.t;h=8950148cb14e6eeb175c7a4f187ddf08ca7874e3;hp=c473ced9b56f8212841ba140219a612d5eea262f;hb=62a39b8f5d0ae86b26350664828069a2a44f5645;hpb=ad1291eedd8a322ce64ba40683da4fb5f1c0b609 diff --git a/t/text_tradition_directory.t b/t/text_tradition_directory.t index c473ced..8950148 100644 --- a/t/text_tradition_directory.t +++ b/t/text_tradition_directory.t @@ -8,7 +8,7 @@ $| = 1; # =begin testing { -use Test::Warn; +use TryCatch; use File::Temp; use Text::Tradition; use_ok 'Text::Tradition::Directory'; @@ -17,38 +17,83 @@ my $fh = File::Temp->new(); my $file = $fh->filename; $fh->close; my $dsn = "dbi:SQLite:dbname=$file"; - -my $d = Text::Tradition::Directory->new( 'dsn' => $dsn, - 'extra_args' => { 'create' => 1 } ); -is( ref $d, 'Text::Tradition::Directory', "Got directory object" ); - -my $scope = $d->new_scope; +my $uuid; my $t = Text::Tradition->new( 'name' => 'inline', 'input' => 'Tabular', 'file' => 't/data/simple.txt', ); -my $uuid = $d->save( $t ); -ok( $uuid, "Saved test tradition" ); - -my $s = $t->add_stemma( 't/data/simple.dot' ); -ok( $d->save( $t ), "Updated tradition with stemma" ); -is( $d->tradition( $uuid ), $t, "Correct tradition returned for id" ); -is( $d->tradition( $uuid )->stemma, $s, "...and it has the correct stemma" ); -warning_like { $d->save( $s ) } qr/not a Text::Tradition/, "Correctly failed to save stemma directly"; - -my $e = Text::Tradition::Directory->new( 'dsn' => $dsn ); -$scope = $e->new_scope; -is( scalar $e->tradition_ids, 1, "Directory index has our tradition" ); -my $te = $e->tradition( $uuid ); -is( $te->name, $t->name, "Retrieved the tradition from a new directory" ); -my $sid = $e->object_to_id( $te->stemma ); -warning_like { $e->tradition( $sid ) } qr/not a Text::Tradition/, "Did not retrieve stemma via tradition call"; -warning_like { $e->delete( $sid ) } qr/Cannot directly delete non-Tradition object/, "Stemma object not deleted from DB"; -$e->delete( $uuid ); -ok( !$e->exists( $uuid ), "Object is deleted from DB" ); -ok( !$e->exists( $sid ), "Object stemma also deleted from DB" ); -is( scalar $e->tradition_ids, 0, "Object is deleted from index" ); + +{ + my $d = Text::Tradition::Directory->new( 'dsn' => $dsn, + 'extra_args' => { 'create' => 1 } ); + is( ref $d, 'Text::Tradition::Directory', "Got directory object" ); + + my $scope = $d->new_scope; + $uuid = $d->save( $t ); + ok( $uuid, "Saved test tradition" ); + + my $s = $t->add_stemma( dotfile => 't/data/simple.dot' ); + ok( $d->save( $t ), "Updated tradition with stemma" ); + is( $d->tradition( $uuid ), $t, "Correct tradition returned for id" ); + is( $d->tradition( $uuid )->stemma(0), $s, "...and it has the correct stemma" ); + try { + $d->save( $s ); + } catch( Text::Tradition::Error $e ) { + is( $e->ident, 'database error', "Got exception trying to save stemma directly" ); + like( $e->message, qr/Cannot directly save non-Tradition object/, + "Exception has correct message" ); + } +} +my $nt = Text::Tradition->new( + 'name' => 'CX', + 'input' => 'CollateX', + 'file' => 't/data/Collatex-16.xml', + ); +is( ref( $nt ), 'Text::Tradition', "Made new tradition" ); + +{ + my $f = Text::Tradition::Directory->new( 'dsn' => $dsn ); + my $scope = $f->new_scope; + is( scalar $f->traditionlist, 1, "Directory index has our tradition" ); + my $nuuid = $f->save( $nt ); + ok( $nuuid, "Stored second tradition" ); + my @tlist = $f->traditionlist; + is( scalar @tlist, 2, "Directory index has both traditions" ); + my $tf = $f->tradition( $uuid ); + my( $tlobj ) = grep { $_->{'id'} eq $uuid } @tlist; + is( $tlobj->{'name'}, $tf->name, "Directory index has correct tradition name" ); + is( $tf->name, $t->name, "Retrieved the tradition from a new directory" ); + my $sid = $f->object_to_id( $tf->stemma(0) ); + try { + $f->tradition( $sid ); + } catch( Text::Tradition::Error $e ) { + is( $e->ident, 'database error', "Got exception trying to fetch stemma directly" ); + like( $e->message, qr/not a Text::Tradition/, "Exception has correct message" ); + } + try { + $f->delete( $sid ); + } catch( Text::Tradition::Error $e ) { + is( $e->ident, 'database error', "Got exception trying to delete stemma directly" ); + like( $e->message, qr/Cannot directly delete non-Tradition object/, + "Exception has correct message" ); + } + + $f->delete( $uuid ); + ok( !$f->exists( $uuid ), "Object is deleted from DB" ); + ok( !$f->exists( $sid ), "Object stemma also deleted from DB" ); + is( scalar $f->traditionlist, 1, "Object is deleted from index" ); +} + +{ + my $g = Text::Tradition::Directory->new( 'dsn' => $dsn ); + my $scope = $g->new_scope; + is( scalar $g->traditionlist, 1, "Now one object in new directory index" ); + my $ntobj = $g->tradition( 'CX' ); + my @w1 = sort { $a->sigil cmp $b->sigil } $ntobj->witnesses; + my @w2 = sort{ $a->sigil cmp $b->sigil } $nt->witnesses; + is_deeply( \@w1, \@w2, "Looked up remaining tradition by name" ); +} }