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 }