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  }