1#!/usr/bin/perl 2# 3# The contents of this file are subject to the Netscape Public 4# License Version 1.1 (the "License"); you may not use this file 5# except in compliance with the License. You may obtain a copy of 6# the License at http://www.mozilla.org/NPL/ 7# 8# Software distributed under the License is distributed on an "AS 9# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 10# implied. See the License for the specific language governing 11# rights and limitations under the License. 12# 13# The Original Code is JavaScript Core Tests. 14# 15# The Initial Developer of the Original Code is Netscape 16# Communications Corporation. Portions created by Netscape are 17# Copyright (C) 1997-1999 Netscape Communications Corporation. All 18# Rights Reserved. 19# 20# Alternatively, the contents of this file may be used under the 21# terms of the GNU Public License (the "GPL"), in which case the 22# provisions of the GPL are applicable instead of those above. 23# If you wish to allow use of your version of this file only 24# under the terms of the GPL and not to allow others to use your 25# version of this file under the NPL, indicate your decision by 26# deleting the provisions above and replace them with the notice 27# and other provisions required by the GPL. If you do not delete 28# the provisions above, a recipient may use your version of this 29# file under either the NPL or the GPL. 30# 31# Contributers: 32# Robert Ginda 33# 34# Creates the meat of a test suite manager page, requites menuhead.html and menufoot.html 35# to create the complete page. The test suite manager lets you choose a subset of tests 36# to run under the runtests2.pl script. 37# 38 39local $lxr_url = "http://lxr.mozilla.org/mozilla/source/js/tests/"; 40local $suite_path = $ARGV[0] || "./"; 41local $uid = 0; # radio button unique ID 42local $html = ""; # html output 43local $javascript = ""; # script output 44 45&main; 46 47print (&scriptTag($javascript) . "\n"); 48print ($html); 49 50sub main { 51 local $i, @suite_list; 52 53 if (!($suite_path =~ /\/$/)) { 54 $suite_path = $suite_path . "/"; 55 } 56 57 @suite_list = sort(&get_subdirs ($suite_path)); 58 59 $javascript .= "suites = new Object();\n"; 60 61 $html .= "<h3>Test Suites:</h3>\n"; 62 $html .= "<center>\n"; 63 $html .= " <input type='button' value='Select All' " . 64 "onclick='selectAll();'> "; 65 $html .= " <input type='button' value='Select None' " . 66 "onclick='selectNone();'> "; 67 68 # suite menu 69 $html .= "<table border='1'>\n"; 70 foreach $suite (@suite_list) { 71 local @readme_text = ("No description available."); 72 if (open (README, $suite_path . $suite . "/README")) { 73 @readme_text = <README>; 74 close (README); 75 } 76 $html .= "<tr><td><a href='\#SUITE_$suite'>$suite</a></td>" . 77 "<td>@readme_text</td>"; 78 $html .= "<td><input type='button' value='Select All' " . 79 "onclick='selectAll(\"$suite\");'> "; 80 $html .= "<input type='button' value='Select None' " . 81 "onclick='selectNone(\"$suite\");'></td>"; 82 $html .= "<td><input readonly name='SUMMARY_$suite'></td>"; 83 $html .= "</tr>"; 84 } 85 $html .= "</table>\n"; 86 $html .= "<td><input readonly name='TOTAL'></td>"; 87 $html .= "</center>"; 88 $html .= "<dl>\n"; 89 90 foreach $i (0 .. $#suite_list) { 91 local $prev_href = ($i > 0) ? "\#SUITE_" . $suite_list[$i - 1] : ""; 92 local $next_href = ($i < $#suite_list) ? "\#SUITE_" . $suite_list[$i + 1] : ""; 93 &process_suite ($suite_path, $suite_list[$i], $prev_href, $next_href); 94 } 95 96 $html .= "</dl>\n"; 97 98} 99 100# 101# Append detail from a 'suite' directory (eg: ecma, ecma_2, js1_1, etc.), calling 102# process_test_dir for subordinate categories. 103# 104sub process_suite { 105 local ($suite_path, $suite, $prev_href, $next_href) = @_; 106 local $i, @test_dir_list; 107 108 # suite js object 109 $javascript .= "suites[\"$suite\"] = {testDirs: {}};\n"; 110 111 @test_dir_list = sort(&get_subdirs ($test_home . $suite)); 112 113 # suite header 114 $html .= " <a name='SUITE_$suite'></a><hr><dt><big><big><b>$suite " . 115 "(" . ($#test_dir_list + 1) . " Sub-Categories)</b></big></big><br>\n"; 116 $html .= " <input type='button' value='Select All' " . 117 "onclick='selectAll(\"$suite\");'>\n"; 118 $html .= " <input type='button' value='Select None' " . 119 "onclick='selectNone(\"$suite\");'> " . 120 "[ <a href='\#top_of_page'>Top of page</a> "; 121 if ($prev_href) { 122 $html .= " | <a href='$prev_href'>Previous Suite</a> "; 123 } 124 if ($next_href) { 125 $html .= " | <a href='$next_href'>Next Suite</a> "; 126 } 127 $html .= "]\n"; 128 129 $html .= " <dd>\n <dl>\n"; 130 131 foreach $i (0 .. $#test_dir_list) { 132 local $prev_href = ($i > 0) ? "\#TESTDIR_" . $suite . $test_dir_list[$i - 1] : 133 ""; 134 local $next_href = ($i < $#test_dir_list) ? 135 "\#TESTDIR_" . $suite . $test_dir_list[$i + 1] : ""; 136 &process_test_dir ($suite_path . $suite . "/", $test_dir_list[$i], $suite, 137 $prev_href, $next_href); 138 } 139 140 $html .= " </dl>\n"; 141 142} 143 144# 145# Append detail from a test directory, calling process_test for subordinate js files 146# 147sub process_test_dir { 148 local ($test_dir_path, $test_dir, $suite, $prev_href, $next_href) = @_; 149 150 @test_list = sort(&get_js_files ($test_dir_path . $test_dir)); 151 152 $javascript .= "suites[\"$suite\"].testDirs[\"$test_dir\"] = {tests: {}};\n"; 153 154 $html .= " <a name='TESTDIR_$suite$test_dir'></a>\n"; 155 $html .= " <dt><big><b>$test_dir (" . ($#test_list + 1) . 156 " tests)</b></big><br>\n"; 157 $html .= " <input type='button' value='Select All' " . 158 "onclick='selectAll(\"$suite\", \"$test_dir\");'>\n"; 159 $html .= " <input type='button' value='Select None' " . 160 "onclick='selectNone(\"$suite\", \"$test_dir\");'> "; 161 $html .= "[ <a href='\#SUITE_$suite'>Top of $suite Suite</a> "; 162 if ($prev_href) { 163 $html .= "| <a href='$prev_href'>Previous Category</a> "; 164 } 165 if ($next_href) { 166 $html .= " | <a href='$next_href'>Next Category</a> "; 167 } 168 $html .= "]<br>\n"; 169 $html .= " </dt>\n"; 170 171 $html .= " <dl>\n"; 172 173 foreach $test (@test_list) { 174 &process_test ($test_dir_path . $test_dir, $test); 175 } 176 177 $html .= " </dl>\n"; 178} 179 180 181# 182# Append detail from a single JavaScript file. 183# 184sub process_test { 185 local ($test_dir_path, $test) = @_; 186 local $title = ""; 187 188 $uid++; 189 190 open (TESTCASE, $test_dir_path . "/" . $test) || 191 die ("Error opening " . $test_dir_path . "/" . $test); 192 193 while (<TESTCASE>) { 194 if (/.*TITLE\s+\=\s+\"(.*)\"/) { 195 $title = $1; 196 break; 197 } 198 } 199 close (TESTCASE); 200 201 $javascript .= "suites[\"$suite\"].testDirs[\"$test_dir\"].tests" . 202 "[\"$test\"] = \"radio$uid\"\n"; 203 $html .= " <input type='radio' value='$test' name='radio$uid' ". 204 "onclick='return onRadioClick(\"radio$uid\");'>" . 205 "<a href='$lxr_url$suite/$test_dir/$test' target='other_window'>" . 206 "$test</a> $title<br>\n"; 207 208} 209 210sub scriptTag { 211 212 return ("<script langugage='JavaScript'>@_</script>"); 213 214} 215 216# 217# given a directory, return an array of all subdirectories 218# 219sub get_subdirs { 220 local ($dir) = @_; 221 local @subdirs; 222 223 if (!($dir =~ /\/$/)) { 224 $dir = $dir . "/"; 225 } 226 227 opendir (DIR, $dir) || die ("couldn't open directory $dir: $!"); 228 local @testdir_contents = readdir(DIR); 229 closedir(DIR); 230 231 foreach (@testdir_contents) { 232 if ((-d ($dir . $_)) && ($_ ne 'CVS') && ($_ ne '.') && ($_ ne '..')) { 233 @subdirs[$#subdirs + 1] = $_; 234 } 235 } 236 237 return @subdirs; 238} 239 240# 241# given a directory, return an array of all the js files that are in it. 242# 243sub get_js_files { 244 local ($test_subdir) = @_; 245 local @js_file_array; 246 247 opendir ( TEST_SUBDIR, $test_subdir) || die ("couldn't open directory " . 248 "$test_subdir: $!"); 249 @subdir_files = readdir( TEST_SUBDIR ); 250 closedir( TEST_SUBDIR ); 251 252 foreach ( @subdir_files ) { 253 if ( $_ =~ /\.js$/ ) { 254 $js_file_array[$#js_file_array+1] = $_; 255 } 256 } 257 258 return @js_file_array; 259} 260 261 262