Skip to content

Commit

Permalink
Merge pull request #1 from atomicgo/testing
Browse files Browse the repository at this point in the history
  • Loading branch information
MarvinJWendt committed Jun 2, 2022
2 parents aaacaa7 + 6d78b66 commit 0d55bd0
Show file tree
Hide file tree
Showing 4 changed files with 302 additions and 148 deletions.
164 changes: 80 additions & 84 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,40 +46,12 @@
<img src="https://raw.githubusercontent.com/atomicgo/atomicgo/main/assets/header.png" alt="AtomicGo">
</p>

## Description

Package keyboard can be used to read key presses from the keyboard, while in a
terminal application. It's crossplatform and keypresses can be combined to check
for ctrl+c, alt+4, ctrl-shift, alt+ctrl+right, etc.

Works nicely with https://atomicgo.dev/cursor

```go

keyboard.StartListener()
defer keyboard.StopListener()

for {
keyInfo, _ := keyboard.GetKey()
key := keyInfo.Code

if key == keys.CtrlC {
break
}

fmt.Println("\r", keyInfo.String())
}

```

## Install

<p align="center">
<table>
<tbody>
<td align="center">
<img width="2000" height="0"><br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------------------------------------------------------------------------------------
<img width="2000" height="0">
</td>
</tbody>
Expand All @@ -91,91 +63,115 @@ Works nicely with https://atomicgo.dev/cursor
<tbody>
<td align="center">
<img width="2000" height="0"><br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------------------------------------------------------------------------------------
<img width="2000" height="0">
</td>
</tbody>
</table>
</p>

```go
// Add this to your imports
import "atomicgo.dev/keyboard"
```
## Description

## Usage
Package keyboard can be used to read key presses from the keyboard, while in a
terminal application. It's crossplatform and keypresses can be combined to check
for ctrl+c, alt+4, ctrl-shift, alt+ctrl+right, etc. It can also be used to
simulate (mock) keypresses for CI testing.

#### func GetKey
Works nicely with https://atomicgo.dev/cursor

```go
func GetKey() (keys.Key, error)
```
GetKey blocks until a key is pressed and returns the key info.
## Simple Usage

Example:
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.CtrlC {
return true, nil // Stop listener by returning true on Ctrl+C
}

keyboard.StartListener()
fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})

## Advanced Usage

// Stop keyboard listener on Escape key press or CTRL+C.
// Exit application on "q" key press.
// Print every rune key press.
// Print every other key press.
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
switch key.Code {
case keys.CtrlC, keys.Escape:
return true, nil // Return true to stop listener
case keys.RuneKey: // Check if key is a rune key (a, b, c, 1, 2, 3, ...)
if key.String() == "q" { // Check if key is "q"
fmt.Println("\rQuitting application")
os.Exit(0) // Exit application
}
fmt.Printf("\rYou pressed the rune key: %s\n", key)
default:
fmt.Printf("\rYou pressed: %s\n", key)
}

for {
keyInfo, _ := keyboard.GetKey()
key := keyInfo.Code
return false, nil // Return false to continue listening
})

if key == keys.CtrlC {
break
}
## Simulate Key Presses (for mocking in tests)

fmt.Println("\r", keyInfo.String())
}
go func() {
keyboard.SimulateKeyPress("Hello") // Simulate key press for every letter in string
keyboard.SimulateKeyPress(keys.Enter) // Simulate key press for Enter
keyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right
keyboard.SimulateKeyPress('x') // Simulate key press for a single rune
keyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs

keyboard.StopListener()
keyboard.SimulateKeyPress(keys.Escape) // Simulate key press for Escape, which quits the program
}()

#### func StartListener
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.Escape || key.Code == keys.CtrlC {
os.Exit(0) // Exit program on Escape
}

```go
func StartListener() error
```
StartListener starts the keyboard listener
fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})

Example:

keyboard.StartListener()
## Usage

#### func Listen

for {
keyInfo, _ := keyboard.GetKey()
key := keyInfo.Code
```go
func Listen(onKeyPress func(key keys.Key) (stop bool, err error)) error
```
Listen calls a callback function when a key is pressed.

if key == keys.CtrlC {
break
}
Simple example:

fmt.Println("\r", keyInfo.String())
}
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.CtrlC {
return true, nil // Stop listener by returning true on Ctrl+C
}

keyboard.StopListener()
fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})

#### func StopListener
#### func SimulateKeyPress

```go
func StopListener() error
func SimulateKeyPress(input ...interface{}) error
```
StopListener stops the keyboard listener
SimulateKeyPress simulate a key press. It can be used to mock user input and
test your application.

