func TestMachineTransition(t *testing.T) { rules := fsm.Ruleset{} rules.AddTransition(fsm.T{"pending", "started"}) rules.AddTransition(fsm.T{"started", "finished"}) some_thing := Thing{State: "pending"} the_machine := fsm.New(fsm.WithRules(rules), fsm.WithSubject(&some_thing)) var err error // should not be able to transition to the current state err = the_machine.Transition("pending") st.Expect(t, err, fsm.InvalidTransition) st.Expect(t, some_thing.State, fsm.State("pending")) // should not be able to skip states err = the_machine.Transition("finished") st.Expect(t, err, fsm.InvalidTransition) st.Expect(t, some_thing.State, fsm.State("pending")) // should be able to transition to the next valid state err = the_machine.Transition("started") st.Expect(t, err, nil) st.Expect(t, some_thing.State, fsm.State("started")) }
func NewTestCase(platform *config.PlatformConfig, suite *config.SuiteConfig) *TestCase { testCase := &TestCase{ platform: platform, suite: suite, State: DESTROYED, Name: fmt.Sprintf("anvil-%s-%s", platform.Name, suite.Name), } machine := fsm.New(fsm.WithRules(createTestCaseRules()), fsm.WithSubject(testCase)) testCase.machine = machine testCase.LoadState() testCase.driver = plugin.LoadDriver(config.Cfg.Driver.Name) testCase.provisioner = plugin.LoadProvisioner(config.Cfg.Provisioner.Name) return testCase }