feat: add use case diagram examples and update parser tests for error handling

on-behalf-of: @Mermaid-Chart <hello@mermaidchart.com>
This commit is contained in:
omkarht
2025-09-17 12:11:36 +05:30
parent 781554bf70
commit 5362d3f5ba
3 changed files with 62 additions and 3 deletions

View File

@@ -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;

View File

@@ -21,6 +21,7 @@ import quadrantChart from './examples/quadrant-chart.js';
import packetDiagram from './examples/packet.js'; import packetDiagram from './examples/packet.js';
import blockDiagram from './examples/block.js'; import blockDiagram from './examples/block.js';
import treemapDiagram from './examples/treemap.js'; import treemapDiagram from './examples/treemap.js';
import usecaseDiagram from './examples/usecase.js';
export const diagramData: DiagramMetadata[] = [ export const diagramData: DiagramMetadata[] = [
flowChart, flowChart,
@@ -45,4 +46,5 @@ export const diagramData: DiagramMetadata[] = [
packetDiagram, packetDiagram,
blockDiagram, blockDiagram,
treemapDiagram, treemapDiagram,
usecaseDiagram,
]; ];

View File

@@ -1489,14 +1489,18 @@ describe('Error Handling', () => {
const emptyInput = ''; const emptyInput = '';
expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow(UsecaseParseError); expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow(UsecaseParseError);
expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow(/missing 'usecase'/); expect(() => parseUsecaseWithAntlr(emptyInput)).toThrow(
/mismatched input '<EOF>' expecting {'usecase', NEWLINE}/
);
}); });
it('should throw UsecaseParseError for only whitespace input', () => { it('should throw UsecaseParseError for only whitespace input', () => {
const whitespaceInput = ' \n \t \n '; const whitespaceInput = ' \n \t \n ';
expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow(UsecaseParseError); expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow(UsecaseParseError);
expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow(/missing 'usecase'/); expect(() => parseUsecaseWithAntlr(whitespaceInput)).toThrow(
/extraneous input '<EOF>' expecting {'usecase', NEWLINE}/
);
}); });
it('should throw UsecaseParseError for missing usecase keyword', () => { it('should throw UsecaseParseError for missing usecase keyword', () => {
@@ -1506,7 +1510,9 @@ describe('Error Handling', () => {
`; `;
expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow(UsecaseParseError); expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow(UsecaseParseError);
expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow(/missing 'usecase'/); expect(() => parseUsecaseWithAntlr(missingKeyword)).toThrow(
/extraneous input 'actor' expecting {'usecase', NEWLINE}/
);
}); });
}); });