func TestStepPlayerIdMap_GetAssignees(t *testing.T) {
  p1 := game.Player{1, "1"}
  p2 := game.Player{2, "2"}
  r1 := game.NewSetupRule("1", "Once")
  r2 := game.NewSetupRule("2", "Each player")

  assignments := NewStepPlayerIdMap()
  var step *game.SetupStep
  step,_ = game.NewGlobalSetupStep(r1)
  assignments.Set(&p1, step)

  var assignees []*game.Player

  assignees = assignments.GetAssignees(r1)
  if len(assignees) != 1 {
    t.Fatal("Should have one assigned player")
  }
  if assignees[0] != &p1 {
    t.Fatal("Player 1 should be the assignee")
  }

  step,_ = game.NewPerPlayerSetupStep(r2, &p1)
  assignments.Set(&p1, step)
  step,_ = game.NewPerPlayerSetupStep(r2, &p2)
  assignments.Set(&p2, step)

  assignees = assignments.GetAssignees(r2)
  if len(assignees) != 2 {
    t.Fatal("Should have two assigned players")
  }
  foundP1, foundP2 := false, false
  for _,p := range assignees {
    if p == &p1 {
      foundP1 = true
    }
    if p == &p2 {
      foundP2 = true
    }
  }
  if !(foundP1 && foundP2) {
    t.Fatal("Both players should be assigned")
  }
}
func NewSession(g *game.Game, players []*game.Player) (*Session, error) {
	if nil == g {
		return nil, errors.New("Session must have a non-nil Game")
	}
	if len(players) < g.MinPlayers {
		return nil, errors.New(fmt.Sprintf("Game requires at least %d players, but %d were given", g.MinPlayers, len(players)))
	}
	if len(players) > g.MaxPlayers {
		return nil, errors.New(fmt.Sprintf("Game requires at most %d players, but %d were given", g.MaxPlayers, len(players)))
	}

	setupSteps := make([]*game.SetupStep, 0)
	for _, rule := range g.SetupRules {
		if "Once" == rule.Arity {
			step, err := game.NewGlobalSetupStep(rule)
			if nil != err {
				return nil, err
			}
			setupSteps = append(setupSteps, step)
		} else if "Each player" == rule.Arity {
			for _, p := range players {
				step, err := game.NewPerPlayerSetupStep(rule, p)
				if nil != err {
					return nil, err
				}
				setupSteps = append(setupSteps, step)
			}
		}
	}

	return &Session{
		Game:             g,
		Players:          players,
		SetupAssignments: newStepAssignments(),
		SetupSteps:       setupSteps,
	}, nil
}