...

Source file src/github.com/jedib0t/go-pretty/v6/list/render_test.go

Documentation: github.com/jedib0t/go-pretty/v6/list

     1  package list
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestList_Render(t *testing.T) {
    13  	lw := NewWriter()
    14  	lw.AppendItem(testItem1)
    15  	lw.Indent()
    16  	lw.AppendItems(testItems2)
    17  	lw.Indent()
    18  	lw.AppendItems(testItems3)
    19  	lw.UnIndent()
    20  	lw.UnIndent()
    21  	lw.AppendItem(testItem4)
    22  	lw.Indent()
    23  	lw.AppendItem(testItem5)
    24  	lw.SetStyle(styleTest)
    25  
    26  	expectedOut := `t Game Of Thrones
    27  |f Winter
    28  |m Is
    29  |b Coming
    30  | f This
    31  | m Is
    32  | b Known
    33  b The Dark Tower
    34   b The Gunslinger`
    35  	assert.Equal(t, expectedOut, lw.Render())
    36  }
    37  
    38  func TestList_Render_Complex(t *testing.T) {
    39  	lw := NewWriter()
    40  	lw.AppendItem("The Houses of Westeros")
    41  	lw.Indent()
    42  	lw.AppendItem("The Starks of Winterfell")
    43  	lw.Indent()
    44  	lw.AppendItem("Eddard Stark")
    45  	lw.Indent()
    46  	lw.AppendItems([]interface{}{"Robb Stark", "Sansa Stark", "Arya Stark", "Bran Stark", "Rickon Stark"})
    47  	lw.UnIndent()
    48  	lw.AppendItems([]interface{}{"Lyanna Stark", "Benjen Stark"})
    49  	lw.UnIndent()
    50  	lw.AppendItem("The Targaryens of Dragonstone")
    51  	lw.Indent()
    52  	lw.AppendItem("Aerys Targaryen")
    53  	lw.Indent()
    54  	lw.AppendItems([]interface{}{"Rhaegar Targaryen", "Viserys Targaryen", "Daenerys Targaryen"})
    55  	lw.UnIndent()
    56  	lw.UnIndent()
    57  	lw.AppendItem("The Lannisters of Lannisport")
    58  	lw.Indent()
    59  	lw.AppendItem("Tywin Lannister")
    60  	lw.Indent()
    61  	lw.AppendItems([]interface{}{"Cersei Lannister", "Jaime Lannister", "Tyrion Lannister"})
    62  
    63  	styles := map[Style]string{
    64  		StyleBulletCircle:     "● The Houses of Westeros\n  ● The Starks of Winterfell\n    ● Eddard Stark\n      ● Robb Stark\n      ● Sansa Stark\n      ● Arya Stark\n      ● Bran Stark\n      ● Rickon Stark\n    ● Lyanna Stark\n    ● Benjen Stark\n  ● The Targaryens of Dragonstone\n    ● Aerys Targaryen\n      ● Rhaegar Targaryen\n      ● Viserys Targaryen\n      ● Daenerys Targaryen\n  ● The Lannisters of Lannisport\n    ● Tywin Lannister\n      ● Cersei Lannister\n      ● Jaime Lannister\n      ● Tyrion Lannister",
    65  		StyleBulletFlower:     "✽ The Houses of Westeros\n  ✽ The Starks of Winterfell\n    ✽ Eddard Stark\n      ✽ Robb Stark\n      ✽ Sansa Stark\n      ✽ Arya Stark\n      ✽ Bran Stark\n      ✽ Rickon Stark\n    ✽ Lyanna Stark\n    ✽ Benjen Stark\n  ✽ The Targaryens of Dragonstone\n    ✽ Aerys Targaryen\n      ✽ Rhaegar Targaryen\n      ✽ Viserys Targaryen\n      ✽ Daenerys Targaryen\n  ✽ The Lannisters of Lannisport\n    ✽ Tywin Lannister\n      ✽ Cersei Lannister\n      ✽ Jaime Lannister\n      ✽ Tyrion Lannister",
    66  		StyleBulletSquare:     "■ The Houses of Westeros\n  ■ The Starks of Winterfell\n    ■ Eddard Stark\n      ■ Robb Stark\n      ■ Sansa Stark\n      ■ Arya Stark\n      ■ Bran Stark\n      ■ Rickon Stark\n    ■ Lyanna Stark\n    ■ Benjen Stark\n  ■ The Targaryens of Dragonstone\n    ■ Aerys Targaryen\n      ■ Rhaegar Targaryen\n      ■ Viserys Targaryen\n      ■ Daenerys Targaryen\n  ■ The Lannisters of Lannisport\n    ■ Tywin Lannister\n      ■ Cersei Lannister\n      ■ Jaime Lannister\n      ■ Tyrion Lannister",
    67  		StyleBulletStar:       "★ The Houses of Westeros\n  ★ The Starks of Winterfell\n    ★ Eddard Stark\n      ★ Robb Stark\n      ★ Sansa Stark\n      ★ Arya Stark\n      ★ Bran Stark\n      ★ Rickon Stark\n    ★ Lyanna Stark\n    ★ Benjen Stark\n  ★ The Targaryens of Dragonstone\n    ★ Aerys Targaryen\n      ★ Rhaegar Targaryen\n      ★ Viserys Targaryen\n      ★ Daenerys Targaryen\n  ★ The Lannisters of Lannisport\n    ★ Tywin Lannister\n      ★ Cersei Lannister\n      ★ Jaime Lannister\n      ★ Tyrion Lannister",
    68  		StyleBulletTriangle:   "▶ The Houses of Westeros\n  ▶ The Starks of Winterfell\n    ▶ Eddard Stark\n      ▶ Robb Stark\n      ▶ Sansa Stark\n      ▶ Arya Stark\n      ▶ Bran Stark\n      ▶ Rickon Stark\n    ▶ Lyanna Stark\n    ▶ Benjen Stark\n  ▶ The Targaryens of Dragonstone\n    ▶ Aerys Targaryen\n      ▶ Rhaegar Targaryen\n      ▶ Viserys Targaryen\n      ▶ Daenerys Targaryen\n  ▶ The Lannisters of Lannisport\n    ▶ Tywin Lannister\n      ▶ Cersei Lannister\n      ▶ Jaime Lannister\n      ▶ Tyrion Lannister",
    69  		StyleConnectedBold:    "━━ The Houses of Westeros\n   ┣━ The Starks of Winterfell\n   ┃  ┣━ Eddard Stark\n   ┃  ┃  ┣━ Robb Stark\n   ┃  ┃  ┣━ Sansa Stark\n   ┃  ┃  ┣━ Arya Stark\n   ┃  ┃  ┣━ Bran Stark\n   ┃  ┃  ┗━ Rickon Stark\n   ┃  ┣━ Lyanna Stark\n   ┃  ┗━ Benjen Stark\n   ┣━ The Targaryens of Dragonstone\n   ┃  ┗━ Aerys Targaryen\n   ┃     ┣━ Rhaegar Targaryen\n   ┃     ┣━ Viserys Targaryen\n   ┃     ┗━ Daenerys Targaryen\n   ┗━ The Lannisters of Lannisport\n      ┗━ Tywin Lannister\n         ┣━ Cersei Lannister\n         ┣━ Jaime Lannister\n         ┗━ Tyrion Lannister",
    70  		StyleConnectedDouble:  "══ The Houses of Westeros\n   ╠═ The Starks of Winterfell\n   ║  ╠═ Eddard Stark\n   ║  ║  ╠═ Robb Stark\n   ║  ║  ╠═ Sansa Stark\n   ║  ║  ╠═ Arya Stark\n   ║  ║  ╠═ Bran Stark\n   ║  ║  ╚═ Rickon Stark\n   ║  ╠═ Lyanna Stark\n   ║  ╚═ Benjen Stark\n   ╠═ The Targaryens of Dragonstone\n   ║  ╚═ Aerys Targaryen\n   ║     ╠═ Rhaegar Targaryen\n   ║     ╠═ Viserys Targaryen\n   ║     ╚═ Daenerys Targaryen\n   ╚═ The Lannisters of Lannisport\n      ╚═ Tywin Lannister\n         ╠═ Cersei Lannister\n         ╠═ Jaime Lannister\n         ╚═ Tyrion Lannister",
    71  		StyleConnectedLight:   "── The Houses of Westeros\n   ├─ The Starks of Winterfell\n   │  ├─ Eddard Stark\n   │  │  ├─ Robb Stark\n   │  │  ├─ Sansa Stark\n   │  │  ├─ Arya Stark\n   │  │  ├─ Bran Stark\n   │  │  └─ Rickon Stark\n   │  ├─ Lyanna Stark\n   │  └─ Benjen Stark\n   ├─ The Targaryens of Dragonstone\n   │  └─ Aerys Targaryen\n   │     ├─ Rhaegar Targaryen\n   │     ├─ Viserys Targaryen\n   │     └─ Daenerys Targaryen\n   └─ The Lannisters of Lannisport\n      └─ Tywin Lannister\n         ├─ Cersei Lannister\n         ├─ Jaime Lannister\n         └─ Tyrion Lannister",
    72  		StyleConnectedRounded: "── The Houses of Westeros\n   ├─ The Starks of Winterfell\n   │  ├─ Eddard Stark\n   │  │  ├─ Robb Stark\n   │  │  ├─ Sansa Stark\n   │  │  ├─ Arya Stark\n   │  │  ├─ Bran Stark\n   │  │  ╰─ Rickon Stark\n   │  ├─ Lyanna Stark\n   │  ╰─ Benjen Stark\n   ├─ The Targaryens of Dragonstone\n   │  ╰─ Aerys Targaryen\n   │     ├─ Rhaegar Targaryen\n   │     ├─ Viserys Targaryen\n   │     ╰─ Daenerys Targaryen\n   ╰─ The Lannisters of Lannisport\n      ╰─ Tywin Lannister\n         ├─ Cersei Lannister\n         ├─ Jaime Lannister\n         ╰─ Tyrion Lannister",
    73  		StyleDefault:          "* The Houses of Westeros\n  * The Starks of Winterfell\n    * Eddard Stark\n      * Robb Stark\n      * Sansa Stark\n      * Arya Stark\n      * Bran Stark\n      * Rickon Stark\n    * Lyanna Stark\n    * Benjen Stark\n  * The Targaryens of Dragonstone\n    * Aerys Targaryen\n      * Rhaegar Targaryen\n      * Viserys Targaryen\n      * Daenerys Targaryen\n  * The Lannisters of Lannisport\n    * Tywin Lannister\n      * Cersei Lannister\n      * Jaime Lannister\n      * Tyrion Lannister",
    74  		StyleMarkdown:         "  * The Houses of Westeros\n    * The Starks of Winterfell\n      * Eddard Stark\n        * Robb Stark\n        * Sansa Stark\n        * Arya Stark\n        * Bran Stark\n        * Rickon Stark\n      * Lyanna Stark\n      * Benjen Stark\n    * The Targaryens of Dragonstone\n      * Aerys Targaryen\n        * Rhaegar Targaryen\n        * Viserys Targaryen\n        * Daenerys Targaryen\n    * The Lannisters of Lannisport\n      * Tywin Lannister\n        * Cersei Lannister\n        * Jaime Lannister\n        * Tyrion Lannister",
    75  		styleTest:             "s The Houses of Westeros\n f The Starks of Winterfell\n |f Eddard Stark\n ||f Robb Stark\n ||m Sansa Stark\n ||m Arya Stark\n ||m Bran Stark\n ||b Rickon Stark\n |m Lyanna Stark\n |b Benjen Stark\n m The Targaryens of Dragonstone\n |b Aerys Targaryen\n | f Rhaegar Targaryen\n | m Viserys Targaryen\n | b Daenerys Targaryen\n b The Lannisters of Lannisport\n  b Tywin Lannister\n   f Cersei Lannister\n   m Jaime Lannister\n   b Tyrion Lannister",
    76  	}
    77  	var mismatches []string
    78  	for style, expectedOut := range styles {
    79  		lw.SetStyle(style)
    80  		out := lw.Render()
    81  		assert.Equal(t, expectedOut, out)
    82  		if expectedOut != out {
    83  			mismatches = append(mismatches, fmt.Sprintf("%s: %#v,", style.Name, out))
    84  			fmt.Printf("// %s renders a List like below:\n", style.Name)
    85  			for _, line := range strings.Split(out, "\n") {
    86  				fmt.Printf("//  %s\n", line)
    87  			}
    88  			fmt.Println()
    89  		}
    90  	}
    91  	sort.Strings(mismatches)
    92  	for _, mismatch := range mismatches {
    93  		fmt.Println(mismatch)
    94  	}
    95  }
    96  
    97  func TestList_Render_Connected(t *testing.T) {
    98  	lw := NewWriter()
    99  	lw.SetStyle(StyleConnectedLight)
   100  	assert.Empty(t, lw.Render())
   101  
   102  	lw.AppendItem(testItem1)
   103  	expectedOut := "── Game Of Thrones"
   104  	assert.Equal(t, expectedOut, lw.Render())
   105  
   106  	lw.AppendItem(testItem1)
   107  	expectedOut = `┌─ Game Of Thrones
   108  └─ Game Of Thrones`
   109  	assert.Equal(t, expectedOut, lw.Render())
   110  
   111  	lw.AppendItem(testItem1)
   112  	expectedOut = `┌─ Game Of Thrones
   113  ├─ Game Of Thrones
   114  └─ Game Of Thrones`
   115  	assert.Equal(t, expectedOut, lw.Render())
   116  
   117  	lw.Indent()
   118  	lw.AppendItem(testItem1)
   119  	expectedOut = `┌─ Game Of Thrones
   120  ├─ Game Of Thrones
   121  └─ Game Of Thrones
   122     └─ Game Of Thrones`
   123  	assert.Equal(t, expectedOut, lw.Render())
   124  
   125  	lw.AppendItem(testItem1)
   126  	expectedOut = `┌─ Game Of Thrones
   127  ├─ Game Of Thrones
   128  └─ Game Of Thrones
   129     ├─ Game Of Thrones
   130     └─ Game Of Thrones`
   131  	assert.Equal(t, expectedOut, lw.Render())
   132  
   133  	lw.Indent()
   134  	lw.AppendItem(testItem1)
   135  	expectedOut = `┌─ Game Of Thrones
   136  ├─ Game Of Thrones
   137  └─ Game Of Thrones
   138     ├─ Game Of Thrones
   139     └─ Game Of Thrones
   140        └─ Game Of Thrones`
   141  	assert.Equal(t, expectedOut, lw.Render())
   142  
   143  	lw.UnIndent()
   144  	lw.AppendItem(testItem1)
   145  	expectedOut = `┌─ Game Of Thrones
   146  ├─ Game Of Thrones
   147  └─ Game Of Thrones
   148     ├─ Game Of Thrones
   149     ├─ Game Of Thrones
   150     │  └─ Game Of Thrones
   151     └─ Game Of Thrones`
   152  	assert.Equal(t, expectedOut, lw.Render())
   153  
   154  	lw.UnIndent()
   155  	lw.AppendItem(testItem1)
   156  	expectedOut = `┌─ Game Of Thrones
   157  ├─ Game Of Thrones
   158  ├─ Game Of Thrones
   159  │  ├─ Game Of Thrones
   160  │  ├─ Game Of Thrones
   161  │  │  └─ Game Of Thrones
   162  │  └─ Game Of Thrones
   163  └─ Game Of Thrones`
   164  	assert.Equal(t, expectedOut, lw.Render())
   165  }
   166  
   167  func TestList_Render_MultiLine(t *testing.T) {
   168  	lw := NewWriter()
   169  	lw.AppendItem(testItem1ML)
   170  	lw.Indent()
   171  	lw.AppendItems(testItems2ML)
   172  	lw.Indent()
   173  	lw.AppendItems(testItems3ML)
   174  	lw.UnIndent()
   175  	lw.UnIndent()
   176  	lw.AppendItem(testItem4ML)
   177  	lw.Indent()
   178  	lw.AppendItem(testItem5)
   179  
   180  	expectedOut := `* Game Of Thrones
   181        // George. R. R. Martin
   182    * Winter
   183      Is
   184      Coming
   185    * Is
   186    * Coming
   187      * This
   188        Is
   189        Known
   190      * Is
   191      * Known
   192  * The Dark Tower
   193        // Stephen King
   194    * The Gunslinger`
   195  	assert.Equal(t, expectedOut, lw.Render())
   196  
   197  	expectedOutRounded := `╭─ Game Of Thrones
   198  │      // George. R. R. Martin
   199  │  ├─ Winter
   200  │  │  Is
   201  │  │  Coming
   202  │  ├─ Is
   203  │  ╰─ Coming
   204  │     ├─ This
   205  │     │  Is
   206  │     │  Known
   207  │     ├─ Is
   208  │     ╰─ Known
   209  ╰─ The Dark Tower
   210         // Stephen King
   211     ╰─ The Gunslinger`
   212  	lw.SetStyle(StyleConnectedRounded)
   213  	assert.Equal(t, expectedOutRounded, lw.Render())
   214  
   215  	expectedOutHTML := `<ul class="go-pretty-table">
   216    <li>Game Of Thrones<br/>    // George. R. R. Martin</li>
   217    <ul class="go-pretty-table-1">
   218      <li>Winter<br/>Is<br/>Coming</li>
   219      <li>Is</li>
   220      <li>Coming</li>
   221      <ul class="go-pretty-table-2">
   222        <li>This<br/>Is<br/>Known</li>
   223        <li>Is</li>
   224        <li>Known</li>
   225      </ul>
   226    </ul>
   227    <li>The Dark Tower<br/>    // Stephen King</li>
   228    <ul class="go-pretty-table-1">
   229      <li>The Gunslinger</li>
   230    </ul>
   231  </ul>`
   232  	assert.Equal(t, expectedOutHTML, lw.RenderHTML())
   233  
   234  	expectedOutMarkdown := `  * Game Of Thrones<br/>    // George. R. R. Martin
   235      * Winter<br/>Is<br/>Coming
   236      * Is
   237      * Coming
   238        * This<br/>Is<br/>Known
   239        * Is
   240        * Known
   241    * The Dark Tower<br/>    // Stephen King
   242      * The Gunslinger`
   243  	assert.Equal(t, expectedOutMarkdown, lw.RenderMarkdown())
   244  }
   245  
   246  func TestList_Render_Styles(t *testing.T) {
   247  	lw := NewWriter()
   248  	lw.AppendItem(testItem1)
   249  	lw.Indent()
   250  	lw.AppendItems(testItems2)
   251  	lw.Indent()
   252  	lw.AppendItems(testItems3)
   253  	lw.UnIndent()
   254  	lw.UnIndent()
   255  	lw.AppendItem(testItem4)
   256  	lw.Indent()
   257  	lw.AppendItem(testItem5)
   258  
   259  	styles := map[Style]string{
   260  		StyleBulletCircle:     "● Game Of Thrones\n  ● Winter\n  ● Is\n  ● Coming\n    ● This\n    ● Is\n    ● Known\n● The Dark Tower\n  ● The Gunslinger",
   261  		StyleBulletFlower:     "✽ Game Of Thrones\n  ✽ Winter\n  ✽ Is\n  ✽ Coming\n    ✽ This\n    ✽ Is\n    ✽ Known\n✽ The Dark Tower\n  ✽ The Gunslinger",
   262  		StyleBulletSquare:     "■ Game Of Thrones\n  ■ Winter\n  ■ Is\n  ■ Coming\n    ■ This\n    ■ Is\n    ■ Known\n■ The Dark Tower\n  ■ The Gunslinger",
   263  		StyleBulletStar:       "★ Game Of Thrones\n  ★ Winter\n  ★ Is\n  ★ Coming\n    ★ This\n    ★ Is\n    ★ Known\n★ The Dark Tower\n  ★ The Gunslinger",
   264  		StyleBulletTriangle:   "▶ Game Of Thrones\n  ▶ Winter\n  ▶ Is\n  ▶ Coming\n    ▶ This\n    ▶ Is\n    ▶ Known\n▶ The Dark Tower\n  ▶ The Gunslinger",
   265  		StyleConnectedBold:    "┏━ Game Of Thrones\n┃  ┣━ Winter\n┃  ┣━ Is\n┃  ┗━ Coming\n┃     ┣━ This\n┃     ┣━ Is\n┃     ┗━ Known\n┗━ The Dark Tower\n   ┗━ The Gunslinger",
   266  		StyleConnectedDouble:  "╔═ Game Of Thrones\n║  ╠═ Winter\n║  ╠═ Is\n║  ╚═ Coming\n║     ╠═ This\n║     ╠═ Is\n║     ╚═ Known\n╚═ The Dark Tower\n   ╚═ The Gunslinger",
   267  		StyleConnectedLight:   "┌─ Game Of Thrones\n│  ├─ Winter\n│  ├─ Is\n│  └─ Coming\n│     ├─ This\n│     ├─ Is\n│     └─ Known\n└─ The Dark Tower\n   └─ The Gunslinger",
   268  		StyleConnectedRounded: "╭─ Game Of Thrones\n│  ├─ Winter\n│  ├─ Is\n│  ╰─ Coming\n│     ├─ This\n│     ├─ Is\n│     ╰─ Known\n╰─ The Dark Tower\n   ╰─ The Gunslinger",
   269  		StyleDefault:          "* Game Of Thrones\n  * Winter\n  * Is\n  * Coming\n    * This\n    * Is\n    * Known\n* The Dark Tower\n  * The Gunslinger",
   270  		StyleMarkdown:         "  * Game Of Thrones\n    * Winter\n    * Is\n    * Coming\n      * This\n      * Is\n      * Known\n  * The Dark Tower\n    * The Gunslinger",
   271  		styleTest:             "t Game Of Thrones\n|f Winter\n|m Is\n|b Coming\n| f This\n| m Is\n| b Known\nb The Dark Tower\n b The Gunslinger",
   272  	}
   273  	var mismatches []string
   274  	for style, expectedOut := range styles {
   275  		lw.SetStyle(style)
   276  		out := lw.Render()
   277  		assert.Equal(t, expectedOut, out)
   278  		if expectedOut != out {
   279  			mismatches = append(mismatches, fmt.Sprintf("%s: %#v,", style.Name, out))
   280  			fmt.Printf("// %s renders a List like below:\n", style.Name)
   281  			for _, line := range strings.Split(out, "\n") {
   282  				fmt.Printf("//  %s\n", line)
   283  			}
   284  			fmt.Println()
   285  		}
   286  	}
   287  	sort.Strings(mismatches)
   288  	for _, mismatch := range mismatches {
   289  		fmt.Println(mismatch)
   290  	}
   291  }
   292  
   293  func TestList_Render_UnindentAll(t *testing.T) {
   294  	lw := NewWriter()
   295  	lw.AppendItem(testItem1)
   296  	lw.Indent()
   297  	lw.AppendItems(testItems2)
   298  	lw.Indent()
   299  	lw.AppendItems(testItems3)
   300  	lw.UnIndentAll()
   301  	lw.AppendItem(testItem4)
   302  	lw.Indent()
   303  	lw.AppendItem(testItem5)
   304  	lw.UnIndentAll()
   305  	lw.AppendItem("The Mandalorian")
   306  	lw.Indent()
   307  	lw.AppendItem("This")
   308  	lw.Indent()
   309  	lw.AppendItem("Is")
   310  	lw.Indent()
   311  	lw.AppendItem("The")
   312  	lw.Indent()
   313  	lw.AppendItem("Way")
   314  	lw.Indent()
   315  	lw.UnIndentAll()
   316  	lw.AppendItem("Right?")
   317  
   318  	expectedOut := `* Game Of Thrones
   319    * Winter
   320    * Is
   321    * Coming
   322      * This
   323      * Is
   324      * Known
   325  * The Dark Tower
   326    * The Gunslinger
   327  * The Mandalorian
   328    * This
   329      * Is
   330        * The
   331          * Way
   332  * Right?`
   333  	assert.Equal(t, expectedOut, lw.Render())
   334  
   335  }
   336  

View as plain text