All files / src/utils mockDocument.ts

79.24% Statements 42/53
81.25% Branches 13/16
44.44% Functions 4/9
79.24% Lines 42/53

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 542x 2x 17x 17x 17x 17x 17x 47x 47x 47x 17x 17x 35x 35x 97x 62x 62x   17x 17x 17x 17x 17x 17x 17x 17x 17x 17x 17x 17x 49x 15x 17x 17x                     17x 17x 17x 17x 17x 17x 17x 17x 17x  
import * as vscode from 'vscode';
 
export function mockDocument(code: string, language: string, fileName?: string): vscode.TextDocument {
  const lines = code.split('\n');
  const uri = vscode.Uri.parse('untitled:virtual');
  const ext = language === 'javascript' ? 'js' : language === 'typescript' ? 'ts' : language === 'css' ? 'css' : 'java';
  const offsetAt = (p: vscode.Position): number => {
    let offset = 0;
    for (let i = 0; i < p.line; i++) offset += lines[i].length + 1;
    return offset + p.character;
  };
  const positionAt = (offset: number): vscode.Position => {
    let remaining = offset;
    for (let i = 0; i < lines.length; i++) {
      if (remaining <= lines[i].length) return new vscode.Position(i, remaining);
      remaining -= lines[i].length + 1;
    }
    return new vscode.Position(lines.length - 1, lines[lines.length - 1].length);
  };
  return {
    uri,
    fileName: fileName ?? `untitled.${ext}`,
    isUntitled: true,
    languageId: language,
    version: 1,
    isDirty: false,
    isClosed: false,
    eol: vscode.EndOfLine.LF,
    lineCount: lines.length,
    getText: (range?: vscode.Range) => {
      if (!range) { return code; }
      return code.slice(offsetAt(range.start), offsetAt(range.end));
    },
    lineAt: (arg: number | vscode.Position) => {
      const line = typeof arg === 'number' ? arg : arg.line;
      const text = lines[line] ?? '';
      return {
        lineNumber: line,
        text,
        range: new vscode.Range(line, 0, line, text.length),
        rangeIncludingLineBreak: new vscode.Range(line, 0, line, text.length),
        firstNonWhitespaceCharacterIndex: text.search(/\S|$/),
        isEmptyOrWhitespace: text.trim().length === 0,
      };
    },
    offsetAt,
    positionAt,
    getWordRangeAtPosition: () => undefined,
    validateRange: (r: vscode.Range) => r,
    validatePosition: (p: vscode.Position) => p,
    save: () => Promise.resolve(false),
  } as unknown as vscode.TextDocument;
}