You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This document contains information you'll need no matter what the task is, but we have a separate library of content that you'll need to consult depending on the issue.
3
+
This document provides a concise guide for writing TypeScript fourslash tests and compiler tests, along with build instructions.
5
4
6
-
You have been given the `md-fragments` MCP server.
7
-
Before doing anything, query its `list-topics` endpoint and remember all the topics you saw.
8
-
Consult these topics often, as they contain important information relevant to the work.
9
-
MOST OPERATIONS (adding tests, running them, etc) HAVE RELEVANT DOCUMENTATION.
5
+
## Build Instructions Summary
10
6
11
-
YOU MUST FOLLOW DIRECTIONS FROM THE "HOW TO FINISH A SESSION" TOPIC BEFORE FINISHING A PULL REQUEST.
7
+
### Setup
8
+
1. Install Node.js (current or LTS)
9
+
2. Clone the repository: `git clone --depth=1 https://github.com/microsoft/TypeScript`
10
+
3. Install dependencies: `npm ci`
12
11
13
-
## Information About This Repo
12
+
### Common Build Tasks
13
+
```bash
14
+
npx hereby local# Build the compiler into built/local
15
+
npx hereby clean # Delete the built compiler
16
+
npx hereby tests # Build the test infrastructure
17
+
npx hereby runtests # Run all tests
18
+
npx hereby runtests-parallel # Run tests in parallel 🚨 MANDATORY BEFORE FINISHING!
19
+
npx hereby runtests --runner=fourslash # Run only fourslash tests
20
+
npx hereby runtests --runner=compiler # Run only compiler tests
21
+
npx hereby runtests --tests=<testPath># Run specific test
22
+
npx hereby baseline-accept # Accept new test baselines
23
+
npx hereby lint # Run eslint 🚨 MANDATORY BEFORE FINISHING!
24
+
npx hereby format # Run code formatting 🚨 MANDATORY BEFORE FINISHING!
25
+
```
26
+
27
+
## Fourslash Test Syntax Guide
28
+
29
+
Fourslash tests are interactive TypeScript language service tests. They validate IDE features like completions, quick info, navigation, and refactoring.
30
+
31
+
### Basic Structure
32
+
```typescript
33
+
/// <referencepath='fourslash.ts'/>
34
+
35
+
////code goes here with /*markers*/
36
+
37
+
// Test assertions go here
38
+
```
39
+
40
+
### Key Syntax Elements
41
+
42
+
#### 1. Source Code Definition
43
+
Use `////` to define source code lines:
44
+
```typescript
45
+
////function foo(x: number) {
46
+
//// return x + 1;
47
+
////}
48
+
////let result = foo(/*marker*/42);
49
+
```
50
+
51
+
#### 2. Markers for Positioning
52
+
Use `/**/` for anonymous markers or `/*name*/` for named markers:
53
+
```typescript
54
+
////let x = /*1*/someValue;
55
+
////let y = /*cursor*/anotherValue;
56
+
```
57
+
58
+
#### 3. Multi-file Tests
59
+
Use `// @Filename:` to define multiple files:
60
+
```typescript
61
+
// @Filename: /a.ts
62
+
////export const value = 42;
63
+
64
+
// @Filename: /b.ts
65
+
////import { value } from './a';
66
+
////console.log(/*marker*/value);
67
+
```
68
+
69
+
#### 4. Ranges
70
+
Use `[|text|]` to define text ranges:
71
+
```typescript
72
+
////function test() {
73
+
//// [|return 42;|]
74
+
////}
75
+
```
76
+
77
+
### Common API Patterns
78
+
79
+
#### Navigation & Positioning
80
+
```typescript
81
+
goTo.marker("markerName"); // Navigate to marker
82
+
goTo.marker(); // Navigate to anonymous marker /**/
Compiler tests validate TypeScript compilation behavior, type checking, and error reporting.
146
+
147
+
### Basic Structure
148
+
- Simple `.ts` files in `tests/cases/compiler/`
149
+
- Use comments to indicate expected behavior
150
+
- No special test harness - just TypeScript code
151
+
152
+
### Compiler Directives
153
+
Use `// @directive: value` for compiler options:
154
+
```typescript
155
+
// @strict: true
156
+
// @target: ES2015
157
+
// @lib: ES2015,DOM
158
+
159
+
let x:string=42; // Error expected
160
+
```
161
+
162
+
### Common Directives
163
+
```typescript
164
+
// @strict: true/false
165
+
// @noImplicitAny: true/false
166
+
// @target: ES5/ES2015/ES2020/ESNext
167
+
// @module: commonjs/amd/es6/esnext
168
+
// @lib: ES5,DOM/ES2015/ES2020
169
+
// @declaration: true/false
170
+
// @skipLibCheck: true/false
171
+
```
172
+
173
+
### Multi-file Tests
174
+
```typescript
175
+
// @Filename: helper.ts
176
+
exportfunction helper(x:number):string {
177
+
returnx.toString();
178
+
}
179
+
180
+
// @Filename: main.ts
181
+
import { helper } from"./helper";
182
+
const result =helper(42);
183
+
```
184
+
185
+
### Error Expectations
186
+
Use comments to document expected behavior:
187
+
```typescript
188
+
abstractclassBase {
189
+
abstract method():void;
190
+
}
14
191
15
-
Facts you should know and remember:
16
-
* All tests can run and pass in this environment. There are no "unrelated" test failures!
17
-
* Test "failures" due to baseline changes are normal as a result of your changes, but they MUST BE ADDRESSED. Read the "Dealing with Baselines" topic to learn more.
18
-
* Maintainer comments in the issue should generally take priority over OP's comments
19
-
* Maintainers might give you hints on where to start. They are not always right, but a good place to start
192
+
classDerivedextendsBase {
193
+
// Missing implementation - should error
194
+
}
20
195
21
-
## Mandatory Workflow
196
+
newBase(); // Should error - cannot instantiate abstract class
197
+
```
198
+
199
+
### Type Testing Patterns
200
+
```typescript
201
+
// Test type inference
202
+
let inferred = [1, 2, 3]; // Should infer number[]
203
+
204
+
// Test type compatibility
205
+
typeA= { x:number };
206
+
typeB= { x:number; y:string };
207
+
let a:A= { x: 1 };
208
+
let b:B= { x: 1, y: "hello" };
209
+
a=b; // Should work - B is assignable to A
210
+
b=a; // Should error - A missing property y
211
+
```
212
+
213
+
### Simple Example
214
+
```typescript
215
+
// Test that optional properties work correctly
216
+
interfaceConfig {
217
+
required:string;
218
+
optional?:number;
219
+
}
220
+
221
+
const config1:Config= { required: "test" }; // Should work
222
+
const config2:Config= { required: "test", optional: 42 }; // Should work
**THESE STEPS ARE MANDATORY BEFORE COMMITTING/PUSHING ANY CHANGES:**
264
+
265
+
1.**MUST RUN:**`npx hereby runtests-parallel` (even though it takes 10-15 minutes)
266
+
2.**MUST RUN:**`npx hereby lint` and fix ALL lint issues
267
+
3.**MUST RUN:**`npx hereby format` as the final step
268
+
269
+
**❌ PRs that fail these checks will be rejected without review.**
270
+
271
+
### Keeping Things Tidy
272
+
273
+
- You can assume lint, tests, and formatting are clean on a fresh clone
274
+
- Only run these verification steps AFTER making changes to code
275
+
- Run `npx hereby lint` and fix ALL issues after making changes
276
+
- Run `npx hereby format` as your final step after making changes
22
277
23
-
When you clone this repo, ALL THE TESTS ARE PASSING. There are no "unrelated" test failures here; if a test is failing, it's because of your change, and you need to address that one way or another.
278
+
### Test Locations
24
279
25
-
This repo uses test-driven development. When fixing bugs or implementing features, you must follow this workflow:
280
+
- Only add testcases in `tests/cases/compiler` or `tests/cases/fourslash`
281
+
- Filenames in `tests/cases/compiler` must always end with `.ts`, not `.d.ts`
282
+
- Do not write direct unit tests as they are almost never the correct test format for our repo
283
+
284
+
### Performance Expectations
285
+
286
+
- Running a set of tests may take up to 4 minutes
287
+
- A full test run may take up to 15 minutes
288
+
289
+
### Working with Issues
290
+
291
+
- Maintainer comments in the issue should generally take priority over OP's comments
292
+
- Maintainers might give you hints on where to start. They are not always right, but a good place to start
293
+
294
+
### Debugging Tips
295
+
296
+
printf debugging is going to be very useful as you are figuring things out.
297
+
To do this, use `console.log`, but you'll need to `ts-ignore` it.
298
+
Write something like this:
299
+
```ts,diff
300
+
function checkSomething(n: Node) {
301
+
doSomething(n);
302
+
+ // @ts-ignore DEBUG CODE ONLY, REMOVE ME WHEN DONE
303
+
+ console.log(`Got node with pos = ${n.pos}`);
304
+
doSomethingElse(n);
305
+
}
306
+
```
307
+
We have a lot of enums so you might want to print back their symbolic name, to do this, index back into the name of the enum
308
+
```ts
309
+
// @ts-ignore DEBUG CODE ONLY, REMOVE ME WHEN DONE
310
+
console.log(`Got node with kind = ${SyntaxKind[n.kind]}`);
311
+
```
312
+
313
+
## Recommended Workflow
314
+
315
+
When fixing bugs or implementing features, follow this workflow:
26
316
27
317
1.**Make a testcase that demonstrates the behavior**
28
318
- Run it (by itself) and review the baselines it generates to ensure it demonstrates the bug
29
319
- Add the test and its baselines in one commit
30
-
- You may need to debug in order to figure out how to write a testcase; this is normal
31
-
- DO NOT TRY TO FIX A BUG UNTIL YOU HAVE A TESTCASE THAT CORRECTLY DEMONSTRATES THE PROBLEM
32
320
33
321
2.**Fix the bug by changing code as appropriate**
34
322
- Put this fix in another commit
@@ -41,40 +329,14 @@ This repo uses test-driven development. When fixing bugs or implementing feature
41
329
- Once you've got the basics figured out, enhance your test to cover edge cases and other variations
42
330
- Run the test again and commit the baseline diff along with the test edit
43
331
44
-
5.**Run all other tests to ensure you didn't break anything**
45
-
- Run `npx hereby runtests-parallel` and wait for it to finish (10-15 minutes is normal!)
332
+
5.**🚨 MANDATORY: Run all other tests to ensure you didn't break anything**
333
+
-**REQUIRED:** Run `npx hereby runtests-parallel` and wait for it to finish (10-15 minutes is normal!)
334
+
-**THIS STEP CANNOT BE SKIPPED** - patience is essential!
46
335
- Some collateral baseline changes are normal, but review for correctness
47
336
- Put these diffs in another commit
48
337
49
-
## Due Diligence
50
-
51
-
As part of your summary, you will need to provide an extensive root cause analysis of why the bug has occurred.
52
-
You should investigate the provided repro thoroughly, and provide "adjacent" testcases that *don't* demonstrate the bug to prove your theory of what the root cause of the bug is.
53
-
54
-
In particular, pay attention to which phase the bug occurs in. For example:
55
-
* If the bug is in the parser, you should be able to demonstrate that the syntax tree is wrong
56
-
* If the bug is in the checker, you should be able to explain why the logic is wrong with constrasting examples
57
-
* If the bug is in the emitter, you should be able to demonstrate that the syntax tree is correct, but that the emit logic is wrong and why
58
-
59
-
## Time Constraints
60
-
61
-
If you're running out of time, consult the "How to give up" documentation topic.
62
-
63
-
## Asking Questions
64
-
65
-
We want to make you smarter over time.
66
-
If you encounter a situation where you think a developer on this project would be able to provide a useful answer *and* it's not something offered by the Documentation MCP server, add a question to the file `.github/copilot-questions.md`
67
-
Explain what you searched for so that we can put the right search terms in the documentation library.
68
-
69
-
## Common Commands
70
-
71
-
You'll need to run these commands often. Always use `npx` to run `hereby` commands.
72
-
73
-
```bash
74
-
npx hereby local# Build the compiler into built/local
75
-
npx hereby runtests-parallel # Run all tests; this will take 10-15 minutes
76
-
npx hereby runtests -t <grep># Run testcases matching a specific pattern
77
-
npx hereby baseline-accept # Accept new test baselines
78
-
npx hereby lint # Run lint. Always do this before submitting
79
-
npx hereby format # Run code formatting. Always do this before submitting
80
-
```
338
+
6.**🚨 MANDATORY: Lint and format your changes**
339
+
-**REQUIRED:** Run `npx hereby lint` and fix ALL issues
340
+
-**REQUIRED:** Run `npx hereby format` before you're done
341
+
-**YOU CANNOT FINISH WITHOUT THESE STEPS**
342
+
- Double-check your line endings. Source files in this repo typically use CRLF line endings. Fix all line endings to be consistent before you wrap up
0 commit comments