1: # Before `make install' is performed this script should be runnable with 2: # `make test'. After `make install' it should work as `perl test.pl' 3: use strict; 4: use warnings; 5: use Test; 6: my $loaded; 7: BEGIN { 8: $| = 1; $^W = 1; $loaded = 0; 9: ###################################################################### 10: plan tests =>13, todo => [10,12], onfail => sub { warn "not ok!\n"; }; 11: # test 12: Grove driver sgml identity test 12: # SGML Grove doesn't have comments or attribute defaulting 13: # test 10: SGMLS driver xml identity test 14: # this test favors the Grove's (less complete) output 15: ###################################################################### 16: 18: } 19: END {ok(0) unless $loaded; 1;} 20: use SGML::ElementMap; 21: use Hash::Layered; 23: ### test: modules load 24: $loaded = 1; 25: ok(1); # test 1 27: ######################### End of black magic. 29: # pre-test verify 30: if (diff('Makefile.PL','Makefile.PL')) { 31: die "Unknown problem with test.pl diff call. Tests aborted.\n"; 32: } 34: # some constants 35: my @driver_list = ( 36: 'SGML::ElementMap::Driver::Grove', 37: 'SGML::ElementMap::Driver::SGMLS', 38: 'SGML::ElementMap::Driver::XMLParser', 39: #'SGML::ElementMap::Driver::SAXParser', 40: ); 42: my ($do_core_test,$do_null_test,$do_identity_test,$do_calc_test) = (1,1,1,1); 45: ###################################################################### 46: ## Test Basic Mechanisms 48: if ($do_core_test) { 49: ok(test_split_envspec()); # test 2 50: } 53: if ($do_null_test) { 54: my $testf = './examples/identity/test-x1.xml'; 55: #my $testf = './test-xml-bom.xml'; 56: #my $testf = '/home/xethair/SGML/cvsdev/xmlschema/triv.xsd'; 57: foreach my $driver ('default',@driver_list) { 58: warn "# NEXT null:$driver:$testf\n"; 59: my $r = eval { 60: my $obj = new SGML::ElementMap; 61: $obj->element('','process'); 62: $obj->sdata('','suppress'); 63: $obj->cdata('','suppress'); 64: $obj->pi('','suppress'); 65: $obj->comment('','suppress'); 66: if ($driver ne 'default') { 67: $obj->driver($driver); 68: } 69: $obj->process_xml_file($testf); 70: }; 71: warn $@ if (!defined $r); 72: ok(defined $r); #test 3,4,5 73: } 74: } 76: ###################################################################### 77: ## Calculator Tests 79: if ($do_calc_test) { 80: harness('./examples/calculator', 81: 'SGML::ElementMap::Example::Calculator','calc.pm','calc',1); 82: #harness('./examples/calculator', # chokes from case sensitivity 83: # 'SGML::ElementMap::Example::Calculator','calc.pm','calc',0); 84: } 86: ###################################################################### 87: ## Identity Tests 89: if ($do_identity_test) { 90: harness('./examples/identity', 'SGML::ElementMap::Example::Identity', 91: 'identity.pm', 'xml', 0); 92: harness('./examples/identity', 'SGML::ElementMap::Example::Identity', 93: 'identity.pm', 'sgml', 1); 94: } 97: exit 0; 100: sub diff { 101: my ($af,$bf) = @_; 102: my ($a,$b,$found); 103: open AF,"<".$af; 104: open BF,"<".$bf; 105: $found = 0; 106: while (!$found) { 107: last if eof(AF) || eof(BF); 108: $a = <AF>; $b = <BF>; 109: chomp $a; chomp $b; # because system line endings might differ (?) 110: $found = 1 if ($a ne $b); 111: } 112: $found = $found || !(eof(AF) && eof(BF)); 113: close AF; 114: close BF; 115: return $found; 117: } 119: # test harness for modules 120: # module must have ::Initialize and should look at ::is_sgml 121: sub harness { 122: my ($path,$module,$mod_file,$ext,$is_sgml) = @_; 123: 124: open REAL_OUT,">&STDOUT"; 125: open REAL_ERR,">&STDERR"; 126: 127: my $val = eval { 128: require $path."/".$mod_file; 129: 130: opendir TD,$path; 131: foreach my $testf (readdir TD) { 132: next unless ($testf =~ /^(test-.*)\.$ext$/i); 133: my $source = $path.'/'.$testf; 134: my $target = $path.'/'.$1.'.out'; 135: my $resultbase = $path.'/'.$1.'.test-out'; 136: my $match = 0; 137: my $mark_type = ($is_sgml ? 'SGML' : 'XML'); 138: # make samples if they aren't there? 139: my $pass = 0; 140: foreach my $driver (@driver_list) { 141: $pass += 1; 142: warn join ('',"# NEXT ",$testf," ", 143: ($module =~ m/::([^:]+)$/)[0], 144: ' ',$pass,": using ", 145: ($driver =~ m/::([^:]+)$/)[0], 146: "\n"); 147: my $result = $resultbase.'-'.$pass; 148: open STDERR,">".$result; 149: open STDOUT,">&STDERR"; 150: my $r = eval { 151: my $engine = new SGML::ElementMap; 152: my $driver_obj; 153: $driver_obj = eval qq{ # begin DOUBLE-QUOTE EVAL 154: use $driver (); 155: \$driver_obj = new $driver(); 156: if (defined \$driver_obj) { 157: if (defined(\$driver_obj->markup('$mark_type'))) { 158: \$driver_obj; 159: } else { 160: 0; 161: } 162: } else { 163: undef; 164: }; 165: }; # end DOUBLE-QUOTE EVAL 166: #$driver_obj-> 167: if (! defined $driver_obj) { 168: die "failed to instantiate ".$driver; 169: return 0; 170: } elsif (! $driver_obj) { 171: warn $driver." refuses markup type ".$mark_type."\n"; 172: return -1; 173: } 174: my $init_ref = eval "\$".$module."::is_sgml=".$is_sgml.';'. 175: ' \&'.$module.'::Initialize;'; 176: die "no init ref" unless ref $init_ref; 177: &$init_ref($engine); 178: $engine->driver($driver_obj); 179: if ($is_sgml) { 180: $engine->process_sgml_file($source); 181: } else { 182: $engine->process_xml_file($source); 183: } 184: }; 185: warn $@ if (!defined $r); 186: open STDOUT,">&REAL_OUT"; 187: open STDERR,">&REAL_ERR"; 188: warn $@ if (!defined $r); 190: # cases 191: # $r negative: markup not supported 192: # $r not defined: failure by exception 193: # $r false: reported failure 194: # $r positive: successful exit 195: 196: if (!$r) { 197: # failure 198: $match = 0; 199: } elsif ($r < 0) { 200: # no support 201: $match = -1; 202: } else { 203: # successful exit 204: $match = ((!-f $result) || diff($target, $result)) ? 0 : 1; 205: } 206: unlink $result unless ! $match; 207: if ($match < 0) { 208: warn "#skip\n"; 209: next; # if $match < 0; 210: } 211: ok($match); 212: if (0) { 213: $match = (defined($r) && $r) || ''; 214: if ($match && $r > 0) { 215: $match = -f $result; 216: if ($match) { 217: if (diff($target,$result)) { 218: $match = 0; 219: } else { 220: unlink $result; 221: } 222: } 223: } 224: ok($match) unless defined ($match) && $match < 0; # test #? 225: } 226: } 227: } 228: closedir TD; 229: 1; 230: }; 231: warn $@ unless defined $val; 233: open STDOUT,">&REAL_OUT"; 234: open STDERR,">&REAL_ERR"; 235: close REAL_OUT; 236: close REAL_ERR; 238: return $val; 239: } 241: ###################################################################### 242: # Test Runners 244: sub test_split_envspec { 245: my ($failed,$spec,$k,$p,$rl,$v,$r,$ti); 246: my @test_envs = ('/A','/B/A', 247: '/C/A', '/C/B/A','/C/A/D','/C/B/D/A','/B/D/A'); 248: my %test_specs = 249: ('' => [1,1,1,1,1,1,1], 250: 'A' => [1,1,1,1,0,1,1], # same as //A 251: '/A' => [1,0,0,0,0,0,0], 252: '/B/A' => [0,1,0,0,0,0,0], 253: 'B/A' => [0,1,0,1,0,0,0], 254: '/B//A' => [0,1,0,0,0,0,1], 255: 'B//A' => [0,1,0,1,0,1,1], 256: '//A' => [1,1,1,1,0,1,1], 257: 'A//' => [0,0,0,0,1,0,0], 258: '/B/' => [0,1,0,0,0,0,0], 259: '/C//' => [0,0,1,1,1,1,0], 260: ); 261: $failed = 0; 262: foreach $spec (keys %test_specs) { 263: ($k,$p) = SGML::ElementMap::split_envspec($spec); 264: $rl = $test_specs{$spec}; 265: for ($ti=0; $ti<@test_envs; $ti+=1) { 266: $r = $rl->[$ti]; 267: $v = ( ($p eq '') || ($test_envs[$ti] =~ m/^$p$/) ); 268: if ( ($v && !$r) || ($r && !$v) ) { 269: $failed = 1; 270: warn "# fail: " . ($r? 'expected' : 'unexpected') . ' match ' . 271: ($v? 'succeeded' : 'failed') . 272: ': SPEC[' . $spec . '] ENV['. $test_envs[$ti] . 273: "] PAT{".$p."}\n"; 274: } 275: } 277: } 278: return $failed ? 0 : 1; 279: } 283: 1;