detector_test.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package detector
  2. import (
  3. "testing"
  4. )
  5. func TestDetectDiagramType(t *testing.T) {
  6. registry := NewDetectorRegistry()
  7. tests := []struct {
  8. name string
  9. input string
  10. expected DiagramType
  11. }{
  12. {
  13. name: "Sequence Diagram",
  14. input: "sequenceDiagram\n A -> B : hello",
  15. expected: DiagramTypeSequence,
  16. },
  17. {
  18. name: "State Diagram V2",
  19. input: "stateDiagram-v2\n [*] --> State1",
  20. expected: DiagramTypeStateV2,
  21. },
  22. {
  23. name: "State Diagram",
  24. input: "stateDiagram\n [*] --> State1",
  25. expected: DiagramTypeState,
  26. },
  27. {
  28. name: "Flowchart",
  29. input: "flowchart TD\n A --> B",
  30. expected: DiagramTypeFlowchart,
  31. },
  32. {
  33. name: "Graph (alias for flowchart)",
  34. input: "graph TD\n A --> B",
  35. expected: DiagramTypeFlowchart,
  36. },
  37. {
  38. name: "Class Diagram",
  39. input: "classDiagram\n class Animal",
  40. expected: DiagramTypeClass,
  41. },
  42. {
  43. name: "ER Diagram",
  44. input: "erDiagram\n CUSTOMER ||--o{ ORDER",
  45. expected: DiagramTypeER,
  46. },
  47. {
  48. name: "Gantt Chart",
  49. input: "gantt\n title A Gantt Diagram",
  50. expected: DiagramTypeGantt,
  51. },
  52. {
  53. name: "Pie Chart",
  54. input: "pie\n title Pets adopted by volunteers",
  55. expected: DiagramTypePie,
  56. },
  57. {
  58. name: "Git Graph",
  59. input: "gitGraph\n commit",
  60. expected: DiagramTypeGit,
  61. },
  62. {
  63. name: "User Journey",
  64. input: "journey\n title My working day",
  65. expected: DiagramTypeUserJourney,
  66. },
  67. {
  68. name: "Timeline",
  69. input: "timeline\n title History of Social Media Platform",
  70. expected: DiagramTypeTimeline,
  71. },
  72. {
  73. name: "Mindmap",
  74. input: "mindmap\n root((mindmap))",
  75. expected: DiagramTypeMindmap,
  76. },
  77. {
  78. name: "Kanban",
  79. input: "kanban\n title Kanban Example",
  80. expected: DiagramTypeKanban,
  81. },
  82. {
  83. name: "Sankey Diagram",
  84. input: "sankey-beta\n A --> B",
  85. expected: DiagramTypeSankey,
  86. },
  87. {
  88. name: "XY Chart",
  89. input: "xychart-beta\n title Sales Revenue",
  90. expected: DiagramTypeXYChart,
  91. },
  92. {
  93. name: "Quadrant Chart",
  94. input: "quadrantChart\n title Reach and engagement of campaigns",
  95. expected: DiagramTypeQuadrant,
  96. },
  97. {
  98. name: "Requirement Diagram",
  99. input: "requirement\n requirement Test",
  100. expected: DiagramTypeRequirement,
  101. },
  102. {
  103. name: "Block Diagram",
  104. input: "block-beta\n A",
  105. expected: DiagramTypeBlock,
  106. },
  107. {
  108. name: "C4 Context",
  109. input: "c4Context\n title System Context diagram for Internet Banking System",
  110. expected: DiagramTypeC4,
  111. },
  112. {
  113. name: "Architecture Diagram",
  114. input: "architecture\n title Architecture diagram",
  115. expected: DiagramTypeArchitecture,
  116. },
  117. {
  118. name: "Radar Chart",
  119. input: "radar\n title Simple Radar Chart",
  120. expected: DiagramTypeRadar,
  121. },
  122. {
  123. name: "Treemap",
  124. input: "treemap\n title Tree Map Example",
  125. expected: DiagramTypeTreemap,
  126. },
  127. {
  128. name: "Packet Diagram",
  129. input: "packet\n title Packet Diagram",
  130. expected: DiagramTypePacket,
  131. },
  132. {
  133. name: "Info Diagram",
  134. input: "info\n title Info Diagram",
  135. expected: DiagramTypeInfo,
  136. },
  137. {
  138. name: "Unknown Diagram",
  139. input: "unknownDiagram\n some content",
  140. expected: DiagramTypeUnknown,
  141. },
  142. {
  143. name: "Empty Input",
  144. input: "",
  145. expected: DiagramTypeUnknown,
  146. },
  147. {
  148. name: "With Comments",
  149. input: "%% This is a comment\nsequenceDiagram\n A -> B : hello",
  150. expected: DiagramTypeSequence,
  151. },
  152. {
  153. name: "With Front Matter",
  154. input: "---\ntitle: Test\n---\nsequenceDiagram\n A -> B : hello",
  155. expected: DiagramTypeSequence,
  156. },
  157. {
  158. name: "With Directives",
  159. input: "%%{init: {'theme':'base'}}%%\nsequenceDiagram\n A -> B : hello",
  160. expected: DiagramTypeSequence,
  161. },
  162. {
  163. name: "Case Insensitive",
  164. input: "SEQUENCEDIAGRAM\n A -> B : hello",
  165. expected: DiagramTypeSequence,
  166. },
  167. {
  168. name: "With Leading Whitespace",
  169. input: " sequenceDiagram\n A -> B : hello",
  170. expected: DiagramTypeSequence,
  171. },
  172. }
  173. for _, tt := range tests {
  174. t.Run(tt.name, func(t *testing.T) {
  175. result := registry.DetectDiagramType(tt.input)
  176. if result != tt.expected {
  177. t.Errorf("Expected %v, got %v", tt.expected, result)
  178. }
  179. })
  180. }
  181. }
  182. func TestCleanText(t *testing.T) {
  183. tests := []struct {
  184. name string
  185. input string
  186. expected string
  187. }{
  188. {
  189. name: "Remove Comments",
  190. input: "%% This is a comment\nsequenceDiagram\n A -> B : hello",
  191. expected: "sequenceDiagram\n A -> B : hello",
  192. },
  193. {
  194. name: "Remove Front Matter",
  195. input: "---\ntitle: Test\n---\nsequenceDiagram\n A -> B : hello",
  196. expected: "sequenceDiagram\n A -> B : hello",
  197. },
  198. {
  199. name: "Remove Directives",
  200. input: "%%{init: {'theme':'base'}}%%\nsequenceDiagram\n A -> B : hello",
  201. expected: "sequenceDiagram\n A -> B : hello",
  202. },
  203. {
  204. name: "Remove Multiple Comments",
  205. input: "%% Comment 1\nsequenceDiagram\n %% Comment 2\n A -> B : hello",
  206. expected: "sequenceDiagram\n A -> B : hello",
  207. },
  208. {
  209. name: "Trim Whitespace",
  210. input: " \n sequenceDiagram \n \n A -> B : hello \n ",
  211. expected: "sequenceDiagram\n A -> B : hello",
  212. },
  213. }
  214. for _, tt := range tests {
  215. t.Run(tt.name, func(t *testing.T) {
  216. result := cleanText(tt.input)
  217. if result != tt.expected {
  218. t.Errorf("Expected %q, got %q", tt.expected, result)
  219. }
  220. })
  221. }
  222. }
  223. func TestDetectorPriority(t *testing.T) {
  224. registry := NewDetectorRegistry()
  225. // Test that stateDiagram-v2 has higher priority than stateDiagram
  226. stateV2Input := "stateDiagram-v2\n [*] --> State1"
  227. result := registry.DetectDiagramType(stateV2Input)
  228. if result != DiagramTypeStateV2 {
  229. t.Errorf("Expected %v, got %v", DiagramTypeStateV2, result)
  230. }
  231. // Test that sequenceDiagram has higher priority than generic patterns
  232. sequenceInput := "sequenceDiagram\n A -> B : hello"
  233. result = registry.DetectDiagramType(sequenceInput)
  234. if result != DiagramTypeSequence {
  235. t.Errorf("Expected %v, got %v", DiagramTypeSequence, result)
  236. }
  237. }