/doc/amhello/install-sh
/doc/amhello/missing
/lib/Automake/Config.pm
-/lib/Automake/tests/*.log
-/lib/Automake/tests/*.log-t
/tests/*.log
/tests/*.log-t
+/tests/pm/*.log
+/tests/pm/*.log-t
/tests/*.dir
/tests/*-p.test
/tests/aclocal-1.*
for t in $$lst; do \
echo "$$t"; \
done | sort >$(am__tmk); \
+## List of subdirs where to look for tests.
+ dirs='$(test_subdirs)'; \
+ test -n "$$dirs" || dirs=.; \
## List of tests on filesystem. Be careful to cater for VPATH builds too.
for ext in $(TEST_EXTENSIONS); do \
- ls *$$ext 2>/dev/null; \
- if test $(srcdir) != $(builddir); then \
- (cd $(srcdir) && ls *$$ext 2>/dev/null); \
- fi; \
- done | sort | uniq >$(am__tfs); \
+ for dir in $$dirs; do \
+ ls $$dir/*$$ext 2>/dev/null; \
+ if test $(srcdir) != $(builddir); then \
+ (cd $(srcdir) && ls $$dir/*$$ext 2>/dev/null); \
+ fi; \
+ done; \
+ done | sed 's,^\./,,' | sort | uniq >$(am__tfs); \
## Compare the two lists, complain if they differ.
if $$diff $(am__tmk) $(am__tfs) >$(am__tdf); then \
result=0; \
## run aclocal and automake.
SUBDIRS = lib . contrib doc m4 tests
-TEST_SUBDIRS = tests lib/Automake/tests
-
bin_SCRIPTS = automake aclocal
CLEANFILES = $(bin_SCRIPTS)
## list of all test scripts in the Automake testsuite.
.PHONY: maintainer-check-list-of-tests
maintainer-check-list-of-tests:
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- for subdir in $(TEST_SUBDIRS); do \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@) || eval $$failcom; \
- done; \
- test -z "$$fail"
-
+ $(am__cd) tests && $(MAKE) $(AM_MAKEFLAGS) $@
maintainer-check: maintainer-check-list-of-tests
## Look for test whose names can cause spurious failures when used as
contrib/Makefile
doc/Makefile
lib/Automake/Makefile
- lib/Automake/tests/Makefile
lib/Makefile
lib/am/Makefile
m4/Makefile
## Process this file with automake to create Makefile.in
-# Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2004, 2008, 2009, 2010, 2012 Free
+# Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# `make clean check' should build Config.pm first.
-SUBDIRS = . tests
-
perllibdir = $(pkgvdatadir)/Automake
dist_perllib_DATA = \
ChannelDefs.pm \
+++ /dev/null
-# Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
-#
-# This file is part of GNU Automake.
-#
-# GNU Automake is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Automake is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-BEGIN {
- use Config;
- if (eval { require 5.007_002; } # for CLONE support
- && $Config{useithreads})
- {
- require threads;
- import threads;
- }
- else
- {
- exit 77;
- }
-}
-use Automake::Condition qw/TRUE FALSE/;
-
-sub test_basics ()
-{
- my @tests = (# [[Conditions], is_true?, is_false?, string, subst-string]
- [[], 1, 0, 'TRUE', ''],
- [['TRUE'], 1, 0, 'TRUE', ''],
- [['FALSE'], 0, 1, 'FALSE', '#'],
- [['A_TRUE'], 0, 0, 'A_TRUE', '@A_TRUE@'],
- [['A_TRUE', 'B_FALSE'],
- 0, 0, 'A_TRUE B_FALSE', '@A_TRUE@@B_FALSE@'],
- [['B_TRUE', 'FALSE'], 0, 1, 'FALSE', '#'],
- [['B_TRUE', 'B_FALSE'], 0, 1, 'FALSE', '#']);
-
- for (@tests)
- {
- my $a = new Automake::Condition @{$_->[0]};
- return 1
- if threads->new(sub {
- return 1 if $_->[1] != $a->true;
- return 1 if $_->[1] != ($a == TRUE);
- return 1 if $_->[2] != $a->false;
- return 1 if $_->[2] != ($a == FALSE);
- return 1 if $_->[3] ne $a->string;
- return 1 if $_->[4] ne $a->subst_string;
- })->join;
- }
- return 0;
-}
-
-sub test_true_when ()
-{
- my $failed = 0;
-
- my @tests = (# [When,
- # [Implied-Conditions],
- # [Not-Implied-Conditions]]
- [['TRUE'],
- [['TRUE']],
- [['A_TRUE'], ['A_TRUE', 'B_FALSE'], ['FALSE']]],
- [['A_TRUE'],
- [['TRUE'], ['A_TRUE']],
- [['A_TRUE', 'B_FALSE'], ['FALSE']]],
- [['A_TRUE', 'B_FALSE'],
- [['TRUE'], ['A_TRUE'], ['B_FALSE'], ['A_TRUE', 'B_FALSE']],
- [['FALSE'], ['C_FALSE'], ['C_FALSE', 'A_TRUE']]]);
-
- for my $t (@tests)
- {
- my $a = new Automake::Condition @{$t->[0]};
- return 1
- if threads->new(sub {
- for my $u (@{$t->[1]})
- {
- my $b = new Automake::Condition @$u;
- return threads->new(sub {
- if (! $b->true_when ($a))
- {
- print "`" . $b->string .
- "' not implied by `" . $a->string . "'?\n";
- $failed = 1;
- }
- })->join;
- }
- for my $u (@{$t->[2]})
- {
- my $b = new Automake::Condition @$u;
- return threads->new(sub {
- if ($b->true_when ($a))
- {
- print "`" . $b->string .
- "' implied by `" . $a->string . "'?\n";
- $failed = 1;
- }
-
- return threads->new(sub {
- return 1 if $b->true_when ($a);
- })->join;
- })->join;
- }
- })->join;
- }
- return $failed;
-}
-
-sub test_reduce_and ()
-{
- my @tests = (# If no conditions are given, TRUE should be returned
- [[], ["TRUE"]],
- # An empty condition is TRUE
- [[""], ["TRUE"]],
- # A single condition should be passed through unchanged
- [["FOO"], ["FOO"]],
- [["FALSE"], ["FALSE"]],
- [["TRUE"], ["TRUE"]],
- # TRUE and false should be discarded and overwhelm
- # the result, respectively
- [["FOO", "TRUE"], ["FOO"]],
- [["FOO", "FALSE"], ["FALSE"]],
- # Repetitions should be removed
- [["FOO", "FOO"], ["FOO"]],
- [["TRUE", "FOO", "FOO"], ["FOO"]],
- [["FOO", "TRUE", "FOO"], ["FOO"]],
- [["FOO", "FOO", "TRUE"], ["FOO"]],
- # Two different conditions should be preserved,
- # but TRUEs should be removed
- [["FOO", "BAR"], ["BAR,FOO"]],
- [["TRUE", "FOO", "BAR"], ["BAR,FOO"]],
- [["FOO", "TRUE", "BAR"], ["BAR,FOO"]],
- [["FOO", "BAR", "TRUE"], ["BAR,FOO"]],
- # A condition implied by another condition should be removed.
- [["FOO BAR", "BAR"], ["FOO BAR"]],
- [["BAR", "FOO BAR"], ["FOO BAR"]],
- [["TRUE", "FOO BAR", "BAR"], ["FOO BAR"]],
- [["FOO BAR", "TRUE", "BAR"], ["FOO BAR"]],
- [["FOO BAR", "BAR", "TRUE"], ["FOO BAR"]],
-
- [["BAR FOO", "BAR"], ["BAR FOO"]],
- [["BAR", "BAR FOO"], ["BAR FOO"]],
- [["TRUE", "BAR FOO", "BAR"], ["BAR FOO"]],
- [["BAR FOO", "TRUE", "BAR"], ["BAR FOO"]],
- [["BAR FOO", "BAR", "TRUE"], ["BAR FOO"]],
-
- # Check that reduction happens even when there are
- # two conditions to remove.
- [["FOO", "FOO BAR", "BAR"], ["FOO BAR"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["FOO BAR", "FOO BAZ"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
- ["FOO BAZ BAR"]],
-
- # Duplicated conditionals should be removed.
- [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
-
- # Equivalent conditions in different forms should be
- # reduced: which one is left is unfortunately order
- # dependent.
- [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
- [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
-
- my $failed = 0;
- foreach (@tests)
- {
- my ($inref, $outref) = @$_;
- my @inconds = map { new Automake::Condition $_ } @$inref;
- return 1
- if threads->new(sub {
- my @outconds = map { (new Automake::Condition $_)->string } @$outref;
- return threads->new(sub {
- my @res =
- map { $_->string } (Automake::Condition::reduce_and (@inconds));
- return threads->new(sub {
- my $result = join (",", sort @res);
- my $exresult = join (",", @outconds);
-
- if ($result ne $exresult)
- {
- print '"' . join(",", @$inref) . '" => "' .
- $result . '" expected "' .
- $exresult . '"' . "\n";
- $failed = 1;
- }
- return $failed;
- })->join;
- })->join;
- })->join;
- }
- return $failed;
-}
-
-sub test_reduce_or ()
-{
- my @tests = (# If no conditions are given, FALSE should be returned
- [[], ["FALSE"]],
- # An empty condition is TRUE
- [[""], ["TRUE"]],
- # A single condition should be passed through unchanged
- [["FOO"], ["FOO"]],
- [["FALSE"], ["FALSE"]],
- [["TRUE"], ["TRUE"]],
- # FALSE and TRUE should be discarded and overwhelm
- # the result, respectively
- [["FOO", "TRUE"], ["TRUE"]],
- [["FOO", "FALSE"], ["FOO"]],
- # Repetitions should be removed
- [["FOO", "FOO"], ["FOO"]],
- [["FALSE", "FOO", "FOO"], ["FOO"]],
- [["FOO", "FALSE", "FOO"], ["FOO"]],
- [["FOO", "FOO", "FALSE"], ["FOO"]],
- # Two different conditions should be preserved,
- # but FALSEs should be removed
- [["FOO", "BAR"], ["BAR,FOO"]],
- [["FALSE", "FOO", "BAR"], ["BAR,FOO"]],
- [["FOO", "FALSE", "BAR"], ["BAR,FOO"]],
- [["FOO", "BAR", "FALSE"], ["BAR,FOO"]],
- # A condition implying another condition should be removed.
- [["FOO BAR", "BAR"], ["BAR"]],
- [["BAR", "FOO BAR"], ["BAR"]],
- [["FALSE", "FOO BAR", "BAR"], ["BAR"]],
- [["FOO BAR", "FALSE", "BAR"], ["BAR"]],
- [["FOO BAR", "BAR", "FALSE"], ["BAR"]],
-
- [["BAR FOO", "BAR"], ["BAR"]],
- [["BAR", "BAR FOO"], ["BAR"]],
- [["FALSE", "BAR FOO", "BAR"], ["BAR"]],
- [["BAR FOO", "FALSE", "BAR"], ["BAR"]],
- [["BAR FOO", "BAR", "FALSE"], ["BAR"]],
-
- # Check that reduction happens even when there are
- # two conditions to remove.
- [["FOO", "FOO BAR", "BAR"], ["BAR,FOO"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["BAZ,FOO"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
- ["BAZ,FOO"]],
-
- # Duplicated conditionals should be removed.
- [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
-
- # Equivalent conditions in different forms should be
- # reduced: which one is left is unfortunately order
- # dependent.
- [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
- [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
-
- my $failed = 0;
- foreach (@tests)
- {
- my ($inref, $outref) = @$_;
- my @inconds = map { new Automake::Condition $_ } @$inref;
- return 1
- if threads->new(sub {
- my @outconds = map { (new Automake::Condition $_)->string } @$outref;
- return threads->new(sub {
- my @res =
- map { $_->string } (Automake::Condition::reduce_or (@inconds));
- return threads->new(sub {
- my $result = join (",", sort @res);
- my $exresult = join (",", @outconds);
-
- if ($result ne $exresult)
- {
- print '"' . join(",", @$inref) . '" => "' .
- $result . '" expected "' .
- $exresult . '"' . "\n";
- $failed = 1;
- }
- return $failed;
- })->join;
- })->join;
- })->join;
- }
- return $failed;
-}
-
-exit (test_basics || test_true_when || test_reduce_and || test_reduce_or);
-
-### Setup "GNU" style for perl-mode and cperl-mode.
-## Local Variables:
-## perl-indent-level: 2
-## perl-continued-statement-offset: 2
-## perl-continued-brace-offset: 0
-## perl-brace-offset: 0
-## perl-brace-imaginary-offset: 0
-## perl-label-offset: -2
-## cperl-indent-level: 2
-## cperl-brace-offset: 0
-## cperl-continued-brace-offset: 0
-## cperl-label-offset: -2
-## cperl-extra-newline-before-brace: t
-## cperl-merge-trailing-else: nil
-## cperl-continued-statement-offset: 2
-## End:
+++ /dev/null
-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
-#
-# This file is part of GNU Automake.
-#
-# GNU Automake is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Automake is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-use Automake::Condition qw/TRUE FALSE/;
-
-sub test_basics ()
-{
- my @tests = (# [[Conditions], is_true?, is_false?, string, subst-string]
- [[], 1, 0, 'TRUE', ''],
- [['TRUE'], 1, 0, 'TRUE', ''],
- [['FALSE'], 0, 1, 'FALSE', '#'],
- [['A_TRUE'], 0, 0, 'A_TRUE', '@A_TRUE@'],
- [['A_TRUE', 'B_FALSE'],
- 0, 0, 'A_TRUE B_FALSE', '@A_TRUE@@B_FALSE@'],
- [['B_TRUE', 'FALSE'], 0, 1, 'FALSE', '#'],
- [['B_TRUE', 'B_FALSE'], 0, 1, 'FALSE', '#']);
-
- for (@tests)
- {
- my $a = new Automake::Condition @{$_->[0]};
- return 1 if $_->[1] != $a->true;
- return 1 if $_->[1] != ($a == TRUE);
- return 1 if $_->[2] != $a->false;
- return 1 if $_->[2] != ($a == FALSE);
- return 1 if $_->[3] ne $a->string;
- return 1 if $_->[4] ne $a->subst_string;
- }
- return 0;
-}
-
-sub test_true_when ()
-{
- my $failed = 0;
-
- my @tests = (# [When,
- # [Implied-Conditions],
- # [Not-Implied-Conditions]]
- [['TRUE'],
- [['TRUE']],
- [['A_TRUE'], ['A_TRUE', 'B_FALSE'], ['FALSE']]],
- [['A_TRUE'],
- [['TRUE'], ['A_TRUE']],
- [['A_TRUE', 'B_FALSE'], ['FALSE']]],
- [['A_TRUE', 'B_FALSE'],
- [['TRUE'], ['A_TRUE'], ['B_FALSE'], ['A_TRUE', 'B_FALSE']],
- [['FALSE'], ['C_FALSE'], ['C_FALSE', 'A_TRUE']]]);
-
- for my $t (@tests)
- {
- my $a = new Automake::Condition @{$t->[0]};
- for my $u (@{$t->[1]})
- {
- my $b = new Automake::Condition @$u;
- if (! $b->true_when ($a))
- {
- print "`" . $b->string .
- "' not implied by `" . $a->string . "'?\n";
- $failed = 1;
- }
- }
- for my $u (@{$t->[2]})
- {
- my $b = new Automake::Condition @$u;
- if ($b->true_when ($a))
- {
- print "`" . $b->string .
- "' implied by `" . $a->string . "'?\n";
- $failed = 1;
- }
-
- return 1 if $b->true_when ($a);
- }
- }
- return $failed;
-}
-
-sub test_reduce_and ()
-{
- my @tests = (# If no conditions are given, TRUE should be returned
- [[], ["TRUE"]],
- # An empty condition is TRUE
- [[""], ["TRUE"]],
- # A single condition should be passed through unchanged
- [["FOO"], ["FOO"]],
- [["FALSE"], ["FALSE"]],
- [["TRUE"], ["TRUE"]],
- # TRUE and false should be discarded and overwhelm
- # the result, respectively
- [["FOO", "TRUE"], ["FOO"]],
- [["FOO", "FALSE"], ["FALSE"]],
- # Repetitions should be removed
- [["FOO", "FOO"], ["FOO"]],
- [["TRUE", "FOO", "FOO"], ["FOO"]],
- [["FOO", "TRUE", "FOO"], ["FOO"]],
- [["FOO", "FOO", "TRUE"], ["FOO"]],
- # Two different conditions should be preserved,
- # but TRUEs should be removed
- [["FOO", "BAR"], ["BAR,FOO"]],
- [["TRUE", "FOO", "BAR"], ["BAR,FOO"]],
- [["FOO", "TRUE", "BAR"], ["BAR,FOO"]],
- [["FOO", "BAR", "TRUE"], ["BAR,FOO"]],
- # A condition implied by another condition should be removed.
- [["FOO BAR", "BAR"], ["FOO BAR"]],
- [["BAR", "FOO BAR"], ["FOO BAR"]],
- [["TRUE", "FOO BAR", "BAR"], ["FOO BAR"]],
- [["FOO BAR", "TRUE", "BAR"], ["FOO BAR"]],
- [["FOO BAR", "BAR", "TRUE"], ["FOO BAR"]],
-
- [["BAR FOO", "BAR"], ["BAR FOO"]],
- [["BAR", "BAR FOO"], ["BAR FOO"]],
- [["TRUE", "BAR FOO", "BAR"], ["BAR FOO"]],
- [["BAR FOO", "TRUE", "BAR"], ["BAR FOO"]],
- [["BAR FOO", "BAR", "TRUE"], ["BAR FOO"]],
-
- # Check that reduction happens even when there are
- # two conditions to remove.
- [["FOO", "FOO BAR", "BAR"], ["FOO BAR"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["FOO BAR", "FOO BAZ"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
- ["FOO BAZ BAR"]],
-
- # Duplicated conditionals should be removed.
- [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
-
- # Equivalent conditions in different forms should be
- # reduced: which one is left is unfortunately order
- # dependent.
- [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
- [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
-
- my $failed = 0;
- foreach (@tests)
- {
- my ($inref, $outref) = @$_;
- my @inconds = map { new Automake::Condition $_ } @$inref;
- my @outconds = map { (new Automake::Condition $_)->string } @$outref;
- my @res =
- map { $_->string } (Automake::Condition::reduce_and (@inconds));
- my $result = join (",", sort @res);
- my $exresult = join (",", @outconds);
-
- if ($result ne $exresult)
- {
- print '"' . join(",", @$inref) . '" => "' .
- $result . '" expected "' .
- $exresult . '"' . "\n";
- $failed = 1;
- }
- }
- return $failed;
-}
-
-sub test_reduce_or ()
-{
- my @tests = (# If no conditions are given, FALSE should be returned
- [[], ["FALSE"]],
- # An empty condition is TRUE
- [[""], ["TRUE"]],
- # A single condition should be passed through unchanged
- [["FOO"], ["FOO"]],
- [["FALSE"], ["FALSE"]],
- [["TRUE"], ["TRUE"]],
- # FALSE and TRUE should be discarded and overwhelm
- # the result, respectively
- [["FOO", "TRUE"], ["TRUE"]],
- [["FOO", "FALSE"], ["FOO"]],
- # Repetitions should be removed
- [["FOO", "FOO"], ["FOO"]],
- [["FALSE", "FOO", "FOO"], ["FOO"]],
- [["FOO", "FALSE", "FOO"], ["FOO"]],
- [["FOO", "FOO", "FALSE"], ["FOO"]],
- # Two different conditions should be preserved,
- # but FALSEs should be removed
- [["FOO", "BAR"], ["BAR,FOO"]],
- [["FALSE", "FOO", "BAR"], ["BAR,FOO"]],
- [["FOO", "FALSE", "BAR"], ["BAR,FOO"]],
- [["FOO", "BAR", "FALSE"], ["BAR,FOO"]],
- # A condition implying another condition should be removed.
- [["FOO BAR", "BAR"], ["BAR"]],
- [["BAR", "FOO BAR"], ["BAR"]],
- [["FALSE", "FOO BAR", "BAR"], ["BAR"]],
- [["FOO BAR", "FALSE", "BAR"], ["BAR"]],
- [["FOO BAR", "BAR", "FALSE"], ["BAR"]],
-
- [["BAR FOO", "BAR"], ["BAR"]],
- [["BAR", "BAR FOO"], ["BAR"]],
- [["FALSE", "BAR FOO", "BAR"], ["BAR"]],
- [["BAR FOO", "FALSE", "BAR"], ["BAR"]],
- [["BAR FOO", "BAR", "FALSE"], ["BAR"]],
-
- # Check that reduction happens even when there are
- # two conditions to remove.
- [["FOO", "FOO BAR", "BAR"], ["BAR,FOO"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["BAZ,FOO"]],
- [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
- ["BAZ,FOO"]],
-
- # Duplicated conditionals should be removed.
- [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
-
- # Equivalent conditions in different forms should be
- # reduced: which one is left is unfortunately order
- # dependent.
- [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
- [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
-
- my $failed = 0;
- foreach (@tests)
- {
- my ($inref, $outref) = @$_;
- my @inconds = map { new Automake::Condition $_ } @$inref;
- my @outconds = map { (new Automake::Condition $_)->string } @$outref;
- my @res =
- map { $_->string } (Automake::Condition::reduce_or (@inconds));
- my $result = join (",", sort @res);
- my $exresult = join (",", @outconds);
-
- if ($result ne $exresult)
- {
- print '"' . join(",", @$inref) . '" => "' .
- $result . '" expected "' .
- $exresult . '"' . "\n";
- $failed = 1;
- }
- }
- return $failed;
-}
-
-exit (test_basics || test_true_when || test_reduce_and || test_reduce_or);
-
-### Setup "GNU" style for perl-mode and cperl-mode.
-## Local Variables:
-## perl-indent-level: 2
-## perl-continued-statement-offset: 2
-## perl-continued-brace-offset: 0
-## perl-brace-offset: 0
-## perl-brace-imaginary-offset: 0
-## perl-label-offset: -2
-## cperl-indent-level: 2
-## cperl-brace-offset: 0
-## cperl-continued-brace-offset: 0
-## cperl-label-offset: -2
-## cperl-extra-newline-before-brace: t
-## cperl-merge-trailing-else: nil
-## cperl-continued-statement-offset: 2
-## End:
+++ /dev/null
-# Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
-#
-# This file is part of GNU Automake.
-#
-# GNU Automake is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Automake is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-BEGIN {
- use Config;
- if (eval { require 5.007_002; } # for CLONE support
- && $Config{useithreads})
- {
- require threads;
- import threads;
- }
- else
- {
- exit 77;
- }
-}
-use Automake::Condition qw/TRUE FALSE/;
-use Automake::DisjConditions;
-
-sub test_basics ()
-{
- my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE";
- return threads->new (sub {
- my $other = new Automake::Condition "COND3_FALSE";
- return threads->new (sub {
- my $set1 = new Automake::DisjConditions $cond, $other;
- return threads->new (sub {
- my $set2 = new Automake::DisjConditions $other, $cond;
- return 1 unless $set1 == $set2;
- return 1 if $set1->false;
- return 1 if $set1->true;
- return 1 unless (new Automake::DisjConditions)->false;
- return 1 if (new Automake::DisjConditions)->true;
- })->join;
- })->join;
- })->join;
-}
-
-sub build_set (@)
-{
- my @conds = @_;
- my @set = ();
- for my $cond (@conds)
- {
- push @set, new Automake::Condition @$cond;
- }
- return new Automake::DisjConditions @set;
-}
-
-sub test_invert ()
-{
- my @tests = ([[["FALSE"]],
- [["TRUE"]]],
-
- [[["TRUE"]],
- [["FALSE"]]],
-
- [[["COND1_TRUE", "COND2_TRUE"],
- ["COND3_FALSE", "COND2_TRUE"]],
- [["COND2_FALSE"],
- ["COND1_FALSE", "COND3_TRUE"]]],
-
- [[["COND1_TRUE", "COND2_TRUE"],
- ["TRUE"]],
- [["FALSE"]]],
-
- [[["COND1_TRUE", "COND2_TRUE"],
- ["FALSE"]],
- [["COND1_FALSE"],
- ["COND2_FALSE"]]],
-
- [[["COND1_TRUE"],
- ["COND2_FALSE"]],
- [["COND1_FALSE", "COND2_TRUE"]]]
- );
-
- for my $t (@tests)
- {
- my $set = build_set @{$t->[0]};
- return 1
- if threads->new(sub {
- my $res = build_set @{$t->[1]};
- my $inv = $set->invert;
- if ($inv != $res)
- {
- print " (I) " . $set->string . "\n\t"
- . $inv->string . ' != ' . $res->string . "\n";
- return 1;
- }
- return 0
- })-> join;
- }
- return 0;
-}
-
-sub test_simplify ()
-{
- my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"]],
- [["FOO_TRUE", "BAR_FALSE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_TRUE", "BAR_TRUE"]],
- [["FOO_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_TRUE", "BAR_TRUE"],
- ["FOO_FALSE"]],
- [["TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["BAR_TRUE", "BAZ_TRUE"],
- ["BAR_FALSE", "BAZ_TRUE"]],
- [["BAZ_TRUE"], ["FOO_TRUE", "BAR_FALSE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["BAR_TRUE", "BAZ_TRUE"],
- ["BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- [["FOO_FALSE"], ["BAZ_TRUE"], ["BAR_FALSE"]]],
-
- [[["B_TRUE"],
- ["A_FALSE", "B_TRUE"]],
- [["B_TRUE"]]],
-
- [[["B_TRUE"],
- ["A_FALSE", "B_FALSE", "C_TRUE"],
- ["A_FALSE", "B_FALSE", "C_FALSE"]],
- [["A_FALSE"], ["B_TRUE"]]],
-
- [[["B_TRUE"],
- ["A_FALSE", "B_FALSE", "C_TRUE"],
- ["A_FALSE", "B_FALSE", "C_FALSE"],
- ["A_TRUE", "B_FALSE"]],
- [["TRUE"]]],
-
- [[["A_TRUE", "B_TRUE"],
- ["A_TRUE", "B_FALSE"],
- ["A_TRUE", "C_FALSE", "D_FALSE"]],
- [["A_TRUE"]]],
-
- [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"]],
- [ ["B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"]]],
-
- [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"]],
- [["C_FALSE", "E_FALSE"],
- ["C_TRUE", "E_TRUE"]]],
-
- [[["A_FALSE"],
- ["A_TRUE", "B_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE", "F_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"]],
- [["TRUE"]]],
-
- # Simplify should work with up to 31 variables.
- [[["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_TRUE"],
- ["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_FALSE"],
- ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_TRUE"],
- ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_FALSE"]],
- [[ "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE"
- ]]]);
-
- for my $t (@tests)
- {
- my $set = build_set @{$t->[0]};
- return 1
- if threads->new(sub {
- my $res = build_set @{$t->[1]};
- return threads->new(sub {
-
- # Make sure simplify() yields the expected result.
- my $sim = $set->simplify;
- return threads->new(sub {
- if ($sim != $res)
- {
- print " (S1) " . $set->string . "\n\t"
- . $sim->string . ' != ' . $res->string . "\n";
- return 1;
- }
-
- # Make sure simplify() is idempotent.
- my $sim2 = $sim->simplify;
- return threads->new(sub {
- if ($sim2 != $sim)
- {
- print " (S2) " . $sim->string . "\n\t"
- . $sim2->string . ' != ' . $sim->string . "\n";
- return 1;
- }
-
- # Also exercise invert() while we are at it.
-
- my $inv1 = $set->invert->simplify;
- return threads->new(sub {
- my $inv2 = $sim->invert->simplify;
- return threads->new(sub {
- if ($inv1 != $inv2)
- {
- print " (S3) " . $set->string . ", " . $sim->string . "\n\t"
- . $inv1->string . ' -= ' . $inv2->string . "\n";
- return 1;
- }
- })->join;
- })->join;
- })->join;
- })->join;
- })->join;
- })->join;
- }
-
- return 0;
-}
-
-sub test_sub_conditions ()
-{
- my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE"],
- [["BAR_FALSE", "BAZ_FALSE"],
- ["BAR_FALSE", "BAZ_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE", "BAR_FALSE"],
- [["BAZ_FALSE"],
- ["BAZ_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE", "BAR_TRUE"],
- [["FALSE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE", "BAR_TRUE"],
- [["BAZ_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE"],
- ["FOO_TRUE", "BAR_TRUE"]],
- ["FOO_TRUE", "BAR_TRUE"],
- [["TRUE"]]],
-
- [[["TRUE"]],
- ["TRUE"],
- [["TRUE"]]],
-
- [[["FALSE"]],
- ["TRUE"],
- [["FALSE"]]],
-
- [[["FALSE"]],
- ["FALSE"],
- [["FALSE"]]]);
-
- for my $t (@tests)
- {
- my $t1 = build_set @{$t->[0]};
- return 1
- if threads->new(sub {
- my $t2 = new Automake::Condition @{$t->[1]};
- return threads->new(sub {
- my $t3 = build_set @{$t->[2]};
- return threads->new(sub {
-
- # Make sure sub_conditions() yields the expected result.
- my $s = $t1->sub_conditions ($t2);
- threads->new(sub {
- if ($s != $t3)
- {
- print " (SC) " . $t1->string . "\n\t"
- . $s->string . ' != ' . $t3->string . "\n";
- return 1;
- }
- })->join;
- })->join;
- })->join;
- })->join;
- }
-}
-
-sub test_ambig ()
-{
- my @tests = ([[["TRUE"]],
- ["TRUE"],
- "multiply defined"],
- [[["C1_TRUE"]],
- ["C1_TRUE"],
- "multiply defined"],
- [[["TRUE"]],
- ["C1_FALSE"],
- "which includes"],
- [[["C1_TRUE"]],
- ["C1_TRUE", "C2_TRUE"],
- "which includes"],
- [[["C1_TRUE", "C2_TRUE"]],
- ["C2_TRUE"],
- "which is included in"],
- [[["C1_TRUE"]],
- ["C2_TRUE"],
- ''],
- [[["C1_TRUE"],
- ["C2_FALSE"]],
- ["C1_FALSE", "C2_TRUE"],
- '']);
-
- my $failed = 0;
- for my $t (@tests)
- {
- my $t1 = build_set @{$t->[0]};
- $failed = 1
- if threads->new(sub {
- my $t2 = new Automake::Condition @{$t->[1]};
- my $t3 = $t->[2];
- return threads->new(sub {
- my ($ans, $cond) = $t1->ambiguous_p ("FOO", $t2);
- return threads->new(sub {
- if ($t3 && $ans !~ /FOO.*$t3/)
- {
- print " (A1) " . $t1->string . " vs. " . $t2->string . "\n\t"
- . "Error message '$ans' does not match '$t3'\n";
- return 1;
- }
- if (!$t3 && $ans ne '')
- {
- print " (A2) " . $t1->string . " vs. " . $t2->string . "\n\t"
- . "Unexpected error message: $ans\n";
- return 1;
- }
- })->join;
- })->join;
- })->join;
- }
- return $failed;
-}
-
-exit (test_basics
- || test_invert
- || test_simplify
- || test_sub_conditions
- || test_ambig);
-
-### Setup "GNU" style for perl-mode and cperl-mode.
-## Local Variables:
-## perl-indent-level: 2
-## perl-continued-statement-offset: 2
-## perl-continued-brace-offset: 0
-## perl-brace-offset: 0
-## perl-brace-imaginary-offset: 0
-## perl-label-offset: -2
-## cperl-indent-level: 2
-## cperl-brace-offset: 0
-## cperl-continued-brace-offset: 0
-## cperl-label-offset: -2
-## cperl-extra-newline-before-brace: t
-## cperl-merge-trailing-else: nil
-## cperl-continued-statement-offset: 2
-## End:
+++ /dev/null
-# Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
-#
-# This file is part of GNU Automake.
-#
-# GNU Automake is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Automake is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-use Automake::Condition qw/TRUE FALSE/;
-use Automake::DisjConditions;
-
-sub test_basics ()
-{
- my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE";
- my $other = new Automake::Condition "COND3_FALSE";
- my $set1 = new Automake::DisjConditions $cond, $other;
- my $set2 = new Automake::DisjConditions $other, $cond;
- return 1 unless $set1 == $set2;
- return 1 if $set1->false;
- return 1 if $set1->true;
- return 1 unless (new Automake::DisjConditions)->false;
- return 1 if (new Automake::DisjConditions)->true;
-}
-
-sub build_set (@)
-{
- my @conds = @_;
- my @set = ();
- for my $cond (@conds)
- {
- push @set, new Automake::Condition @$cond;
- }
- return new Automake::DisjConditions @set;
-}
-
-sub test_invert ()
-{
- my @tests = ([[["FALSE"]],
- [["TRUE"]]],
-
- [[["TRUE"]],
- [["FALSE"]]],
-
- [[["COND1_TRUE", "COND2_TRUE"],
- ["COND3_FALSE", "COND2_TRUE"]],
- [["COND2_FALSE"],
- ["COND1_FALSE", "COND3_TRUE"]]],
-
- [[["COND1_TRUE", "COND2_TRUE"],
- ["TRUE"]],
- [["FALSE"]]],
-
- [[["COND1_TRUE", "COND2_TRUE"],
- ["FALSE"]],
- [["COND1_FALSE"],
- ["COND2_FALSE"]]],
-
- [[["COND1_TRUE"],
- ["COND2_FALSE"]],
- [["COND1_FALSE", "COND2_TRUE"]]]
- );
-
- for my $t (@tests)
- {
- my $set = build_set @{$t->[0]};
- my $res = build_set @{$t->[1]};
- my $inv = $set->invert;
- if ($inv != $res)
- {
- print " (I) " . $set->string . "\n\t"
- . $inv->string . ' != ' . $res->string . "\n";
- return 1;
- }
- }
- return 0;
-}
-
-sub test_simplify ()
-{
- my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"]],
- [["FOO_TRUE", "BAR_FALSE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_TRUE", "BAR_TRUE"]],
- [["FOO_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_TRUE", "BAR_TRUE"],
- ["FOO_FALSE"]],
- [["TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["BAR_TRUE", "BAZ_TRUE"],
- ["BAR_FALSE", "BAZ_TRUE"]],
- [["BAZ_TRUE"], ["FOO_TRUE", "BAR_FALSE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["BAR_TRUE", "BAZ_TRUE"],
- ["BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- [["FOO_FALSE"], ["BAZ_TRUE"], ["BAR_FALSE"]]],
-
- [[["B_TRUE"],
- ["A_FALSE", "B_TRUE"]],
- [["B_TRUE"]]],
-
- [[["B_TRUE"],
- ["A_FALSE", "B_FALSE", "C_TRUE"],
- ["A_FALSE", "B_FALSE", "C_FALSE"]],
- [["A_FALSE"], ["B_TRUE"]]],
-
- [[["B_TRUE"],
- ["A_FALSE", "B_FALSE", "C_TRUE"],
- ["A_FALSE", "B_FALSE", "C_FALSE"],
- ["A_TRUE", "B_FALSE"]],
- [["TRUE"]]],
-
- [[["A_TRUE", "B_TRUE"],
- ["A_TRUE", "B_FALSE"],
- ["A_TRUE", "C_FALSE", "D_FALSE"]],
- [["A_TRUE"]]],
-
- [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"]],
- [ ["B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"]]],
-
- [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"],
- ["A_FALSE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_FALSE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
- ["A_TRUE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"]],
- [["C_FALSE", "E_FALSE"],
- ["C_TRUE", "E_TRUE"]]],
-
- [[["A_FALSE"],
- ["A_TRUE", "B_FALSE"],
- ["A_TRUE", "B_TRUE", "C_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE", "F_FALSE"],
- ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"]],
- [["TRUE"]]],
-
- # Simplify should work with up to 31 variables.
- [[["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_TRUE"],
- ["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_FALSE"],
- ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_TRUE"],
- ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
- "V31_FALSE"]],
- [[ "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
- "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
- "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
- "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
- "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
- "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE"
- ]]]);
-
- for my $t (@tests)
- {
- my $set = build_set @{$t->[0]};
- my $res = build_set @{$t->[1]};
-
- # Make sure simplify() yields the expected result.
- my $sim = $set->simplify;
- if ($sim != $res)
- {
- print " (S1) " . $set->string . "\n\t"
- . $sim->string . ' != ' . $res->string . "\n";
- return 1;
- }
-
- # Make sure simplify() is idempotent.
- my $sim2 = $sim->simplify;
- if ($sim2 != $sim)
- {
- print " (S2) " . $sim->string . "\n\t"
- . $sim2->string . ' != ' . $sim->string . "\n";
- return 1;
- }
-
- # Also exercise invert() while we are at it.
-
- my $inv1 = $set->invert->simplify;
- my $inv2 = $sim->invert->simplify;
- if ($inv1 != $inv2)
- {
- print " (S3) " . $set->string . ", " . $sim->string . "\n\t"
- . $inv1->string . ' != ' . $inv2->string . "\n";
- return 1;
- }
- }
-
- return 0;
-}
-
-sub test_sub_conditions ()
-{
- my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE"],
- [["BAR_FALSE", "BAZ_FALSE"],
- ["BAR_FALSE", "BAZ_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE", "BAR_FALSE"],
- [["BAZ_FALSE"],
- ["BAZ_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE", "BAR_TRUE"],
- [["FALSE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
- ["FOO_TRUE", "BAZ_TRUE"],
- ["FOO_FALSE"]],
- ["FOO_TRUE", "BAR_TRUE"],
- [["BAZ_TRUE"]]],
-
- [[["FOO_TRUE", "BAR_FALSE"],
- ["FOO_TRUE", "BAR_TRUE"]],
- ["FOO_TRUE", "BAR_TRUE"],
- [["TRUE"]]],
-
- [[["TRUE"]],
- ["TRUE"],
- [["TRUE"]]],
-
- [[["FALSE"]],
- ["TRUE"],
- [["FALSE"]]],
-
- [[["FALSE"]],
- ["FALSE"],
- [["FALSE"]]]);
-
- for my $t (@tests)
- {
- my $t1 = build_set @{$t->[0]};
- my $t2 = new Automake::Condition @{$t->[1]};
- my $t3 = build_set @{$t->[2]};
-
- # Make sure sub_conditions() yields the expected result.
- my $s = $t1->sub_conditions ($t2);
- if ($s != $t3)
- {
- print " (SC) " . $t1->string . "\n\t"
- . $s->string . ' != ' . $t3->string . "\n";
- return 1;
- }
- }
-}
-
-sub test_ambig ()
-{
- my @tests = ([[["TRUE"]],
- ["TRUE"],
- "multiply defined"],
- [[["C1_TRUE"]],
- ["C1_TRUE"],
- "multiply defined"],
- [[["TRUE"]],
- ["C1_FALSE"],
- "which includes"],
- [[["C1_TRUE"]],
- ["C1_TRUE", "C2_TRUE"],
- "which includes"],
- [[["C1_TRUE", "C2_TRUE"]],
- ["C2_TRUE"],
- "which is included in"],
- [[["C1_TRUE"]],
- ["C2_TRUE"],
- ''],
- [[["C1_TRUE"],
- ["C2_FALSE"]],
- ["C1_FALSE", "C2_TRUE"],
- '']);
-
- for my $t (@tests)
- {
- my $t1 = build_set @{$t->[0]};
- my $t2 = new Automake::Condition @{$t->[1]};
- my $t3 = $t->[2];
- my ($ans, $cond) = $t1->ambiguous_p ("FOO", $t2);
- if ($t3 && $ans !~ /FOO.*$t3/)
- {
- print " (A1) " . $t1->string . " vs. " . $t2->string . "\n\t"
- . "Error message '$ans' does not match '$t3'\n";
- return 1;
- }
- if (!$t3 && $ans ne '')
- {
- print " (A2) " . $t1->string . " vs. " . $t2->string . "\n\t"
- . "Unexpected error message: $ans\n";
- return 1;
- }
- }
- return 0;
-}
-
-exit (test_basics
- || test_invert
- || test_simplify
- || test_sub_conditions
- || test_ambig);
-
-### Setup "GNU" style for perl-mode and cperl-mode.
-## Local Variables:
-## perl-indent-level: 2
-## perl-continued-statement-offset: 2
-## perl-continued-brace-offset: 0
-## perl-brace-offset: 0
-## perl-brace-imaginary-offset: 0
-## perl-label-offset: -2
-## cperl-indent-level: 2
-## cperl-brace-offset: 0
-## cperl-continued-brace-offset: 0
-## cperl-label-offset: -2
-## cperl-extra-newline-before-brace: t
-## cperl-merge-trailing-else: nil
-## cperl-continued-statement-offset: 2
-## End:
+++ /dev/null
-## Process this file with automake to create Makefile.in
-
-# Copyright (C) 2002, 2003, 2008, 2009, 2012 Free Software Foundation,
-# Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-PL_LOG_COMPILER = $(PERL)
-AM_PL_LOG_FLAGS = -Mstrict -I ../.. -I $(top_srcdir)/lib -w
-TEST_EXTENSIONS = .pl
-
-TESTS = \
-Condition.pl \
-Condition-t.pl \
-DisjConditions.pl \
-DisjConditions-t.pl \
-Version.pl \
-Wrap.pl
-
-EXTRA_DIST = $(TESTS)
-
-include $(top_srcdir)/CheckListOfTests.am
+++ /dev/null
-# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
-#
-# This file is part of GNU Automake.
-#
-# GNU Automake is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Automake is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-use Automake::Version;
-
-my $failed = 0;
-
-sub test_version_compare
-{
- my ($left, $right, $result) = @_;
- my @leftver = Automake::Version::split ($left);
- my @rightver = Automake::Version::split ($right);
- if ($#leftver == -1)
- {
- print "can't grok \"$left\"\n";
- $failed = 1;
- return;
- }
- if ($#rightver == -1)
- {
- print "can't grok \"$right\"\n";
- $failed = 1;
- return;
- }
- my $res = Automake::Version::compare (@leftver, @rightver);
- if ($res != $result)
- {
- print "compare (\"$left\", \"$right\") = $res! (not $result?)\n";
- $failed = 1;
- }
-}
-
-my @tests = (
-# basics
- ['1.0', '2.0', -1],
- ['2.0', '1.0', 1],
- ['1.2', '1.2', 0],
- ['1.1', '1.2', -1],
- ['1.2', '1.1', 1],
-# alphas
- ['1.4', '1.4g', -1],
- ['1.4g', '1.5', -1],
- ['1.4g', '1.4', 1],
- ['1.5', '1.4g', 1],
- ['1.4a', '1.4g', -1],
- ['1.5a', '1.3g', 1],
- ['1.6a', '1.6a', 0],
-# micros
- ['1.5.1', '1.5', 1],
- ['1.5.0', '1.5', 0],
- ['1.5.4', '1.6.1', -1],
-# micros and alphas
- ['1.5a', '1.5.1', 1],
- ['1.5a', '1.5.1a', 1],
- ['1.5a', '1.5.1f', 1],
- ['1.5', '1.5.1a', -1],
- ['1.5.1a', '1.5.1f', -1],
-# special exceptions
- ['1.6-p5a', '1.6.5a', 0],
- ['1.6', '1.6-p5a', -1],
- ['1.6-p4b', '1.6-p5a', -1],
- ['1.6-p4b', '1.6-foo', 1],
- ['1.6-p4b', '1.6a-foo', -1]
-);
-
-test_version_compare (@{$_}) foreach @tests;
-
-exit $failed;
-
-### Setup "GNU" style for perl-mode and cperl-mode.
-## Local Variables:
-## perl-indent-level: 2
-## perl-continued-statement-offset: 2
-## perl-continued-brace-offset: 0
-## perl-brace-offset: 0
-## perl-brace-imaginary-offset: 0
-## perl-label-offset: -2
-## cperl-indent-level: 2
-## cperl-brace-offset: 0
-## cperl-continued-brace-offset: 0
-## cperl-label-offset: -2
-## cperl-extra-newline-before-brace: t
-## cperl-merge-trailing-else: nil
-## cperl-continued-statement-offset: 2
-## End:
+++ /dev/null
-# Copyright (C) 2003 Free Software Foundation, Inc.
-#
-# This file is part of GNU Automake.
-#
-# GNU Automake is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# GNU Automake is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-use Automake::Wrap 'wrap';
-
-my $failed = 0;
-
-sub test_wrap
-{
- my ($in, $exp_out) = @_;
-
- my $out = &wrap (@$in);
- if ($out ne $exp_out)
- {
- print STDERR "For: @$in\nGot:\n$out\nInstead of:\n$exp_out\n---\n";
- ++$failed;
- }
-}
-
-my @tests = (
- [["HEAD:", "NEXT:", "CONT", 13, "v" ,"a", "l", "ue", "s", "values"],
-"HEAD:v aCONT
-NEXT:l ueCONT
-NEXT:sCONT
-NEXT:values
-"],
- [["rule: ", "\t", " \\", 20, "dep1" ,"dep2", "dep3", "dep4", "dep5",
- "dep06", "dep07", "dep08"],
-"rule: dep1 dep2 \\
-\tdep3 dep4 \\
-\tdep5 dep06 \\
-\tdep07 \\
-\tdep08
-"],
- [["big header:", "big continuation:", " END", 5, "diag1", "diag2", "diag3"],
-"big header:diag1 END
-big continuation:diag2 END
-big continuation:diag3
-"],
- [["big header:", "cont: ", " END", 16, "word1", "word2"],
-"big header: END
-cont: word1 END
-cont: word2
-"]);
-
-
-test_wrap (@{$_}) foreach @tests;
-
-exit $failed;
-
-### Setup "GNU" style for perl-mode and cperl-mode.
-## Local Variables:
-## perl-indent-level: 2
-## perl-continued-statement-offset: 2
-## perl-continued-brace-offset: 0
-## perl-brace-offset: 0
-## perl-brace-imaginary-offset: 0
-## perl-label-offset: -2
-## cperl-indent-level: 2
-## cperl-brace-offset: 0
-## cperl-continued-brace-offset: 0
-## cperl-label-offset: -2
-## cperl-extra-newline-before-brace: t
-## cperl-merge-trailing-else: nil
-## cperl-continued-statement-offset: 2
-## End:
test x"$$required" = x || unset required; \
test x"$$parallel_tests" = x || unset parallel_tests;
+TEST_EXTENSIONS = .pl .test
+
+PL_LOG_COMPILER = $(PERL)
+AM_PL_LOG_FLAGS = -Mstrict -I $(top_builddir)/lib -I $(top_srcdir)/lib -w
+
include $(srcdir)/list-of-tests.mk
TESTS = $(handwritten_TESTS) $(parallel_tests)
check_SCRIPTS = defs aclocal-$(APIVERSION) automake-$(APIVERSION)
## Checking the list of tests.
+test_subdirs = . pm
include $(top_srcdir)/CheckListOfTests.am
maintainer-check-list-of-tests: $(parallel_tests)
## You should have received a copy of the GNU General Public License
## along with this program. If not, see <http://www.gnu.org/licenses/>.
+perl_TESTS = \
+pm/Condition.pl \
+pm/Condition-t.pl \
+pm/DisjConditions.pl \
+pm/DisjConditions-t.pl \
+pm/Version.pl \
+pm/Wrap.pl
+
# The order here is mostly alphabetical, with the deliberate exception
# that tests having a high runtime (especially TAP tests that run various
# checks sequentially) are listed early; this improves performance on
# concurrent testsuite runs.
handwritten_TESTS = \
get-sysconf.test \
+$(perl_TESTS) \
self-check-env-sanitize.test \
self-check-report.test \
aclibobj.test \
--- /dev/null
+# Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+BEGIN {
+ use Config;
+ if (eval { require 5.007_002; } # for CLONE support
+ && $Config{useithreads})
+ {
+ require threads;
+ import threads;
+ }
+ else
+ {
+ exit 77;
+ }
+}
+use Automake::Condition qw/TRUE FALSE/;
+
+sub test_basics ()
+{
+ my @tests = (# [[Conditions], is_true?, is_false?, string, subst-string]
+ [[], 1, 0, 'TRUE', ''],
+ [['TRUE'], 1, 0, 'TRUE', ''],
+ [['FALSE'], 0, 1, 'FALSE', '#'],
+ [['A_TRUE'], 0, 0, 'A_TRUE', '@A_TRUE@'],
+ [['A_TRUE', 'B_FALSE'],
+ 0, 0, 'A_TRUE B_FALSE', '@A_TRUE@@B_FALSE@'],
+ [['B_TRUE', 'FALSE'], 0, 1, 'FALSE', '#'],
+ [['B_TRUE', 'B_FALSE'], 0, 1, 'FALSE', '#']);
+
+ for (@tests)
+ {
+ my $a = new Automake::Condition @{$_->[0]};
+ return 1
+ if threads->new(sub {
+ return 1 if $_->[1] != $a->true;
+ return 1 if $_->[1] != ($a == TRUE);
+ return 1 if $_->[2] != $a->false;
+ return 1 if $_->[2] != ($a == FALSE);
+ return 1 if $_->[3] ne $a->string;
+ return 1 if $_->[4] ne $a->subst_string;
+ })->join;
+ }
+ return 0;
+}
+
+sub test_true_when ()
+{
+ my $failed = 0;
+
+ my @tests = (# [When,
+ # [Implied-Conditions],
+ # [Not-Implied-Conditions]]
+ [['TRUE'],
+ [['TRUE']],
+ [['A_TRUE'], ['A_TRUE', 'B_FALSE'], ['FALSE']]],
+ [['A_TRUE'],
+ [['TRUE'], ['A_TRUE']],
+ [['A_TRUE', 'B_FALSE'], ['FALSE']]],
+ [['A_TRUE', 'B_FALSE'],
+ [['TRUE'], ['A_TRUE'], ['B_FALSE'], ['A_TRUE', 'B_FALSE']],
+ [['FALSE'], ['C_FALSE'], ['C_FALSE', 'A_TRUE']]]);
+
+ for my $t (@tests)
+ {
+ my $a = new Automake::Condition @{$t->[0]};
+ return 1
+ if threads->new(sub {
+ for my $u (@{$t->[1]})
+ {
+ my $b = new Automake::Condition @$u;
+ return threads->new(sub {
+ if (! $b->true_when ($a))
+ {
+ print "`" . $b->string .
+ "' not implied by `" . $a->string . "'?\n";
+ $failed = 1;
+ }
+ })->join;
+ }
+ for my $u (@{$t->[2]})
+ {
+ my $b = new Automake::Condition @$u;
+ return threads->new(sub {
+ if ($b->true_when ($a))
+ {
+ print "`" . $b->string .
+ "' implied by `" . $a->string . "'?\n";
+ $failed = 1;
+ }
+
+ return threads->new(sub {
+ return 1 if $b->true_when ($a);
+ })->join;
+ })->join;
+ }
+ })->join;
+ }
+ return $failed;
+}
+
+sub test_reduce_and ()
+{
+ my @tests = (# If no conditions are given, TRUE should be returned
+ [[], ["TRUE"]],
+ # An empty condition is TRUE
+ [[""], ["TRUE"]],
+ # A single condition should be passed through unchanged
+ [["FOO"], ["FOO"]],
+ [["FALSE"], ["FALSE"]],
+ [["TRUE"], ["TRUE"]],
+ # TRUE and false should be discarded and overwhelm
+ # the result, respectively
+ [["FOO", "TRUE"], ["FOO"]],
+ [["FOO", "FALSE"], ["FALSE"]],
+ # Repetitions should be removed
+ [["FOO", "FOO"], ["FOO"]],
+ [["TRUE", "FOO", "FOO"], ["FOO"]],
+ [["FOO", "TRUE", "FOO"], ["FOO"]],
+ [["FOO", "FOO", "TRUE"], ["FOO"]],
+ # Two different conditions should be preserved,
+ # but TRUEs should be removed
+ [["FOO", "BAR"], ["BAR,FOO"]],
+ [["TRUE", "FOO", "BAR"], ["BAR,FOO"]],
+ [["FOO", "TRUE", "BAR"], ["BAR,FOO"]],
+ [["FOO", "BAR", "TRUE"], ["BAR,FOO"]],
+ # A condition implied by another condition should be removed.
+ [["FOO BAR", "BAR"], ["FOO BAR"]],
+ [["BAR", "FOO BAR"], ["FOO BAR"]],
+ [["TRUE", "FOO BAR", "BAR"], ["FOO BAR"]],
+ [["FOO BAR", "TRUE", "BAR"], ["FOO BAR"]],
+ [["FOO BAR", "BAR", "TRUE"], ["FOO BAR"]],
+
+ [["BAR FOO", "BAR"], ["BAR FOO"]],
+ [["BAR", "BAR FOO"], ["BAR FOO"]],
+ [["TRUE", "BAR FOO", "BAR"], ["BAR FOO"]],
+ [["BAR FOO", "TRUE", "BAR"], ["BAR FOO"]],
+ [["BAR FOO", "BAR", "TRUE"], ["BAR FOO"]],
+
+ # Check that reduction happens even when there are
+ # two conditions to remove.
+ [["FOO", "FOO BAR", "BAR"], ["FOO BAR"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["FOO BAR", "FOO BAZ"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
+ ["FOO BAZ BAR"]],
+
+ # Duplicated conditionals should be removed.
+ [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
+
+ # Equivalent conditions in different forms should be
+ # reduced: which one is left is unfortunately order
+ # dependent.
+ [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
+ [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
+
+ my $failed = 0;
+ foreach (@tests)
+ {
+ my ($inref, $outref) = @$_;
+ my @inconds = map { new Automake::Condition $_ } @$inref;
+ return 1
+ if threads->new(sub {
+ my @outconds = map { (new Automake::Condition $_)->string } @$outref;
+ return threads->new(sub {
+ my @res =
+ map { $_->string } (Automake::Condition::reduce_and (@inconds));
+ return threads->new(sub {
+ my $result = join (",", sort @res);
+ my $exresult = join (",", @outconds);
+
+ if ($result ne $exresult)
+ {
+ print '"' . join(",", @$inref) . '" => "' .
+ $result . '" expected "' .
+ $exresult . '"' . "\n";
+ $failed = 1;
+ }
+ return $failed;
+ })->join;
+ })->join;
+ })->join;
+ }
+ return $failed;
+}
+
+sub test_reduce_or ()
+{
+ my @tests = (# If no conditions are given, FALSE should be returned
+ [[], ["FALSE"]],
+ # An empty condition is TRUE
+ [[""], ["TRUE"]],
+ # A single condition should be passed through unchanged
+ [["FOO"], ["FOO"]],
+ [["FALSE"], ["FALSE"]],
+ [["TRUE"], ["TRUE"]],
+ # FALSE and TRUE should be discarded and overwhelm
+ # the result, respectively
+ [["FOO", "TRUE"], ["TRUE"]],
+ [["FOO", "FALSE"], ["FOO"]],
+ # Repetitions should be removed
+ [["FOO", "FOO"], ["FOO"]],
+ [["FALSE", "FOO", "FOO"], ["FOO"]],
+ [["FOO", "FALSE", "FOO"], ["FOO"]],
+ [["FOO", "FOO", "FALSE"], ["FOO"]],
+ # Two different conditions should be preserved,
+ # but FALSEs should be removed
+ [["FOO", "BAR"], ["BAR,FOO"]],
+ [["FALSE", "FOO", "BAR"], ["BAR,FOO"]],
+ [["FOO", "FALSE", "BAR"], ["BAR,FOO"]],
+ [["FOO", "BAR", "FALSE"], ["BAR,FOO"]],
+ # A condition implying another condition should be removed.
+ [["FOO BAR", "BAR"], ["BAR"]],
+ [["BAR", "FOO BAR"], ["BAR"]],
+ [["FALSE", "FOO BAR", "BAR"], ["BAR"]],
+ [["FOO BAR", "FALSE", "BAR"], ["BAR"]],
+ [["FOO BAR", "BAR", "FALSE"], ["BAR"]],
+
+ [["BAR FOO", "BAR"], ["BAR"]],
+ [["BAR", "BAR FOO"], ["BAR"]],
+ [["FALSE", "BAR FOO", "BAR"], ["BAR"]],
+ [["BAR FOO", "FALSE", "BAR"], ["BAR"]],
+ [["BAR FOO", "BAR", "FALSE"], ["BAR"]],
+
+ # Check that reduction happens even when there are
+ # two conditions to remove.
+ [["FOO", "FOO BAR", "BAR"], ["BAR,FOO"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["BAZ,FOO"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
+ ["BAZ,FOO"]],
+
+ # Duplicated conditionals should be removed.
+ [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
+
+ # Equivalent conditions in different forms should be
+ # reduced: which one is left is unfortunately order
+ # dependent.
+ [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
+ [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
+
+ my $failed = 0;
+ foreach (@tests)
+ {
+ my ($inref, $outref) = @$_;
+ my @inconds = map { new Automake::Condition $_ } @$inref;
+ return 1
+ if threads->new(sub {
+ my @outconds = map { (new Automake::Condition $_)->string } @$outref;
+ return threads->new(sub {
+ my @res =
+ map { $_->string } (Automake::Condition::reduce_or (@inconds));
+ return threads->new(sub {
+ my $result = join (",", sort @res);
+ my $exresult = join (",", @outconds);
+
+ if ($result ne $exresult)
+ {
+ print '"' . join(",", @$inref) . '" => "' .
+ $result . '" expected "' .
+ $exresult . '"' . "\n";
+ $failed = 1;
+ }
+ return $failed;
+ })->join;
+ })->join;
+ })->join;
+ }
+ return $failed;
+}
+
+exit (test_basics || test_true_when || test_reduce_and || test_reduce_or);
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## cperl-indent-level: 2
+## cperl-brace-offset: 0
+## cperl-continued-brace-offset: 0
+## cperl-label-offset: -2
+## cperl-extra-newline-before-brace: t
+## cperl-merge-trailing-else: nil
+## cperl-continued-statement-offset: 2
+## End:
--- /dev/null
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use Automake::Condition qw/TRUE FALSE/;
+
+sub test_basics ()
+{
+ my @tests = (# [[Conditions], is_true?, is_false?, string, subst-string]
+ [[], 1, 0, 'TRUE', ''],
+ [['TRUE'], 1, 0, 'TRUE', ''],
+ [['FALSE'], 0, 1, 'FALSE', '#'],
+ [['A_TRUE'], 0, 0, 'A_TRUE', '@A_TRUE@'],
+ [['A_TRUE', 'B_FALSE'],
+ 0, 0, 'A_TRUE B_FALSE', '@A_TRUE@@B_FALSE@'],
+ [['B_TRUE', 'FALSE'], 0, 1, 'FALSE', '#'],
+ [['B_TRUE', 'B_FALSE'], 0, 1, 'FALSE', '#']);
+
+ for (@tests)
+ {
+ my $a = new Automake::Condition @{$_->[0]};
+ return 1 if $_->[1] != $a->true;
+ return 1 if $_->[1] != ($a == TRUE);
+ return 1 if $_->[2] != $a->false;
+ return 1 if $_->[2] != ($a == FALSE);
+ return 1 if $_->[3] ne $a->string;
+ return 1 if $_->[4] ne $a->subst_string;
+ }
+ return 0;
+}
+
+sub test_true_when ()
+{
+ my $failed = 0;
+
+ my @tests = (# [When,
+ # [Implied-Conditions],
+ # [Not-Implied-Conditions]]
+ [['TRUE'],
+ [['TRUE']],
+ [['A_TRUE'], ['A_TRUE', 'B_FALSE'], ['FALSE']]],
+ [['A_TRUE'],
+ [['TRUE'], ['A_TRUE']],
+ [['A_TRUE', 'B_FALSE'], ['FALSE']]],
+ [['A_TRUE', 'B_FALSE'],
+ [['TRUE'], ['A_TRUE'], ['B_FALSE'], ['A_TRUE', 'B_FALSE']],
+ [['FALSE'], ['C_FALSE'], ['C_FALSE', 'A_TRUE']]]);
+
+ for my $t (@tests)
+ {
+ my $a = new Automake::Condition @{$t->[0]};
+ for my $u (@{$t->[1]})
+ {
+ my $b = new Automake::Condition @$u;
+ if (! $b->true_when ($a))
+ {
+ print "`" . $b->string .
+ "' not implied by `" . $a->string . "'?\n";
+ $failed = 1;
+ }
+ }
+ for my $u (@{$t->[2]})
+ {
+ my $b = new Automake::Condition @$u;
+ if ($b->true_when ($a))
+ {
+ print "`" . $b->string .
+ "' implied by `" . $a->string . "'?\n";
+ $failed = 1;
+ }
+
+ return 1 if $b->true_when ($a);
+ }
+ }
+ return $failed;
+}
+
+sub test_reduce_and ()
+{
+ my @tests = (# If no conditions are given, TRUE should be returned
+ [[], ["TRUE"]],
+ # An empty condition is TRUE
+ [[""], ["TRUE"]],
+ # A single condition should be passed through unchanged
+ [["FOO"], ["FOO"]],
+ [["FALSE"], ["FALSE"]],
+ [["TRUE"], ["TRUE"]],
+ # TRUE and false should be discarded and overwhelm
+ # the result, respectively
+ [["FOO", "TRUE"], ["FOO"]],
+ [["FOO", "FALSE"], ["FALSE"]],
+ # Repetitions should be removed
+ [["FOO", "FOO"], ["FOO"]],
+ [["TRUE", "FOO", "FOO"], ["FOO"]],
+ [["FOO", "TRUE", "FOO"], ["FOO"]],
+ [["FOO", "FOO", "TRUE"], ["FOO"]],
+ # Two different conditions should be preserved,
+ # but TRUEs should be removed
+ [["FOO", "BAR"], ["BAR,FOO"]],
+ [["TRUE", "FOO", "BAR"], ["BAR,FOO"]],
+ [["FOO", "TRUE", "BAR"], ["BAR,FOO"]],
+ [["FOO", "BAR", "TRUE"], ["BAR,FOO"]],
+ # A condition implied by another condition should be removed.
+ [["FOO BAR", "BAR"], ["FOO BAR"]],
+ [["BAR", "FOO BAR"], ["FOO BAR"]],
+ [["TRUE", "FOO BAR", "BAR"], ["FOO BAR"]],
+ [["FOO BAR", "TRUE", "BAR"], ["FOO BAR"]],
+ [["FOO BAR", "BAR", "TRUE"], ["FOO BAR"]],
+
+ [["BAR FOO", "BAR"], ["BAR FOO"]],
+ [["BAR", "BAR FOO"], ["BAR FOO"]],
+ [["TRUE", "BAR FOO", "BAR"], ["BAR FOO"]],
+ [["BAR FOO", "TRUE", "BAR"], ["BAR FOO"]],
+ [["BAR FOO", "BAR", "TRUE"], ["BAR FOO"]],
+
+ # Check that reduction happens even when there are
+ # two conditions to remove.
+ [["FOO", "FOO BAR", "BAR"], ["FOO BAR"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["FOO BAR", "FOO BAZ"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
+ ["FOO BAZ BAR"]],
+
+ # Duplicated conditionals should be removed.
+ [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
+
+ # Equivalent conditions in different forms should be
+ # reduced: which one is left is unfortunately order
+ # dependent.
+ [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
+ [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
+
+ my $failed = 0;
+ foreach (@tests)
+ {
+ my ($inref, $outref) = @$_;
+ my @inconds = map { new Automake::Condition $_ } @$inref;
+ my @outconds = map { (new Automake::Condition $_)->string } @$outref;
+ my @res =
+ map { $_->string } (Automake::Condition::reduce_and (@inconds));
+ my $result = join (",", sort @res);
+ my $exresult = join (",", @outconds);
+
+ if ($result ne $exresult)
+ {
+ print '"' . join(",", @$inref) . '" => "' .
+ $result . '" expected "' .
+ $exresult . '"' . "\n";
+ $failed = 1;
+ }
+ }
+ return $failed;
+}
+
+sub test_reduce_or ()
+{
+ my @tests = (# If no conditions are given, FALSE should be returned
+ [[], ["FALSE"]],
+ # An empty condition is TRUE
+ [[""], ["TRUE"]],
+ # A single condition should be passed through unchanged
+ [["FOO"], ["FOO"]],
+ [["FALSE"], ["FALSE"]],
+ [["TRUE"], ["TRUE"]],
+ # FALSE and TRUE should be discarded and overwhelm
+ # the result, respectively
+ [["FOO", "TRUE"], ["TRUE"]],
+ [["FOO", "FALSE"], ["FOO"]],
+ # Repetitions should be removed
+ [["FOO", "FOO"], ["FOO"]],
+ [["FALSE", "FOO", "FOO"], ["FOO"]],
+ [["FOO", "FALSE", "FOO"], ["FOO"]],
+ [["FOO", "FOO", "FALSE"], ["FOO"]],
+ # Two different conditions should be preserved,
+ # but FALSEs should be removed
+ [["FOO", "BAR"], ["BAR,FOO"]],
+ [["FALSE", "FOO", "BAR"], ["BAR,FOO"]],
+ [["FOO", "FALSE", "BAR"], ["BAR,FOO"]],
+ [["FOO", "BAR", "FALSE"], ["BAR,FOO"]],
+ # A condition implying another condition should be removed.
+ [["FOO BAR", "BAR"], ["BAR"]],
+ [["BAR", "FOO BAR"], ["BAR"]],
+ [["FALSE", "FOO BAR", "BAR"], ["BAR"]],
+ [["FOO BAR", "FALSE", "BAR"], ["BAR"]],
+ [["FOO BAR", "BAR", "FALSE"], ["BAR"]],
+
+ [["BAR FOO", "BAR"], ["BAR"]],
+ [["BAR", "BAR FOO"], ["BAR"]],
+ [["FALSE", "BAR FOO", "BAR"], ["BAR"]],
+ [["BAR FOO", "FALSE", "BAR"], ["BAR"]],
+ [["BAR FOO", "BAR", "FALSE"], ["BAR"]],
+
+ # Check that reduction happens even when there are
+ # two conditions to remove.
+ [["FOO", "FOO BAR", "BAR"], ["BAR,FOO"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ"], ["BAZ,FOO"]],
+ [["FOO", "FOO BAR", "BAZ", "FOO BAZ", "FOO BAZ BAR"],
+ ["BAZ,FOO"]],
+
+ # Duplicated conditionals should be removed.
+ [["FOO", "BAR", "BAR"], ["BAR,FOO"]],
+
+ # Equivalent conditions in different forms should be
+ # reduced: which one is left is unfortunately order
+ # dependent.
+ [["BAR FOO", "FOO BAR"], ["FOO BAR"]],
+ [["FOO BAR", "BAR FOO"], ["BAR FOO"]]);
+
+ my $failed = 0;
+ foreach (@tests)
+ {
+ my ($inref, $outref) = @$_;
+ my @inconds = map { new Automake::Condition $_ } @$inref;
+ my @outconds = map { (new Automake::Condition $_)->string } @$outref;
+ my @res =
+ map { $_->string } (Automake::Condition::reduce_or (@inconds));
+ my $result = join (",", sort @res);
+ my $exresult = join (",", @outconds);
+
+ if ($result ne $exresult)
+ {
+ print '"' . join(",", @$inref) . '" => "' .
+ $result . '" expected "' .
+ $exresult . '"' . "\n";
+ $failed = 1;
+ }
+ }
+ return $failed;
+}
+
+exit (test_basics || test_true_when || test_reduce_and || test_reduce_or);
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## cperl-indent-level: 2
+## cperl-brace-offset: 0
+## cperl-continued-brace-offset: 0
+## cperl-label-offset: -2
+## cperl-extra-newline-before-brace: t
+## cperl-merge-trailing-else: nil
+## cperl-continued-statement-offset: 2
+## End:
--- /dev/null
+# Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+BEGIN {
+ use Config;
+ if (eval { require 5.007_002; } # for CLONE support
+ && $Config{useithreads})
+ {
+ require threads;
+ import threads;
+ }
+ else
+ {
+ exit 77;
+ }
+}
+use Automake::Condition qw/TRUE FALSE/;
+use Automake::DisjConditions;
+
+sub test_basics ()
+{
+ my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE";
+ return threads->new (sub {
+ my $other = new Automake::Condition "COND3_FALSE";
+ return threads->new (sub {
+ my $set1 = new Automake::DisjConditions $cond, $other;
+ return threads->new (sub {
+ my $set2 = new Automake::DisjConditions $other, $cond;
+ return 1 unless $set1 == $set2;
+ return 1 if $set1->false;
+ return 1 if $set1->true;
+ return 1 unless (new Automake::DisjConditions)->false;
+ return 1 if (new Automake::DisjConditions)->true;
+ })->join;
+ })->join;
+ })->join;
+}
+
+sub build_set (@)
+{
+ my @conds = @_;
+ my @set = ();
+ for my $cond (@conds)
+ {
+ push @set, new Automake::Condition @$cond;
+ }
+ return new Automake::DisjConditions @set;
+}
+
+sub test_invert ()
+{
+ my @tests = ([[["FALSE"]],
+ [["TRUE"]]],
+
+ [[["TRUE"]],
+ [["FALSE"]]],
+
+ [[["COND1_TRUE", "COND2_TRUE"],
+ ["COND3_FALSE", "COND2_TRUE"]],
+ [["COND2_FALSE"],
+ ["COND1_FALSE", "COND3_TRUE"]]],
+
+ [[["COND1_TRUE", "COND2_TRUE"],
+ ["TRUE"]],
+ [["FALSE"]]],
+
+ [[["COND1_TRUE", "COND2_TRUE"],
+ ["FALSE"]],
+ [["COND1_FALSE"],
+ ["COND2_FALSE"]]],
+
+ [[["COND1_TRUE"],
+ ["COND2_FALSE"]],
+ [["COND1_FALSE", "COND2_TRUE"]]]
+ );
+
+ for my $t (@tests)
+ {
+ my $set = build_set @{$t->[0]};
+ return 1
+ if threads->new(sub {
+ my $res = build_set @{$t->[1]};
+ my $inv = $set->invert;
+ if ($inv != $res)
+ {
+ print " (I) " . $set->string . "\n\t"
+ . $inv->string . ' != ' . $res->string . "\n";
+ return 1;
+ }
+ return 0
+ })-> join;
+ }
+ return 0;
+}
+
+sub test_simplify ()
+{
+ my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"]],
+ [["FOO_TRUE", "BAR_FALSE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_TRUE", "BAR_TRUE"]],
+ [["FOO_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_TRUE", "BAR_TRUE"],
+ ["FOO_FALSE"]],
+ [["TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["BAR_TRUE", "BAZ_TRUE"],
+ ["BAR_FALSE", "BAZ_TRUE"]],
+ [["BAZ_TRUE"], ["FOO_TRUE", "BAR_FALSE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["BAR_TRUE", "BAZ_TRUE"],
+ ["BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ [["FOO_FALSE"], ["BAZ_TRUE"], ["BAR_FALSE"]]],
+
+ [[["B_TRUE"],
+ ["A_FALSE", "B_TRUE"]],
+ [["B_TRUE"]]],
+
+ [[["B_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_FALSE"]],
+ [["A_FALSE"], ["B_TRUE"]]],
+
+ [[["B_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_FALSE"],
+ ["A_TRUE", "B_FALSE"]],
+ [["TRUE"]]],
+
+ [[["A_TRUE", "B_TRUE"],
+ ["A_TRUE", "B_FALSE"],
+ ["A_TRUE", "C_FALSE", "D_FALSE"]],
+ [["A_TRUE"]]],
+
+ [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"]],
+ [ ["B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"]]],
+
+ [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"]],
+ [["C_FALSE", "E_FALSE"],
+ ["C_TRUE", "E_TRUE"]]],
+
+ [[["A_FALSE"],
+ ["A_TRUE", "B_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE", "F_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"]],
+ [["TRUE"]]],
+
+ # Simplify should work with up to 31 variables.
+ [[["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_TRUE"],
+ ["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_FALSE"],
+ ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_TRUE"],
+ ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_FALSE"]],
+ [[ "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE"
+ ]]]);
+
+ for my $t (@tests)
+ {
+ my $set = build_set @{$t->[0]};
+ return 1
+ if threads->new(sub {
+ my $res = build_set @{$t->[1]};
+ return threads->new(sub {
+
+ # Make sure simplify() yields the expected result.
+ my $sim = $set->simplify;
+ return threads->new(sub {
+ if ($sim != $res)
+ {
+ print " (S1) " . $set->string . "\n\t"
+ . $sim->string . ' != ' . $res->string . "\n";
+ return 1;
+ }
+
+ # Make sure simplify() is idempotent.
+ my $sim2 = $sim->simplify;
+ return threads->new(sub {
+ if ($sim2 != $sim)
+ {
+ print " (S2) " . $sim->string . "\n\t"
+ . $sim2->string . ' != ' . $sim->string . "\n";
+ return 1;
+ }
+
+ # Also exercise invert() while we are at it.
+
+ my $inv1 = $set->invert->simplify;
+ return threads->new(sub {
+ my $inv2 = $sim->invert->simplify;
+ return threads->new(sub {
+ if ($inv1 != $inv2)
+ {
+ print " (S3) " . $set->string . ", " . $sim->string . "\n\t"
+ . $inv1->string . ' -= ' . $inv2->string . "\n";
+ return 1;
+ }
+ })->join;
+ })->join;
+ })->join;
+ })->join;
+ })->join;
+ })->join;
+ }
+
+ return 0;
+}
+
+sub test_sub_conditions ()
+{
+ my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE"],
+ [["BAR_FALSE", "BAZ_FALSE"],
+ ["BAR_FALSE", "BAZ_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE", "BAR_FALSE"],
+ [["BAZ_FALSE"],
+ ["BAZ_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE", "BAR_TRUE"],
+ [["FALSE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE", "BAR_TRUE"],
+ [["BAZ_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE"],
+ ["FOO_TRUE", "BAR_TRUE"]],
+ ["FOO_TRUE", "BAR_TRUE"],
+ [["TRUE"]]],
+
+ [[["TRUE"]],
+ ["TRUE"],
+ [["TRUE"]]],
+
+ [[["FALSE"]],
+ ["TRUE"],
+ [["FALSE"]]],
+
+ [[["FALSE"]],
+ ["FALSE"],
+ [["FALSE"]]]);
+
+ for my $t (@tests)
+ {
+ my $t1 = build_set @{$t->[0]};
+ return 1
+ if threads->new(sub {
+ my $t2 = new Automake::Condition @{$t->[1]};
+ return threads->new(sub {
+ my $t3 = build_set @{$t->[2]};
+ return threads->new(sub {
+
+ # Make sure sub_conditions() yields the expected result.
+ my $s = $t1->sub_conditions ($t2);
+ threads->new(sub {
+ if ($s != $t3)
+ {
+ print " (SC) " . $t1->string . "\n\t"
+ . $s->string . ' != ' . $t3->string . "\n";
+ return 1;
+ }
+ })->join;
+ })->join;
+ })->join;
+ })->join;
+ }
+}
+
+sub test_ambig ()
+{
+ my @tests = ([[["TRUE"]],
+ ["TRUE"],
+ "multiply defined"],
+ [[["C1_TRUE"]],
+ ["C1_TRUE"],
+ "multiply defined"],
+ [[["TRUE"]],
+ ["C1_FALSE"],
+ "which includes"],
+ [[["C1_TRUE"]],
+ ["C1_TRUE", "C2_TRUE"],
+ "which includes"],
+ [[["C1_TRUE", "C2_TRUE"]],
+ ["C2_TRUE"],
+ "which is included in"],
+ [[["C1_TRUE"]],
+ ["C2_TRUE"],
+ ''],
+ [[["C1_TRUE"],
+ ["C2_FALSE"]],
+ ["C1_FALSE", "C2_TRUE"],
+ '']);
+
+ my $failed = 0;
+ for my $t (@tests)
+ {
+ my $t1 = build_set @{$t->[0]};
+ $failed = 1
+ if threads->new(sub {
+ my $t2 = new Automake::Condition @{$t->[1]};
+ my $t3 = $t->[2];
+ return threads->new(sub {
+ my ($ans, $cond) = $t1->ambiguous_p ("FOO", $t2);
+ return threads->new(sub {
+ if ($t3 && $ans !~ /FOO.*$t3/)
+ {
+ print " (A1) " . $t1->string . " vs. " . $t2->string . "\n\t"
+ . "Error message '$ans' does not match '$t3'\n";
+ return 1;
+ }
+ if (!$t3 && $ans ne '')
+ {
+ print " (A2) " . $t1->string . " vs. " . $t2->string . "\n\t"
+ . "Unexpected error message: $ans\n";
+ return 1;
+ }
+ })->join;
+ })->join;
+ })->join;
+ }
+ return $failed;
+}
+
+exit (test_basics
+ || test_invert
+ || test_simplify
+ || test_sub_conditions
+ || test_ambig);
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## cperl-indent-level: 2
+## cperl-brace-offset: 0
+## cperl-continued-brace-offset: 0
+## cperl-label-offset: -2
+## cperl-extra-newline-before-brace: t
+## cperl-merge-trailing-else: nil
+## cperl-continued-statement-offset: 2
+## End:
--- /dev/null
+# Copyright (C) 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use Automake::Condition qw/TRUE FALSE/;
+use Automake::DisjConditions;
+
+sub test_basics ()
+{
+ my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE";
+ my $other = new Automake::Condition "COND3_FALSE";
+ my $set1 = new Automake::DisjConditions $cond, $other;
+ my $set2 = new Automake::DisjConditions $other, $cond;
+ return 1 unless $set1 == $set2;
+ return 1 if $set1->false;
+ return 1 if $set1->true;
+ return 1 unless (new Automake::DisjConditions)->false;
+ return 1 if (new Automake::DisjConditions)->true;
+}
+
+sub build_set (@)
+{
+ my @conds = @_;
+ my @set = ();
+ for my $cond (@conds)
+ {
+ push @set, new Automake::Condition @$cond;
+ }
+ return new Automake::DisjConditions @set;
+}
+
+sub test_invert ()
+{
+ my @tests = ([[["FALSE"]],
+ [["TRUE"]]],
+
+ [[["TRUE"]],
+ [["FALSE"]]],
+
+ [[["COND1_TRUE", "COND2_TRUE"],
+ ["COND3_FALSE", "COND2_TRUE"]],
+ [["COND2_FALSE"],
+ ["COND1_FALSE", "COND3_TRUE"]]],
+
+ [[["COND1_TRUE", "COND2_TRUE"],
+ ["TRUE"]],
+ [["FALSE"]]],
+
+ [[["COND1_TRUE", "COND2_TRUE"],
+ ["FALSE"]],
+ [["COND1_FALSE"],
+ ["COND2_FALSE"]]],
+
+ [[["COND1_TRUE"],
+ ["COND2_FALSE"]],
+ [["COND1_FALSE", "COND2_TRUE"]]]
+ );
+
+ for my $t (@tests)
+ {
+ my $set = build_set @{$t->[0]};
+ my $res = build_set @{$t->[1]};
+ my $inv = $set->invert;
+ if ($inv != $res)
+ {
+ print " (I) " . $set->string . "\n\t"
+ . $inv->string . ' != ' . $res->string . "\n";
+ return 1;
+ }
+ }
+ return 0;
+}
+
+sub test_simplify ()
+{
+ my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"]],
+ [["FOO_TRUE", "BAR_FALSE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_TRUE", "BAR_TRUE"]],
+ [["FOO_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_TRUE", "BAR_TRUE"],
+ ["FOO_FALSE"]],
+ [["TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["BAR_TRUE", "BAZ_TRUE"],
+ ["BAR_FALSE", "BAZ_TRUE"]],
+ [["BAZ_TRUE"], ["FOO_TRUE", "BAR_FALSE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["BAR_TRUE", "BAZ_TRUE"],
+ ["BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ [["FOO_FALSE"], ["BAZ_TRUE"], ["BAR_FALSE"]]],
+
+ [[["B_TRUE"],
+ ["A_FALSE", "B_TRUE"]],
+ [["B_TRUE"]]],
+
+ [[["B_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_FALSE"]],
+ [["A_FALSE"], ["B_TRUE"]]],
+
+ [[["B_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE"],
+ ["A_FALSE", "B_FALSE", "C_FALSE"],
+ ["A_TRUE", "B_FALSE"]],
+ [["TRUE"]]],
+
+ [[["A_TRUE", "B_TRUE"],
+ ["A_TRUE", "B_FALSE"],
+ ["A_TRUE", "C_FALSE", "D_FALSE"]],
+ [["A_TRUE"]]],
+
+ [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"]],
+ [ ["B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"]]],
+
+ [[["A_FALSE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"],
+ ["A_FALSE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_FALSE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE", "D_TRUE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_TRUE", "D_FALSE", "E_TRUE"],
+ ["A_TRUE", "B_FALSE", "C_FALSE", "D_FALSE", "E_FALSE"]],
+ [["C_FALSE", "E_FALSE"],
+ ["C_TRUE", "E_TRUE"]]],
+
+ [[["A_FALSE"],
+ ["A_TRUE", "B_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE", "F_FALSE"],
+ ["A_TRUE", "B_TRUE", "C_TRUE", "D_TRUE", "E_TRUE"]],
+ [["TRUE"]]],
+
+ # Simplify should work with up to 31 variables.
+ [[["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_TRUE"],
+ ["V01_TRUE", "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_FALSE"],
+ ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_TRUE"],
+ ["V01_FALSE","V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE",
+ "V31_FALSE"]],
+ [[ "V02_TRUE", "V03_TRUE", "V04_TRUE", "V05_TRUE",
+ "V06_TRUE", "V07_TRUE", "V08_TRUE", "V09_TRUE", "V10_TRUE",
+ "V11_TRUE", "V12_TRUE", "V13_TRUE", "V14_TRUE", "V15_TRUE",
+ "V16_TRUE", "V17_TRUE", "V18_TRUE", "V19_TRUE", "V20_TRUE",
+ "V21_TRUE", "V22_TRUE", "V23_TRUE", "V24_TRUE", "V25_TRUE",
+ "V26_TRUE", "V27_TRUE", "V28_TRUE", "V29_TRUE", "V30_TRUE"
+ ]]]);
+
+ for my $t (@tests)
+ {
+ my $set = build_set @{$t->[0]};
+ my $res = build_set @{$t->[1]};
+
+ # Make sure simplify() yields the expected result.
+ my $sim = $set->simplify;
+ if ($sim != $res)
+ {
+ print " (S1) " . $set->string . "\n\t"
+ . $sim->string . ' != ' . $res->string . "\n";
+ return 1;
+ }
+
+ # Make sure simplify() is idempotent.
+ my $sim2 = $sim->simplify;
+ if ($sim2 != $sim)
+ {
+ print " (S2) " . $sim->string . "\n\t"
+ . $sim2->string . ' != ' . $sim->string . "\n";
+ return 1;
+ }
+
+ # Also exercise invert() while we are at it.
+
+ my $inv1 = $set->invert->simplify;
+ my $inv2 = $sim->invert->simplify;
+ if ($inv1 != $inv2)
+ {
+ print " (S3) " . $set->string . ", " . $sim->string . "\n\t"
+ . $inv1->string . ' != ' . $inv2->string . "\n";
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+sub test_sub_conditions ()
+{
+ my @tests = ([[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE"],
+ [["BAR_FALSE", "BAZ_FALSE"],
+ ["BAR_FALSE", "BAZ_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE", "BAR_FALSE"],
+ [["BAZ_FALSE"],
+ ["BAZ_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAR_FALSE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE", "BAR_TRUE"],
+ [["FALSE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE", "BAZ_FALSE"],
+ ["FOO_TRUE", "BAZ_TRUE"],
+ ["FOO_FALSE"]],
+ ["FOO_TRUE", "BAR_TRUE"],
+ [["BAZ_TRUE"]]],
+
+ [[["FOO_TRUE", "BAR_FALSE"],
+ ["FOO_TRUE", "BAR_TRUE"]],
+ ["FOO_TRUE", "BAR_TRUE"],
+ [["TRUE"]]],
+
+ [[["TRUE"]],
+ ["TRUE"],
+ [["TRUE"]]],
+
+ [[["FALSE"]],
+ ["TRUE"],
+ [["FALSE"]]],
+
+ [[["FALSE"]],
+ ["FALSE"],
+ [["FALSE"]]]);
+
+ for my $t (@tests)
+ {
+ my $t1 = build_set @{$t->[0]};
+ my $t2 = new Automake::Condition @{$t->[1]};
+ my $t3 = build_set @{$t->[2]};
+
+ # Make sure sub_conditions() yields the expected result.
+ my $s = $t1->sub_conditions ($t2);
+ if ($s != $t3)
+ {
+ print " (SC) " . $t1->string . "\n\t"
+ . $s->string . ' != ' . $t3->string . "\n";
+ return 1;
+ }
+ }
+}
+
+sub test_ambig ()
+{
+ my @tests = ([[["TRUE"]],
+ ["TRUE"],
+ "multiply defined"],
+ [[["C1_TRUE"]],
+ ["C1_TRUE"],
+ "multiply defined"],
+ [[["TRUE"]],
+ ["C1_FALSE"],
+ "which includes"],
+ [[["C1_TRUE"]],
+ ["C1_TRUE", "C2_TRUE"],
+ "which includes"],
+ [[["C1_TRUE", "C2_TRUE"]],
+ ["C2_TRUE"],
+ "which is included in"],
+ [[["C1_TRUE"]],
+ ["C2_TRUE"],
+ ''],
+ [[["C1_TRUE"],
+ ["C2_FALSE"]],
+ ["C1_FALSE", "C2_TRUE"],
+ '']);
+
+ for my $t (@tests)
+ {
+ my $t1 = build_set @{$t->[0]};
+ my $t2 = new Automake::Condition @{$t->[1]};
+ my $t3 = $t->[2];
+ my ($ans, $cond) = $t1->ambiguous_p ("FOO", $t2);
+ if ($t3 && $ans !~ /FOO.*$t3/)
+ {
+ print " (A1) " . $t1->string . " vs. " . $t2->string . "\n\t"
+ . "Error message '$ans' does not match '$t3'\n";
+ return 1;
+ }
+ if (!$t3 && $ans ne '')
+ {
+ print " (A2) " . $t1->string . " vs. " . $t2->string . "\n\t"
+ . "Unexpected error message: $ans\n";
+ return 1;
+ }
+ }
+ return 0;
+}
+
+exit (test_basics
+ || test_invert
+ || test_simplify
+ || test_sub_conditions
+ || test_ambig);
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## cperl-indent-level: 2
+## cperl-brace-offset: 0
+## cperl-continued-brace-offset: 0
+## cperl-label-offset: -2
+## cperl-extra-newline-before-brace: t
+## cperl-merge-trailing-else: nil
+## cperl-continued-statement-offset: 2
+## End:
--- /dev/null
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use Automake::Version;
+
+my $failed = 0;
+
+sub test_version_compare
+{
+ my ($left, $right, $result) = @_;
+ my @leftver = Automake::Version::split ($left);
+ my @rightver = Automake::Version::split ($right);
+ if ($#leftver == -1)
+ {
+ print "can't grok \"$left\"\n";
+ $failed = 1;
+ return;
+ }
+ if ($#rightver == -1)
+ {
+ print "can't grok \"$right\"\n";
+ $failed = 1;
+ return;
+ }
+ my $res = Automake::Version::compare (@leftver, @rightver);
+ if ($res != $result)
+ {
+ print "compare (\"$left\", \"$right\") = $res! (not $result?)\n";
+ $failed = 1;
+ }
+}
+
+my @tests = (
+# basics
+ ['1.0', '2.0', -1],
+ ['2.0', '1.0', 1],
+ ['1.2', '1.2', 0],
+ ['1.1', '1.2', -1],
+ ['1.2', '1.1', 1],
+# alphas
+ ['1.4', '1.4g', -1],
+ ['1.4g', '1.5', -1],
+ ['1.4g', '1.4', 1],
+ ['1.5', '1.4g', 1],
+ ['1.4a', '1.4g', -1],
+ ['1.5a', '1.3g', 1],
+ ['1.6a', '1.6a', 0],
+# micros
+ ['1.5.1', '1.5', 1],
+ ['1.5.0', '1.5', 0],
+ ['1.5.4', '1.6.1', -1],
+# micros and alphas
+ ['1.5a', '1.5.1', 1],
+ ['1.5a', '1.5.1a', 1],
+ ['1.5a', '1.5.1f', 1],
+ ['1.5', '1.5.1a', -1],
+ ['1.5.1a', '1.5.1f', -1],
+# special exceptions
+ ['1.6-p5a', '1.6.5a', 0],
+ ['1.6', '1.6-p5a', -1],
+ ['1.6-p4b', '1.6-p5a', -1],
+ ['1.6-p4b', '1.6-foo', 1],
+ ['1.6-p4b', '1.6a-foo', -1]
+);
+
+test_version_compare (@{$_}) foreach @tests;
+
+exit $failed;
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## cperl-indent-level: 2
+## cperl-brace-offset: 0
+## cperl-continued-brace-offset: 0
+## cperl-label-offset: -2
+## cperl-extra-newline-before-brace: t
+## cperl-merge-trailing-else: nil
+## cperl-continued-statement-offset: 2
+## End:
--- /dev/null
+# Copyright (C) 2003 Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# GNU Automake is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use Automake::Wrap 'wrap';
+
+my $failed = 0;
+
+sub test_wrap
+{
+ my ($in, $exp_out) = @_;
+
+ my $out = &wrap (@$in);
+ if ($out ne $exp_out)
+ {
+ print STDERR "For: @$in\nGot:\n$out\nInstead of:\n$exp_out\n---\n";
+ ++$failed;
+ }
+}
+
+my @tests = (
+ [["HEAD:", "NEXT:", "CONT", 13, "v" ,"a", "l", "ue", "s", "values"],
+"HEAD:v aCONT
+NEXT:l ueCONT
+NEXT:sCONT
+NEXT:values
+"],
+ [["rule: ", "\t", " \\", 20, "dep1" ,"dep2", "dep3", "dep4", "dep5",
+ "dep06", "dep07", "dep08"],
+"rule: dep1 dep2 \\
+\tdep3 dep4 \\
+\tdep5 dep06 \\
+\tdep07 \\
+\tdep08
+"],
+ [["big header:", "big continuation:", " END", 5, "diag1", "diag2", "diag3"],
+"big header:diag1 END
+big continuation:diag2 END
+big continuation:diag3
+"],
+ [["big header:", "cont: ", " END", 16, "word1", "word2"],
+"big header: END
+cont: word1 END
+cont: word2
+"]);
+
+
+test_wrap (@{$_}) foreach @tests;
+
+exit $failed;
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## cperl-indent-level: 2
+## cperl-brace-offset: 0
+## cperl-continued-brace-offset: 0
+## cperl-label-offset: -2
+## cperl-extra-newline-before-brace: t
+## cperl-merge-trailing-else: nil
+## cperl-continued-statement-offset: 2
+## End: