From 64c5bf8daf8b71b6efc2b4d2be34b179c8c87059 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Mon, 26 May 2025 20:23:03 -0400 Subject: Add numeric tests --- cmds/test.go | 142 ++++++++++++++++++++++++++--------------------------------- 1 file changed, 62 insertions(+), 80 deletions(-) (limited to 'cmds/test.go') diff --git a/cmds/test.go b/cmds/test.go index 98e182f..59989d3 100644 --- a/cmds/test.go +++ b/cmds/test.go @@ -1,7 +1,6 @@ package cmds import ( - "fmt" "os" "os/user" "strconv" @@ -17,104 +16,87 @@ func test(args []string) int { if strings.HasPrefix(args[1], "-") { return genTest(args[1:]) } else { - n, err := strconv.Atoi(args[1]) + _, err := strconv.Atoi(args[1]) if err != nil { return testString(args[1:]) } else { - fmt.Println(n) + return testNumber(args[1:]) } } - return 1 } func testString(args []string) int { - ret := 1 - switch args[1] { - case "=": - if args[0] == args[2] { - ret = 0 - } - break - case "!=": - if args[0] != args[2] { - ret = 0 - } - break + if len(args) != 3 { + return 1 + } + sTests := map[string]func() bool{ + "=": func() bool { return args[0] == args[2] }, + "!=": func() bool { return args[0] != args[2] }, + "<": func() bool { return strings.Compare(args[0], args[2]) < 0 }, + ">": func() bool { return strings.Compare(args[0], args[2]) > 0 }, } - return ret + if sTest, ok := sTests[args[1]]; ok && sTest() { + return 0 + } + return 1 +} + +func testNumber(args []string) int { + if len(args) != 3 { + return 1 + } + a, _ := strconv.Atoi(args[0]) + b, err := strconv.Atoi(args[2]) + if err != nil { + return 1 + } + nTests := map[string]func() bool{ + "-eq": func() bool { return a == b }, + "-ne": func() bool { return a != b }, + "-gt": func() bool { return a > b }, + "-ge": func() bool { return a >= b }, + "-lt": func() bool { return a < b }, + "-le": func() bool { return a <= b }, + } + if nTest, ok := nTests[args[1]]; ok && nTest() { + return 0 + } + return 1 } func genTest(args []string) int { - ret := 1 - switch args[0] { - case "-n": - if len(args[1]) > 0 { - return 0 - } - break - case "-z": - if len(args[1]) == 0 { - return 0 - } - break + sTests := map[string]func() bool{ + "-n": func() bool { return len(args[1]) > 0 }, + "-z": func() bool { return len(args[1]) == 0 }, + } + if sTest, ok := sTests[args[0]]; ok && sTest() { + return 0 } fi, err := os.Lstat(args[1]) c, _ := user.Current() if err != nil { - return ret + return 1 } s := fi.Sys().(*syscall.Stat_t) + uid, _ := strconv.Atoi(c.Uid) + gid, _ := strconv.Atoi(c.Gid) - switch args[0] { - case "-e": - ret = 0 - break - case "-f": - if !fi.IsDir() { - ret = 0 - } - break - case "-d": - if fi.IsDir() { - ret = 0 - } - break - case "-r": - if fi.Mode().Perm()&0400 != 0 { - ret = 0 - } - break - case "-w": - if fi.Mode().Perm()&0200 != 0 { - ret = 0 - } - break - case "-x": - if fi.Mode().Perm()&0100 != 0 { - ret = 0 - } - break - case "-S": - if fi.Size() > 0 { - ret = 0 - } - break - case "-L": - if fi.Mode()&os.ModeSymlink != 0 { - ret = 0 - } - break - case "-O": - if c.Uid == strconv.Itoa(int(s.Uid)) { - ret = 0 - } - break - case "-G": - if c.Gid == strconv.Itoa(int(s.Gid)) { - ret = 0 - } - break + fTests := map[string]func() bool{ + "-e": func() bool { return true }, + "-f": func() bool { return !fi.IsDir() }, + "-d": func() bool { return fi.IsDir() }, + "-r": func() bool { return fi.Mode().Perm()&0400 != 0 }, + "-w": func() bool { return fi.Mode().Perm()&0200 != 0 }, + "-x": func() bool { return fi.Mode().Perm()&0100 != 0 }, + "-S": func() bool { return fi.Size() > 0 }, + "-L": func() bool { return fi.Mode()&os.ModeSymlink != 0 }, + "-O": func() bool { return uid == int(s.Uid) }, + "-G": func() bool { return gid == int(s.Gid) }, + } + + if fTest, ok := fTests[args[0]]; ok && fTest() { + return 0 } - return ret + return 1 } -- cgit v1.2.3