1
# (c) Sound Object Logic 2000-2001
6
use vars qw( $intrusive );
8
my $children = $intrusive ? 'ia_children' : 'children';
11
my @kids = qw( Bart Lisa Maggie );
13
# $Tangram::TRACE = \*STDOUT;
15
sub NaturalPerson::children
18
join(' ', map { $_->{firstName} || '' } @{ $self->{$children} } )
24
Springfield::test( $intrusive
25
|| $storage->load( $id{Marge} )->children eq 'Bart Lisa Maggie' );
28
Springfield::begin_tests(45);
32
my $storage = Springfield::connect_empty;
34
my @children = map { NaturalPerson->new( firstName => $_ ) } @kids;
35
@id{ @kids } = $storage->insert( @children );
37
my $homer = NaturalPerson->new( firstName => 'Homer', $children => [ @children ] );
38
$id{Homer} = $storage->insert($homer);
40
my $marge = NaturalPerson->new( firstName => 'Marge' );
41
$marge->{$children} = [ @children ] unless $intrusive;
42
$id{Marge} = $storage->insert($marge);
47
#############################################################################
51
Springfield::leaktest;
54
my $storage = Springfield::connect;
55
my $homer = $storage->load( $id{Homer} );
57
Springfield::test( $homer->children eq 'Bart Lisa Maggie' );
58
marge_test( $storage );
60
@{ $homer->{$children} }[0, 2] = @{ $homer->{$children} }[2, 0];
61
$storage->update( $homer );
66
Springfield::leaktest;
69
my $storage = Springfield::connect;
70
my $homer = $storage->load( $id{Homer} );
72
Springfield::test( $homer->children eq 'Maggie Lisa Bart' );
73
marge_test( $storage );
75
pop @{ $homer->{$children} };
76
$storage->update( $homer );
81
###############################################
85
my $storage = Springfield::connect;
87
my $homer = $storage->load($id{Homer}) or die;
89
Springfield::test( $homer->children eq 'Maggie Lisa' );
91
shift @{ $homer->{$children} };
92
$storage->update($homer);
97
Springfield::leaktest;
100
my $storage = Springfield::connect;
101
my $homer = $storage->load($id{Homer}) or die;
102
Springfield::test( $homer->children eq 'Lisa' );
103
$storage->disconnect;
106
Springfield::leaktest;
109
my $storage = Springfield::connect;
110
my $homer = $storage->load($id{Homer}) or die;
111
shift @{ $homer->{$children} };
112
$storage->update($homer);
113
$storage->disconnect;
116
Springfield::leaktest;
119
my $storage = Springfield::connect;
120
my $homer = $storage->load($id{Homer}) or die;
122
Springfield::test( $homer->children eq '' );
124
push @{ $homer->{$children} }, $storage->load( $id{Bart} );
125
$storage->update($homer);
127
$storage->disconnect;
130
Springfield::leaktest;
133
my $storage = Springfield::connect;
134
my $homer = $storage->load($id{Homer}) or die;
136
Springfield::test( $homer->children eq 'Bart' );
138
push @{ $homer->{$children} }, $storage->load( @id{qw( Lisa Maggie )} );
139
$storage->update($homer);
141
$storage->disconnect;
144
Springfield::leaktest;
147
my $storage = Springfield::connect;
148
my $homer = $storage->load( $id{Homer} );
150
Springfield::test( $homer->children eq 'Bart Lisa Maggie' );
151
marge_test( $storage );
153
$storage->disconnect;
156
Springfield::leaktest;
159
my $storage = Springfield::connect;
160
my $homer = $storage->load( $id{Homer} );
162
Springfield::test( $homer->children eq 'Bart Lisa Maggie' );
163
marge_test( $storage );
168
Springfield::leaktest;
170
$storage->disconnect;
174
my $storage = Springfield::connect;
175
my $bart = $storage->load( $id{Bart} );
177
Springfield::test( !$intrusive || $bart->{ia_parent}{firstName} eq 'Homer' );
178
marge_test( $storage );
180
$storage->disconnect;
183
Springfield::leaktest;
189
my $storage = Springfield::connect;
191
my @prefetch = $storage->prefetch( 'NaturalPerson', $children );
193
my $homer = $storage->load( $id{Homer} );
195
Springfield::test( $homer->children eq 'Bart Lisa Maggie' );
196
marge_test( $storage );
198
$storage->disconnect();
201
Springfield::leaktest;
204
my $storage = Springfield::connect;
206
my $person = $storage->remote('NaturalPerson');
208
my @prefetch = $storage->prefetch( 'NaturalPerson', $children );
210
my $homer = $storage->load( $id{Homer} );
212
Springfield::test( $homer->children eq 'Bart Lisa Maggie' );
213
marge_test( $storage );
215
$storage->disconnect();
218
Springfield::leaktest;
223
my $parents = $intrusive ? 'Homer' : 'Homer Marge';
226
my $storage = Springfield::connect;
227
my ($parent, $child) = $storage->remote(qw( NaturalPerson NaturalPerson ));
229
my @results = $storage->select( $parent, $parent->{$children}->includes( $child )
230
& $child->{firstName} eq 'Bart' );
232
Springfield::test( join( ' ', sort map { $_->{firstName} } @results ) eq $parents );
233
$storage->disconnect();
236
Springfield::leaktest;
239
my $storage = Springfield::connect;
240
my $parent = $storage->remote( 'NaturalPerson' );
241
my $bart = $storage->load( $id{Bart} );
243
my @results = $storage->select( $parent, $parent->{$children}->includes( $bart ) );
245
Springfield::test( join( ' ', sort map { $_->{firstName} } @results ) eq $parents );
246
$storage->disconnect();
249
Springfield::leaktest;
252
my $storage = Springfield::connect_empty;
254
my @children = map { NaturalPerson->new( firstName => $_ ) } @kids;
256
my $homer = NaturalPerson->new( firstName => 'Homer',
257
children => [ map { NaturalPerson->new( firstName => $_ ) } @kids ] );
259
my $abe = NaturalPerson->new( firstName => 'Abe',
260
$children => [ $homer ] );
262
$id{Abe} = $storage->insert($abe);
264
$storage->disconnect();
267
Springfield::leaktest;
270
my $storage = Springfield::connect;
272
$storage->erase( $storage->load( $id{Abe} ) );
274
my @pop = $storage->select('NaturalPerson');
275
Springfield::test( @pop == 0 );
277
$storage->disconnect();
280
Springfield::leaktest;
282
#############################################################################
285
Springfield::tx_tests(8, sub {
289
# check rollback of DB tx
291
Springfield::leaktest;
293
my $storage = Springfield::connect;
294
my $homer = $storage->load( $id{Homer} );
296
$storage->tx_start();
298
shift @{ $homer->{$children} };
299
$storage->update( $homer );
301
$storage->tx_rollback();
303
$storage->disconnect;
306
Springfield::leaktest;
308
# storage should still contain 3 children
311
my $storage = Springfield::connect;
312
my $homer = $storage->load( $id{Homer} );
314
Springfield::test( $homer->children eq 'Bart Lisa Maggie' );
315
marge_test( $storage );
317
$storage->disconnect;
320
Springfield::leaktest;
322
# check that DB and collection state remain in synch in case of rollback
325
my $storage = Springfield::connect;
326
my $homer = $storage->load( $id{Homer} );
328
$storage->tx_start();
330
shift @{ $homer->{$children} };
331
$storage->update( $homer );
333
$storage->tx_rollback();
335
$storage->update( $homer );
337
$storage->disconnect;
340
# Bart should no longer be Homer's child
343
my $storage = Springfield::connect;
344
my $homer = $storage->load( $id{Homer} );
346
Springfield::test( $homer->children eq 'Lisa Maggie' );
347
marge_test( $storage );
349
$storage->disconnect;
352
Springfield::leaktest;