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