| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- package tests
- import (
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- "mermaid-go/pkg/ast"
- "mermaid-go/pkg/mermaid"
- )
- func TestMermaid_ParseAndRender_RoundTrip(t *testing.T) {
- testCases := []struct {
- name string
- input string
- }{
- {
- name: "basic flowchart",
- input: `graph TD
- A --> B`,
- },
- {
- name: "flowchart with shapes",
- input: `graph TD
- A[Rectangle] --> B(Round)
- B --> C{Diamond}`,
- },
- {
- name: "flowchart with labels",
- input: `graph TD
- A -->|Get money| B
- B -->|Go shopping| C`,
- },
- {
- name: "flowchart with different arrows",
- input: `graph TD
- A --> B
- B -.-> C
- C ==> D`,
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- parser := mermaid.NewParser()
- renderer := mermaid.NewRenderer()
- // Parse
- diagram, err := parser.Parse(tc.input)
- require.NoError(t, err)
- require.NotNil(t, diagram)
- // Validate
- err = diagram.Validate()
- require.NoError(t, err)
- // Render
- output := renderer.Render(diagram)
- require.NotEmpty(t, output)
- // Verify it starts with graph declaration
- assert.Contains(t, output, "graph")
- // Parse the rendered output again to ensure it's valid
- diagram2, err := parser.Parse(output)
- require.NoError(t, err)
- require.NotNil(t, diagram2)
- // Validate again
- err = diagram2.Validate()
- require.NoError(t, err)
- })
- }
- }
- func TestMermaid_ComplexFlowchart(t *testing.T) {
- input := `graph TD
- A[Christmas] -->|Get money| B(Go shopping)
- B --> C{Let me think}
- C -.->|One| D[Laptop]
- C -.->|Two| E[iPhone]
- C -.->|Three| F[Car]`
- parser := mermaid.NewParser()
- diagram, err := parser.Parse(input)
- require.NoError(t, err)
- flowchart := diagram.(*ast.Flowchart)
- // Verify structure
- assert.Equal(t, "TD", flowchart.Direction)
- assert.Len(t, flowchart.Vertices, 6) // A, B, C, D, E, F
- assert.Len(t, flowchart.Edges, 5) // 5 connections
- // Verify specific vertices
- assert.Contains(t, flowchart.Vertices, "A")
- assert.Contains(t, flowchart.Vertices, "B")
- assert.Contains(t, flowchart.Vertices, "C")
- // Verify vertex properties
- vertexA := flowchart.Vertices["A"]
- require.NotNil(t, vertexA.Text)
- assert.Equal(t, "Christmas", *vertexA.Text)
- vertexB := flowchart.Vertices["B"]
- require.NotNil(t, vertexB.Text)
- assert.Equal(t, "Go shopping", *vertexB.Text)
- // Render and verify
- renderer := mermaid.NewRenderer()
- output := renderer.Render(diagram)
- assert.Contains(t, output, "graph TD")
- assert.Contains(t, output, "Christmas")
- assert.Contains(t, output, "Go shopping")
- assert.Contains(t, output, "Get money")
- }
|