/**
 * Testing dimension — declarative scoring spec.
 *
 * Methodology: additive checklist over test-discipline signals (test
 * ratio, coverage-config presence, runner exit code, line-coverage
 * thresholds) gated on test-file presence, plus a hygiene penalty
 * for source that's predominantly commented-out code.
 *
 * Industry-conventional coverage thresholds: 60% (adequate), 80%
 * (excellent). Sources: CodeClimate default config, SonarQube's
 * Coverage on New Code quality-gate condition (default 80%), Google
 * Testing on the Toilet recommendations. These thresholds are the
 * de-facto convention; dxkit adopts them.
 *
 * Cap rule encodes the Label Contract: when coverage data is absent
 * the dimension can't honestly claim a top-tier rating regardless of
 * how many test files exist — file presence + a green exit code
 * without line-coverage measurement is failing the most basic
 * testing-discipline check.
 *
 *   unmeasured (35)   no coverage data available
 *
 * Source signal flow: the adapter (`src/analyzers/tests/shallow.ts`)
 * builds `TestingScoreInput` from the health-side ScoreInput
 * (HealthMetrics + CapabilityReport) and dispatches through
 * `evaluateSpec`. The standalone test-gaps subcommand uses its own
 * separate analyzer; this dimension only feeds the health rollup.
 */
import type { DimensionScoringSpec } from '../spec';
/**
 * Partition of every signal the Testing scorer reads. The adapter
 * builds this shape; the spec stays consumer-agnostic.
 */
export interface TestingScoreInput {
    /** Total source files (the denominator for test-ratio). */
    sourceFiles: number;
    /** Test files (discovered by name patterns per active language pack). */
    testFiles: number;
    /** True when at least one coverage config file is present
     *  (jest.config + collectCoverage, vitest.config + coverage,
     *  pytest.ini + --cov, etc.). */
    coverageConfigExists: boolean;
    /** Runner exit code: true=green, false=red, null=not invoked. */
    testsPass: boolean | null;
    /** Line-coverage percent (rounded integer). Null when no coverage
     *  artifact was found — the most-conservative interpretation is
     *  "we don't know" and triggers the unmeasured cap. */
    coveragePercent: number | null;
    /** From graphify: ratio of commented-out code in source files
     *  (0.0–1.0). Beyond 0.5 the file is more dead/commented than
     *  active code — a hygiene red flag worth penalizing. Null when
     *  graphify didn't run. */
    commentedCodeRatio: number | null;
}
export declare const TESTING_SCORING_SPEC: DimensionScoringSpec<TestingScoreInput>;
//# sourceMappingURL=testing.d.ts.map