# test.govlab/patterns/core/selectors/syntax.selector.test.ts

> 20 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-govlab-patterns-core-selectors-syntax-selector-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/patterns/core/selectors/syntax.selector.test.ts.txt

Listed in [test.govlab/patterns/core/selectors](https://banes-lab.com/api/source/testing/test.govlab/patterns/core/selectors.md), after [test.govlab/patterns/core/selectors/representation.selector.test.ts](https://banes-lab.com/source/testing/test.govlab/patterns/core/selectors/representation.selector.test.ts.md).

## Contained in

- [test.govlab/patterns/core/selectors](https://banes-lab.com/anatomy/testing/folder-testing-test-govlab-patterns-core-selectors.md)

## Source

```typescript
import { branch, leaf } from "../parsers/syntax.fixture.ts";
import { childNodes, fieldText, fieldType, lineOf } from "@govlab/patterns/core/selectors/syntax.selector.ts";
import { describe, expect, it } from "vitest";

describe("the syntax selectors", () => {
    it("childNodes lists every present child in order", () => {
        const root = branch("root", [leaf("a"), leaf("b")]);
        expect(childNodes(root).map((node) => node.type)).toStrictEqual(["a", "b"]);
    });

    it("fieldText and fieldType read a named field, and fall back when it is absent", () => {
        const node = leaf("call_expression", { function: leaf("member_expression") });
        expect(fieldText(node, "function")).toBe("member_expression");
        expect(fieldType(node, "function")).toBe("member_expression");
        expect(fieldText(node, "missing")).toBe("");
        expect(fieldType(node, "missing")).toBeUndefined();
    });

    it("lineOf numbers lines from one", () => {
        expect(lineOf(leaf("x"))).toBe(1);
        expect(lineOf(branch("y", []))).toBe(1);
    });
});
```
