using System.Collections.Generic;
private static readonly JsonSerializerSettings options = new JsonSerializerSettings { Formatting = Formatting.Indented };
public static void Main()
var detailFaker = new JobStandardizedDetailFaker();
var jobStandardizedDetailsGenerator = detailFaker.GetJobStandardizedDetailRules();
var jobStandardizedDetails = jobStandardizedDetailsGenerator.Generate(4);
var serializedData = JsonConvert.SerializeObject(jobStandardizedDetails, new JsonSerializerSettings
Formatting = Formatting.Indented
Console.WriteLine(serializedData);
public class JobStandardizedDetailFaker
private readonly Faker _faker = new();
public Faker<JobStandardizedDetail> GetJobStandardizedDetailRules()
AutoFaker.Configure(builder =>
.WithOverride(new SequenceByNameOverride());
var subSubSubSubFaker = new AutoFaker<JobStandardizedDetailSubItem>();
var subSubSubFaker = new AutoFaker<JobStandardizedDetailSubItem>()
.RuleFor(s => s.Value, f => subSubSubSubFaker.Generate(_faker.Random.Int(1,6)));
var subSubFaker = new AutoFaker<JobStandardizedDetailSubItem>()
.RuleFor(s => s.Value, f => subSubSubFaker.Generate(_faker.Random.Int(1, 6)));
var subFaker = new AutoFaker<JobStandardizedDetailSubItem>()
.RuleFor(s => s.Value, f => subSubFaker.Generate(_faker.Random.Int(1, 6)));
var categories = new[] {"JOB DETAILS", "SCHEDULE AND COVERAGE", "ABOUT THE FACILITY", "REQUIREMENTS"};
var faker = new AutoFaker<JobStandardizedDetail>()
.RuleFor(job => job.Category,
faker => categories[faker.IndexVariable])
.RuleFor(job => job.SubItems,
(faker, job) => GenerateSubItems(subFaker, job).Generate(_faker.Random.Int(1, 6)));
private Faker<JobStandardizedDetailSubItem> GenerateSubItems(Faker<JobStandardizedDetailSubItem> faker,
JobStandardizedDetail job)
if (job.Category == "ABOUT THE FACILITY" && job.SubItems.Count == 0)
var aboutFaker = new AutoFaker<JobStandardizedDetailSubItem>()
.RuleFor(a => a.Title, (f) => f.Lorem.Slug())
.RuleFor(a => a.Value, f => (dynamic)("<h1>Sample HTML Text</h1> " + ListFaker(f, f.Random.Int(1, 10))));
return faker.RuleFor(a => a.Value, (f) =>
return (dynamic)f.Lorem.Sentence();
return faker.Generate(1);
private string ListFaker(Faker f, int numberOfItems)
var listItems = new List<string>();
for(var i = 0; i <= numberOfItems; i++) {
var item = $"<li>{f.Lorem.Word()}</li>";
var listFaker = $"<ul>{String.Join(' ', listItems.ToArray())}</ul>";
public class SequenceByNameOverride : AutoGeneratorOverride
public override bool CanOverride(AutoGenerateContext context)
return context.GenerateType == typeof(int) && string.Equals("Sequence", context.GenerateName, StringComparison.OrdinalIgnoreCase);
public override void Generate(AutoGenerateOverrideContext context)
context.Instance = context.Faker.IndexVariable++;
public record JobStandardizedDetail
public string Category { get; init; }
public int Sequence { get; init; }
public List<JobStandardizedDetailSubItem> SubItems { get; init; } = new List<JobStandardizedDetailSubItem>();
public record JobStandardizedDetailSubItem
public int Sequence { get; init; }
public string Title { get; init; }
public dynamic Value { get; init; }
public JobStandardizedDetailSubItem()
public JobStandardizedDetailSubItem(string title, params StandardizeValue[] value)
public record StandardizeValue
public string Title { get; init; }
public dynamic Value { get; init; }
public StandardizeValue()
public StandardizeValue(string title)