github.com/WindomZ/go-commander@v1.2.2/program_test.go (about)

     1  package commander
     2  
     3  import (
     4  	"github.com/WindomZ/testify/assert"
     5  	"strconv"
     6  	"testing"
     7  )
     8  
     9  func TestProgram_AutomaticHelp(t *testing.T) {
    10  	program := newProgram()
    11  
    12  	program.Command("go-commander").
    13  		Version("0.0.1").
    14  		Description("this is a test cli.")
    15  
    16  	if _, err := program.Parse([]string{}); err != nil {
    17  		t.Fatal(err)
    18  	}
    19  	if _, err := program.Parse([]string{"go-commander", "-h"}); err != nil {
    20  		t.Fatal(err)
    21  	}
    22  }
    23  
    24  func TestProgram_ShowVersion(t *testing.T) {
    25  	program := newProgram()
    26  
    27  	program.Command("go-commander")
    28  	program.Version("0.0.1").
    29  		Description("this is a test cli.")
    30  
    31  	if _, err := program.Parse([]string{"go-commander", "-v"}); err != nil {
    32  		t.Fatal(err)
    33  	}
    34  }
    35  
    36  func TestProgram_ErrorHandling(t *testing.T) {
    37  	program := newProgram()
    38  
    39  	program.Command("go-commander").
    40  		Version("0.0.1").
    41  		Description("this is a test cli.")
    42  
    43  	program.Command("test").Action(func() error {
    44  		return newError("this is a test error")
    45  	})
    46  
    47  	_, err := program.Parse(nil)
    48  	assert.Error(t, err)
    49  
    50  	_, err = program.Parse([]string{"go-commander", "test"})
    51  	assert.Error(t, err)
    52  
    53  	var handing bool = false
    54  	program.ErrorHandling(func(err error) {
    55  		assert.Error(t, err)
    56  		handing = true
    57  	})
    58  
    59  	_, err = program.Parse([]string{"go-commander", "test"})
    60  	assert.Error(t, err)
    61  	assert.True(t, handing)
    62  }
    63  
    64  func TestProgram_LineOption(t *testing.T) {
    65  	var result string
    66  	var result2 string
    67  
    68  	program := newProgram()
    69  
    70  	program.Command("test").
    71  		Version("0.0.1").
    72  		Description("this is a test cli.")
    73  
    74  	program.Command("-a --aaa").
    75  		Action(func() {
    76  			result = "aaa"
    77  		}).
    78  		Option("-d --ddd").
    79  		Action(func() {
    80  			result2 = "ddd"
    81  		})
    82  	program.Command("-b --bbb", "",
    83  		func() {
    84  			result = "bbb"
    85  		})
    86  	program.Command("-c").
    87  		Action(func() {
    88  			result = "ccc"
    89  		})
    90  
    91  	if _, err := program.Parse([]string{"test", "-a"}); err != nil {
    92  		t.Fatal(err)
    93  	} else {
    94  		assert.Equal(t, result, "aaa")
    95  	}
    96  	if _, err := program.Parse([]string{"test", "-a", "-d"}); err != nil {
    97  		t.Fatal(err)
    98  	} else {
    99  		assert.Equal(t, result, "aaa")
   100  		assert.Equal(t, result2, "ddd")
   101  	}
   102  	if _, err := program.Parse([]string{"test", "--bbb"}); err != nil {
   103  		t.Fatal(err)
   104  	} else {
   105  		assert.Equal(t, result, "bbb")
   106  	}
   107  	if _, err := program.Parse([]string{"test", "-c"}); err != nil {
   108  		t.Fatal(err)
   109  	} else {
   110  		assert.Equal(t, result, "ccc")
   111  	}
   112  }
   113  
   114  func TestProgram_Aliases(t *testing.T) {
   115  	program := newProgram()
   116  
   117  	program.Command("go-commander")
   118  
   119  	program.Command("-i --init")
   120  
   121  	program.Command("-o").
   122  		Aliases([]string{"--origin"})
   123  
   124  	assert.Equal(t, program.HelpMessage(), `  Usage:
   125      go-commander -i|--init
   126      go-commander -o|--origin
   127      go-commander -h|--help
   128      go-commander -v|--version
   129  
   130    Options:
   131      -h --help     output usage information
   132      -v --version  output the version number
   133  `)
   134  }
   135  
   136  func TestProgram_CommandDescription(t *testing.T) {
   137  	program := newProgram()
   138  
   139  	program.Command("go-commander")
   140  
   141  	program.Command("-i --init").
   142  		Description("this is init flag")
   143  
   144  	program.Command("-o").
   145  		Aliases([]string{"--origin"}).
   146  		Description("this is origin flag")
   147  
   148  	assert.Equal(t, program.HelpMessage(), `  Usage:
   149      go-commander -i|--init
   150      go-commander -o|--origin
   151      go-commander -h|--help
   152      go-commander -v|--version
   153  
   154    Options:
   155      -h --help     output usage information
   156      -i --init     this is init flag
   157      -o --origin   this is origin flag
   158      -v --version  output the version number
   159  `)
   160  }
   161  
   162  func TestProgram_Ping(t *testing.T) {
   163  	var sum int
   164  	var host string
   165  	program := newProgram()
   166  
   167  	program.Command("test").
   168  		Version("0.0.1").
   169  		Description("this is a test cli.")
   170  
   171  	program.Command("add <x> <y>").
   172  		Description("addition operation").
   173  		Action(func() error {
   174  			sum = program.MustInt("<x>") + program.MustInt("<y>")
   175  			return nil
   176  		})
   177  
   178  	program.Command("ping <host>").
   179  		Option("--timeout=<seconds>",
   180  			"",
   181  			func() error {
   182  				seconds := program.MustString("<seconds>")
   183  
   184  				t.Log("seconds =", seconds)
   185  
   186  				assert.Equal(t, seconds, 0)
   187  				return nil
   188  			},
   189  		).Action(func() error {
   190  		host = program.MustString("<host>")
   191  		return nil
   192  	})
   193  
   194  	if _, err := program.Parse([]string{"test", "add", "10", "20"}); err != nil {
   195  		t.Fatal(err)
   196  	}
   197  	if _, err := program.Parse([]string{"test", "ping", "127.0.0.1"}); err != nil {
   198  		t.Fatal(err)
   199  	}
   200  
   201  	assert.Equal(t, sum, 30)
   202  	assert.Equal(t, host, "127.0.0.1")
   203  }
   204  
   205  func TestProgram_Calculator(t *testing.T) {
   206  	var result int
   207  	program := newProgram()
   208  
   209  	program.Command("calculator_example").
   210  		Version("0.0.1").
   211  		Description("simple calculator example")
   212  
   213  	program.Command("<value> ( ( + | - | * | / ) <value> )...", "", func() error {
   214  		values := program.MustStrings("<value>")
   215  		for index, value := range values {
   216  			if i, err := strconv.Atoi(value); err != nil {
   217  			} else if index == 0 {
   218  				result = i
   219  			} else {
   220  				switch program.GetArg(index*2 - 1) {
   221  				case "+":
   222  					result += i
   223  				case "-":
   224  					result -= i
   225  				case "*":
   226  					result *= i
   227  				case "/":
   228  					result /= i
   229  				}
   230  			}
   231  		}
   232  		return nil
   233  	})
   234  
   235  	program.Command("<function> <value> [( , <value> )]...", "", func() error {
   236  		result = 0
   237  		switch program.MustString("<function>") {
   238  		case "sum":
   239  			values := program.MustStrings("<value>")
   240  			for _, value := range values {
   241  				if i, err := strconv.Atoi(value); err == nil {
   242  					result += i
   243  				}
   244  			}
   245  		}
   246  		return nil
   247  	})
   248  
   249  	if _, err := program.Parse([]string{"calculator_example",
   250  		"1", "+", "2", "+", "3", "+", "4", "+", "5"}); err != nil {
   251  		t.Fatal(err)
   252  	}
   253  	assert.Equal(t, result, 15)
   254  
   255  	if _, err := program.Parse([]string{"calculator_example",
   256  		"1", "+", "2", "*", "3", "/", "4", "-", "5"}); err != nil {
   257  		t.Fatal(err)
   258  	}
   259  	assert.Equal(t, result, -3)
   260  
   261  	if _, err := program.Parse([]string{"calculator_example",
   262  		"sum", "10", ",", "20", ",", "30", ",", "40"}); err != nil {
   263  		t.Fatal(err)
   264  	}
   265  	assert.Equal(t, result, 100)
   266  }