1package fsm_test 2 3import ( 4 "testing" 5 6 "github.com/jawher/mow.cli/internal/container" 7 "github.com/jawher/mow.cli/internal/fsm" 8 "github.com/jawher/mow.cli/internal/fsm/fsmtest" 9 "github.com/jawher/mow.cli/internal/matcher" 10 "github.com/jawher/mow.cli/internal/values" 11 "github.com/stretchr/testify/require" 12) 13 14func TestParseErrorsWhenApplyReturnsFalse(t *testing.T) { 15 s := fsm.NewState() 16 err := s.Parse(nil) 17 18 require.Error(t, err) 19} 20 21func TestParseNoErrorWhenApplyReturnsTrue(t *testing.T) { 22 s := fsm.NewState() 23 s.Terminal = true 24 25 err := s.Parse(nil) 26 27 require.NoError(t, err) 28} 29 30func TestParseFillsContainers(t *testing.T) { 31 var ( 32 boolSetByUser = false 33 boolVar = false 34 stringsSetByUser = false 35 stringsVar []string 36 boolCon = &container.Container{ 37 Value: values.NewBool(&boolVar, false), 38 ValueSetFromEnv: true, 39 ValueSetByUser: &boolSetByUser, 40 } 41 stringsCon = &container.Container{ 42 Value: values.NewStrings(&stringsVar, []string{"original", "value"}), 43 ValueSetFromEnv: true, 44 ValueSetByUser: &stringsSetByUser, 45 } 46 ) 47 matchers := map[string]matcher.Matcher{ 48 "^": fsmtest.TestMatcher{ 49 TestPriority: 2, 50 MatchFunc: func(args []string, c *matcher.ParseContext) (bool, []string) { 51 c.Opts[boolCon] = []string{"true"} 52 c.Args[stringsCon] = []string{"new", "value"} 53 return true, nil 54 }, 55 }, 56 } 57 s := fsmtest.NewFsm(` 58 S1 ^ (S2) 59 `, matchers) 60 61 s.Prepare() 62 63 err := s.Parse([]string{"something"}) 64 65 require.NoError(t, err) 66 67 require.False(t, boolCon.ValueSetFromEnv) 68 require.True(t, boolSetByUser) 69 require.True(t, boolVar) 70 71 require.False(t, stringsCon.ValueSetFromEnv) 72 require.True(t, stringsSetByUser) 73 require.Equal(t, stringsVar, []string{"new", "value"}) 74} 75