#!/usr/bin/perl -w
use strict;
use Test tests => 18;
use File::Temp <:mktemp>;

#use CORE::system;

BEGIN {
    if (-d 't') {
      chdir 't'
        or die "Couldn't chdir into 't/' : $!";
    };
    unshift @INC, '../lib';
    # XXX this could be further munged to enable some parts on other
    # platforms
    #unless ($^O =~ /^MSWin/) {
    #print "1..0 # skipped: windows specific test\n";
    #exit 0;
    #}
};

#use vars qw/$testdir $exename $plxname/;
#$testdir = "t e s t";
#$exename = "showav";
#$plxname = "showargv";

#do "create_files.pl"
#  or die $!;

sub params_ok {
  my ($args, $name) = @_;
  local $" = "*";

  my $count = scalar @$args;
  my $tempfile = mktemp("systemXXXXXXX");

  my %sep = map { $_ => 1 } ( "\0", "\t", qw/ _ : . /, '(', ')', '*', ',' );

  for my $arg (@$args) {
    for (sort keys (%sep)) {
      delete $sep{$_} if $arg =~ /\Q$_\E/;
    };
  };

  unless (keys %sep) {
    diag ">>$_<<" for @$args;
    die "$name: Couldn't find a separator that does not occur in any of the arguments"
  };

  my ($sep) = sort keys %sep;
  my @add = ('dump_args.pl', $tempfile, ord($sep));

  my (@commandline) = ($^X, '-w', @add, @$args);
  #diag "@commandline";
  if (system(@commandline) != 0) {
    diag "Starting >>@commandline<<";
    return flunk($name);
  };

  my @received_args = do {
    local (*FH,$/);
    open FH, $tempfile
      or do {
         diag "Couldn't open tempfile '$tempfile' : $!";
         return flunk($name);
      };
    split /\Q$sep\E/, <FH>;
  };

  is_deeply( \@received_args, $args, $name )
    or do {
      $" = "\t|";
      diag "Want |@$args<";
      diag "Got  |@received_args<";
    };

  unlink $tempfile
    or diag "Couldn't remove '$tempfile' : $!";
};

params_ok([], "Empty list");
params_ok([1], "Single number");
params_ok([" "], "Single space");
params_ok(["Hello World"], "Single space with other stuff");
params_ok(['Hello "World"'], "2 Double quotes and spaces");
params_ok(['Hello 12"'], "1 Double quote at end and space");
params_ok(["Hello 1'"], "1 single quote");
params_ok(["Hello c:\\"], "1 Backslash at end");
params_ok(["Hello c:\\\\"], "2 Backslashes at end");
params_ok(["Hello c:\\\\\\\\"], "4 Backslashes at end");
params_ok(["Hello c:\\\\\\\\\\"], "5 Backslashes at end");
params_ok(["Hello c:\\foo"], "1 Backslash embedded");
params_ok(["Hello c:\\\\bar"], "2 Backslashes embedded");
params_ok(['12"', '13"', '14"'], "3x1 double quote (at end)");
params_ok(['"12', '"13', '"14'], "3x1 double quote (at end)");
params_ok(['Hello', '"World"'], "1 double quoted string");
params_ok(['  '], "two spaces");
params_ok(['  ','  '], "2xtwo spaces");
params_ok(["\t"], "a tab");
params_ok(["\t\t","\t\t"], "2xtwo tabs");
