integration_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package tests
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. "mermaid-go/pkg/ast"
  7. "mermaid-go/pkg/parser"
  8. "mermaid-go/pkg/renderer"
  9. )
  10. func TestMermaid_ParseAndRender_RoundTrip(t *testing.T) {
  11. testCases := []struct {
  12. name string
  13. input string
  14. }{
  15. {
  16. name: "basic flowchart",
  17. input: `graph TD
  18. A --> B`,
  19. },
  20. {
  21. name: "flowchart with shapes",
  22. input: `graph TD
  23. A[Rectangle] --> B(Round)
  24. B --> C{Diamond}`,
  25. },
  26. {
  27. name: "flowchart with labels",
  28. input: `graph TD
  29. A -->|Get money| B
  30. B -->|Go shopping| C`,
  31. },
  32. {
  33. name: "flowchart with different arrows",
  34. input: `graph TD
  35. A --> B
  36. B -.-> C
  37. C ==> D`,
  38. },
  39. }
  40. for _, tc := range testCases {
  41. t.Run(tc.name, func(t *testing.T) {
  42. mermaidParser := parser.NewMermaidParser()
  43. mermaidRenderer := renderer.NewMermaidRenderer()
  44. // Parse
  45. diagram, err := mermaidParser.Parse(tc.input)
  46. require.NoError(t, err)
  47. require.NotNil(t, diagram)
  48. // Validate
  49. err = diagram.Validate()
  50. require.NoError(t, err)
  51. // Render
  52. output, err := mermaidRenderer.Render(diagram)
  53. require.NoError(t, err)
  54. require.NotEmpty(t, output)
  55. // Verify it starts with graph declaration
  56. assert.Contains(t, output, "graph")
  57. // Parse the rendered output again to ensure it's valid
  58. diagram2, err := mermaidParser.Parse(output)
  59. require.NoError(t, err)
  60. require.NotNil(t, diagram2)
  61. // Validate again
  62. err = diagram2.Validate()
  63. require.NoError(t, err)
  64. })
  65. }
  66. }
  67. func TestMermaid_ComplexFlowchart(t *testing.T) {
  68. input := `graph TD
  69. A[Christmas] -->|Get money| B(Go shopping)
  70. B --> C{Let me think}
  71. C -.->|One| D[Laptop]
  72. C -.->|Two| E[iPhone]
  73. C -.->|Three| F[Car]`
  74. mermaidParser := parser.NewMermaidParser()
  75. diagram, err := mermaidParser.Parse(input)
  76. require.NoError(t, err)
  77. flowchart := diagram.(*ast.Flowchart)
  78. // Verify structure
  79. assert.Equal(t, "TD", flowchart.Direction)
  80. assert.Len(t, flowchart.Vertices, 6) // A, B, C, D, E, F
  81. assert.Len(t, flowchart.Edges, 5) // 5 connections
  82. // Verify specific vertices
  83. assert.Contains(t, flowchart.Vertices, "A")
  84. assert.Contains(t, flowchart.Vertices, "B")
  85. assert.Contains(t, flowchart.Vertices, "C")
  86. // Verify vertex properties
  87. vertexA := flowchart.Vertices["A"]
  88. require.NotNil(t, vertexA.Text)
  89. assert.Equal(t, "Christmas", *vertexA.Text)
  90. vertexB := flowchart.Vertices["B"]
  91. require.NotNil(t, vertexB.Text)
  92. assert.Equal(t, "Go shopping", *vertexB.Text)
  93. // Render and verify
  94. mermaidRenderer := renderer.NewMermaidRenderer()
  95. output, err := mermaidRenderer.Render(diagram)
  96. require.NoError(t, err)
  97. assert.Contains(t, output, "graph TD")
  98. assert.Contains(t, output, "Christmas")
  99. assert.Contains(t, output, "Go shopping")
  100. assert.Contains(t, output, "Get money")
  101. }