integration_test.go 2.6 KB

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