use Test::More tests => 27;
use strict;
use warnings;
use Config;

use CGI::Simple::Standard qw(:all -default);

# Makes forked test work OK
Test::More->builder->no_ending(1);

my $CRLF = "\015\012";

# A peculiarity of sending "\n" through MBX|Socket|web-server on VMS
# is that a CR character gets inserted automatically in the web server
# case but not internal to perl's double quoted strings "\n".  This
# test would need to be modified to use the "\015\012" on VMS if it
# were actually run through a web server.
# Thanks to Peter Prymmer for this

if ($^O eq 'VMS') {
    $CRLF = "\n";
}

# Web servers on EBCDIC hosts are typically set up to do an EBCDIC -> ASCII
# translation hence CRLF is used as \r\n within CGI.pm on such machines.

if (ord("\t") != 9) {
    $CRLF = "\r\n";
}

# Set up a CGI environment
$ENV{REQUEST_METHOD}  = 'GET';
$ENV{QUERY_STRING}    = 'game=chess&game=checkers&weather=dull';
$ENV{PATH_INFO}       = '/somewhere/else';
$ENV{PATH_TRANSLATED} = '/usr/local/somewhere/else';
$ENV{SCRIPT_NAME}     = '/cgi-bin/foo.cgi';
$ENV{SERVER_PROTOCOL} = 'HTTP/1.0';
$ENV{SERVER_PORT}     = 8080;
$ENV{SERVER_NAME}     = 'the.good.ship.lollypop.com';
$ENV{HTTP_LOVE}       = 'true';

is(request_method(), 'GET', "CGI::request_method()");
is(query_string(), 'game=chess;game=checkers;weather=dull',
    "CGI::query_string()");
is(param(), 2, "CGI::param()");
is(join(' ', sort { $a cmp $b } param()),
    'game weather', "CGI::param()");
is(param('game'),    'chess', "CGI::param()");
is(param('weather'), 'dull',  "CGI::param()");
is(join(' ', param('game')), 'chess checkers', "CGI::param()");
ok(param(-name => 'foo', -value => 'bar'), 'CGI::param() put');
is(param(-name => 'foo'), 'bar', 'CGI::param() get');
is(
    query_string(),
    'game=chess;game=checkers;weather=dull;foo=bar',
    "CGI::query_string() redux"
);
is(http('love'), 'true', "CGI::http()");
is(script_name(), '/cgi-bin/foo.cgi', "CGI::script_name()");
is(url(), 'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi',
    "CGI::url()");
is(
    self_url(),
    'http://the.good.ship.lollypop.com:8080/cgi-bin/foo.cgi/somewhere/else' .
    '?game=chess;game=checkers;weather=dull;foo=bar',
    "CGI::url()"
);
is(url(-absolute => 1), '/cgi-bin/foo.cgi', 'CGI::url(-absolute=>1)');
is(url(-relative => 1), 'foo.cgi',          'CGI::url(-relative=>1)');
is(url(-relative => 1, -path => 1),
    'foo.cgi/somewhere/else', 'CGI::url(-relative=>1,-path=>1)');
is(
    url(-relative => 1, -path => 1, -query => 1),
    'foo.cgi/somewhere/else?game=chess;game=checkers;weather=dull;foo=bar',
    'CGI::url(-relative=>1,-path=>1,-query=>1)'
);
Delete('foo');
ok(!param('foo'), 'CGI::delete()');

#CGI::_reset_globals();

$ENV{QUERY_STRING} = 'mary+had+a+little+lamb';

restore_parameters();
is(join(' ', keywords()), 'mary had a little lamb', 'CGI::keywords');
is(
    join(' ', param('keywords')),
    'mary had a little lamb',
    'CGI::keywords'
);

is(
    redirect('http://somewhere.else'),
    "Status: 302 Moved${CRLF}Location: http://somewhere.else${CRLF}${CRLF}",
    "CGI::redirect() 1"
);

my $h = redirect(
    -Location => 'http://somewhere.else',
    -Type     => 'text/html'
);

is(
    $h,
    "Status: 302 Moved${CRLF}Location: http://somewhere.else${CRLF}" .
    "Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}",
    "CGI::redirect() 2"
);

is(
    redirect(
        -Location => 'http://somewhere.else/bin/foo&bar',
        -Type     => 'text/html'
    ),
    "Status: 302 Moved${CRLF}Location: http://somewhere.else/bin/foo&bar${CRLF}" .
    "Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}",
    "CGI::redirect() 2"
);

is(escapeHTML('CGI'), 'CGI', 'escapeHTML(CGI) failing again');

SKIP: {
    skip "Fork not available on this platform", 2 unless $Config{d_fork};
    my $test_string = 'game=soccer&game=baseball&weather=nice';
    $ENV{REQUEST_METHOD} = 'POST';
    $ENV{CONTENT_LENGTH} = length($test_string);
    $ENV{QUERY_STRING}   = 'big_balls=basketball&small_balls=golf';

    if (open(CHILD, "|-")) {    # cparent
        print CHILD $test_string;
        close CHILD;
        exit 0;
    }

    # at this point, we're in a new (child) process
    restore_parameters();       # trigger a reinitialisaton
    is(param('weather'), 'nice', "CGI::param() from POST");
    is(url_param('big_balls'), 'basketball', "CGI::url_param()");
}
