github.com/julianthome/gore@v0.0.0-20231109011145-b3a6bbe6fe55/commands_test.go (about)

     1  package gore
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestAction_Type(t *testing.T) {
    12  	var stdout, stderr strings.Builder
    13  	s, err := NewSession(&stdout, &stderr)
    14  	t.Cleanup(func() { s.Clear() })
    15  	require.NoError(t, err)
    16  
    17  	codes := []string{
    18  		`:type "hello"`,
    19  		":type 128",
    20  		":type 3.14",
    21  		"func f() []int { return nil }",
    22  		":t f",
    23  		":t f()",
    24  		":i fmt encoding/json",
    25  		":t fmt.Sprint",
    26  		":t fmt.Println",
    27  		":t json.NewEncoder",
    28  		":t x",
    29  		":t fmt",
    30  	}
    31  
    32  	for _, code := range codes {
    33  		_ = s.Eval(code)
    34  	}
    35  
    36  	assert.Regexp(t, `string
    37  int
    38  float64
    39  func\(\) \[\]int
    40  \[\]int
    41  func\(a \.\.\.(?:interface\{\}|any)\) string
    42  func\(a \.\.\.(?:interface\{\}|any)\) \(n int, err error\)
    43  func\(w io\.Writer\) \*encoding/json\.Encoder
    44  `, stdout.String())
    45  	assert.Equal(t, `type: cannot get type: x
    46  type: cannot get type: fmt
    47  `, stderr.String())
    48  }
    49  
    50  func TestAction_Doc(t *testing.T) {
    51  	var stdout, stderr strings.Builder
    52  	s, err := NewSession(&stdout, &stderr)
    53  	t.Cleanup(func() { s.Clear() })
    54  	require.NoError(t, err)
    55  
    56  	err = s.Eval(":import encoding/json")
    57  	require.NoError(t, err)
    58  	err = s.Eval(":i fmt")
    59  	require.NoError(t, err)
    60  
    61  	test := func() {
    62  		err = s.Eval(":doc fmt")
    63  		require.NoError(t, err)
    64  
    65  		err = s.Eval(":doc fmt.Print")
    66  		require.NoError(t, err)
    67  
    68  		err = s.Eval(":d json.NewEncoder(nil).Encode")
    69  		require.NoError(t, err)
    70  	}
    71  
    72  	test()
    73  
    74  	// test :doc works after some code
    75  
    76  	err = s.Eval("a := 1")
    77  	require.NoError(t, err)
    78  
    79  	err = s.Eval("fmt.Print()")
    80  	require.NoError(t, err)
    81  
    82  	test()
    83  
    84  	assert.Contains(t, stdout.String(), "package fmt")
    85  	assert.Contains(t, stdout.String(), "func Printf")
    86  	assert.Equal(t, "", stderr.String())
    87  }
    88  
    89  func TestAction_Import(t *testing.T) {
    90  	var stdout, stderr strings.Builder
    91  	s, err := NewSession(&stdout, &stderr)
    92  	t.Cleanup(func() { s.Clear() })
    93  	require.NoError(t, err)
    94  
    95  	err = s.Eval(":import encoding/json fmt")
    96  	require.NoError(t, err)
    97  
    98  	err = s.Eval("fmt.Print")
    99  	require.NoError(t, err)
   100  
   101  	err = s.Eval("json.Encoder{}")
   102  	require.NoError(t, err)
   103  
   104  	assert.Contains(t, stdout.String(), "(func(...interface {}) (int, error))")
   105  	assert.Contains(t, stdout.String(), "json.Encoder")
   106  	assert.Equal(t, "", stderr.String())
   107  
   108  	err = s.Eval(":import invalid")
   109  	require.Error(t, err)
   110  
   111  	err = s.Eval("fmt.Sprint")
   112  	require.NoError(t, err)
   113  	assert.Equal(t, "import: could not import \"invalid\"\n", stderr.String())
   114  }
   115  
   116  func TestAction_Clear(t *testing.T) {
   117  	var stdout, stderr strings.Builder
   118  	s, err := NewSession(&stdout, &stderr)
   119  	t.Cleanup(func() { s.Clear() })
   120  	require.NoError(t, err)
   121  
   122  	codes := []string{
   123  		`x := 10`,
   124  		`x`,
   125  		`:clear`,
   126  		`x := "foo"`,
   127  		`x`,
   128  		`:clear`,
   129  		`x`,
   130  	}
   131  
   132  	for _, code := range codes {
   133  		_ = s.Eval(code)
   134  	}
   135  
   136  	assert.Equal(t, `10
   137  10
   138  "foo"
   139  "foo"
   140  `, stdout.String())
   141  	assert.Equal(t, "undefined: x\n", stderr.String())
   142  }
   143  
   144  func TestAction_Help(t *testing.T) {
   145  	var stdout, stderr strings.Builder
   146  	s, err := NewSession(&stdout, &stderr)
   147  	t.Cleanup(func() { s.Clear() })
   148  	require.NoError(t, err)
   149  
   150  	err = s.Eval(": :  :   help  ")
   151  	require.NoError(t, err)
   152  
   153  	assert.Contains(t, stdout.String(), ":import <package>")
   154  	assert.Contains(t, stdout.String(), ":write [<file>]")
   155  	assert.Contains(t, stdout.String(), "show this help")
   156  	assert.Contains(t, stdout.String(), "quit the session")
   157  	assert.Equal(t, "", stderr.String())
   158  
   159  	err = s.Eval(":h")
   160  	require.NoError(t, err)
   161  }
   162  
   163  func TestAction_Quit(t *testing.T) {
   164  	var stdout, stderr strings.Builder
   165  	s, err := NewSession(&stdout, &stderr)
   166  	t.Cleanup(func() { s.Clear() })
   167  	require.NoError(t, err)
   168  
   169  	err = s.Eval(" :\t: quit")
   170  	require.Equal(t, ErrQuit, err)
   171  
   172  	assert.Equal(t, "", stdout.String())
   173  	assert.Equal(t, "", stderr.String())
   174  
   175  	err = s.Eval(":q")
   176  	require.Equal(t, ErrQuit, err)
   177  }
   178  
   179  func TestAction_CommandNotFound(t *testing.T) {
   180  	var stdout, stderr strings.Builder
   181  	s, err := NewSession(&stdout, &stderr)
   182  	t.Cleanup(func() { s.Clear() })
   183  	require.NoError(t, err)
   184  
   185  	err = s.Eval(":::")
   186  	require.NoError(t, err)
   187  
   188  	err = s.Eval(":foo")
   189  	require.Error(t, err)
   190  
   191  	err = s.Eval(":ii")
   192  	require.Error(t, err)
   193  
   194  	err = s.Eval(":docc")
   195  	require.Error(t, err)
   196  
   197  	err = s.Eval(":help]")
   198  	require.Error(t, err)
   199  
   200  	assert.Equal(t, "", stdout.String())
   201  	assert.Equal(t, `command not found: foo
   202  command not found: ii
   203  command not found: docc
   204  command not found: help]
   205  `, stderr.String())
   206  }
   207  
   208  func TestAction_ArgumentRequired(t *testing.T) {
   209  	var stdout, stderr strings.Builder
   210  	s, err := NewSession(&stdout, &stderr)
   211  	t.Cleanup(func() { s.Clear() })
   212  	require.NoError(t, err)
   213  
   214  	err = s.Eval(":import")
   215  	require.Error(t, err)
   216  
   217  	err = s.Eval(":type")
   218  	require.Error(t, err)
   219  
   220  	err = s.Eval(":doc")
   221  	require.Error(t, err)
   222  
   223  	assert.Equal(t, "", stdout.String())
   224  	assert.Equal(t, `import: argument is required
   225  type: argument is required
   226  doc: argument is required
   227  `, stderr.String())
   228  }