Enable tests for the case sensitive and non case sensitive path resolution during soucemap path calculation

This commit is contained in:
Sheetal Nandi 2014-10-03 15:07:18 -07:00
parent 00e5b15a05
commit fe8f736207
12 changed files with 452 additions and 22 deletions

View File

@ -2096,9 +2096,6 @@ module FourSlash {
xmlData.push(xml);
}
// Cache these between executions so we don't have to re-parse them for every test
var fourslashSourceFile: ts.SourceFile = undefined;
export function runFourSlashTestContent(content: string, fileName: string): TestXmlData {
// Parse out the files and their metadata
var testData = parseTestData(content, fileName);
@ -2106,21 +2103,16 @@ module FourSlash {
currentTestState = new TestState(testData);
var result = '';
var fourslashFilename = 'fourslash.ts';
var tsFn = 'tests/cases/fourslash/' + fourslashFilename;
fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), ts.ScriptTarget.ES5, /*version*/ "0", /*isOpen*/ false);
var files: { [filename: string]: ts.SourceFile; } = {};
files[Harness.Compiler.getCanonicalFileName(fourslashFilename)] = fourslashSourceFile;
files[Harness.Compiler.getCanonicalFileName(fileName)] = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES5, /*version*/ "0", /*isOpen*/ false);
files[Harness.Compiler.getCanonicalFileName(Harness.Compiler.defaultLibFileName)] = Harness.Compiler.defaultLibSourceFile;
var host = Harness.Compiler.createCompilerHost(files, (fn, contents) => result = contents);
var program = ts.createProgram([fourslashFilename, fileName], { out: "fourslashTestOutput.js" }, host);
var host = Harness.Compiler.createCompilerHost([{ unitName: Harness.Compiler.fourslashFilename, content: undefined },
{ unitName: fileName, content: content }],
(fn, contents) => result = contents,
ts.ScriptTarget.ES5,
sys.useCaseSensitiveFileNames);
var program = ts.createProgram([Harness.Compiler.fourslashFilename, fileName], { out: "fourslashTestOutput.js" }, host);
var checker = ts.createTypeChecker(program, /*fullTypeCheckMode*/ true);
checker.checkProgram();
var errs = checker.getDiagnostics(files[fileName]);
var errs = checker.getDiagnostics(program.getSourceFile(fileName));
if (errs.length > 0) {
throw new Error('Error compiling ' + fileName + ': ' + errs.map(e => e.messageText).join('\r\n'));
}

View File

