github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/test/test.go (about) 1 package cmdtest 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/types" 9 "github.com/lmorg/murex/utils" 10 ) 11 12 func init() { 13 lang.DefineFunction("test", cmdTest, types.Any) 14 lang.DefineFunction("!test", cmdTestDisable, types.Null) 15 } 16 17 func errUsage(invalidParameter string, err error) error { 18 usage := `Expected usage: 19 test config [ enable|!enable ] [ verbose|!verbose ] [ auto-report|!auto-report ] 20 test define test-name { json-properties } 21 test unit function|private|open|event test-name { json-properties } 22 test state name { code block } 23 test run { code-block } 24 test run package/module/test-name|* 25 test report 26 !test` 27 28 switch { 29 case invalidParameter != "": 30 return fmt.Errorf("invalid parameter: `%s`%s%s", invalidParameter, utils.NewLineString, usage) 31 case err != nil: 32 return fmt.Errorf("%s%s%s", err.Error(), utils.NewLineString, usage) 33 default: 34 return errors.New(usage) 35 } 36 } 37 38 type testArgs struct { 39 StdoutBlock string 40 StdoutRegex string 41 StderrBlock string 42 StderrRegex string 43 ExitNum int 44 } 45 46 func cmdTest(p *lang.Process) error { 47 //p.Stdout.SetDataType(types.Null) 48 49 if p.Parameters.Len() == 0 { 50 s, err := p.Config.Get("test", "enabled", types.String) 51 if err != nil { 52 return err 53 } 54 _, err = p.Stdout.Write([]byte(s.(string))) 55 return err 56 } 57 58 option, _ := p.Parameters.String(0) 59 switch option { 60 case "define": 61 return testDefine(p) 62 63 case "unit": 64 return testUnitDefine(p) 65 66 case "state": 67 return testState(p) 68 69 case "run": 70 return testRun(p) 71 72 case "run-unit": 73 return testUnitRun(p) 74 75 case "config": 76 for i := 1; i < p.Parameters.Len(); i++ { 77 err := testConfig(p, i) 78 if err != nil { 79 return err 80 } 81 } 82 return nil 83 84 case "report": 85 return lang.ShellProcess.Tests.WriteResults(p.Config, p.Stdout) 86 87 default: 88 return errUsage(option, nil) 89 } 90 } 91 92 func testConfig(p *lang.Process, i int) error { 93 option, _ := p.Parameters.String(i) 94 95 switch option { 96 case "enable": 97 p.Stdout.Writeln([]byte("Enabling test mode....")) 98 return p.Config.Set("test", "enabled", true, p.FileRef) 99 100 case "!enable": 101 p.Stdout.Writeln([]byte("Disabling test mode....")) 102 return p.Config.Set("test", "enabled", false, p.FileRef) 103 104 case "auto-report": 105 p.Stdout.Writeln([]byte("Enabling auto-report....")) 106 return p.Config.Set("test", "auto-report", true, p.FileRef) 107 108 case "!auto-report": 109 p.Stdout.Writeln([]byte("Disabling auto-report....")) 110 return p.Config.Set("test", "auto-report", false, p.FileRef) 111 112 case "verbose": 113 p.Stdout.Writeln([]byte("Enabling verbose reporting....")) 114 return p.Config.Set("test", "verbose", true, p.FileRef) 115 116 case "!verbose": 117 p.Stdout.Writeln([]byte("Disabling verbose reporting....")) 118 return p.Config.Set("test", "verbose", false, p.FileRef) 119 120 default: 121 return errUsage(option, nil) 122 } 123 } 124 125 func cmdTestDisable(p *lang.Process) error { 126 if p.Parameters.Len() > 0 { 127 return errUsage("", errors.New("too many parameters! Usage: `!test` to disable testing")) 128 } 129 return p.Config.Set("test", "enabled", false, p.FileRef) 130 }