UNPKG

jsii-diff

Version:

Assembly comparison for jsii

146 lines (141 loc) 5.67 kB
"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