diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2012-04-06 13:12:25 +0200 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2012-04-06 21:29:30 +0200 |
commit | 8a5096d150cf9803b8963768b7366cd68edcce03 (patch) | |
tree | a49c0e54876b8b9877d7ca2df386377e7b6037d1 /t/pm | |
parent | f8e822bbc197f01fc722aa6def7cddb4182e3c66 (diff) | |
download | automake-8a5096d150cf9803b8963768b7366cd68edcce03.tar.gz |
tests: rename 'tests/' => 't/', '*.test' => '*.sh'
When we (soon) convert the Automake testsuite to a non-recursive
make setup, we'll have to fix the entries of $(TESTS) to be
prepended with the subdirectory they are in; this will increase
the length of $(TESTS), and thus increase the possibility of
exceeding the command-line length limits on some systems (most
notably, MinGW/MSYS). See automake bug#7868 for more information.
Thus we rename the 'tests/' subdirectory to 't/', and each 'x.test'
script in there to 'x.sh'; this way, the $(TESTS) entry 'foo.test'
will become 't/foo.sh', which have the same number of characters.
* tests/: Rename ...
* t/: ... to this.
* t/*.test: Rename ...
* t/*.sh: ... to this.
* t/.gitignore: Removed as obsolete.
* t/defs: Adjust.
* t/gen-testsuite-part: Likewise.
* t/list-of-tests.mk: Likewise.
* t/ccnoco.sh: Likewise.
* t/ccnoco3.sh: Likewise.
* t/self-check-cleanup.tap: Likewise.
* t/self-check-dir.tap: Likewise.
* t/self-check-me.tap: Likewise.
* t/self-check-reexec.tap: Likewise.
* README: Likewise.
* bootstrap: Likewise
* configure.ac: Likewise.
* Makefile.am: Likewise.
* .gitignore: Likewise.
* syntax-check.mk: Likewise.
Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
Diffstat (limited to 't/pm')
-rw-r--r-- | t/pm/Cond2.pl | 22 | ||||
-rw-r--r-- | t/pm/Cond3.pl | 22 | ||||
-rw-r--r-- | t/pm/Condition-t.pl | 327 | ||||
-rw-r--r-- | t/pm/Condition.pl | 277 | ||||
-rw-r--r-- | t/pm/DisjCon2.pl | 24 | ||||
-rw-r--r-- | t/pm/DisjCon3.pl | 23 | ||||
-rw-r--r-- | t/pm/DisjConditions-t.pl | 461 | ||||
-rw-r--r-- | t/pm/DisjConditions.pl | 404 | ||||
-rw-r--r-- | t/pm/Version.pl | 129 | ||||
-rw-r--r-- | t/pm/Version2.pl | 20 | ||||
-rw-r--r-- | t/pm/Version3.pl | 20 | ||||
-rw-r--r-- | t/pm/Wrap.pl | 112 |
12 files changed, 1841 insertions, 0 deletions
diff --git a/t/pm/Cond2.pl b/t/pm/Cond2.pl new file mode 100644 index 000000000..2bed02826 --- /dev/null +++ b/t/pm/Cond2.pl @@ -0,0 +1,22 @@ +# Copyright (C) 2011-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/>. + +# Catch common programming error: +# A Condition passed as a string to 'new'. + +use Automake::Condition; + +my $cond = new Automake::Condition ('TRUE'); +new Automake::Condition ($cond); diff --git a/t/pm/Cond3.pl b/t/pm/Cond3.pl new file mode 100644 index 000000000..518eea84d --- /dev/null +++ b/t/pm/Cond3.pl @@ -0,0 +1,22 @@ +# Copyright (C) 2011-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/>. + +# Catch common programming error: +# A Condition passed as a string to 'new'. + +use Automake::Condition; + +my $cond = new Automake::Condition ("COND1_TRUE"); +new Automake::Condition ("$cond"); diff --git a/t/pm/Condition-t.pl b/t/pm/Condition-t.pl new file mode 100644 index 000000000..d29407add --- /dev/null +++ b/t/pm/Condition-t.pl @@ -0,0 +1,327 @@ +# Copyright (C) 2001-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/>. + +BEGIN { + use Config; + if (eval { require 5.007_002; } # for CLONE support + && $Config{useithreads} + && !$ENV{WANT_NO_THREADS}) + { + 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, human] + [[], 1, 0, 'TRUE', '', 'TRUE'], + [['TRUE'], 1, 0, 'TRUE', '', 'TRUE'], + [['FALSE'], 0, 1, 'FALSE', '#', 'FALSE'], + [['A_TRUE'], 0, 0, 'A_TRUE', '@A_TRUE@', 'A'], + [['A_TRUE', 'B_FALSE'], + 0, 0, 'A_TRUE B_FALSE', '@A_TRUE@@B_FALSE@', 'A and !B'], + [['B_TRUE', 'FALSE'], 0, 1, 'FALSE', '#', 'FALSE'], + [['B_TRUE', 'B_FALSE'], 0, 1, 'FALSE', '#', '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; + return 1 if $_->[5] ne $a->human; + })->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; +} + +sub test_merge () +{ + 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 $both = $cond->merge ($other); + return threads->new(sub { + my $both2 = $cond->merge_conds ("COND3_FALSE"); + return threads->new(sub { + $cond = $both->strip ($other); + my @conds = $cond->conds; + return 1 if $both->string ne "COND1_TRUE COND2_FALSE COND3_FALSE"; + return 1 if $cond->string ne "COND1_TRUE COND2_FALSE"; + return 1 if $both != $both2; + })->join; + })->join; + })->join; + })->join; + return 0; +} + +exit (test_basics + || test_true_when + || test_reduce_and + || test_reduce_or + || test_merge); + +### 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: diff --git a/t/pm/Condition.pl b/t/pm/Condition.pl new file mode 100644 index 000000000..5041a843e --- /dev/null +++ b/t/pm/Condition.pl @@ -0,0 +1,277 @@ +# Copyright (C) 2001-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/>. + +use Automake::Condition qw/TRUE FALSE/; + +sub test_basics () +{ + my @tests = (# [[Conditions], is_true?, is_false?, string, subst-string, human] + [[], 1, 0, 'TRUE', '', 'TRUE'], + [['TRUE'], 1, 0, 'TRUE', '', 'TRUE'], + [['FALSE'], 0, 1, 'FALSE', '#', 'FALSE'], + [['A_TRUE'], 0, 0, 'A_TRUE', '@A_TRUE@', 'A'], + [['A_TRUE', 'B_FALSE'], + 0, 0, 'A_TRUE B_FALSE', '@A_TRUE@@B_FALSE@', 'A and !B'], + [['B_TRUE', 'FALSE'], 0, 1, 'FALSE', '#', 'FALSE'], + [['B_TRUE', 'B_FALSE'], 0, 1, 'FALSE', '#', '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 1 if $_->[5] ne $a->human; + } + 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; +} + +sub test_merge () +{ + my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE"; + my $other = new Automake::Condition "COND3_FALSE"; + my $both = $cond->merge ($other); + my $both2 = $cond->merge_conds ("COND3_FALSE"); + $cond = $both->strip ($other); + my @conds = $cond->conds; + return 1 if $both->string ne "COND1_TRUE COND2_FALSE COND3_FALSE"; + return 1 if $cond->string ne "COND1_TRUE COND2_FALSE"; + return 1 if $both != $both2; + return 0; +} + +exit (test_basics + || test_true_when + || test_reduce_and + || test_reduce_or + || test_merge); + +### 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: diff --git a/t/pm/DisjCon2.pl b/t/pm/DisjCon2.pl new file mode 100644 index 000000000..2d287493d --- /dev/null +++ b/t/pm/DisjCon2.pl @@ -0,0 +1,24 @@ +# Copyright (C) 2011-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/>. + +# Catch common programming error: +# A non-Condition reference passed to new. + +use Automake::Condition; +use Automake::DisjConditions; + +my $cond = new Automake::Condition ('TRUE'); +my $cond2 = new Automake::DisjConditions ($cond); +new Automake::DisjConditions ($cond2); diff --git a/t/pm/DisjCon3.pl b/t/pm/DisjCon3.pl new file mode 100644 index 000000000..ede5ab7ac --- /dev/null +++ b/t/pm/DisjCon3.pl @@ -0,0 +1,23 @@ +# Copyright (C) 2011-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/>. + +# Catch common programming error: +# A non-reference passed to new. + +use Automake::Condition qw/TRUE FALSE/; +use Automake::DisjConditions; + +my $cond = new Automake::Condition ("COND1_TRUE"); +new Automake::DisjConditions ("$cond"); diff --git a/t/pm/DisjConditions-t.pl b/t/pm/DisjConditions-t.pl new file mode 100644 index 000000000..b49ae2e59 --- /dev/null +++ b/t/pm/DisjConditions-t.pl @@ -0,0 +1,461 @@ +# Copyright (C) 2001-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/>. + +BEGIN { + use Config; + if (eval { require 5.007_002; } # for CLONE support + && $Config{useithreads} + && !$ENV{WANT_NO_THREADS}) + { + require threads; + import threads; + } + else + { + exit 77; + } +} +use Automake::Condition qw/TRUE FALSE/; +use Automake::DisjConditions; + +sub test_basics () +{ + my $true = new Automake::DisjConditions TRUE; + my $false = new Automake::DisjConditions FALSE; + my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE"; + return threads->new (sub { + my $other = new Automake::Condition "COND3_FALSE"; + my $another = new Automake::Condition "COND3_TRUE", "COND4_FALSE"; + return threads->new (sub { + my $set1 = new Automake::DisjConditions $cond, $other; + return threads->new (sub { + my $set2 = new Automake::DisjConditions $other, $cond; + my $set3 = new Automake::DisjConditions FALSE, $another; + 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; + return 1 unless $true->human eq 'TRUE'; + return 1 unless $false->human eq 'FALSE'; + return 1 unless $set1->human eq "(COND1 and !COND2) or (!COND3)"; + return 1 unless $set2->human eq "(COND1 and !COND2) or (!COND3)"; + my $one_cond_human = $set1->one_cond->human; + return 1 unless $one_cond_human eq "!COND3" + || $one_cond_human eq "COND1 and !COND2"; + return 1 unless $set1->string eq "COND1_TRUE COND2_FALSE | COND3_FALSE"; + + my $merged1 = $set1->merge ($set2); + my $merged2 = $set1->merge ($cond); + my $mult1 = $set1->multiply ($set3); + return threads->new (sub { + my $mult2 = $set1->multiply ($another); + return threads->new (sub { + return 1 unless $merged1->simplify->string eq "COND1_TRUE COND2_FALSE | COND3_FALSE"; + return 1 unless $merged2->simplify->string eq "COND1_TRUE COND2_FALSE | COND3_FALSE"; + return 1 unless $mult1->string eq "COND1_TRUE COND2_FALSE COND3_TRUE COND4_FALSE"; + return 1 unless $mult1 == $mult2; + return 0; + })->join; + })->join; + })->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: diff --git a/t/pm/DisjConditions.pl b/t/pm/DisjConditions.pl new file mode 100644 index 000000000..e7c977534 --- /dev/null +++ b/t/pm/DisjConditions.pl @@ -0,0 +1,404 @@ +# Copyright (C) 2001-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/>. + +use Automake::Condition qw/TRUE FALSE/; +use Automake::DisjConditions; + +sub test_basics () +{ + my $true = new Automake::DisjConditions TRUE; + my $false = new Automake::DisjConditions FALSE; + my $cond = new Automake::Condition "COND1_TRUE", "COND2_FALSE"; + my $other = new Automake::Condition "COND3_FALSE"; + my $another = new Automake::Condition "COND3_TRUE", "COND4_FALSE"; + my $set1 = new Automake::DisjConditions $cond, $other; + my $set2 = new Automake::DisjConditions $other, $cond; + my $set3 = new Automake::DisjConditions FALSE, $another; + 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; + return 1 unless $true->human eq 'TRUE'; + return 1 unless $false->human eq 'FALSE'; + return 1 unless $set1->human eq "(COND1 and !COND2) or (!COND3)"; + return 1 unless $set2->human eq "(COND1 and !COND2) or (!COND3)"; + my $one_cond_human = $set1->one_cond->human; + return 1 unless $one_cond_human eq "!COND3" + || $one_cond_human eq "COND1 and !COND2"; + return 1 unless $set1->string eq "COND1_TRUE COND2_FALSE | COND3_FALSE"; + + my $merged1 = $set1->merge ($set2); + my $merged2 = $set1->merge ($cond); + my $mult1 = $set1->multiply ($set3); + my $mult2 = $set1->multiply ($another); + return 1 unless $merged1->simplify->string eq "COND1_TRUE COND2_FALSE | COND3_FALSE"; + return 1 unless $merged2->simplify->string eq "COND1_TRUE COND2_FALSE | COND3_FALSE"; + return 1 unless $mult1->string eq "COND1_TRUE COND2_FALSE COND3_TRUE COND4_FALSE"; + return 1 unless $mult1 == $mult2; + + return 0; +} + +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: diff --git a/t/pm/Version.pl b/t/pm/Version.pl new file mode 100644 index 000000000..293badcd1 --- /dev/null +++ b/t/pm/Version.pl @@ -0,0 +1,129 @@ +# Copyright (C) 2002-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/>. + +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 $check_expected = ($result == 0 || $result == 1) ? 0 : 1; + # Exception for 'foo' fork. + $check_expected = 1 + if ($right =~ /foo/ && !($left =~ /foo/)); + + my $check = Automake::Version::check ($left, $right); + if ($check != $check_expected) + { + print "check (\"$left\", \"$right\") = $check! (not $check_expected?)\n"; + $failed = 1; + } +} + +sub test_bad_versions +{ + my ($ver) = @_; + my @version = Automake::Version::split ($ver); + if ($#version != -1) + { + print "shouldn't grok \"$ver\"\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], + ['1.5.1f', '1.5.1a', 1], + ['1.5.1f', '1.5.1f', 0], +# 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], + ['1.6-p5', '1.6.5', 0], + ['1.6a-foo', '1.6a-foo', 0], +); + +my @bad_versions = ( + '', 'a', '1', '1a', '1.2.3.4', '-1.2' +); + +test_version_compare (@{$_}) foreach @tests; +test_bad_versions ($_) foreach @bad_versions; + +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: diff --git a/t/pm/Version2.pl b/t/pm/Version2.pl new file mode 100644 index 000000000..b452e475d --- /dev/null +++ b/t/pm/Version2.pl @@ -0,0 +1,20 @@ +# Copyright (C) 2011-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/>. + +# prog_error due to invalid $VERSION. + +use Automake::Version; + +Automake::Version::check ('', '1.2.3'); diff --git a/t/pm/Version3.pl b/t/pm/Version3.pl new file mode 100644 index 000000000..2f7d41375 --- /dev/null +++ b/t/pm/Version3.pl @@ -0,0 +1,20 @@ +# Copyright (C) 2011-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/>. + +# prog_error due to invalid $REQUIRED. + +use Automake::Version; + +Automake::Version::check ('1.2.3', ''); diff --git a/t/pm/Wrap.pl b/t/pm/Wrap.pl new file mode 100644 index 000000000..a929a6a44 --- /dev/null +++ b/t/pm/Wrap.pl @@ -0,0 +1,112 @@ +# Copyright (C) 2003-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/>. + +use Automake::Wrap qw/wrap makefile_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; + } +} + +sub test_makefile_wrap +{ + my ($in, $exp_out) = @_; + + my $out = &makefile_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 +"], + [["big header:", "", " END", 16, "w1", "w2 ", "w3"], +"big header: END +w1 w2 w3 +"]); + +my @makefile_tests = ( + [["target:"], +"target: +"], + [["target:", "\t"], +"target: +"], + [["target:", "\t", "prereq1", "prereq2"], +"target: prereq1 prereq2 +"], + [["target: ", "\t", "this is a long list of prerequisites ending in space", + "so that there is no need for another space before the backslash", + "unlike in the second line"], +"target: this is a long list of prerequisites ending in space \\ +\tso that there is no need for another space before the backslash \\ +\tunlike in the second line +"]); + +test_wrap (@{$_}) foreach @tests; +test_makefile_wrap (@{$_}) foreach @makefile_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: |