# test.govlab/quality/core/parsers/tool.perlcritic.parser.test.ts

> 44 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-govlab-quality-core-parsers-tool-perlcritic-parser-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.perlcritic.parser.test.ts.txt

Listed in [test.govlab/quality/core/parsers](https://banes-lab.com/api/source/testing/test.govlab/quality/core/parsers.md), after [test.govlab/quality/core/parsers/tool.oxlint.parser.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.oxlint.parser.test.ts.md) and before [test.govlab/quality/core/parsers/tool.phpcs.parser.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.phpcs.parser.test.ts.md).

## Contained in

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

## Source

```typescript
import { describe, expect, it } from "vitest";
import { parsePerlcriticOutput } from "@govlab/quality/core/parsers/tool.perlcritic.parser.ts";

const EXPECTED_COUNT = 2;

const DELIM = "~|~";
const RECORDED = [
    [
        "govlab-governance/polyglot/perl/Bad.pm",
        "5",
        "1",
        "3",
        "Subroutines::ProhibitManyArgs",
        "Too many arguments",
    ].join(DELIM),
    ["x.pm", "9", "5", "4", "BuiltinFunctions::ProhibitStringyEval", `String "a~|~b" in eval`].join(DELIM),
    "",
].join("\n");

describe("parsePerlcriticOutput", () => {
    it("maps each delimited record to a gating (advisory:false) finding keyed by policy, message tail re-joined", () => {
        const findings = parsePerlcriticOutput(RECORDED, "perl");
        expect(findings).toHaveLength(EXPECTED_COUNT);
        expect(findings[0]).toMatchObject({
            advisory: false,
            column: 1,
            ecosystem: "perl",
            file: "govlab-governance/polyglot/perl/Bad.pm",
            line: 5,
            message: "Too many arguments",
            ruleId: "Subroutines::ProhibitManyArgs",
            severity: "error",
            tool: "perlcritic",
        });
        expect(findings[1]).toMatchObject({
            advisory: false,
            line: 9,
            message: 'String "a~|~b" in eval',
            ruleId: "BuiltinFunctions::ProhibitStringyEval",
        });
    });

    it("returns [] on empty output or lines with too few fields", () => {
        expect(parsePerlcriticOutput("", "perl")).toEqual([]);
        expect(parsePerlcriticOutput("some non-delimited banner line", "perl")).toEqual([]);
        expect(parsePerlcriticOutput("a~|~b~|~c", "perl")).toEqual([]);
    });
});
```
