# -*-perl-*- # $Id: 01_tie.t,v 3.2 2004/02/26 02:02:30 lachoy Exp $ use strict; use Test::More tests => 21; # Test the SPOPS::Tie interface and the various pieces of it do "t/config.pl"; # Simple require { require_ok( 'SPOPS::Tie' ); SPOPS::Tie->import( qw( IDX_CHANGE IDX_LAZY_LOADED ) ); } # Basic operations { my ( $obj, $data ) = do_tie(); is( $obj->{ IDX_CHANGE() }, 0, 'Initial change flag' ); $data->{sleepy} = 'sloopy'; is( $data->{sleepy}, 'sloopy', 'Basic equivalency' ); isnt( $obj->{ IDX_CHANGE() }, 0, 'Modified change flag' ); } # Multivalue fields { my ( $obj, $data ) = do_tie({ multivalue => { 'sleepy' => 1, 'dopey' => 2 } }); ok( ! $obj->{ IDX_CHANGE() }, 'Initial change flag (multivalue)' ); $data->{sleepy} = 'sloopy'; ok( $obj->{ IDX_CHANGE() }, 'Modified change flag (multivalue)' ); my $info = $data->{sleepy}; is( scalar @{ $info }, 1, 'Multivalue set (number)' ); is( $info->[0], 'sloopy', 'Multivalue set (content)' ); $data->{sleepy} = 'snarly'; $info = $data->{sleepy}; is( scalar @{ $info }, 2, 'Multivalue set (second)' ); $data->{sleepy} = { remove => 'snarly' }; $info = $data->{sleepy}; is( scalar @{ $info }, 1, 'Multivalue remove (number)' ); is( $info->[0], 'sloopy', 'Multivalue remove (content)' ); $data->{sleepy} = { modify => { sloopy => 'slocum' } }; $info = $data->{sleepy}; is( scalar @{ $info }, 1, 'Multivalue modify (number)' ); is( $info->[0], 'slocum', 'Multivalue modify (content)' ); $data->{slimey} = 'goo'; is( $data->{slimey}, 'goo', 'Basic equivalency (multivalue)' ); } # Field mapping { my ( $obj, $data ) = do_tie({ field_map => { dopey => 'snarly', sleepy => 'smelly' } }); ok( ! $obj->{ IDX_CHANGE() }, 'Initial change flag (field map)' ); $data->{sleepy} = 'sloopy'; ok( $obj->{ IDX_CHANGE() }, 'Modified change flag (field map)' ); is( $data->{smelly}, 'sloopy', 'Field map (alias set)' ); $data->{snarly} = 'growl'; is( $data->{dopey}, 'growl', 'Field map (alias read)' ); } # Lazy loading { my ( $obj, $data ) = do_tie({ is_lazy_load => 1, field => [ qw/ fee fi fum / ], lazy_load_sub => \&get_lazy_field }); $data->{fee} = 'manual - fee'; is( $obj->{ IDX_LAZY_LOADED() }->{fee}, 1, 'Lazy load status (normal set)' ); ok( ! $obj->{ IDX_LAZY_LOADED() }->{fum}, 'Lazy load status (lazy unset)' ); is( $data->{fum}, 'muf', 'Lazy load (field value loaded)' ); } # Simple routine to retrieve a SPOPS::Tie hashref plus its object so # we can do various comparisons sub do_tie { my ( $params ) = @_; my ( %data ); my $obj = tie %data, 'SPOPS::Tie', 'My::Tie', $params; return ( $obj, \%data ); } # Dumb routine to do 'lazy loading' sub get_lazy_field { my ( $class, $data, $field ) = @_; return scalar( reverse $field ); }