Example:

keyboard.StartListener()

for {
keyInfo, _ := keyboard.GetKey()
key := keyInfo.Code

if key == keys.CtrlC {
break
}

fmt.Println("\r", keyInfo.String())
}

keyboard.StopListener()
go func() {
keyboard.SimulateKeyPress("Hello") // Simulate key press for every letter in string
keyboard.SimulateKeyPress(keys.Enter) // Simulate key press for Enter
keyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right
keyboard.SimulateKeyPress('x') // Simulate key press for a single rune
keyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs
}()

---

Expand Down
62 changes: 51 additions & 11 deletions doc.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,64 @@
/*
Package keyboard can be used to read key presses from the keyboard, while in a terminal application. It's crossplatform and keypresses can be combined to check for ctrl+c, alt+4, ctrl-shift, alt+ctrl+right, etc.
It can also be used to simulate (mock) keypresses for CI testing.
Works nicely with https://atomicgo.dev/cursor
```go
## Simple Usage
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.CtrlC {
return true, nil // Stop listener by returning true on Ctrl+C
}
fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})
keyboard.StartListener()
defer keyboard.StopListener()
for {
keyInfo, _ := keyboard.GetKey()
key := keyInfo.Code
## Advanced Usage
if key == keys.CtrlC {
break
// Stop keyboard listener on Escape key press or CTRL+C.
// Exit application on "q" key press.
// Print every rune key press.
// Print every other key press.
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
switch key.Code {
case keys.CtrlC, keys.Escape:
return true, nil // Return true to stop listener
case keys.RuneKey: // Check if key is a rune key (a, b, c, 1, 2, 3, ...)
if key.String() == "q" { // Check if key is "q"
fmt.Println("\rQuitting application")
os.Exit(0) // Exit application
}
fmt.Printf("\rYou pressed the rune key: %s\n", key)
default:
fmt.Printf("\rYou pressed: %s\n", key)
}
fmt.Println("\r", keyInfo.String())
}
return false, nil // Return false to continue listening
})
## Simulate Key Presses (for mocking in tests)
go func() {
keyboard.SimulateKeyPress("Hello") // Simulate key press for every letter in string
keyboard.SimulateKeyPress(keys.Enter) // Simulate key press for Enter
keyboard.SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right
keyboard.SimulateKeyPress('x') // Simulate key press for a single rune
keyboard.SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs
keyboard.SimulateKeyPress(keys.Escape) // Simulate key press for Escape, which quits the program
}()
keyboard.Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.Escape || key.Code == keys.CtrlC {
os.Exit(0) // Exit program on Escape
}
```
fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})
*/
package keyboard
63 changes: 63 additions & 0 deletions doc_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package keyboard

import (
"fmt"
"os"

"atomicgo.dev/keyboard/keys"
)

func ExampleSimple() {
Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.CtrlC {
return true, nil // Stop listener by returning true on Ctrl+C
}

fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})
}

func ExampleAdvanced() {
// Stop keyboard listener on Escape key press or CTRL+C.
// Exit application on "q" key press.
// Print every rune key press.
// Print every other key press.
Listen(func(key keys.Key) (stop bool, err error) {
switch key.Code {
case keys.CtrlC, keys.Escape:
return true, nil // Return true to stop listener
case keys.RuneKey: // Check if key is a rune key (a, b, c, 1, 2, 3, ...)
if key.String() == "q" { // Check if key is "q"
fmt.Println("\rQuitting application")
os.Exit(0) // Exit application
}
fmt.Printf("\rYou pressed the rune key: %s\n", key)
default:
fmt.Printf("\rYou pressed: %s\n", key)
}

return false, nil // Return false to continue listening
})
}

func ExampleMocking() {
go func() {
SimulateKeyPress("Hello") // Simulate key press for every letter in string
SimulateKeyPress(keys.Enter) // Simulate key press for Enter
SimulateKeyPress(keys.CtrlShiftRight) // Simulate key press for Ctrl+Shift+Right
SimulateKeyPress('x') // Simulate key press for a single rune
SimulateKeyPress('x', keys.Down, 'a') // Simulate key presses for multiple inputs

SimulateKeyPress(keys.Escape) // Simulate key press for Escape, which quits the program
}()

Listen(func(key keys.Key) (stop bool, err error) {
if key.Code == keys.Escape || key.Code == keys.CtrlC {
os.Exit(0) // Exit program on Escape
}

fmt.Println("\r" + key.String()) // Print every key press
return false, nil // Return false to continue listening
})
}
Loading

0 comments on commit 0d55bd0

Please sign in to comment.