ParserTest.java revision 1239:77609e069f9f
1169691Skan/* 297403Sobrien * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 397403Sobrien * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 497403Sobrien * 597403Sobrien * This code is free software; you can redistribute it and/or modify it 697403Sobrien * under the terms of the GNU General Public License version 2 only, as 797403Sobrien * published by the Free Software Foundation. Oracle designates this 897403Sobrien * particular file as subject to the "Classpath" exception as provided 997403Sobrien * by Oracle in the LICENSE file that accompanied this code. 1097403Sobrien * 1197403Sobrien * This code is distributed in the hope that it will be useful, but WITHOUT 1297403Sobrien * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1397403Sobrien * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1497403Sobrien * version 2 for more details (a copy is included in the LICENSE file that 1597403Sobrien * accompanied this code). 16169691Skan * 1797403Sobrien * You should have received a copy of the GNU General Public License version 1897403Sobrien * 2 along with this work; if not, write to the Free Software Foundation, 1997403Sobrien * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2097403Sobrien * 2197403Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2297403Sobrien * or visit www.oracle.com if you need additional information or have any 2397403Sobrien * questions. 2497403Sobrien */ 2597403Sobrien 2697403Sobrienpackage jdk.nashorn.internal.parser.test; 2797403Sobrien 2897403Sobrienimport static jdk.nashorn.internal.runtime.Source.readFully; 2997403Sobrienimport static jdk.nashorn.internal.runtime.Source.sourceFor; 3097403Sobrienimport java.io.File; 3197403Sobrienimport jdk.nashorn.internal.parser.Parser; 3297403Sobrienimport jdk.nashorn.internal.runtime.Context; 3397403Sobrienimport jdk.nashorn.internal.runtime.ErrorManager; 3497403Sobrienimport jdk.nashorn.internal.runtime.Source; 35169691Skanimport jdk.nashorn.internal.runtime.options.Options; 36132720Skanimport org.testng.Assert; 37132720Skanimport org.testng.annotations.AfterClass; 38132720Skanimport org.testng.annotations.BeforeClass; 39132720Skanimport org.testng.annotations.Test; 40132720Skan 41132720Skan/** 4297403Sobrien * Run tests to check Nashorn's parser. 43169691Skan */ 44169691Skan@SuppressWarnings("javadoc") 4597403Sobrienpublic class ParserTest { 4697403Sobrien private static final boolean VERBOSE = Boolean.valueOf(System.getProperty("parsertest.verbose")); 4797403Sobrien private static final boolean TEST262 = Boolean.valueOf(System.getProperty("parsertest.test262")); 4897403Sobrien 4997403Sobrien private static final String TEST_BASIC_DIR = System.getProperty("test.basic.dir"); 5097403Sobrien private static final String TEST262_SUITE_DIR = System.getProperty("test262.suite.dir"); 5197403Sobrien 5297403Sobrien 5397403Sobrien interface TestFilter { 5497403Sobrien public boolean exclude(File file, String content); 5597403Sobrien } 5697403Sobrien 5797403Sobrien private static void log(final String msg) { 5897403Sobrien org.testng.Reporter.log(msg, true); 5997403Sobrien } 6097403Sobrien 6197403Sobrien private Context context; 6297403Sobrien 6397403Sobrien @BeforeClass 64132720Skan public void setupTest() { 6597403Sobrien final Options options = new Options("nashorn"); 6697403Sobrien options.set("parse.only", true); 6797403Sobrien options.set("scripting", true); 68132720Skan options.set("const.as.var", true); 6997403Sobrien 7097403Sobrien final ErrorManager errors = new ErrorManager(); 7197403Sobrien this.context = new Context(options, errors, Thread.currentThread().getContextClassLoader()); 72132720Skan } 7397403Sobrien 7497403Sobrien @AfterClass 7597403Sobrien public void tearDownTest() { 76132720Skan this.context = null; 7797403Sobrien } 7897403Sobrien 7997403Sobrien @Test 80132720Skan public void parseAllTests() { 8197403Sobrien if (TEST262) { 8297403Sobrien parseTestSet(TEST262_SUITE_DIR, new TestFilter() { 8397403Sobrien @Override 84132720Skan public boolean exclude(final File file, final String content) { 8597403Sobrien return content != null && content.contains("@negative"); 8697403Sobrien } 8797403Sobrien }); 88132720Skan } 8997403Sobrien parseTestSet(TEST_BASIC_DIR, new TestFilter() { 9097403Sobrien @Override 9197403Sobrien public boolean exclude(final File file, final String content) { 92132720Skan return file.getName().equals("es6"); 9397403Sobrien } 9497403Sobrien }); 9597403Sobrien } 96132720Skan 9797403Sobrien private void parseTestSet(final String testSet, final TestFilter filter) { 9897403Sobrien passed = 0; 9997403Sobrien failed = 0; 100132720Skan skipped = 0; 10197403Sobrien 10297403Sobrien final File testSetDir = new File(testSet); 10397403Sobrien if (! testSetDir.isDirectory()) { 104169691Skan log("WARNING: " + testSetDir + " not found or not a directory"); 10597403Sobrien return; 10697403Sobrien } 10797403Sobrien log(testSetDir.getAbsolutePath()); 108169691Skan parseJSDirectory(testSetDir, filter); 10997403Sobrien 11097403Sobrien log(testSet + " parse done!"); 11197403Sobrien log("parse ok: " + passed); 112169691Skan log("parse failed: " + failed); 11397403Sobrien log("parse skipped: " + skipped); 11497403Sobrien if (failed != 0) { 11597403Sobrien Assert.fail(failed + " tests failed to compile in " + testSetDir.getAbsolutePath()); 116169691Skan } 11797403Sobrien } 11897403Sobrien 11997403Sobrien // number of scripts that parsed fine 120169691Skan private int passed; 12197403Sobrien // number of scripts resulting in parse failure 12297403Sobrien private int failed; 12397403Sobrien // scripts that were skipped - all tests with @negative are 124169691Skan // skipped for now. 12597403Sobrien private int skipped; 12697403Sobrien 12797403Sobrien private void parseJSDirectory(final File dir, final TestFilter filter) { 128169691Skan if (filter != null && filter.exclude(dir, null)) { 12997403Sobrien return; 13097403Sobrien } 13197403Sobrien for (final File f : dir.listFiles()) { 132169691Skan if (f.isDirectory()) { 13397403Sobrien parseJSDirectory(f, filter); 13497403Sobrien } else if (f.getName().endsWith(".js")) { 13597403Sobrien parseJSFile(f, filter); 136169691Skan } 13797403Sobrien } 13897403Sobrien } 13997403Sobrien 140169691Skan private void parseJSFile(final File file, final TestFilter filter) { 14197403Sobrien if (VERBOSE) { 14297403Sobrien log("Begin parsing " + file.getAbsolutePath()); 14397403Sobrien } 144169691Skan 14597403Sobrien try { 14697403Sobrien final char[] buffer = readFully(file); 14797403Sobrien boolean excluded = false; 148169691Skan if (filter != null) { 14997403Sobrien final String content = new String(buffer); 15097403Sobrien excluded = filter.exclude(file, content); 15197403Sobrien } 152169691Skan 15397403Sobrien if (excluded) { 15497403Sobrien if (VERBOSE) { 15597403Sobrien log("Skipping " + file.getAbsolutePath()); 156169691Skan } 15797403Sobrien skipped++; 158169691Skan return; 159169691Skan } 160 161 final ErrorManager errors = new ErrorManager() { 162 @Override 163 public void error(final String msg) { 164 log(msg); 165 } 166 }; 167 errors.setLimit(0); 168 final Source source = sourceFor(file.getAbsolutePath(), buffer); 169 new Parser(context.getEnv(), source, errors, context.getEnv()._strict, null).parse(); 170 if (errors.getNumberOfErrors() > 0) { 171 log("Parse failed: " + file.getAbsolutePath()); 172 failed++; 173 } else { 174 passed++; 175 } 176 } catch (final Throwable exp) { 177 exp.printStackTrace(); 178 log("Parse failed: " + file.getAbsolutePath() + " : " + exp); 179 if (VERBOSE) { 180 exp.printStackTrace(System.out); 181 } 182 failed++; 183 } 184 185 if (VERBOSE) { 186 log("Done parsing " + file.getAbsolutePath()); 187 } 188 } 189} 190