# test.govlab/patterns/core/aggregators/field.aggregator.test.ts

> 31 lines of code and 0 definitions.

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

Listed in [test.govlab/patterns/core/aggregators](https://banes-lab.com/api/source/testing/test.govlab/patterns/core/aggregators.md), before [test.govlab/patterns/core/aggregators/representation.distribution.aggregator.test.ts](https://banes-lab.com/source/testing/test.govlab/patterns/core/aggregators/representation.distribution.aggregator.test.ts.md).

## Contained in

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

## Source

```typescript
import { describe, expect, it } from "vitest";
import { DataLoadError } from "@govlab/patterns/core/classifiers/schema.classifier.ts";
import { FieldAccumulator } from "@govlab/patterns/core/aggregators/field.aggregator.ts";

const TWO = 2;

describe("FieldAccumulator", () => {
    it("folds observations into a nullable scalar schema", () => {
        const field = new FieldAccumulator();
        field.observe("red", false);
        field.observe(null, false);
        expect(field.result("color", TWO)).toStrictEqual({
            elementNumeric: false,
            fixedLength: null,
            kind: "scalar",
            name: "color",
            nullable: true,
            primitive: "string",
        });
    });

    it("records a fixed-length numeric list", () => {
        const field = new FieldAccumulator();
        field.observe([0, 1], false);
        field.observe([1, 1], false);
        expect(field.result("point", TWO)).toMatchObject({ elementNumeric: true, fixedLength: TWO, kind: "list" });
    });

    it("refuses a field whose values change kind", () => {
        const field = new FieldAccumulator();
        field.observe("x", false);
        field.observe([1], false);
        expect(() => field.result("mixed", TWO)).toThrow(DataLoadError);
    });
});
```
