diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 90ffcef07ff..90ca94b4ab6 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1703,6 +1703,14 @@ module Harness { return (Path.getFileName(filePath) === 'lib.d.ts') || (Path.getFileName(filePath) === 'lib.core.d.ts'); } + export function getDefaultLibraryFile(): { unitName: string, content: string } { + var libFile = Harness.userSpecifiedroot + Harness.libFolder + "/" + "lib.d.ts"; + return { + unitName: libFile, + content: IO.readFile(libFile) + } + } + if (Error) (Error).stackTraceLimit = 1; } diff --git a/src/harness/loggedIO.ts b/src/harness/loggedIO.ts index d9418c0e6ae..8ba38043e78 100644 --- a/src/harness/loggedIO.ts +++ b/src/harness/loggedIO.ts @@ -15,6 +15,7 @@ interface IOLog { arguments: string[]; executingPath: string; currentDirectory: string; + useCustomLibraryFile?: boolean; filesRead: { path: string; codepage: number; diff --git a/src/harness/rwcRunner.ts b/src/harness/rwcRunner.ts index c1c3251cf02..49a15112e9f 100644 --- a/src/harness/rwcRunner.ts +++ b/src/harness/rwcRunner.ts @@ -32,6 +32,7 @@ module RWC { }; var baseName = /(.*)\/(.*).json/.exec(ts.normalizeSlashes(jsonPath))[2]; var currentDirectory: string; + var useCustomLibraryFile: boolean; after(() => { // Mocha holds onto the closure environment of the describe callback even after the test is done. @@ -43,6 +44,10 @@ module RWC { baselineOpts = undefined; baseName = undefined; currentDirectory = undefined; + // useCustomLibraryFile is a flag specified in the json object to indicate whether to use built/local/lib.d.ts + // or to use lib.d.ts inside the json object. If the flag is true, use the lib.d.ts inside json file + // otherwise use the lib.d.ts from built/local + useCustomLibraryFile = undefined; }); it('can compile', () => { @@ -51,34 +56,52 @@ module RWC { var ioLog: IOLog = JSON.parse(Harness.IO.readFile(jsonPath)); currentDirectory = ioLog.currentDirectory; + useCustomLibraryFile = ioLog.useCustomLibraryFile; runWithIOLog(ioLog, () => { opts = ts.parseCommandLine(ioLog.arguments); assert.equal(opts.errors.length, 0); + + // To provide test coverage of output javascript file, + // we will set noEmitOnError flag to be false. + opts.options.noEmitOnError = false; }); runWithIOLog(ioLog, () => { harnessCompiler.reset(); + // Load the files ts.forEach(opts.fileNames, fileName => { inputFiles.push(getHarnessCompilerInputUnit(fileName)); }); - if (!opts.options.noLib) { - // Find the lib.d.ts file in the input file and add it to the input files list - var libFile = ts.forEach(ioLog.filesRead, fileRead=> Harness.isLibraryFile(fileRead.path) ? fileRead.path : undefined); - if (libFile) { - inputFiles.push(getHarnessCompilerInputUnit(libFile)); - } - } - - ts.forEach(ioLog.filesRead, fileRead => { + // Add files to compilation + for(let fileRead of ioLog.filesRead) { + // Check if the file is already added into the set of input files. var resolvedPath = ts.normalizeSlashes(ts.sys.resolvePath(fileRead.path)); - var inInputList = ts.forEach(inputFiles, inputFile=> inputFile.unitName === resolvedPath); - if (!inInputList) { - // Add the file to other files + var inInputList = ts.forEach(inputFiles, inputFile => inputFile.unitName === resolvedPath); + + if (!Harness.isLibraryFile(fileRead.path)) { + if (inInputList) { + continue; + } otherFiles.push(getHarnessCompilerInputUnit(fileRead.path)); } - }); + else if (!opts.options.noLib && Harness.isLibraryFile(fileRead.path)){ + if (!inInputList) { + // If useCustomLibraryFile is true, we will use lib.d.ts from json object + // otherwise use the lib.d.ts from built/local + // Majority of RWC code will be using built/local/lib.d.ts instead of + // lib.d.ts inside json file. However, some RWC cases will still use + // their own version of lib.d.ts because they have customized lib.d.ts + if (useCustomLibraryFile) { + inputFiles.push(getHarnessCompilerInputUnit(fileRead.path)); + } + else { + inputFiles.push(Harness.getDefaultLibraryFile()); + } + } + } + } // do not use lib since we already read it in above opts.options.noLib = true; @@ -115,9 +138,10 @@ module RWC { it('has the expected declaration file content', () => { Harness.Baseline.runBaseline('has the expected declaration file content', baseName + '.d.ts', () => { - if (compilerResult.errors.length || !compilerResult.declFilesCode.length) { + if (!compilerResult.declFilesCode.length) { return null; } + return Harness.Compiler.collateOutputs(compilerResult.declFilesCode); }, false, baselineOpts); });