jsii-diff
Version:
Assembly comparison for jsii
146 lines (141 loc) • 5.67 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const spec_1 = require("@jsii/spec");
const util_1 = require("./util");
const diagnostics_1 = require("../lib/diagnostics");
// ----------------------------------------------------------------------
test('experimental stability violations lead to warnings', () => {
const mms = (0, util_1.compare)(`
/** @experimental */
export class Foo1 { }
`, `
export class FooNew { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('prod'));
expect(diags.length).toBe(1);
expect((0, diagnostics_1.hasErrors)(diags)).toBeFalsy();
});
// ----------------------------------------------------------------------
test('experimental stability violations can be turned into errors', () => {
const mms = (0, util_1.compare)(`
/** @experimental */
export class Foo1 { }
`, `
export class FooNew { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('all'));
expect((0, diagnostics_1.onlyErrors)(diags).length).toBe(1);
expect((0, diagnostics_1.onlyWarnings)(diags).length).toBe(0);
expect((0, diagnostics_1.hasErrors)(diags)).toBeTruthy();
});
// ----------------------------------------------------------------------
test('external stability violations are reported as warnings', () => {
const mms = (0, util_1.compare)(`
/** @stability external */
export class Foo1 { }
`, `
export class FooNew { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('prod'));
expect(diags.length).toBe(1);
expect((0, diagnostics_1.hasErrors)(diags)).toBeFalsy();
});
// ----------------------------------------------------------------------
test('external stability violations can be turned into errors', () => {
const mms = (0, util_1.compare)(`
/** @stability external */
export class Foo1 { }
/** @stability experimental */
export class Foo2 { }
`, `
export class FooNew { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('non-experimental'));
expect((0, diagnostics_1.onlyErrors)(diags).length).toBe(1);
expect((0, diagnostics_1.onlyWarnings)(diags).length).toBe(1);
expect((0, diagnostics_1.hasErrors)(diags)).toBeTruthy();
});
// ----------------------------------------------------------------------
test('deprecated stability violations are reported as errors', () => {
const mms = (0, util_1.compare)(`
/** @deprecated for some reason */
export class Foo1 { }
`, `
export class FooNew { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('prod'));
expect(diags.length).toBe(1);
expect((0, diagnostics_1.hasErrors)(diags)).toBeTruthy();
});
// ----------------------------------------------------------------------
describe('treatAsError', () => {
test.each([
['prod', [spec_1.Stability.Deprecated, spec_1.Stability.Stable]],
[
'all',
[
spec_1.Stability.Deprecated,
spec_1.Stability.Experimental,
spec_1.Stability.External,
spec_1.Stability.Stable,
],
],
[
'non-experimental',
[spec_1.Stability.Deprecated, spec_1.Stability.External, spec_1.Stability.Stable],
],
])('%s', (errorClasses, expectedStabilities) => {
const shouldError = (0, diagnostics_1.treatAsError)(errorClasses);
expect(shouldError.size).toBe(expectedStabilities.length);
expect([...expectedStabilities].every((s) => shouldError.has(s))).toBe(true);
});
});
// ----------------------------------------------------------------------
test('errors can be skipped by key', () => {
const mms = (0, util_1.compare)(`
export class Foo1 { }
`, `
export class Foo2 { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('prod'), new Set([mms.mismatches[0].violationKey]));
expect(diags.length).toBe(1);
expect((0, diagnostics_1.hasErrors)(diags)).toBeFalsy();
});
// ----------------------------------------------------------------------
test('changing stable to experimental is breaking', () => {
const mms = (0, util_1.compare)(`
/** @stable */
export class Foo1 { }
`, `
/** @experimental */
export class Foo1 { }
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('prod'));
expect(diags.length).toBeGreaterThan(0);
expect(diags.some((d) => /stability not allowed to go from 'stable' to 'experimental'/.exec(d.message))).toBeTruthy();
expect((0, diagnostics_1.hasErrors)(diags)).toBeTruthy();
});
// ----------------------------------------------------------------------
test('can make fields optional in output struct if it is marked @external', () => {
const mms = (0, util_1.compare)(`
/** @stability external */
export interface TheStruct {
readonly fieldOne: string;
}
export interface IConsumer {
foo(): TheStruct;
}
`, `
/** @stability external */
export interface TheStruct {
readonly fieldOne?: string;
}
export interface IConsumer {
foo(): TheStruct;
}
`);
const diags = (0, diagnostics_1.classifyDiagnostics)(mms, (0, diagnostics_1.treatAsError)('prod'));
expect(diags.length).toBe(1);
expect((0, diagnostics_1.hasErrors)(diags)).toBeFalsy();
});
//# sourceMappingURL=diagnostics.test.js.map