diff --git a/ft/helpers.go b/ft/helpers.go index cdea6ae..4074cbf 100644 --- a/ft/helpers.go +++ b/ft/helpers.go @@ -1,8 +1,10 @@ package ft import ( + "bufio" "errors" "fmt" + "os" "sort" "strings" ) @@ -38,3 +40,20 @@ func printMap(hashmap map[string]string) { fmt.Println("") } + +func PipeArgs(args *[]string) error { + + // read from stdin + scanner := bufio.NewScanner(os.Stdin) + scanner.Split(bufio.ScanWords) + for scanner.Scan() { + // append to args + *args = append(*args, scanner.Text()) + } + if err := scanner.Err(); err != nil { + return err + } + + return nil + +} diff --git a/ft/helpers_test.go b/ft/helpers_test.go index a8ad738..0e93ec5 100644 --- a/ft/helpers_test.go +++ b/ft/helpers_test.go @@ -97,3 +97,71 @@ func TestVerifyInput(t *testing.T) { } } + +func TestPipeArgs(t *testing.T) { + tests := []struct { + name string + initialArgs []string + input string + expected []string + }{ + { + name: "1. Pipe key name to args.", + initialArgs: []string{"ft"}, + input: "keyname", + expected: []string{"ft", "keyname"}, + }, + { + name: "2. Pipe in multiple args.", + initialArgs: []string{"ft"}, + input: "-set keyname", + expected: []string{"ft", "-set", "keyname"}, + }, + } + for _, tt := range tests { + t.Log(tt.name) + + r, w, err := os.Pipe() + if err != nil { + fmt.Println(tt.name) + t.Error("Error establishing pipe.") + } + stdin := os.Stdin + os.Stdin = r + + defer func() { + os.Stdin = stdin + r.Close() + w.Close() + }() + + _, err = io.WriteString(w, tt.input) + if err != nil { + t.Errorf("WriteString failed: %v", err) + } + w.Close() + + args := tt.initialArgs + err = PipeArgs(&args) + if err != nil { + fmt.Println(tt.name) + t.Error("PipeArgs produced an error: ", err) + } + + equal := true + if len(args) == len(tt.expected) { + for i, _ := range args { + if args[i] == tt.expected[i] { + continue + } + equal = false + break + } + if equal { + continue + } + } + t.Errorf("Expected: %q length %v, got: %q length %v", tt.expected, len(tt.expected), args, len(args)) + } + +} diff --git a/main.go b/main.go index ac6fd74..cf534a3 100644 --- a/main.go +++ b/main.go @@ -36,6 +36,13 @@ func main() { return } + // handle piped args + err = ft.PipeArgs(&os.Args) + if err != nil { + fmt.Println("Error: ", err) + return + } + // sanitize user input inputCommand, err := ft.PassCmd(os.Args) if err != nil { diff --git a/main_test.go b/main_test.go index 55b049c..bc63eff 100644 --- a/main_test.go +++ b/main_test.go @@ -73,10 +73,11 @@ func TestMainFunc(t *testing.T) { // tests tests := []struct { - name string - args []string - expected string - wantErr bool + name string + args []string + pipedInput string + expected string + wantErr bool }{ { name: "1. Check help command.", @@ -132,6 +133,14 @@ func TestMainFunc(t *testing.T) { expected: fmt.Sprintf("%v\n", cdpathtest), wantErr: false, }, + { + name: "8. Check command args piped to ft.", + args: []string{"ft"}, + pipedInput: "key", + expected: fmt.Sprintf("%v\n", tmpdir), + wantErr: false, + }, + // { // []string{"ft", "rn", "key", "key2"}, // "key renamed to key2", @@ -178,6 +187,27 @@ func TestMainFunc(t *testing.T) { }() + // Mock Stdin + stdinReader, stdinWriter, err := os.Pipe() + if err != nil { + fmt.Println(tt.name) + t.Error("Error establishing pipe.") + } + stdin := os.Stdin + os.Stdin = stdinReader + + defer func() { + os.Stdin = stdin + stdinReader.Close() + stdinWriter.Close() + }() + + _, err = io.WriteString(stdinWriter, tt.pipedInput) + if err != nil { + t.Errorf("WriteString failed: %v", err) + } + stdinWriter.Close() + main() // Capture queue contents for comparison against expected output