5.7 KB168 lines
Blame
1import { describe, expect, it } from 'vitest';
2
3import { Architecture } from '../src/language/index.js';
4import { expectNoErrorsOrAlternatives, architectureParse as parse } from './test-util.js';
5
6describe('architecture', () => {
7 describe('should handle architecture definition', () => {
8 it.each([
9 `architecture-beta`,
10 ` architecture-beta `,
11 `\tarchitecture-beta\t`,
12 `
13 \tarchitecture-beta
14 `,
15 ])('should handle regular architecture', (context: string) => {
16 const result = parse(context);
17 expectNoErrorsOrAlternatives(result);
18 expect(result.value.$type).toBe(Architecture.$type);
19 });
20 });
21
22 describe('should handle TitleAndAccessibilities', () => {
23 it.each([
24 `architecture-beta title sample title`,
25 ` architecture-beta title sample title `,
26 `\tarchitecture-beta\ttitle sample title\t`,
27 `architecture-beta
28 \ttitle sample title
29 `,
30 ])('should handle regular architecture + title in same line', (context: string) => {
31 const result = parse(context);
32 expectNoErrorsOrAlternatives(result);
33 expect(result.value.$type).toBe(Architecture.$type);
34
35 const { title } = result.value;
36 expect(title).toBe('sample title');
37 });
38
39 it.each([
40 `architecture-beta
41 title sample title`,
42 `architecture-beta
43 title sample title
44 `,
45 ])('should handle regular architecture + title in next line', (context: string) => {
46 const result = parse(context);
47 expectNoErrorsOrAlternatives(result);
48 expect(result.value.$type).toBe(Architecture.$type);
49
50 const { title } = result.value;
51 expect(title).toBe('sample title');
52 });
53
54 it('should handle regular architecture + title + accTitle + accDescr', () => {
55 const context = `architecture-beta
56 title sample title
57 accTitle: sample accTitle
58 accDescr: sample accDescr
59 `;
60 const result = parse(context);
61 expectNoErrorsOrAlternatives(result);
62 expect(result.value.$type).toBe(Architecture.$type);
63
64 const { title, accTitle, accDescr } = result.value;
65 expect(title).toBe('sample title');
66 expect(accTitle).toBe('sample accTitle');
67 expect(accDescr).toBe('sample accDescr');
68 });
69
70 it('should handle regular architecture + title + accTitle + multi-line accDescr', () => {
71 const context = `architecture-beta
72 title sample title
73 accTitle: sample accTitle
74 accDescr {
75 sample accDescr
76 }
77 `;
78 const result = parse(context);
79 expectNoErrorsOrAlternatives(result);
80 expect(result.value.$type).toBe(Architecture.$type);
81
82 const { title, accTitle, accDescr } = result.value;
83 expect(title).toBe('sample title');
84 expect(accTitle).toBe('sample accTitle');
85 expect(accDescr).toBe('sample accDescr');
86 });
87 });
88
89 describe('should handle service titles with quotes', () => {
90 it('should handle service with quoted title using double quotes', () => {
91 const context = `architecture-beta
92 service db(database)["Database"] in api
93 `;
94 const result = parse(context);
95 expectNoErrorsOrAlternatives(result);
96 expect(result.value.$type).toBe(Architecture.$type);
97
98 const service = result.value.services?.[0];
99 expect(service).toBeDefined();
100 expect(service?.title).toBe('Database');
101 });
102
103 it('should handle service with quoted title using single quotes', () => {
104 const context = `architecture-beta
105 service db(database)['Database'] in api
106 `;
107 const result = parse(context);
108 expectNoErrorsOrAlternatives(result);
109 expect(result.value.$type).toBe(Architecture.$type);
110
111 const service = result.value.services?.[0];
112 expect(service).toBeDefined();
113 expect(service?.title).toBe('Database');
114 });
115
116 it('should handle service with unquoted title (backward compatibility)', () => {
117 const context = `architecture-beta
118 service db(database)[Database] in api
119 `;
120 const result = parse(context);
121 expectNoErrorsOrAlternatives(result);
122 expect(result.value.$type).toBe(Architecture.$type);
123
124 const service = result.value.services?.[0];
125 expect(service).toBeDefined();
126 expect(service?.title).toBe('Database');
127 });
128
129 it('should handle group with quoted title', () => {
130 const context = `architecture-beta
131 group api(cloud)["API"]
132 `;
133 const result = parse(context);
134 expectNoErrorsOrAlternatives(result);
135 expect(result.value.$type).toBe(Architecture.$type);
136
137 const group = result.value.groups?.[0];
138 expect(group).toBeDefined();
139 expect(group?.title).toBe('API');
140 });
141 it('should preserve apostrophes in service titles', () => {
142 const context = `architecture-beta
143 service db(database)["John's Database"] in api
144 `;
145 const result = parse(context);
146 expectNoErrorsOrAlternatives(result);
147 expect(result.value.$type).toBe(Architecture.$type);
148
149 const service = result.value.services?.[0];
150 expect(service).toBeDefined();
151 expect(service?.title).toBe("John's Database");
152 });
153
154 it('should preserve inner quotes in service titles when escaped', () => {
155 const context = `architecture-beta
156 service api(server)["The \\"Main\\" API"] in cloud
157 `;
158 const result = parse(context);
159 expectNoErrorsOrAlternatives(result);
160 expect(result.value.$type).toBe(Architecture.$type);
161
162 const service = result.value.services?.[0];
163 expect(service).toBeDefined();
164 expect(service?.title).toBe('The "Main" API');
165 });
166 });
167});
168