The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 58;
use strict;

use CGI::Simple::Util qw(escape unescape);

# ASCII order, ASCII codepoints, ASCII repertoire

my %punct = (
  ' '  => '20',
  '!'  => '21',
  '"'  => '22',
  '#'  => '23',
  '$'  => '24',
  '%'  => '25',
  '&'  => '26',
  '\'' => '27',
  '('  => '28',
  ')'  => '29',
  '*'  => '2A',
  '+'  => '2B',
  ','  => '2C',
  # '-' => '2D',  '.' => '2E'
  '/'  => '2F',
  ':'  => '3A',
  ';'  => '3B',
  '<'  => '3C',
  '='  => '3D',
  '>'  => '3E',
  '?'  => '3F',
  '['  => '5B',
  '\\' => '5C',
  ']'  => '5D',
  '^'  => '5E',
  # '_' => '5F',
  '`' => '60',
  '{' => '7B',
  '|' => '7C',
  '}' => '7D',
  '~' => '7E',
);

# The sort order may not be ASCII on EBCDIC machines:

foreach ( sort( keys( %punct ) ) ) {
  my $escape     = "AbC\%$punct{$_}dEF";
  my $cgi_escape = escape( "AbC$_" . "dEF" );
  is( $escape, $cgi_escape, "$escape ne $cgi_escape" );
  my $unescape     = "AbC$_" . "dEF";
  my $cgi_unescape = unescape( "AbC\%$punct{$_}dEF" );
  is( $unescape, $cgi_unescape, "$unescape ne $cgi_unescape" );
}