func (m *StepMap) GetAssignee(s *game.SetupStep) *game.Player {
	for player, step := range m.stepMap {
		if s.Equal(step) {
			return player
		}
	}
	return nil
}
func (m *StepPlayerIdMap) GetAssignee(s *game.SetupStep) *game.Player {
	for playerId, step := range m.stepMap {
		if nil != step && s.Equal(step) {
			return m.playerMap[playerId]
		}
	}
	return nil
}
func (m *StepMap) IsAssigned(step *game.SetupStep) bool {
	assignees := m.GetAssignees(step.Rule)
	for _, assignee := range assignees {
		if step.CanBeOwnedBy(assignee) {
			return true
		}
	}
	return false
}
func TestStepHonorsDependencies(t *testing.T) {
	rule0 := game.NewSetupRule("0", "Once")
	rule0.Id = 0
	rule1 := game.NewSetupRule("1", "Once", rule0)
	rule1.Id = 1
	rule2 := game.NewSetupRule("2", "Once", rule1)
	rule2.Id = 2

	players := []*game.Player{
		&game.Player{1, "Alice"},
		&game.Player{2, "Bob"},
	}
	g := game.NewGame("war", []*game.SetupRule{rule0, rule1, rule2}, len(players), len(players))
	session, err := NewSession(g, players)
	if nil != err {
		t.Fatal("Error creating session")
	}

	states := make(map[*game.SetupRule][]stepState)
	var step *game.SetupStep

	states[rule0] = []stepState{undone, unassigned}
	states[rule1] = []stepState{undone, unassigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(1, t, session, states)

	step = session.Step(players[0])
	if step.Rule.Description != "0" {
		t.Fatal(fmt.Sprintf("Step 0 should be the next step, but is %s", step.Rule.Description))
	}
	states[rule0] = []stepState{undone, assigned}
	states[rule1] = []stepState{undone, unassigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(2, t, session, states)

	// No change
	step = session.Step(players[0])
	if step.Rule.Description != "0" {
		t.Fatal(fmt.Sprintf("Step 0 should be the next step, but is %s", step.Rule.Description))
	}
	states[rule0] = []stepState{undone, assigned}
	states[rule1] = []stepState{undone, unassigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(3, t, session, states)

	// No change. Dependency is not yet done.
	noStep := session.Step(players[1])
	if noStep != nil {
		t.Fatal("Step cannot yet be assigned")
	}
	states[rule0] = []stepState{undone, assigned}
	states[rule1] = []stepState{undone, unassigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(4, t, session, states)

	step.Finish()
	states[rule0] = []stepState{done, assigned}
	states[rule1] = []stepState{undone, unassigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(5, t, session, states)

	step = session.Step(players[0])
	if step.Rule.Description != "1" {
		t.Fatal(fmt.Sprintf("Step 1 should be the next step, but is %s", step.Rule.Description))
	}
	states[rule0] = []stepState{done, unassigned}
	states[rule1] = []stepState{undone, assigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(6, t, session, states)

	step.Finish()
	states[rule0] = []stepState{done, unassigned}
	states[rule1] = []stepState{done, assigned}
	states[rule2] = []stepState{undone, unassigned}
	verifyStates(7, t, session, states)

	step = session.Step(players[1])
	states[rule0] = []stepState{done, unassigned}
	states[rule1] = []stepState{done, assigned}
	states[rule2] = []stepState{undone, assigned}
	verifyStates(8, t, session, states)

	// No change
	session.Step(players[0])
	states[rule0] = []stepState{done, unassigned}
	states[rule1] = []stepState{done, assigned}
	states[rule2] = []stepState{undone, assigned}
	verifyStates(9, t, session, states)

	step.Finish()
	states[rule0] = []stepState{done, unassigned}
	states[rule1] = []stepState{done, assigned}
	states[rule2] = []stepState{done, assigned}
	verifyStates(10, t, session, states)
}