# test.rules/codemods/analyzers/field.reference.analyzer.test.ts

> 28 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-rules-codemods-analyzers-field-reference-analyzer-test-ts
Source text: https://banes-lab.com/source/testing/test.rules/codemods/analyzers/field.reference.analyzer.test.ts.txt

Listed in [test.rules/codemods/analyzers](https://banes-lab.com/api/source/testing/test.rules/codemods/analyzers.md), after [test.rules/codemods/analyzers/field.analyzer.test.ts](https://banes-lab.com/source/testing/test.rules/codemods/analyzers/field.analyzer.test.ts.md) and before [test.rules/codemods/analyzers/field.vocabulary.analyzer.test.ts](https://banes-lab.com/source/testing/test.rules/codemods/analyzers/field.vocabulary.analyzer.test.ts.md).

## Contained in

- [test.rules/codemods/analyzers](https://banes-lab.com/anatomy/testing/folder-testing-test-rules-codemods-analyzers.md)

## Source

```typescript
import { describe, expect, it } from "vitest";
import { join } from "node:path";
import { mkdtempSync } from "node:fs";
import { tmpdir } from "node:os";
import ts from "typescript";
import { visitRead } from "@ssot/govlab/codemods/analyzers/field.reference.analyzer.ts";
import { writeCanonicalText } from "@govlab/canonical-write";

const SOURCE = [
    "interface Box { size: number; label: string; hidden: string; spread: number }",
    "declare const box: Box;",
    "export const size = box.size;",
    "export const label = box['label'];",
    "export const { spread } = box;",
].join("\n");

describe("visitRead", () => {
    it("marks a field read through property access, a literal key and destructuring, and leaves the rest", async () => {
        const dir = mkdtempSync(join(tmpdir(), "field-reference-"));
        const file = join(dir, "box.generated.ts");
        await writeCanonicalText(file, SOURCE);
        const program = ts.createProgram([file], { noEmit: true, strict: true, target: ts.ScriptTarget.ES2022 });
        const source = program.getSourceFile(file);
        const read = new Set<string>();
        if (source !== undefined) {
            visitRead(program.getTypeChecker(), source, read);
        }
        expect([...read].sort()).toStrictEqual(["Box.label", "Box.size", "Box.spread"]);
    });
});
```
