# Golang: testing terminal output

When working with Go, we always strive to test, one thing we want to test, is the terminal output, this is a simple way for testing the standard output.

## Testing the terminal output

```go
// save copy of std out
old := os.Stdout
//create read and write pupe
r, w, _ := os.Pipe()
// set the stdout to the pipe
os.Stdout = w
// we excute the function
someFunctionCall()
// close the resource
w.Close()
// reset the stdout back to the orignal
os.Stdout = old
// read from the read pipe we create
got, _ := io.ReadAll(r)
// check if out is what you want
// want := something you want
//if got != want {
	// throw an error.
//}
```

## Example

### SayHello function

Given we have this example function, saying `Hello World!`, and we want to test this out, whether the terminal is properly printing it out.

```go
func sayHello() {
	fmt.Printf("Hello World!")
}
```

### The test we function

To test we apply the same method, and we test for strings equality.

```go
func Test_SayHello(t *testing.T) {
	// save copy of std out
	old := os.Stdout
	//create read and write pupe
	r, w, _ := os.Pipe()
	// set the stdout to the pipe
	os.Stdout = w
	// we excuted
	sayHello()
	// close the resource
	w.Close()
	// reset the stdout back to the orignal
	os.Stdout = old
	// read from the read output we create
	out, _ := io.ReadAll(r)
	// convert to string
	got := string(out)
	// what we expect
	want := "Hello World!"
	if strings.Compare(got, want) != 0 {
		t.Errorf("incorrect hello got: %v", string(out))
	}
	if got != want {
		t.Errorf("incorrect hello got: %v", string(out))
	}
}
```
