go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/ansi/table_test.go (about)

     1  /*
     2  
     3  Copyright (c) 2023 - Present. Will Charczuk. All rights reserved.
     4  Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository.
     5  
     6  */
     7  
     8  package ansi
     9  
    10  import (
    11  	"bytes"
    12  	"fmt"
    13  	"testing"
    14  
    15  	. "go.charczuk.com/sdk/assert"
    16  )
    17  
    18  func Test_Table(t *testing.T) {
    19  	buffer := new(bytes.Buffer)
    20  
    21  	err := Table(buffer, []string{"foo", "bar"}, [][]string{{"1", "2"}, {"3", "4"}})
    22  	ItsNil(t, err)
    23  	ItsEqual(t, false, buffer.String() == "")
    24  }
    25  
    26  func Test_Table_emptyErr(t *testing.T) {
    27  	buffer := new(bytes.Buffer)
    28  
    29  	err := Table(buffer, nil, [][]string{{"1", "2"}, {"3", "4"}})
    30  	ItsNotNil(t, err)
    31  }
    32  
    33  func Test_Table_writeErr(t *testing.T) {
    34  	failAfter := &failAfter{MaxBytes: 32}
    35  
    36  	err := Table(failAfter, []string{"foo", "bar", "baz"}, [][]string{
    37  		{"1", "2", "3"},
    38  		{"4", "5", "6"},
    39  		{"7", "8", "9"},
    40  	})
    41  	ItsNotNil(t, err)
    42  }
    43  
    44  type failAfter struct {
    45  	Written  []byte
    46  	MaxBytes int
    47  }
    48  
    49  func (fa *failAfter) Write(contents []byte) (int, error) {
    50  	fa.Written = append(fa.Written, contents...)
    51  	if len(fa.Written) > fa.MaxBytes {
    52  		return len(contents), fmt.Errorf("did fail")
    53  	}
    54  	return len(contents), nil
    55  }
    56  
    57  func Test_TableForSlice(t *testing.T) {
    58  	objects := []struct {
    59  		ID   int
    60  		Name string
    61  	}{
    62  		{1, "Foo"},
    63  		{2, "Bar"},
    64  		{3, "Baz"},
    65  	}
    66  
    67  	output := new(bytes.Buffer)
    68  	err := TableForSlice(output, objects)
    69  	ItsNil(t, err)
    70  	ItsEqual(t,
    71  		"┌──┬────┐\n│ID│Name│\n├──┼────┤\n│1 │Foo │\n│2 │Bar │\n│3 │Baz │\n└──┴────┘\n",
    72  		output.String(),
    73  	)
    74  }
    75  
    76  func Test_TableForSlice_unicode(t *testing.T) {
    77  	objects := []struct {
    78  		ID    string
    79  		Count int
    80  	}{
    81  		{"モ foo", 1},
    82  		{"ふ bar", 1},
    83  		{"ス baz", 3},
    84  	}
    85  
    86  	output := new(bytes.Buffer)
    87  	err := TableForSlice(output, objects)
    88  	ItsNil(t, err)
    89  	ItsEqual(t,
    90  		"┌──────┬─────┐\n│ID    │Count│\n├──────┼─────┤\n│モ foo│1    │\n│ふ bar│1    │\n│ス baz│3    │\n└──────┴─────┘\n",
    91  		output.String(),
    92  	)
    93  }