#!perl
# Copyright (C) 2001-2006, Parrot Foundation.

use strict;
use warnings;
use lib qw( t . lib ../lib ../../lib );

use Test::More;
use Parrot::Test tests => 20;

=head1 NAME

t/library/streams.t - Stream tests

=head1 SYNOPSIS

    % prove t/library/streams.t

=head1 DESCRIPTION

Tests string streams.

=cut

my @streams = qw[Combiner Coroutine Filter Lines ParrotIO Replay Sub Writer];

for my $a (@streams) {

    #
    # 1..8
    #
    pir_output_is( <<"CODE", <<"OUT", "load and create a Stream;$a" );

.sub _main :main
    print "loading '$a'...\\n"
    load_bytecode 'Stream/$a.pbc'
    print "loaded\\n"

    \$P0 = new ['Stream'; '$a']

    \$S0 = typeof \$P0
    print "class name: '"
    print \$S0
    print "'\\ndone\\n"
    end
.end
CODE
loading '$a'...
loaded
class name: 'Stream;$a'
done
OUT

}

#
# 9
#
pir_output_is( <<'CODE', <<'OUT', "Stream;Sub" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Sub.pbc'

    stream = new ['Stream'; 'Sub']

    # set the stream's source sub   #'
    .const 'Sub' temp = "_hello"
    assign stream, temp

    # dump the stream
    stream."dump"()
    # read again to see if read returns null
    $S0 = stream."read"()
    if_null $S0, OK
    print "error: read returned '"
    print $S0
    print "' instead of (null)\n"
OK:
    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end
.sub _hello :method
    self."write"( "hello" )
    self."write"( "world!" )
    self."write"( "parrot" )
    self."write"( "is cool" )
.end
CODE
read:[hello]
read:[world!]
read:[parrot]
read:[is cool]
done
finished
OUT

#
# 10
#
pir_output_is( <<'CODE', <<'OUT', "Stream::read_bytes" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Sub.pbc'
    load_bytecode 'Stream/Replay.pbc'

    $P0 = new ['Stream'; 'Sub']
    # set the stream's source sub      #'
    .const 'Sub' temp = "_hello"
    assign $P0, temp

    stream = new ['Stream'; 'Replay']
    assign stream, $P0

    $S0 = stream."read_bytes"( 3 )
    print "1: ["
    print $S0
    print "]\n"

    stream = clone stream
    $P0    = clone stream

    $S0    = stream."read_bytes"( 4 )
    print "2: ["
    print $S0
    print "] = "

    $S0 = $P0."read_bytes"( 4 )
    print "3: ["
    print $S0
    print "]\n"

    $S0 = stream."read"()
    print "4: ["
    print $S0
    print "]\n"

    print "# _hello ends now:\n"
    $S0 = stream."read_bytes"( 100 )
    print "5: ["
    print $S0
    print "]\n"

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _hello :method
    print "_hello start!\n"
    self."write"( "hello" )
    self."write"( "world!" )
    self."write"( "parrot" )
    self."write"( "is cool" )
    print "_hello end!\n"
.end
CODE
_hello start!
1: [hel]
2: [lowo] = 3: [lowo]
4: [rld!]
# _hello ends now:
_hello end!
5: [parrotis cool]
done
finished
OUT

#
# 11
#
pir_output_is( <<'CODE', <<'OUT', "Stream::Combiner" );

.sub _main :main
    .local pmc counter
    .local pmc text
    .local pmc combined

    load_bytecode 'Stream/Base.pbc'
    load_bytecode 'Stream/Combiner.pbc'
    load_bytecode 'Stream/Sub.pbc'

    # create the counter stream
    counter = new ['Stream'; 'Sub']
    .const 'Sub' ct = "_counter"
    assign counter, ct

    # create the text stream
    text = new ['Stream'; 'Sub']
    # set its source
    .const 'Sub' src = "_text"
    assign text, src

    # create a combiner stream
    combined = new ['Stream'; 'Combiner']
    # add the streams
    assign combined, counter
    assign combined, text

    # specify our own combiner sub
    .const 'Sub' cb = "_combiner"
    combined."combiner"( cb )

    # dump the combined stream
    combined."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _counter
    .param pmc stream
    .local int i
    .local string str

    i = 0
LOOP:
    inc i
    str = i
    stream."write"( str )
    branch LOOP
.end

.sub _text
    .param pmc stream

    stream."write"( "hello" )
    stream."write"( "world!" )
    stream."write"( "parrot" )
    stream."write"( "is cool" )
.end

.sub _combiner
    .param pmc strings
    .local string str
    .local string ret

    ret = strings[0]
    ret = concat ret, " "
    str = strings[1]
    ret = concat ret, str

    .return(ret)
.end
CODE
read:[1 hello]
read:[2 world!]
read:[3 parrot]
read:[4 is cool]
done
finished
OUT

#
# 12
#
pir_output_is( <<'CODE', <<'OUT', "Stream::Coroutine" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Base.pbc'
    load_bytecode 'Stream/Coroutine.pbc'

    # create the coroutine stream
    stream = new ['Stream'; 'Coroutine']

    # set the stream's source coroutine #'
    .const 'Sub' temp = "_coro"
    assign stream, temp
    #stream."source"( temp )

    # dump the stream
    stream."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _coro
    .param pmc stream
    .local int i
    .local string str

    i = 0
LOOP:
    str = i

    .yield(str)

    inc i
    if i < 10 goto LOOP

    # the stream is automatically closed if you return a null string
    # you can also close it explicitly with
    # stream."close"()
    # in which case it doesn't matter what you are returning.

    null str
    .return(str)
.end
CODE
read:[0]
read:[1]
read:[2]
read:[3]
read:[4]
read:[5]
read:[6]
read:[7]
read:[8]
read:[9]
done
finished
OUT

#
# 13
#
pir_output_is( <<'CODE', <<'OUT', "Stream::ParrotIO" );

.sub _main :main
    .local pmc file
    .local pmc lines
    .local pmc counter
    .local pmc combiner
    .local string name

    name = "t/library/perlhistory.txt"

    load_bytecode 'Stream/ParrotIO.pbc'
    load_bytecode 'Stream/Lines.pbc'
    load_bytecode 'Stream/Sub.pbc'
    load_bytecode 'Stream/Combiner.pbc'

    # create a file stream
    file = new ['Stream'; 'ParrotIO']
    file."open"( name, 'r' )

    # process it one line per read
    lines = new ['Stream'; 'Lines']
    assign lines, file

    # endless counter
    counter = new ['Stream'; 'Sub']
    .const 'Sub' temp = "_counter"
    assign counter, temp

    # combine the counter and the file's lines   #'
    combiner = new ['Stream'; 'Combiner']
    assign combiner, counter
    assign combiner, lines

    # dump the stream
    combiner."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _counter
    .param pmc stream
    .local int i
    .local string str
    .local pmc array

    i = 0
    array = new 'ResizablePMCArray'

LOOP:
    inc i
    array[0] = i
    sprintf str, "%5d ", array
    stream."write"( str )
    branch LOOP
.end
CODE
read:[    1 ]
read:[    2 This file is used as a source for ParrotIO streams in t/library/streams.t]
read:[    3 ]
read:[    4         Larry   0              Classified.     Don't ask.]
read:[    5         Larry   1.000          1987-Dec-18]
read:[    6                  1.001..10     1988-Jan-30]
read:[    7                  1.011..14     1988-Feb-02]
read:[    8         Schwern  1.0.15        2002-Dec-18     Modernization]
read:[    9         Richard  1.0.16        2003-Dec-18]
read:[   10         Larry   2.000          1988-Jun-05]
read:[   11                  2.001         1988-Jun-28]
read:[   12         Larry   3.000          1989-Oct-18]
read:[   13                  3.001         1989-Oct-26]
read:[   14                  3.002..4      1989-Nov-11]
read:[   15                  3.005         1989-Nov-18]
read:[   16                  3.006..8      1989-Dec-22]
read:[   17                  3.009..13     1990-Mar-02]
read:[   18                  3.014         1990-Mar-13]
read:[   19                  3.015         1990-Mar-14]
read:[   20                  3.016..18     1990-Mar-28]
read:[   21                  3.019..27     1990-Aug-10     User subs.]
read:[   22                  3.028         1990-Aug-14]
read:[   23                  3.029..36     1990-Oct-17]
read:[   24                  3.037         1990-Oct-20]
read:[   25                  3.040         1990-Nov-10]
read:[   26                  3.041         1990-Nov-13]
read:[   27                  3.042..43     1991-Jan-??]
read:[   28                  3.044         1991-Jan-12]
read:[   29         Larry   4.000          1991-Mar-21]
read:[   30                  4.001..3      1991-Apr-12]
read:[   31                  4.004..9      1991-Jun-07]
read:[   32                  4.010         1991-Jun-10]
read:[   33                  4.011..18     1991-Nov-05]
read:[   34                  4.019         1991-Nov-11     Stable.]
read:[   35                  4.020..33     1992-Jun-08]
read:[   36                  4.034         1992-Jun-11]
read:[   37                  4.035         1992-Jun-23]
read:[   38         Larry    4.036         1993-Feb-05     Very stable.]
read:[   39                  5.000alpha1   1993-Jul-31]
read:[   40                  5.000alpha2   1993-Aug-16]
read:[   41                  5.000alpha3   1993-Oct-10]
read:[   42                  5.000alpha4   1993-???-??]
read:[   43                  5.000alpha5   1993-???-??]
read:[   44                  5.000alpha6   1994-Mar-18]
read:[   45                  5.000alpha7   1994-Mar-25]
read:[   46         Andy     5.000alpha8   1994-Apr-04]
read:[   47         Larry    5.000alpha9   1994-May-05     ext appears.]
read:[   48                  5.000alpha10  1994-Jun-11]
read:[   49                  5.000alpha11  1994-Jul-01]
read:[   50         Andy     5.000a11a     1994-Jul-07     To fit 14.]
read:[   51                  5.000a11b     1994-Jul-14]
read:[   52                  5.000a11c     1994-Jul-19]
read:[   53                  5.000a11d     1994-Jul-22]
read:[   54         Larry    5.000alpha12  1994-Aug-04]
read:[   55         Andy     5.000a12a     1994-Aug-08]
read:[   56                  5.000a12b     1994-Aug-15]
read:[   57                  5.000a12c     1994-Aug-22]
read:[   58                  5.000a12d     1994-Aug-22]
read:[   59                  5.000a12e     1994-Aug-22]
read:[   60                  5.000a12f     1994-Aug-24]
read:[   61                  5.000a12g     1994-Aug-24]
read:[   62                  5.000a12h     1994-Aug-24]
read:[   63         Larry    5.000beta1    1994-Aug-30]
read:[   64         Andy     5.000b1a      1994-Sep-06]
read:[   65         Larry    5.000beta2    1994-Sep-14     Core slushified.]
read:[   66         Andy     5.000b2a      1994-Sep-14]
read:[   67                  5.000b2b      1994-Sep-17]
read:[   68                  5.000b2c      1994-Sep-17]
read:[   69         Larry    5.000beta3    1994-Sep-??]
read:[   70         Andy     5.000b3a      1994-Sep-18]
read:[   71                  5.000b3b      1994-Sep-22]
read:[   72                  5.000b3c      1994-Sep-23]
read:[   73                  5.000b3d      1994-Sep-27]
read:[   74                  5.000b3e      1994-Sep-28]
read:[   75                  5.000b3f      1994-Sep-30]
read:[   76                  5.000b3g      1994-Oct-04]
read:[   77         Andy     5.000b3h      1994-Oct-07]
read:[   78         Larry?   5.000gamma    1994-Oct-13?]
read:[   79         Larry   5.000          1994-Oct-17]
read:[   80         Andy     5.000a        1994-Dec-19]
read:[   81                  5.000b        1995-Jan-18]
read:[   82                  5.000c        1995-Jan-18]
read:[   83                  5.000d        1995-Jan-18]
read:[   84                  5.000e        1995-Jan-18]
read:[   85                  5.000f        1995-Jan-18]
read:[   86                  5.000g        1995-Jan-18]
read:[   87                  5.000h        1995-Jan-18]
read:[   88                  5.000i        1995-Jan-26]
read:[   89                  5.000j        1995-Feb-07]
read:[   90                  5.000k        1995-Feb-11]
read:[   91                  5.000l        1995-Feb-21]
read:[   92                  5.000m        1995-Feb-28]
read:[   93                  5.000n        1995-Mar-07]
read:[   94                  5.000o        1995-Mar-13?]
read:[   95         Larry   5.001          1995-Mar-13]
read:[   96         Andy     5.001a        1995-Mar-15]
read:[   97                  5.001b        1995-Mar-31]
read:[   98                  5.001c        1995-Apr-07]
read:[   99                  5.001d        1995-Apr-14]
read:[  100                  5.001e        1995-Apr-18     Stable.]
read:[  101                  5.001f        1995-May-31]
read:[  102                  5.001g        1995-May-25]
read:[  103                  5.001h        1995-May-25]
read:[  104                  5.001i        1995-May-30]
read:[  105                  5.001j        1995-Jun-05]
read:[  106                  5.001k        1995-Jun-06]
read:[  107                  5.001l        1995-Jun-06     Stable.]
read:[  108                  5.001m        1995-Jul-02     Very stable.]
read:[  109                  5.001n        1995-Oct-31     Very unstable.]
read:[  110                  5.002beta1    1995-Nov-21]
read:[  111                  5.002b1a      1995-Dec-04]
read:[  112                  5.002b1b      1995-Dec-04]
read:[  113                  5.002b1c      1995-Dec-04]
read:[  114                  5.002b1d      1995-Dec-04]
read:[  115                  5.002b1e      1995-Dec-08]
read:[  116                  5.002b1f      1995-Dec-08]
read:[  117         Tom      5.002b1g      1995-Dec-21     Doc release.]
read:[  118         Andy     5.002b1h      1996-Jan-05]
read:[  119                  5.002b2       1996-Jan-14]
read:[  120         Larry    5.002b3       1996-Feb-02]
read:[  121         Andy     5.002gamma    1996-Feb-11]
read:[  122         Larry    5.002delta    1996-Feb-27]
read:[  123         Larry   5.002          1996-Feb-29     Prototypes.]
read:[  124         Charles  5.002_01      1996-Mar-25]
read:[  125                 5.003          1996-Jun-25     Security release.]
read:[  126                  5.003_01      1996-Jul-31]
read:[  127         Nick     5.003_02      1996-Aug-10]
read:[  128         Andy     5.003_03      1996-Aug-28]
read:[  129                  5.003_04      1996-Sep-02]
read:[  130                  5.003_05      1996-Sep-12]
read:[  131                  5.003_06      1996-Oct-07]
read:[  132                  5.003_07      1996-Oct-10]
read:[  133         Chip     5.003_08      1996-Nov-19]
read:[  134                  5.003_09      1996-Nov-26]
read:[  135                  5.003_10      1996-Nov-29]
read:[  136                  5.003_11      1996-Dec-06]
read:[  137                  5.003_12      1996-Dec-19]
read:[  138                  5.003_13      1996-Dec-20]
read:[  139                  5.003_14      1996-Dec-23]
read:[  140                  5.003_15      1996-Dec-23]
read:[  141                  5.003_16      1996-Dec-24]
read:[  142                  5.003_17      1996-Dec-27]
read:[  143                  5.003_18      1996-Dec-31]
read:[  144                  5.003_19      1997-Jan-04]
read:[  145                  5.003_20      1997-Jan-07]
read:[  146                  5.003_21      1997-Jan-15]
read:[  147                  5.003_22      1997-Jan-16]
read:[  148                  5.003_23      1997-Jan-25]
read:[  149                  5.003_24      1997-Jan-29]
read:[  150                  5.003_25      1997-Feb-04]
read:[  151                  5.003_26      1997-Feb-10]
read:[  152                  5.003_27      1997-Feb-18]
read:[  153                  5.003_28      1997-Feb-21]
read:[  154                  5.003_90      1997-Feb-25     Ramping up to the 5.004 release.]
read:[  155                  5.003_91      1997-Mar-01]
read:[  156                  5.003_92      1997-Mar-06]
read:[  157                  5.003_93      1997-Mar-10]
read:[  158                  5.003_94      1997-Mar-22]
read:[  159                  5.003_95      1997-Mar-25]
read:[  160                  5.003_96      1997-Apr-01]
read:[  161                  5.003_97      1997-Apr-03     Fairly widely used.]
read:[  162                  5.003_97a     1997-Apr-05]
read:[  163                  5.003_97b     1997-Apr-08]
read:[  164                  5.003_97c     1997-Apr-10]
read:[  165                  5.003_97d     1997-Apr-13]
read:[  166                  5.003_97e     1997-Apr-15]
read:[  167                  5.003_97f     1997-Apr-17]
read:[  168                  5.003_97g     1997-Apr-18]
read:[  169                  5.003_97h     1997-Apr-24]
read:[  170                  5.003_97i     1997-Apr-25]
read:[  171                  5.003_97j     1997-Apr-28]
read:[  172                  5.003_98      1997-Apr-30]
read:[  173                  5.003_99      1997-May-01]
read:[  174                  5.003_99a     1997-May-09]
read:[  175                  p54rc1        1997-May-12     Release Candidates.]
read:[  176                  p54rc2        1997-May-14]
read:[  177         Chip    5.004          1997-May-15     A major maintenance release.]
read:[  178         Tim      5.004_01-t1   1997-???-??     The 5.004 maintenance track.]
read:[  179                  5.004_01-t2   1997-Jun-11     aka perl5.004m1t2]
read:[  180                  5.004_01      1997-Jun-13]
read:[  181                  5.004_01_01   1997-Jul-29     aka perl5.004m2t1]
read:[  182                  5.004_01_02   1997-Aug-01     aka perl5.004m2t2]
read:[  183                  5.004_01_03   1997-Aug-05     aka perl5.004m2t3]
read:[  184                  5.004_02      1997-Aug-07]
read:[  185                  5.004_02_01   1997-Aug-12     aka perl5.004m3t1]
read:[  186                  5.004_03-t2   1997-Aug-13     aka perl5.004m3t2]
read:[  187                  5.004_03      1997-Sep-05]
read:[  188                  5.004_04-t1   1997-Sep-19     aka perl5.004m4t1]
read:[  189                  5.004_04-t2   1997-Sep-23     aka perl5.004m4t2]
read:[  190                  5.004_04-t3   1997-Oct-10     aka perl5.004m4t3]
read:[  191                  5.004_04-t4   1997-Oct-14     aka perl5.004m4t4]
read:[  192                  5.004_04      1997-Oct-15]
read:[  193                  5.004_04-m1   1998-Mar-04     (5.004m5t1) Maint. trials for 5.004_05.]
read:[  194                  5.004_04-m2   1998-May-01]
read:[  195                  5.004_04-m3   1998-May-15]
read:[  196                  5.004_04-m4   1998-May-19]
read:[  197                  5.004_05-MT5  1998-Jul-21]
read:[  198                  5.004_05-MT6  1998-Oct-09]
read:[  199                  5.004_05-MT7  1998-Nov-22]
read:[  200                  5.004_05-MT8  1998-Dec-03]
read:[  201         Chip     5.004_05-MT9  1999-Apr-26]
read:[  202                  5.004_05      1999-Apr-29]
read:[  203         Malcolm  5.004_50      1997-Sep-09     The 5.005 development track.]
read:[  204                  5.004_51      1997-Oct-02]
read:[  205                  5.004_52      1997-Oct-15]
read:[  206                  5.004_53      1997-Oct-16]
read:[  207                  5.004_54      1997-Nov-14]
read:[  208                  5.004_55      1997-Nov-25]
read:[  209                  5.004_56      1997-Dec-18]
read:[  210                  5.004_57      1998-Feb-03]
read:[  211                  5.004_58      1998-Feb-06]
read:[  212                  5.004_59      1998-Feb-13]
read:[  213                  5.004_60      1998-Feb-20]
read:[  214                  5.004_61      1998-Feb-27]
read:[  215                  5.004_62      1998-Mar-06]
read:[  216                  5.004_63      1998-Mar-17]
read:[  217                  5.004_64      1998-Apr-03]
read:[  218                  5.004_65      1998-May-15]
read:[  219                  5.004_66      1998-May-29]
read:[  220         Sarathy  5.004_67      1998-Jun-15]
read:[  221                  5.004_68      1998-Jun-23]
read:[  222                  5.004_69      1998-Jun-29]
read:[  223                  5.004_70      1998-Jul-06]
read:[  224                  5.004_71      1998-Jul-09]
read:[  225                  5.004_72      1998-Jul-12]
read:[  226                  5.004_73      1998-Jul-13]
read:[  227                  5.004_74      1998-Jul-14     5.005 beta candidate.]
read:[  228                  5.004_75      1998-Jul-15     5.005 beta1.]
read:[  229                  5.004_76      1998-Jul-21     5.005 beta2.]
read:[  230                  5.005         1998-Jul-22     Oneperl.]
read:[  231         Sarathy  5.005_01      1998-Jul-27     The 5.005 maintenance track.]
read:[  232                  5.005_02-T1   1998-Aug-02]
read:[  233                  5.005_02-T2   1998-Aug-05]
read:[  234                  5.005_02      1998-Aug-08]
read:[  235         Graham   5.005_03-MT1  1998-Nov-30]
read:[  236                  5.005_03-MT2  1999-Jan-04]
read:[  237                  5.005_03-MT3  1999-Jan-17]
read:[  238                  5.005_03-MT4  1999-Jan-26]
read:[  239                  5.005_03-MT5  1999-Jan-28]
read:[  240                  5.005_03-MT6  1999-Mar-05]
read:[  241                  5.005_03      1999-Mar-28]
read:[  242         Sarathy  5.005_50      1998-Jul-26     The 5.6 development track.]
read:[  243                  5.005_51      1998-Aug-10]
read:[  244                  5.005_52      1998-Sep-25]
read:[  245                  5.005_53      1998-Oct-31]
read:[  246                  5.005_54      1998-Nov-30]
read:[  247                  5.005_55      1999-Feb-16]
read:[  248                  5.005_56      1999-Mar-01]
read:[  249                  5.005_57      1999-May-25]
read:[  250                  5.005_58      1999-Jul-27]
read:[  251                  5.005_59      1999-Aug-02]
read:[  252                  5.005_60      1999-Aug-02]
read:[  253                  5.005_61      1999-Aug-20]
read:[  254                  5.005_62      1999-Oct-15]
read:[  255                  5.005_63      1999-Dec-09]
read:[  256                  5.5.640       2000-Feb-02]
read:[  257                  5.5.650       2000-Feb-08     beta1]
read:[  258                  5.5.660       2000-Feb-22     beta2]
read:[  259                  5.5.670       2000-Feb-29     beta3]
read:[  260                  5.6.0-RC1     2000-Mar-09     Release candidate 1.]
read:[  261                  5.6.0-RC2     2000-Mar-14     Release candidate 2.]
read:[  262                  5.6.0-RC3     2000-Mar-21     Release candidate 3.]
read:[  263                  5.6.0         2000-Mar-22]
read:[  264         Sarathy  5.6.1-TRIAL1  2000-Dec-18     The 5.6 maintenance track.]
read:[  265                  5.6.1-TRIAL2  2001-Jan-31]
read:[  266                  5.6.1-TRIAL3  2001-Mar-19]
read:[  267                  5.6.1-foolish 2001-Apr-01     The \"fools-gold\" release.]
read:[  268                  5.6.1         2001-Apr-08]
read:[  269         Rafael   5.6.2-RC1     2003-Nov-08]
read:[  270                  5.6.2         2003-Nov-15     Fix new build issues]
read:[  271         Jarkko   5.7.0         2000-Sep-02     The 5.7 track: Development.]
read:[  272                  5.7.1         2001-Apr-09]
read:[  273                  5.7.2         2001-Jul-13     Virtual release candidate 0.]
read:[  274                  5.7.3         2002-Mar-05]
read:[  275                  5.8.0-RC1     2002-Jun-01]
read:[  276                  5.8.0-RC2     2002-Jun-21]
read:[  277                  5.8.0-RC3     2002-Jul-13]
read:[  278                  5.8.0         2002-Jul-18]
read:[  279                  5.8.1-RC1     2003-Jul-10]
read:[  280                  5.8.1-RC2     2003-Jul-11]
read:[  281                  5.8.1-RC3     2003-Jul-30]
read:[  282                  5.8.1-RC4     2003-Aug-01]
read:[  283                  5.8.1-RC5     2003-Sep-22]
read:[  284                  5.8.1         2003-Sep-25]
read:[  285         Nicholas 5.8.2-RC1     2003-Oct-27]
read:[  286                  5.8.2-RC2     2003-Nov-03]
read:[  287                  5.8.2         2003-Nov-05]
read:[  288                  5.8.3-RC1     2004-Jan-07]
read:[  289                  5.8.3         2004-Jan-14]
read:[  290                  5.8.4-RC1     2004-Apr-05]
read:[  291                  5.8.4-RC2     2004-Apr-15]
read:[  292                  5.8.4         2004-Apr-21]
read:[  293                  5.8.5-RC1     2004-Jul-06]
read:[  294                  5.8.5-RC2     2004-Jul-08]
read:[  295                  5.8.5         2004-Jul-19]
read:[  296 ]
read:[  297         Hugo     5.9.0         2003-Oct-27]
read:[  298         Rafael   5.9.1         2004-Mar-16]
done
finished
OUT

#
# 14
#
pir_output_is( <<'CODE', <<'OUT', "Stream::Filter" );

.sub _main :main
    .local pmc stream
    .local pmc filter

    load_bytecode 'Stream/Sub.pbc'
    load_bytecode 'Stream/Filter.pbc'

    # create the counter stream
    stream = new ['Stream'; 'Sub']
    # assign its source
    .const 'Sub' temp = "_counter"
    assign stream, temp

    # create the filter stream
    filter = new ['Stream'; 'Filter']
    # assign its source
    assign filter, stream
    # set the filter sub
    .const 'Sub' ft = "_filter"
    filter."filter"( ft )

    # dump the stream
    filter."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _counter
    .param pmc stream
    .local string str
    .local int i

    i = 0

LOOP:
    str = i
    stream."write"( str )

    inc i
    if i < 10 goto LOOP
.end

.sub _filter
    .param string str
    .local string tmp
    .local int i

    i = str

    # skip 4 * 2
    if i == 4 goto SKIP

    mul i, 2
    set tmp, i
    str = concat str, " * 2 = "
    str = concat str, tmp

    .return(str)

SKIP:
    null str
    .return(str)
.end
CODE
read:[0 * 2 = 0]
read:[1 * 2 = 2]
read:[2 * 2 = 4]
read:[3 * 2 = 6]
read:[5 * 2 = 10]
read:[6 * 2 = 12]
read:[7 * 2 = 14]
read:[8 * 2 = 16]
read:[9 * 2 = 18]
done
finished
OUT

#
# 15
#
pir_output_is( <<'CODE', <<'OUT', "Stream::include" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Sub.pbc'

    stream = new ['Stream'; 'Sub']

    .const 'Sub' temp = "_counter"
    assign stream, temp

    # dump the stream
    stream."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _counter :method
    .local string str
    .local int i

    i = 0

LOOP:
    str = i

    self."write"( str )

    # include another stream after '4'
    if i != 4 goto SKIP
    .local pmc temp

    temp = new ['Stream'; 'Sub']

    .const 'Sub' func = "_included"
    assign temp, func

    # include it
    self."include"( temp )
SKIP:

    inc i
    if i < 10 goto LOOP
.end

.sub _included :method
    .local pmc temp

    self."write"( "hello" )

    # create another stream
    temp = new ['Stream'; 'Sub']
    .const 'Sub' func = "_counter2"
    assign temp, func

    # include it
    self."include"( temp )

    self."write"( "world" )
.end

.sub _counter2 :method
    .local string str

    str = 'A'
LOOP:
    self."write"( str )

    ord $I0, str
    inc $I0
    chr str, $I0

    if str != "G" goto LOOP
.end
CODE
read:[0]
read:[1]
read:[2]
read:[3]
read:[4]
read:[hello]
read:[A]
read:[B]
read:[C]
read:[D]
read:[E]
read:[F]
read:[world]
read:[5]
read:[6]
read:[7]
read:[8]
read:[9]
done
finished
OUT

#
# 16
#
pir_output_is( <<'CODE', <<'OUT', "Stream::Lines" );

.sub _main :main
    .local pmc stream
    .local pmc lines

    load_bytecode 'Stream/Sub.pbc'
    load_bytecode 'Stream/Lines.pbc'

    # create a text stream
    stream = new ['Stream'; 'Sub']
    # set the source
    .const 'Sub' temp = "_text"
    assign stream, temp

    # create a lines stream
    lines = new ['Stream'; 'Lines']
    # set the source
    assign lines, stream

    # dump the stream
    lines."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _text :method
    self."write"( "this\nis a\n" )
    self."write"( "Stream::Lines\ntest" )
    self."write"( "case\nhello world" )
.end
CODE
read:[this]
read:[is a]
read:[Stream::Lines]
read:[testcase]
done
finished
OUT

#
# 17
#
pir_output_is( <<'CODE', <<'OUT', "Stream::ParrotIO" );

.sub _main :main
    .local pmc stream
    .local pmc temp

    load_bytecode 'Stream/ParrotIO.pbc'

    # create the ParrotIO stream
    stream = new ['Stream'; 'ParrotIO']

    # open this file
    stream."open"( "t/library/perlhistory.txt", 'r' )

    # you can specify a custom block size with
    # stream."blockSize"( 10 )

    # dump the stream
    stream."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end
CODE
read:[\nThis file is used as a source for ParrotIO stream]
read:[s in t/library/streams.t\n\n        Larry   0       ]
read:[       Classified.     Don't ask.\n        Larry   ]
read:[1.000          1987-Dec-18\n                 1.001.]
read:[.10     1988-Jan-30\n                 1.011..14    ]
read:[ 1988-Feb-02\n        Schwern  1.0.15        2002-D]
read:[ec-18     Modernization\n        Richard  1.0.16   ]
read:[     2003-Dec-18\n        Larry   2.000          19]
read:[88-Jun-05\n                 2.001         1988-Jun-]
read:[28\n        Larry   3.000          1989-Oct-18\n    ]
read:[             3.001         1989-Oct-26\n           ]
read:[      3.002..4      1989-Nov-11\n                 3]
read:[.005         1989-Nov-18\n                 3.006..8]
read:[      1989-Dec-22\n                 3.009..13     1]
read:[990-Mar-02\n                 3.014         1990-Mar]
read:[-13\n                 3.015         1990-Mar-14\n   ]
read:[              3.016..18     1990-Mar-28\n          ]
read:[       3.019..27     1990-Aug-10     User subs.\n  ]
read:[               3.028         1990-Aug-14\n         ]
read:[        3.029..36     1990-Oct-17\n                ]
read:[ 3.037         1990-Oct-20\n                 3.040 ]
read:[        1990-Nov-10\n                 3.041        ]
read:[ 1990-Nov-13\n                 3.042..43     1991-J]
read:[an-??\n                 3.044         1991-Jan-12\n ]
read:[       Larry   4.000          1991-Mar-21\n        ]
read:[         4.001..3      1991-Apr-12\n               ]
read:[  4.004..9      1991-Jun-07\n                 4.010]
read:[         1991-Jun-10\n                 4.011..18   ]
read:[  1991-Nov-05\n                 4.019         1991-]
read:[Nov-11     Stable.\n                 4.020..33     ]
read:[1992-Jun-08\n                 4.034         1992-Ju]
read:[n-11\n                 4.035         1992-Jun-23\n  ]
read:[      Larry    4.036         1993-Feb-05     Very ]
read:[stable.\n                 5.000alpha1   1993-Jul-31]
read:[\n                 5.000alpha2   1993-Aug-16\n      ]
read:[           5.000alpha3   1993-Oct-10\n             ]
read:[    5.000alpha4   1993-???-??\n                 5.0]
read:[00alpha5   1993-???-??\n                 5.000alpha]
read:[6   1994-Mar-18\n                 5.000alpha7   199]
read:[4-Mar-25\n        Andy     5.000alpha8   1994-Apr-0]
read:[4\n        Larry    5.000alpha9   1994-May-05     e]
read:[xt appears.\n                 5.000alpha10  1994-Ju]
read:[n-11\n                 5.000alpha11  1994-Jul-01\n  ]
read:[      Andy     5.000a11a     1994-Jul-07     To fi]
read:[t 14.\n                 5.000a11b     1994-Jul-14\n ]
read:[                5.000a11c     1994-Jul-19\n        ]
read:[         5.000a11d     1994-Jul-22\n        Larry  ]
read:[  5.000alpha12  1994-Aug-04\n        Andy     5.000]
read:[a12a     1994-Aug-08\n                 5.000a12b   ]
read:[  1994-Aug-15\n                 5.000a12c     1994-]
read:[Aug-22\n                 5.000a12d     1994-Aug-22\n]
read:[                 5.000a12e     1994-Aug-22\n       ]
read:[          5.000a12f     1994-Aug-24\n              ]
read:[   5.000a12g     1994-Aug-24\n                 5.00]
read:[0a12h     1994-Aug-24\n        Larry    5.000beta1 ]
read:[   1994-Aug-30\n        Andy     5.000b1a      1994]
read:[-Sep-06\n        Larry    5.000beta2    1994-Sep-14]
read:[     Core slushified.\n        Andy     5.000b2a   ]
read:[   1994-Sep-14\n                 5.000b2b      1994]
read:[-Sep-17\n                 5.000b2c      1994-Sep-17]
read:[\n        Larry    5.000beta3    1994-Sep-??\n      ]
read:[  Andy     5.000b3a      1994-Sep-18\n             ]
read:[    5.000b3b      1994-Sep-22\n                 5.0]
read:[00b3c      1994-Sep-23\n                 5.000b3d  ]
read:[    1994-Sep-27\n                 5.000b3e      199]
read:[4-Sep-28\n                 5.000b3f      1994-Sep-3]
read:[0\n                 5.000b3g      1994-Oct-04\n     ]
read:[   Andy     5.000b3h      1994-Oct-07\n        Larr]
read:[y?   5.000gamma    1994-Oct-13?\n        Larry   5.]
read:[000          1994-Oct-17\n        Andy     5.000a  ]
read:[      1994-Dec-19\n                 5.000b        1]
read:[995-Jan-18\n                 5.000c        1995-Jan]
read:[-18\n                 5.000d        1995-Jan-18\n   ]
read:[              5.000e        1995-Jan-18\n          ]
read:[       5.000f        1995-Jan-18\n                 ]
read:[5.000g        1995-Jan-18\n                 5.000h ]
read:[       1995-Jan-18\n                 5.000i        ]
read:[1995-Jan-26\n                 5.000j        1995-Fe]
read:[b-07\n                 5.000k        1995-Feb-11\n  ]
read:[               5.000l        1995-Feb-21\n         ]
read:[        5.000m        1995-Feb-28\n                ]
read:[ 5.000n        1995-Mar-07\n                 5.000o]
read:[        1995-Mar-13?\n        Larry   5.001        ]
read:[  1995-Mar-13\n        Andy     5.001a        1995-]
read:[Mar-15\n                 5.001b        1995-Mar-31\n]
read:[                 5.001c        1995-Apr-07\n       ]
read:[          5.001d        1995-Apr-14\n              ]
read:[   5.001e        1995-Apr-18     Stable.\n         ]
read:[        5.001f        1995-May-31\n                ]
read:[ 5.001g        1995-May-25\n                 5.001h]
read:[        1995-May-25\n                 5.001i       ]
read:[ 1995-May-30\n                 5.001j        1995-J]
read:[un-05\n                 5.001k        1995-Jun-06\n ]
read:[                5.001l        1995-Jun-06     Stab]
read:[le.\n                 5.001m        1995-Jul-02    ]
read:[ Very stable.\n                 5.001n        1995-]
read:[Oct-31     Very unstable.\n                 5.002be]
read:[ta1    1995-Nov-21\n                 5.002b1a      ]
read:[1995-Dec-04\n                 5.002b1b      1995-De]
read:[c-04\n                 5.002b1c      1995-Dec-04\n  ]
read:[               5.002b1d      1995-Dec-04\n         ]
read:[        5.002b1e      1995-Dec-08\n                ]
read:[ 5.002b1f      1995-Dec-08\n        Tom      5.002b]
read:[1g      1995-Dec-21     Doc release.\n        Andy ]
read:[    5.002b1h      1996-Jan-05\n                 5.0]
read:[02b2       1996-Jan-14\n        Larry    5.002b3   ]
read:[    1996-Feb-02\n        Andy     5.002gamma    199]
read:[6-Feb-11\n        Larry    5.002delta    1996-Feb-2]
read:[7\n        Larry   5.002          1996-Feb-29     P]
read:[rototypes.\n        Charles  5.002_01      1996-Mar]
read:[-25\n                5.003          1996-Jun-25    ]
read:[ Security release.\n                 5.003_01      ]
read:[1996-Jul-31\n        Nick     5.003_02      1996-Au]
read:[g-10\n        Andy     5.003_03      1996-Aug-28\n  ]
read:[               5.003_04      1996-Sep-02\n         ]
read:[        5.003_05      1996-Sep-12\n                ]
read:[ 5.003_06      1996-Oct-07\n                 5.003_]
read:[07      1996-Oct-10\n        Chip     5.003_08     ]
read:[ 1996-Nov-19\n                 5.003_09      1996-N]
read:[ov-26\n                 5.003_10      1996-Nov-29\n ]
read:[                5.003_11      1996-Dec-06\n        ]
read:[         5.003_12      1996-Dec-19\n               ]
read:[  5.003_13      1996-Dec-20\n                 5.003]
read:[_14      1996-Dec-23\n                 5.003_15    ]
read:[  1996-Dec-23\n                 5.003_16      1996-]
read:[Dec-24\n                 5.003_17      1996-Dec-27\n]
read:[                 5.003_18      1996-Dec-31\n       ]
read:[          5.003_19      1997-Jan-04\n              ]
read:[   5.003_20      1997-Jan-07\n                 5.00]
read:[3_21      1997-Jan-15\n                 5.003_22   ]
read:[   1997-Jan-16\n                 5.003_23      1997]
read:[-Jan-25\n                 5.003_24      1997-Jan-29]
read:[\n                 5.003_25      1997-Feb-04\n      ]
read:[           5.003_26      1997-Feb-10\n             ]
read:[    5.003_27      1997-Feb-18\n                 5.0]
read:[03_28      1997-Feb-21\n                 5.003_90  ]
read:[    1997-Feb-25     Ramping up to the 5.004 releas]
read:[e.\n                 5.003_91      1997-Mar-01\n    ]
read:[             5.003_92      1997-Mar-06\n           ]
read:[      5.003_93      1997-Mar-10\n                 5]
read:[.003_94      1997-Mar-22\n                 5.003_95]
read:[      1997-Mar-25\n                 5.003_96      1]
read:[997-Apr-01\n                 5.003_97      1997-Apr]
read:[-03     Fairly widely used.\n                 5.003]
read:[_97a     1997-Apr-05\n                 5.003_97b   ]
read:[  1997-Apr-08\n                 5.003_97c     1997-]
read:[Apr-10\n                 5.003_97d     1997-Apr-13\n]
read:[                 5.003_97e     1997-Apr-15\n       ]
read:[          5.003_97f     1997-Apr-17\n              ]
read:[   5.003_97g     1997-Apr-18\n                 5.00]
read:[3_97h     1997-Apr-24\n                 5.003_97i  ]
read:[   1997-Apr-25\n                 5.003_97j     1997]
read:[-Apr-28\n                 5.003_98      1997-Apr-30]
read:[\n                 5.003_99      1997-May-01\n      ]
read:[           5.003_99a     1997-May-09\n             ]
read:[    p54rc1        1997-May-12     Release Candidat]
read:[es.\n                 p54rc2        1997-May-14\n   ]
read:[     Chip    5.004          1997-May-15     A majo]
read:[r maintenance release.\n        Tim      5.004_01-t]
read:[1   1997-???-??     The 5.004 maintenance track.\n ]
read:[                5.004_01-t2   1997-Jun-11     aka ]
read:[perl5.004m1t2\n                 5.004_01      1997-]
read:[Jun-13\n                 5.004_01_01   1997-Jul-29 ]
read:[    aka perl5.004m2t1\n                 5.004_01_02]
read:[   1997-Aug-01     aka perl5.004m2t2\n             ]
read:[    5.004_01_03   1997-Aug-05     aka perl5.004m2t]
read:[3\n                 5.004_02      1997-Aug-07\n     ]
read:[            5.004_02_01   1997-Aug-12     aka perl]
read:[5.004m3t1\n                 5.004_03-t2   1997-Aug-]
read:[13     aka perl5.004m3t2\n                 5.004_03]
read:[      1997-Sep-05\n                 5.004_04-t1   1]
read:[997-Sep-19     aka perl5.004m4t1\n                 ]
read:[5.004_04-t2   1997-Sep-23     aka perl5.004m4t2\n  ]
read:[               5.004_04-t3   1997-Oct-10     aka p]
read:[erl5.004m4t3\n                 5.004_04-t4   1997-O]
read:[ct-14     aka perl5.004m4t4\n                 5.004]
read:[_04      1997-Oct-15\n                 5.004_04-m1 ]
read:[  1998-Mar-04     (5.004m5t1) Maint. trials for 5.]
read:[004_05.\n                 5.004_04-m2   1998-May-01]
read:[\n                 5.004_04-m3   1998-May-15\n      ]
read:[           5.004_04-m4   1998-May-19\n             ]
read:[    5.004_05-MT5  1998-Jul-21\n                 5.0]
read:[04_05-MT6  1998-Oct-09\n                 5.004_05-M]
read:[T7  1998-Nov-22\n                 5.004_05-MT8  199]
read:[8-Dec-03\n        Chip     5.004_05-MT9  1999-Apr-2]
read:[6\n                 5.004_05      1999-Apr-29\n     ]
read:[   Malcolm  5.004_50      1997-Sep-09     The 5.00]
read:[5 development track.\n                 5.004_51    ]
read:[  1997-Oct-02\n                 5.004_52      1997-]
read:[Oct-15\n                 5.004_53      1997-Oct-16\n]
read:[                 5.004_54      1997-Nov-14\n       ]
read:[          5.004_55      1997-Nov-25\n              ]
read:[   5.004_56      1997-Dec-18\n                 5.00]
read:[4_57      1998-Feb-03\n                 5.004_58   ]
read:[   1998-Feb-06\n                 5.004_59      1998]
read:[-Feb-13\n                 5.004_60      1998-Feb-20]
read:[\n                 5.004_61      1998-Feb-27\n      ]
read:[           5.004_62      1998-Mar-06\n             ]
read:[    5.004_63      1998-Mar-17\n                 5.0]
read:[04_64      1998-Apr-03\n                 5.004_65  ]
read:[    1998-May-15\n                 5.004_66      199]
read:[8-May-29\n        Sarathy  5.004_67      1998-Jun-1]
read:[5\n                 5.004_68      1998-Jun-23\n     ]
read:[            5.004_69      1998-Jun-29\n            ]
read:[     5.004_70      1998-Jul-06\n                 5.]
read:[004_71      1998-Jul-09\n                 5.004_72 ]
read:[     1998-Jul-12\n                 5.004_73      19]
read:[98-Jul-13\n                 5.004_74      1998-Jul-]
read:[14     5.005 beta candidate.\n                 5.00]
read:[4_75      1998-Jul-15     5.005 beta1.\n           ]
read:[      5.004_76      1998-Jul-21     5.005 beta2.\n ]
read:[                5.005         1998-Jul-22     Onep]
read:[erl.\n        Sarathy  5.005_01      1998-Jul-27   ]
read:[  The 5.005 maintenance track.\n                 5.]
read:[005_02-T1   1998-Aug-02\n                 5.005_02-]
read:[T2   1998-Aug-05\n                 5.005_02      19]
read:[98-Aug-08\n        Graham   5.005_03-MT1  1998-Nov-]
read:[30\n                 5.005_03-MT2  1999-Jan-04\n    ]
read:[             5.005_03-MT3  1999-Jan-17\n           ]
read:[      5.005_03-MT4  1999-Jan-26\n                 5]
read:[.005_03-MT5  1999-Jan-28\n                 5.005_03]
read:[-MT6  1999-Mar-05\n                 5.005_03      1]
read:[999-Mar-28\n        Sarathy  5.005_50      1998-Jul]
read:[-26     The 5.6 development track.\n               ]
read:[  5.005_51      1998-Aug-10\n                 5.005]
read:[_52      1998-Sep-25\n                 5.005_53    ]
read:[  1998-Oct-31\n                 5.005_54      1998-]
read:[Nov-30\n                 5.005_55      1999-Feb-16\n]
read:[                 5.005_56      1999-Mar-01\n       ]
read:[          5.005_57      1999-May-25\n              ]
read:[   5.005_58      1999-Jul-27\n                 5.00]
read:[5_59      1999-Aug-02\n                 5.005_60   ]
read:[   1999-Aug-02\n                 5.005_61      1999]
read:[-Aug-20\n                 5.005_62      1999-Oct-15]
read:[\n                 5.005_63      1999-Dec-09\n      ]
read:[           5.5.640       2000-Feb-02\n             ]
read:[    5.5.650       2000-Feb-08     beta1\n          ]
read:[       5.5.660       2000-Feb-22     beta2\n       ]
read:[          5.5.670       2000-Feb-29     beta3\n    ]
read:[             5.6.0-RC1     2000-Mar-09     Release]
read:[ candidate 1.\n                 5.6.0-RC2     2000-]
read:[Mar-14     Release candidate 2.\n                 5]
read:[.6.0-RC3     2000-Mar-21     Release candidate 3.\n]
read:[                 5.6.0         2000-Mar-22\n       ]
read:[ Sarathy  5.6.1-TRIAL1  2000-Dec-18     The 5.6 ma]
read:[intenance track.\n                 5.6.1-TRIAL2  20]
read:[01-Jan-31\n                 5.6.1-TRIAL3  2001-Mar-]
read:[19\n                 5.6.1-foolish 2001-Apr-01     ]
read:[The \"fools-gold\" release.\n                 5.6.1  ]
read:[       2001-Apr-08\n        Rafael   5.6.2-RC1     ]
read:[2003-Nov-08\n                 5.6.2         2003-No]
read:[v-15     Fix new build issues\n        Jarkko   5.7]
read:[.0         2000-Sep-02     The 5.7 track: Developm]
read:[ent.\n                 5.7.1         2001-Apr-09\n  ]
read:[               5.7.2         2001-Jul-13     Virtu]
read:[al release candidate 0.\n                 5.7.3    ]
read:[     2002-Mar-05\n                 5.8.0-RC1     20]
read:[02-Jun-01\n                 5.8.0-RC2     2002-Jun-]
read:[21\n                 5.8.0-RC3     2002-Jul-13\n    ]
read:[             5.8.0         2002-Jul-18\n           ]
read:[      5.8.1-RC1     2003-Jul-10\n                 5]
read:[.8.1-RC2     2003-Jul-11\n                 5.8.1-RC]
read:[3     2003-Jul-30\n                 5.8.1-RC4     2]
read:[003-Aug-01\n                 5.8.1-RC5     2003-Sep]
read:[-22\n                 5.8.1         2003-Sep-25\n   ]
read:[     Nicholas 5.8.2-RC1     2003-Oct-27\n          ]
read:[       5.8.2-RC2     2003-Nov-03\n                 ]
read:[5.8.2         2003-Nov-05\n                 5.8.3-R]
read:[C1     2004-Jan-07\n                 5.8.3         ]
read:[2004-Jan-14\n                 5.8.4-RC1     2004-Ap]
read:[r-05\n                 5.8.4-RC2     2004-Apr-15\n  ]
read:[               5.8.4         2004-Apr-21\n         ]
read:[        5.8.5-RC1     2004-Jul-06\n                ]
read:[ 5.8.5-RC2     2004-Jul-08\n                 5.8.5 ]
read:[        2004-Jul-19\n\n        Hugo     5.9.0       ]
read:[  2003-Oct-27\n        Rafael   5.9.1         2004-]
read:[Mar-16\n]
done
finished
OUT

#
# 18
#

SKIP:
{
    skip( "broken method invocation", 1 );
    pir_output_is( <<'CODE', <<'OUT', "Stream::Replay" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Writer.pbc'
    load_bytecode 'Stream/Replay.pbc'

    stream = new ['Stream'; 'Writer']
    P0 = global "_reader"
    assign stream, P0

    stream."write"( "1" )
    stream."write"( "2" )
    stream."write"( "A" )
    stream."write"( "B" )
    stream."write"( "4" )
    stream."write"( "5" )
    stream."write"( "*" )
    stream."close"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _reader :method
    .local pmc stream1
    .local pmc stream2
    .local pmc stream3
    .local string str

    stream1 = new ['Stream'; 'Replay']
    assign stream1, self

    print "reader start\n"

    print "1:'"
    str = stream1."read"()
    print str
    str = stream1."read"()
    print str
    print "'\n"

    stream2 = clone stream1
    stream3 = clone stream1

    print "2:'"
    str = stream2."read"()
    print str
    str = stream2."read"()
    print str
    stream2."close"()
    print "'\n1:'"

    str = stream1."read"()
    print str
    str = stream1."read"()
    print str

    str = stream1."read"()
    print str
    str = stream1."read"()
    print str

    print "\n3:'"

    str = stream3."read"()
    print str
    str = stream3."read"()
    print str
    str = stream3."read"()
    print str
    str = stream3."read"()
    print str

    str = stream3."read"()
    print str

    print "'\n"

    print "reader done\n"
.end
CODE
reader start
1:'12'
2:'AB'
1:'AB45
3:'AB45*'
reader done
done
finished
OUT

}

#
# 19 #'
#
pir_output_is( <<'CODE', <<'OUT', "Stream::Sub" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Base.pbc'
    load_bytecode 'Stream/Sub.pbc'

    stream = new ['Stream'; 'Sub']

    .const 'Sub' temp = "_counter"
    assign stream, temp

    # dump the stream
    stream."dump"()

    print "done\n"
    sweep 1
    collect
    print "finished\n"
    end
.end

.sub _counter :method
    .local string str
    .local int i

    i = 0

LOOP:
    # streams are using strings,
    # so we have to convert the number into a string
    str = i

    # write the string
    self."write"( str )

    inc i
    if i < 10 goto LOOP
.end
CODE
read:[0]
read:[1]
read:[2]
read:[3]
read:[4]
read:[5]
read:[6]
read:[7]
read:[8]
read:[9]
done
finished
OUT

#
# 20
#
SKIP:
{
    skip( "broken method invocation", 1 );
    pir_output_is( <<'CODE', <<'OUT', "Stream::Write" );

.sub _main :main
    .local pmc stream

    load_bytecode 'Stream/Writer.pbc'

    stream = new ['Stream'; 'Writer']

    # set the stream's source sub
    .const 'Sub' temp = "_reader"
    assign stream, temp

    print "main start\n"
    stream."write"( "hello" )
    stream."write"( "world!" )
    stream."write"( "parrot" )
    stream."write"( "is cool" )
    stream."close"()
    print "main done\n"
    sweep 1
    collect
    print "finished\n"

    end
.end

.sub _reader :method
    print "reader start\n"
    self."dump"()
    print "reader done\n"
.end
CODE
main start
reader start
read:[hello]
read:[world!]
read:[parrot]
read:[is cool]
reader done
main done
finished
OUT
}

# Local Variables:
#   mode: cperl
#   cperl-indent-level: 4
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4:
