diff --git a/packages/examples/src/examples/usecase.ts b/packages/examples/src/examples/usecase.ts new file mode 100644 index 000000000..b689ec164 --- /dev/null +++ b/packages/examples/src/examples/usecase.ts @@ -0,0 +1,51 @@ +import type { DiagramMetadata } from '../types.js'; + +export default { + id: 'usecase', + name: 'Use Case Diagram', + description: 'Visualize system functionality and user interactions', + examples: [ + { + title: 'Basic Use Case', + isDefault: true, + code: `usecase +actor User +actor Admin +User --> (Login) +User --> (View Profile) +Admin --> (Manage Users) +Admin --> (View Reports)`, + }, + { + title: 'System Boundary', + code: `usecase +actor Customer +actor Support + +SystemBoundary@{ type: rect } "E-commerce System" { + Customer --> (Browse Products) + Customer --> (Place Order) + Customer --> (Track Order) +} + +SystemBoundary@{ type: package } "Admin Panel" { + Support --> (Process Orders) + Support --> (Handle Returns) +}`, + }, + { + title: 'Actor Relationships', + code: `usecase +actor Developer1 +actor Developer2 +actor Manager + +Developer1 --> (Write Code) +Developer2 --> (Review Code) +Manager --> (Approve Release) + +Developer1 --> Developer2 +Manager --> Developer1`, + }, + ], +} satisfies DiagramMetadata; diff --git a/packages/examples/src/index.ts b/packages/examples/src/index.ts index eb9160bcf..558b04575 100644 --- a/packages/examples/src/index.ts +++ b/packages/examples/src/index.ts @@ -21,6 +21,7 @@ import quadrantChart from './examples/quadrant-chart.js'; import packetDiagram from './examples/packet.js'; import blockDiagram from './examples/block.js'; import treemapDiagram from './examples/treemap.js'; +import usecaseDiagram from './examples/usecase.js'; export const diagramData: DiagramMetadata[] = [ flowChart, @@ -45,4 +46,5 @@ export const diagramData: DiagramMetadata[] = [ packetDiagram, blockDiagram, treemapDiagram, + usecaseDiagram, ]; diff --git a/packages/parser/tests/usecase.test.ts b/packages/parser/tests/usecase.test.ts index c49ec0f26..5631b7c35 100644 --- a/packages/parser/tests/usecase.test.ts +++ b/packages/parser/tests/usecase.test.ts @@ -1489,14 +1489,18 @@ describe('Error Handling', () => { const emptyInput = ''; expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow(UsecaseParseError); - expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow(/missing 'usecase'/); + expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow( + /mismatched input '' expecting {'usecase', NEWLINE}/ + ); }); it('should throw UsecaseParseError for only whitespace input', () => { const whitespaceInput = ' \n \t \n '; expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow(UsecaseParseError); - expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow(/missing 'usecase'/); + expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow( + /extraneous input '' expecting {'usecase', NEWLINE}/ + ); }); it('should throw UsecaseParseError for missing usecase keyword', () => { @@ -1506,7 +1510,9 @@ describe('Error Handling', () => { `; expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow(UsecaseParseError); - expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow(/missing 'usecase'/); + expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow( + /extraneous input 'actor' expecting {'usecase', NEWLINE}/ + ); }); });