using Core.Entities;
namespace Tests.Builders;
///
/// Fluent builder for creating EventDefinition test entities.
///
public class EventDefinitionBuilder
{
private static int _idCounter = 1;
private int _id = _idCounter++;
private string _name = "Test Event";
private string _shortName = "Test";
private EventFormat _format = EventFormat.Individual;
private int _minTeamSize = 1;
private int _maxTeamSize = 1;
private string? _semifinalistActivity = null;
private bool _onSiteActivity = false;
private int _regionalCount = 0;
private int _stateCount = 2;
private bool _presubmission = false;
private string _eligibility = "All students";
private string? _theme = null;
private string? _description = null;
private int? _levelOfEffort = null;
private string? _documentation = null;
private string? _notes = null;
public EventDefinitionBuilder WithName(string name)
{
_name = name;
if (_shortName == "Test") _shortName = name; // Auto-sync short name
return this;
}
public EventDefinitionBuilder WithShortName(string shortName)
{
_shortName = shortName;
return this;
}
public EventDefinitionBuilder AsTeamEvent(int minSize, int maxSize)
{
_format = EventFormat.Team;
_minTeamSize = minSize;
_maxTeamSize = maxSize;
return this;
}
public EventDefinitionBuilder AsIndividualEvent()
{
_format = EventFormat.Individual;
_minTeamSize = 1;
_maxTeamSize = 1;
return this;
}
public EventDefinitionBuilder WithInterview()
{
_semifinalistActivity = "Interview";
return this;
}
public EventDefinitionBuilder WithPresentation()
{
_semifinalistActivity = "Presentation";
return this;
}
public EventDefinitionBuilder WithSemifinalistActivity(string activity)
{
_semifinalistActivity = activity;
return this;
}
public EventDefinitionBuilder AsOnSite()
{
_onSiteActivity = true;
return this;
}
public EventDefinitionBuilder AsRegionalEvent(int count = 3)
{
_regionalCount = count;
return this;
}
public EventDefinitionBuilder WithStateCount(int count)
{
_stateCount = count;
return this;
}
public EventDefinitionBuilder WithPresubmission()
{
_presubmission = true;
return this;
}
public EventDefinitionBuilder WithEligibility(string eligibility)
{
_eligibility = eligibility;
return this;
}
public EventDefinitionBuilder WithTheme(string theme)
{
_theme = theme;
return this;
}
public EventDefinitionBuilder WithDescription(string description)
{
_description = description;
return this;
}
public EventDefinitionBuilder WithLevelOfEffort(int level)
{
_levelOfEffort = level;
return this;
}
public EventDefinitionBuilder WithDocumentation(string documentation)
{
_documentation = documentation;
return this;
}
public EventDefinitionBuilder WithNotes(string notes)
{
_notes = notes;
return this;
}
public EventDefinition Build()
{
return new EventDefinition
{
Id = _id,
Name = _name,
ShortName = _shortName,
EventFormat = _format,
MinTeamSize = _minTeamSize,
MaxTeamSize = _maxTeamSize,
SemifinalistActivity = _semifinalistActivity,
OnSiteActivity = _onSiteActivity,
ChapterEligibilityCountRegionals = _regionalCount,
ChapterEligibilityCountState = _stateCount,
Presubmission = _presubmission,
Eligibility = _eligibility,
Theme = _theme,
Description = _description,
LevelOfEffort = _levelOfEffort,
Documentation = _documentation,
Notes = _notes
};
}
// Static factory methods
public static EventDefinitionBuilder Default() => new EventDefinitionBuilder();
public static EventDefinitionBuilder Individual(string name) =>
new EventDefinitionBuilder()
.WithName(name)
.AsIndividualEvent();
public static EventDefinitionBuilder Team(string name, int minSize, int maxSize) =>
new EventDefinitionBuilder()
.WithName(name)
.AsTeamEvent(minSize, maxSize);
///
/// Reset the ID counter for test isolation. Call this in test SetUp.
///
public static void ResetIdCounter() => _idCounter = 1;
}