#!/usr/bin/perl

use strict;
use subs 'fork';
use Test::More tests => $] >= 5.007 ? 6 : 8;

BEGIN { use_ok('Acme::ComeFrom') }

sub OK  { ok(1, "comefrom @_") }
sub NOK { ok(0, "comefrom @_") }
sub func { ok(shift, 'sanity') }
sub fork { ok(1, "fork()"); 0; }

func(1);                        # Jump to the first comefrom below (&func).
func(0);                        # This will not happen.
NOK('&NAME');                   # Neither will this.

if ($] eq "Intercal") {         # This is never true, but:
    comefrom &func;             # Coming from "func(1)"...
    OK('&NAME');                # ...and OKs the test.
}

sub {                           # In another scope now.
    MY_LABEL: NOK('LABEL');     # This will not happen.

    if ($] eq "Befunge") {      # This is never true, but:
        comefrom MY_LABEL;      # Coming from "MY_LABEL" above...
        OK('LABEL');            # ...and OKs the test
    }

    EXPR0: NOK('EXPR');         # This will not happen.

    if ($] eq "APL") {          # This is never true, but:
        comefrom "EXPR$|";      # Coming from "EXPR0" above...
        OK('EXPR');             # ...and OKs the test
    }
}->();

comefrom(EXPR0);                # This causes a fork!

no Acme::ComeFrom;              # Removes filtering...
normal: OK('(disabled)');       # ...so this will run.

if ($] eq "Lisp") {             # This is never true...
    NOK('(disabled)')           # ...so this will not happen.
}

use Acme::ComeFrom;             # Resumes filtering.

{
    my $i = 0;

    DUMMY: 0;                   # This evalutes the "$i++" below.
    EXPR1: NOK('uncached EXPR');

    if ($] eq "FORTRAN") {      # This is never true, but:
        comefrom 'EXPR'.$i++;   # Coming from "EXPR1:" above...
        OK('uncached EXPR');    # ...and OKs the test
    }
}

