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