| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 | # Copyright (C) 2001-2017 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:
 |