use v6-alpha; # Tests for lazy lists # # TODO - uncomment "countable lazy slice" test # TODO - add timeout control, in tests that may loop forever # TODO - the backends that don't have infinite lists implemented # should warn of this, instead of entering an infinite loop. # TODO - add test for (1..Inf:by(2)) # TODO - add test for "build a list from a coroutine" # TODO - add test for zip() # TODO - add test for 2D array use Test; plan( 32 ); unless $?PUGS_BACKEND eq "BACKEND_PERL5" { skip_rest ("$?PUGS_BACKEND does not support lazy lists yet.", :depends("lazy lists") ); exit; } # constructors is( (1..Inf).perl, "(1, 2, 3, ..., Inf)", "simple infinite list" ); is( (1..*).perl, "(1, 2, 3, ..., Inf)", "simple infinite list" ); is( (-Inf..Inf).perl, "(-Inf, ..., Inf)", "double infinite list" ); is( (*..*).perl, "(-Inf, ..., Inf)", "double infinite list" ); is( (-Inf..0).perl, "(-Inf, ..., -2, -1, 0)", "negative infinite list" ); is( (*..0).perl, "(-Inf, ..., -2, -1, 0)", "negative infinite list" ); # this one should not really work unless .perl gives up before infinity is( ('aaaa'..'zzzz').perl, "('aaaa', 'aaab', 'aaac', ..., 'zzzx', 'zzzy', 'zzzz')", "string lazy list" ); is( ('aaaa'..*).perl, "('aaaa', 'aaab', 'aaac', ..., *)", "infinite string lazy list" ); is( (1..*,2,3).perl, "(1, 2, 3, ..., Inf, 2, 3)", "infinite list with non-lazy elements" ); # splices { my @a = (1..Inf); is( @a.splice( 2, 3 ), "(3, 4, 5)", "splice" ); is( @a, "(1, 2, 6, ..., Inf)", "spliced" ); } { my @a = (1..Inf); is( @a.splice( 2, Inf, 99, 100 ), "(3, 4, 5, ..., Inf)", "splice" ); is( @a, "(1, 2, 99, 100)", "spliced" ); } # basic list operations is( (1..Inf).elems, "Inf", "elems" ); is( (1..Inf).shift, "1", "shift" ); is( (1..Inf).pop, "Inf", "pop" ); is( (1..Inf).clone, "(1, 2, 3, ..., Inf)", "clone" ); is( (1..Inf).reverse.perl, "(Inf, ..., 3, 2, 1)", "reverse" ); is( (1..Inf).map:{ $_/2 }.perl, "(0.5, 1, 1.5, ..., Inf)", "map" ); is( ('x' xx 1000000).perl, "('x', 'x', 'x', ..., 'x', 'x', 'x')", "xx operator" ); is( (1..Inf).sum, "Inf", "infinite sum" ); is( (1..1000000).sum, "500000500000", "non-infinite sum" ); # slices is( (1..Inf)[2..5].perl, "(3, 4, 5, 6)", "simple slice" ); { my @a = (1..Inf); is( @a[2..5].perl, "(3, 4, 5, 6)", "simple slice" ); } is( (1..Inf)[2..Inf].perl, "(3, 4, 5, ..., Inf)", "lazy slice" ); if $?PUGS_BACKEND eq "BACKEND_PERL5" { skip ( 1, "countable lazy slice not fully implemented in $?PUGS_BACKEND yet", :depends("lazy slices") ); is( (1..Inf)[2..100000].perl, "(3, 4, 5, ..., 100001, 100002, 100003)", "countable lazy slice" ); } # array assignment { my @a = (1..Inf); is( @a.perl, "(1, 2, 3, ..., Inf)", "array assignment" ); @a[1] = 99; is( @a.perl, "(1, 99, 3, ..., Inf)", "array element assignment" ); } { my @a = (1..Inf); is( @a.perl, "(1, 2, 3, ..., Inf)", "array assignment" ); @a[0,1] = (98, 99); is( @a.perl, "(98, 99, 3, ..., Inf)", "array slice assignment" ); } { my @a = (1..Inf); @a[1].delete; is( @a.perl, "(1, undef, 3, ..., Inf)", "array element delete()" ); } { my @a = (1..Inf); @a[0,1].delete; is( @a.perl, "(undef, undef, 3, ..., Inf)", "array slice delete()" ); } { my @a = (1..Inf); @a[1..1000002] = @a[9..1000010]; is( @a.perl, "(1, 10, 11, ..., Inf)", "big slice assignment" ); } # assorted operations is( (1..Inf, (1..Inf).reverse ).perl, "(1, 2, 3,, ..., 3, 2, 1)", "end of infinite list is readable" );