@ -534,18 +534,47 @@ module Harness {
export var defaultLibFileName = 'lib.d.ts';
export var defaultLibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.d.ts'), /*languageVersion*/ ts.ScriptTarget.ES5, /*version:*/ "0");
// Cache these between executions so we don't have to re-parse them for every test
export var fourslashFilename = 'fourslash.ts';
export var fourslashSourceFile: ts.SourceFile;
export function getCanonicalFileName(fileName: string): string {
return sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
}
export function createCompilerHost(filemap: { [filename: string]: ts.SourceFile; }, writeFile: (fn: string, contents: string, writeByteOrderMark:boolean) => void): ts.CompilerHost {
export function createCompilerHost(inputFiles: { unitName: string; content: string; }[],
writeFile: (fn: string, contents: string, writeByteOrderMark: boolean) => void,
scriptTarget: ts.ScriptTarget,
useCaseSensitiveFileNames: boolean): ts.CompilerHost {
// Local get canonical file name function, that depends on passed in parameter for useCaseSensitiveFileNames
function getCanonicalFileName(fileName: string): string {
return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
}
var filemap: { [filename: string]: ts.SourceFile; } = {};
// Register input files
function register(file: { unitName: string; content: string; }) {
if (file.content !== undefined) {
var filename = Path.switchToForwardSlashes(file.unitName);
filemap[getCanonicalFileName(filename)] = ts.createSourceFile(filename, file.content, scriptTarget, /*version:*/ "0");
}
};
inputFiles.forEach(register);
return {
getCurrentDirectory: sys.getCurrentDirectory,
getCancellationToken: (): any => undefined,
getSourceFile: (fn, languageVersion) => {
if (Object.prototype.hasOwnProperty.call(filemap, getCanonicalFileName(fn))) {
return filemap[getCanonicalFileName(fn)];
} else {
}
else if (fn === fourslashFilename) {
var tsFn = 'tests/cases/fourslash/' + fourslashFilename;
fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), scriptTarget, /*version*/ "0", /*isOpen*/ false);
return fourslashSourceFile;
}
else {
var lib = defaultLibFileName;
if (fn === defaultLibFileName) {
return defaultLibSourceFile;
@ -557,7 +586,7 @@ module Harness {
getDefaultLibFilename: () => defaultLibFileName,
writeFile: writeFile,
getCanonicalFileName: getCanonicalFileName,
useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames,
useCaseSensitiveFileNames: () => useCaseSensitiveFileNames,
getNewLine: ()=> sys.newLine
};
}
@ -614,7 +643,7 @@ module Harness {
}
public compileFiles(inputFiles: { unitName: string; content: string }[],
otherFiles: { unitName: string; content?: string }[],
otherFiles: { unitName: string; content: string }[],
onComplete: (result: CompilerResult, checker: ts.TypeChecker) => void,
settingsCallback?: (settings: ts.CompilerOptions) => void,
options?: ts.CompilerOptions) {
@ -628,6 +657,7 @@ module Harness {
settingsCallback(null);
}
var useCaseSensitiveFileNames = sys.useCaseSensitiveFileNames;
this.settings.forEach(setting => {
switch (setting.flag.toLowerCase()) {
// "filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve"
@ -706,10 +736,13 @@ module Harness {
options.removeComments = setting.value === 'false';
break;
case 'usecasesensitivefilenames':
useCaseSensitiveFileNames = setting.value === 'true';
break;
case 'mapsourcefiles':
case 'maproot':
case 'generatedeclarationfiles':
case 'usecasesensitivefileresolution':
case 'gatherDiagnostics':
case 'codepage':
case 'createFileLog':
@ -748,7 +781,10 @@ module Harness {
var fileOutputs: GeneratedFile[] = [];
var programFiles = inputFiles.map(file => file.unitName);
var program = ts.createProgram(programFiles, options, createCompilerHost(filemap, (fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark })));
var program = ts.createProgram(programFiles, options, createCompilerHost(inputFiles.concat(otherFiles),
(fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark }),
options.target,
useCaseSensitiveFileNames));
var hadParseErrors = program.getDiagnostics().length > 0;
@ -1034,7 +1070,7 @@ module Harness {
var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines
// List of allowed metadata names
var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve", "newline", "newlines", "emitbom", "errortruncation"];
var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outDir", "noimplicitany", "noresolve", "newline", "newlines", "emitbom", "errortruncation", "usecasesensitivefilenames"];
function extractCompilerSettings(content: string): CompilerSetting[] {

View File

@ -0,0 +1,26 @@
//// [tests/cases/compiler/sourceMapWithCaseSensitiveFileNames.ts] ////
//// [app.ts]
// Note in the out result we are using same folder name only different in casing
// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
class c {
}
//// [app2.ts]
class d {
}
//// [fooResult.js]
// Note in the out result we are using same folder name only different in casing
// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
var c = (function () {
function c() {
}
return c;
})();
var d = (function () {
function d() {
}
return d;
})();
//# sourceMappingURL=fooResult.js.map

View File

@ -0,0 +1,2 @@
//// [fooResult.js.map]
{"version":3,"file":"fooResult.js","sourceRoot":"","sources":["../testFiles/app.ts","../testFiles/app2.ts"],"names":["c","c.constructor","d","d.constructor"],"mappings":"AAEA,AAFA,gFAAgF;AAChF,wIAAwI;IAClI,CAAC;IAAPA,SAAMA,CAACA;IACPC,CAACA;IAADD,QAACA;AAADA,CAACA,AADD,IACC;ACHD,IAAM,CAAC;IAAPE,SAAMA,CAACA;IACPC,CAACA;IAADD,QAACA;AAADA,CAACA,AADD,IACC"}

View File

@ -0,0 +1,150 @@
===================================================================
JsFile: fooResult.js
mapUrl: fooResult.js.map
sourceRoot:
sources: ../testFiles/app.ts,../testFiles/app2.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/testfiles/fooResult.js
sourceFile:../testFiles/app.ts
-------------------------------------------------------------------
>>>// Note in the out result we are using same folder name only different in casing
1 >
2 >
3 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >// Note in the out result we are using same folder name only different in casing
>// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
>
2 >
3 >// Note in the out result we are using same folder name only different in casing
1 >Emitted(1, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
3 >Emitted(1, 81) Source(1, 81) + SourceIndex(0)
---
>>>// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
1->
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1->
>
2 >// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
1->Emitted(2, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(2, 137) Source(2, 137) + SourceIndex(0)
---
>>>var c = (function () {
1 >^^^^
2 > ^
3 > ^^^^^^^^^^^^^^->
1 >
>class
2 > c
1 >Emitted(3, 5) Source(3, 7) + SourceIndex(0)
2 >Emitted(3, 6) Source(3, 8) + SourceIndex(0)
---
>>> function c() {
1->^^^^
2 > ^^^^^^^^^
3 > ^
1->
2 > class
3 > c
1->Emitted(4, 5) Source(3, 1) + SourceIndex(0) name (c)
2 >Emitted(4, 14) Source(3, 7) + SourceIndex(0) name (c)
3 >Emitted(4, 15) Source(3, 8) + SourceIndex(0) name (c)
---
>>> }
1 >^^^^
2 > ^
3 > ^^^^^^^^^->
1 > {
>
2 > }
1 >Emitted(5, 5) Source(4, 1) + SourceIndex(0) name (c.constructor)
2 >Emitted(5, 6) Source(4, 2) + SourceIndex(0) name (c.constructor)
---
>>> return c;
1->^^^^
2 > ^^^^^^^^
1->
2 > }
1->Emitted(6, 5) Source(4, 1) + SourceIndex(0) name (c)
2 >Emitted(6, 13) Source(4, 2) + SourceIndex(0) name (c)
---
>>>})();
1 >
2 >^
3 >
4 > ^^^^
5 > ^^^^^^^^^^^^^^^^^^->
1 >
2 >}
3 >
4 > class c {
> }
1 >Emitted(7, 1) Source(4, 1) + SourceIndex(0) name (c)
2 >Emitted(7, 2) Source(4, 2) + SourceIndex(0) name (c)
3 >Emitted(7, 2) Source(3, 1) + SourceIndex(0)
4 >Emitted(7, 6) Source(4, 2) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/testfiles/fooResult.js
sourceFile:../testFiles/app2.ts
-------------------------------------------------------------------
>>>var d = (function () {
1->
2 >^^^^
3 > ^
4 > ^^^^^^^^^^^^^^->
1->
2 >class
3 > d
1->Emitted(8, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(8, 5) Source(1, 7) + SourceIndex(1)
3 >Emitted(8, 6) Source(1, 8) + SourceIndex(1)
---
>>> function d() {
1->^^^^
2 > ^^^^^^^^^
3 > ^
1->
2 > class
3 > d
1->Emitted(9, 5) Source(1, 1) + SourceIndex(1) name (d)
2 >Emitted(9, 14) Source(1, 7) + SourceIndex(1) name (d)
3 >Emitted(9, 15) Source(1, 8) + SourceIndex(1) name (d)
---
>>> }
1 >^^^^
2 > ^
3 > ^^^^^^^^^->
1 > {
>
2 > }
1 >Emitted(10, 5) Source(2, 1) + SourceIndex(1) name (d.constructor)
2 >Emitted(10, 6) Source(2, 2) + SourceIndex(1) name (d.constructor)
---
>>> return d;
1->^^^^
2 > ^^^^^^^^
1->
2 > }
1->Emitted(11, 5) Source(2, 1) + SourceIndex(1) name (d)
2 >Emitted(11, 13) Source(2, 2) + SourceIndex(1) name (d)
---
>>>})();
1 >
2 >^
3 >
4 > ^^^^
5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >
2 >}
3 >
4 > class d {
> }
1 >Emitted(12, 1) Source(2, 1) + SourceIndex(1) name (d)
2 >Emitted(12, 2) Source(2, 2) + SourceIndex(1) name (d)
3 >Emitted(12, 2) Source(1, 1) + SourceIndex(1)
4 >Emitted(12, 6) Source(2, 2) + SourceIndex(1)
---
>>>//# sourceMappingURL=fooResult.js.map

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/testFiles/app.ts ===
// Note in the out result we are using same folder name only different in casing
// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
class c {
>c : c
}
=== tests/cases/compiler/testFiles/app2.ts ===
class d {
>d : d
}

View File

@ -0,0 +1,26 @@
//// [tests/cases/compiler/sourceMapWithNonCaseSensitiveFileNames.ts] ////
//// [app.ts]
// Note in the out result we are using same folder name only different in casing
// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
class c {
}
//// [app2.ts]
class d {
}
//// [fooResult.js]
// Note in the out result we are using same folder name only different in casing
// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
var c = (function () {
function c() {
}
return c;
})();
var d = (function () {
function d() {
}
return d;
})();
//# sourceMappingURL=fooResult.js.map

View File

@ -0,0 +1,2 @@
//// [fooResult.js.map]
{"version":3,"file":"fooResult.js","sourceRoot":"","sources":["../testFiles/app.ts","../testFiles/app2.ts"],"names":["c","c.constructor","d","d.constructor"],"mappings":"AAEA,AAFA,gFAAgF;AAChF,0GAA0G;IACpG,CAAC;IAAPA,SAAMA,CAACA;IACPC,CAACA;IAADD,QAACA;AAADA,CAACA,AADD,IACC;ACHD,IAAM,CAAC;IAAPE,SAAMA,CAACA;IACPC,CAACA;IAADD,QAACA;AAADA,CAACA,AADD,IACC"}

View File

@ -0,0 +1,150 @@
===================================================================
JsFile: fooResult.js
mapUrl: fooResult.js.map
sourceRoot:
sources: ../testFiles/app.ts,../testFiles/app2.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/testfiles/fooResult.js
sourceFile:../testFiles/app.ts
-------------------------------------------------------------------
>>>// Note in the out result we are using same folder name only different in casing
1 >
2 >
3 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >// Note in the out result we are using same folder name only different in casing
>// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
>
2 >
3 >// Note in the out result we are using same folder name only different in casing
1 >Emitted(1, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
3 >Emitted(1, 81) Source(1, 81) + SourceIndex(0)
---
>>>// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
1->
2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1->
>
2 >// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
1->Emitted(2, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(2, 107) Source(2, 107) + SourceIndex(0)
---
>>>var c = (function () {
1 >^^^^
2 > ^
3 > ^^^^^^^^^^^^^^->
1 >
>class
2 > c
1 >Emitted(3, 5) Source(3, 7) + SourceIndex(0)
2 >Emitted(3, 6) Source(3, 8) + SourceIndex(0)
---
>>> function c() {
1->^^^^
2 > ^^^^^^^^^
3 > ^
1->
2 > class
3 > c
1->Emitted(4, 5) Source(3, 1) + SourceIndex(0) name (c)
2 >Emitted(4, 14) Source(3, 7) + SourceIndex(0) name (c)
3 >Emitted(4, 15) Source(3, 8) + SourceIndex(0) name (c)
---
>>> }
1 >^^^^
2 > ^
3 > ^^^^^^^^^->
1 > {
>
2 > }
1 >Emitted(5, 5) Source(4, 1) + SourceIndex(0) name (c.constructor)
2 >Emitted(5, 6) Source(4, 2) + SourceIndex(0) name (c.constructor)
---
>>> return c;
1->^^^^
2 > ^^^^^^^^
1->
2 > }
1->Emitted(6, 5) Source(4, 1) + SourceIndex(0) name (c)
2 >Emitted(6, 13) Source(4, 2) + SourceIndex(0) name (c)
---
>>>})();
1 >
2 >^
3 >
4 > ^^^^
5 > ^^^^^^^^^^^^^^^^^^->
1 >
2 >}
3 >
4 > class c {
> }
1 >Emitted(7, 1) Source(4, 1) + SourceIndex(0) name (c)
2 >Emitted(7, 2) Source(4, 2) + SourceIndex(0) name (c)
3 >Emitted(7, 2) Source(3, 1) + SourceIndex(0)
4 >Emitted(7, 6) Source(4, 2) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/testfiles/fooResult.js
sourceFile:../testFiles/app2.ts
-------------------------------------------------------------------
>>>var d = (function () {
1->
2 >^^^^
3 > ^
4 > ^^^^^^^^^^^^^^->
1->
2 >class
3 > d
1->Emitted(8, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(8, 5) Source(1, 7) + SourceIndex(1)
3 >Emitted(8, 6) Source(1, 8) + SourceIndex(1)
---
>>> function d() {
1->^^^^
2 > ^^^^^^^^^
3 > ^
1->
2 > class
3 > d
1->Emitted(9, 5) Source(1, 1) + SourceIndex(1) name (d)
2 >Emitted(9, 14) Source(1, 7) + SourceIndex(1) name (d)
3 >Emitted(9, 15) Source(1, 8) + SourceIndex(1) name (d)
---
>>> }
1 >^^^^
2 > ^
3 > ^^^^^^^^^->
1 > {
>
2 > }
1 >Emitted(10, 5) Source(2, 1) + SourceIndex(1) name (d.constructor)
2 >Emitted(10, 6) Source(2, 2) + SourceIndex(1) name (d.constructor)
---
>>> return d;
1->^^^^
2 > ^^^^^^^^
1->
2 > }
1->Emitted(11, 5) Source(2, 1) + SourceIndex(1) name (d)
2 >Emitted(11, 13) Source(2, 2) + SourceIndex(1) name (d)
---
>>>})();
1 >
2 >^
3 >
4 > ^^^^
5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >
2 >}
3 >
4 > class d {
> }
1 >Emitted(12, 1) Source(2, 1) + SourceIndex(1) name (d)
2 >Emitted(12, 2) Source(2, 2) + SourceIndex(1) name (d)
3 >Emitted(12, 2) Source(1, 1) + SourceIndex(1)
4 >Emitted(12, 6) Source(2, 2) + SourceIndex(1)
---
>>>//# sourceMappingURL=fooResult.js.map

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/testFiles/app.ts ===
// Note in the out result we are using same folder name only different in casing
// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
class c {
>c : c
}
=== tests/cases/compiler/testFiles/app2.ts ===
class d {
>d : d
}

View File

@ -0,0 +1,12 @@
// @out: tests/cases/compiler/testfiles/fooResult.js
// @sourcemap: true
// @useCaseSensitiveFileNames: true
// @Filename: testFiles/app.ts
// Note in the out result we are using same folder name only different in casing
// Since this is case sensitive, the folders are different and hence the relative paths in sourcemap shouldn't be just app.ts or app2.ts
class c {
}
// @Filename: testFiles/app2.ts
class d {
}

View File

@ -0,0 +1,12 @@
// @out: tests/cases/compiler/testfiles/fooResult.js
// @sourcemap: true
// @useCaseSensitiveFileNames: false
// @Filename: testFiles/app.ts
// Note in the out result we are using same folder name only different in casing
// Since this is non case sensitive, the relative paths should be just app.ts and app2.ts in the sourcemap
class c {
}
// @Filename: testFiles/app2.ts
class d {
}