void ECMAscriptTest::initTestCase() { basedir = QString::fromUtf8( qgetenv( "ECMATEST_BASEDIR" ) ); if ( basedir.isEmpty() ) qFatal( "ECMATEST_BASEDIR not set" ); if ( !basedir.endsWith( QLatin1Char( '/' ) ) ) basedir += QLatin1Char( '/' ); QVERIFY( loadInclude( "sta.js" ) ); QVERIFY( loadInclude( "ed.js" ) ); testrunner = includes[ "sta.js" ] + includes[ "ed.js" ] + '\n'; const QString brokenFn = QString::fromAscii( qgetenv( "ECMATEST_BROKEN" ) ); if ( !brokenFn.isEmpty() ) { QFile brokenF( brokenFn ); if ( !brokenF.open( QIODevice::ReadOnly ) ) { const QString errmsg = QString::fromAscii( "cannot open " ) + brokenFn; QWARN( errmsg.toAscii() ); } else { expectedBroken = QString::fromAscii( brokenF.readAll() ).split( QLatin1Char( '\n' ) ) .filter( QRegExp( "^[^#].*" ) ); } } m_passed = 0; }
bool ResourceManifest::loadInclude(IPropertyTree &include, const char *dir) { const char *filename = include.queryProp("@filename"); StringBuffer includePath; makeAbsolutePath(filename, dir, includePath); VStringBuffer xpath("Include[@originalFilename='%s']", includePath.str()); if (manifest->hasProp(xpath.str())) return false; include.setProp("@originalFilename", includePath.str()); StringBuffer includeDir; splitDirTail(includePath, includeDir); Owned<IPropertyTree> manifestInclude = createPTreeFromXMLFile(includePath.str()); Owned<IPropertyTreeIterator> it = manifestInclude->getElements("*"); ForEach(*it) { IPropertyTree &item = it->query(); if (streq(item.queryName(), "Resource")) updateResourcePaths(item, includeDir.str()); else if (streq(item.queryName(), "Include")) { if (!loadInclude(item, includeDir.str())) continue; } manifest->addPropTree(item.queryName(), LINK(&item)); } return true; }
void ResourceManifest::expand() { manifest->setProp("@manifestDir", dir.str()); Owned<IPropertyTreeIterator> resources = manifest->getElements("Resource[@filename]"); ForEach(*resources) updateResourcePaths(resources->query(), dir.str()); Owned<IPropertyTreeIterator> includes = manifest->getElements("Include[@filename]"); ForEach(*includes) loadInclude(includes->query(), dir.str()); resources.setown(manifest->getElements("Resource[@filename]")); ForEach(*resources) { IPropertyTree &res = resources->query(); const char *name = res.queryProp("@originalFilename"); if (containsFileWildcard(name)) { StringBuffer wildpath; const char *tail = splitDirTail(name, wildpath); expandDirectory(res, wildpath, tail, res.getPropBool("@recursive")); manifest->removeTree(&res); } } }
void ECMAscriptTest::runAllTests() { static const QByteArray include = "$INCLUDE(\""; QFETCH(QString, filename); QByteArray expectedError; QFile input( filename ); foreach ( const QByteArray &skip, skips.keys() ) { if ( skip == QTest::currentDataTag() ) QSKIP( skips[ skip ], SkipSingle ); } QVERIFY( input.open( QIODevice::ReadOnly ) ); const QByteArray testdata = input.readAll(); QVERIFY( ! testdata.isEmpty() ); RefPtr<KJS::Interpreter> interp = new KJS::Interpreter(global); KJS::Interpreter::setShouldPrintExceptions(true); QByteArray testscript; // test is expected to fail if ( testdata.indexOf( "@negative" ) >= 0 ) { expectedError = getTextProperty( "@negative", testdata ); if ( expectedError.isEmpty() ) expectedError = "."; } int from = 0; while ( ( from = testdata.indexOf( include, from ) ) >= 0 ) { int endq = testdata.indexOf( "\"", from + include.length() ); QVERIFY( endq >= 0 ); const QByteArray includeFile = testdata.mid( from + include.length(), endq - from - include.length() ); if ( ! includes.contains( includeFile ) ) QVERIFY( loadInclude( includeFile ) ); testscript += includes[ includeFile ]; from = endq; } testscript += testrunner; testscript += testdata; const QFileInfo info( input ); const QString scriptutf = QString::fromUtf8( testscript.constData() ); KJS::Completion completion = interp->evaluate(info.fileName().toAscii().constData(), 0, scriptutf); const bool knownBroken = expectedBroken.contains( QString::fromAscii( QTest::currentDataTag() ) ); if ( expectedError.isEmpty() ) { ECMATEST_VERIFY( completion.complType() != KJS::Throw ); } else { if ( knownBroken && completion.complType() != KJS::Throw ) { QEXPECT_FAIL(QTest::currentDataTag(), "It is known that KJS doesn't pass this test", Abort); m_failed++; } QCOMPARE( completion.complType(), KJS::Throw ); QVERIFY( completion.value() != NULL ); const QString eMsg = exceptionToString( interp->execState(), completion.value() ); if ( expectedError == "^((?!NotEarlyError).)*$" ) { ECMATEST_VERIFY( eMsg.indexOf( "NotEarlyError" ) == -1 ); } else if ( expectedError == "." ) { // means "every exception passes } else { ECMATEST_VERIFY( eMsg.indexOf( expectedError ) >= 0 ); } } }