#! perl
# Copyright (C) 2004-2009, Parrot Foundation.
# $Id: harness 36833 2009-02-17 20:09:26Z allison $

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

use File::Spec;
use Getopt::Long;
use Parrot::Config qw( %PConfig );
use Test::Harness  ();

=head1 Languages harness

There are 4 ways to run a language test:

=over 4

=item Overall Harness

    make languages-test

or

    cd languages && make test

=item Selected languages

    cd languages && perl t/harness --languages=pynie,punie

=item Per Language Harness

For almost all languages you can do something like:

    cd languages/tcl && make test

=item Run a single test for more detailed output.

    cd languages/tcl && prove -v t/cmd_lsort.t

=back

=head1 TODO

It should be possible to use non-Perl5 test files,
like for languages/perl6 or languages/pheme.

=cut

=for comment

We are assuming that we are running out of parrot/languages; we are being
called by languages/Makefile with an explicit perl.

=cut


# Step 0: handle command line args
my $languages_list;    # select a subset of languages
my $result = GetOptions( 'languages=s'   => \$languages_list );

# Step 1: find harness files for testable languages

# Various languages are not yet in unified testing; some will never be.
#
# BASIC                No t/harness, two implementations
# ecmascript           No t/harness
# forth                No t/harness
# perl6                test scripts are written in Perl 6, not Perl 5
# pheme                test scripts are written in Scheme, not Perl 5
# PIR                  many test failures
# pynie                test scripts are written in PIR, not Perl 5
# scheme               many test failures
# urm                  uses deprecated parrot features

my @unified_testable_languages
    = defined $languages_list ?
          split( /\s*,\s*/, $languages_list )
          :
          qw( abc APL
              befunge bf
              cola
              dotnet
              jako
              lisp
              ook
              parrot_compiler punie
              regex
            );
my @harnesses
    = grep {-f $_}
          map { File::Spec->join($_, 't', 'harness') }
              @unified_testable_languages;

# Step 2: Get a listing of files from these harnesses.
#
# See L<Parrot::Test::Harness> for information regarding --master.

my @tests;
foreach my $harness (@harnesses) {
    my $perl = "$^X -I" . File::Spec->join(File::Spec->updir(), 'lib');
    open(FILES, "$perl $harness --files --master |");
    push @tests, <FILES>;
    close(FILES);
}
chomp(@tests);

# Step 3: test.
Test::Harness::runtests(@tests);

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