#!/usr/bin/env perl use Data::Dumper; use Data::Dx; use Dios { accessors => 'unified' }; use Getopt::Long; use Path::Tiny; use Test::Expr; use 5.014_00; class Nada { has Int $.number is rw; }; class Yada { has Int $.number is rw; has Nada @.nadas is rw; }; # class Yada: BEGIN { # Let's confirm that Dios uses Object::InsideOut so we can "dump" and "pump" say $INC{'Object/InsideOut.pm'}; }; Getopt::Long::GetOptions( "initialize" => \my $initialize, "restore" => \my $restore, "save" => \my $save, ); say ""; Nada->new(), Yada->new(), say "initialized!" if ($initialize); sub test_our_yada { my $self=shift; ok $self->isa('Yada'); ok $self->number() == 0; ok @{$self->nadas()} == 2; Dx $self->nadas(); ok $self->nadas()->[0]->number() == 1; ok $self->nadas()->[1]->number() == 2; } if ($save) { # The "initial" Yada my $yada=Yada->new(number=>0,nadas=>[Nada->new(number=>1),Nada->new(number=>2)]); $yada->main::test_our_yada(); # $erialized and written to 'Yada.dat' Path::Tiny::path('Yada.dat')->spew_raw($yada->dump(1)); done_testing; } elsif ($restore) { # The restored from 'Yada.dat' Yada my $yada=Object::InsideOut->pump(Path::Tiny::path('Yada.dat')->slurp_raw()); $yada->main::test_our_yada(); done_testing; } else { warn "Needs a 'save' or a 'restore'."; } say ""; __END__ #### # Saved WITHOUT initial "Nada->new(), Yada->new()" >perl test_01.t -save ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] ok 4 - $self->nadas()->[0]->number() == 1 ok 5 - $self->nadas()->[1]->number() == 2 1..5 # Restored WITHOUT initial "Nada->new(), Yada->new()" >perl test_01.t -restore OIO::Args error: Unknown field name for class 'Yada': number Package: main File: test_01.t Line: 52 Trace begun at test_01.t line 52 # Restored WITH initial "Nada->new(), Yada->new()" >perl test_01.t -initialize -restore initialized! ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] not ok 4 - $self->nadas()->[0]->number() == 1 # Failed test '$self->nadas()->[0]->number() == 1' # at test_01.t line 45. # # (do{$self->nadas()->[0]->number() == 1}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # not ok 5 - $self->nadas()->[1]->number() == 2 # Failed test '$self->nadas()->[1]->number() == 2' # at test_01.t line 46. # # (do{$self->nadas()->[1]->number() == 2}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # 1..5 ERROR: Duplicate reclaimed object ID (1) in class tree for Nada in thread 0 # Looks like you failed 2 tests of 5. # Saved WITH initial "Nada->new(), Yada->new()" >perl test_01.t -initialize -save initialized! ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] ok 4 - $self->nadas()->[0]->number() == 1 ok 5 - $self->nadas()->[1]->number() == 2 1..5 # Restored WITHOUT initial "Nada->new(), Yada->new()" >perl test_01.t -restore OIO::Args error: Unknown field name for class 'Yada': number Package: main File: test_01.t Line: 52 Trace begun at test_01.t line 52 # Restored WITH initial "Nada->new(), Yada->new()" >perl test_01.t -initialize -restore initialized! ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] not ok 4 - $self->nadas()->[0]->number() == 1 # Failed test '$self->nadas()->[0]->number() == 1' # at test_01.t line 45. # # (do{$self->nadas()->[0]->number() == 1}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # not ok 5 - $self->nadas()->[1]->number() == 2 # Failed test '$self->nadas()->[1]->number() == 2' # at test_01.t line 46. # # (do{$self->nadas()->[1]->number() == 2}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # 1..5 ERROR: Duplicate reclaimed object ID (1) in class tree for Nada in thread 0 # Looks like you failed 2 tests of 5.