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