[{"data":1,"prerenderedAt":1499},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fconstructor-setup":170,"\u002Fguides\u002Fconstructor-setup-surround":1494},[4,25,104,150,160],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Guides","\u002Fguides","2.guides",[30,35,40,45,50,55,60,65,70,75,79,84,89,94,99],{"title":31,"path":32,"stem":33,"icon":34},"Seeds and TestBiome","\u002Fguides\u002Fseeds-and-testbiome","2.guides\u002F01.seeds-and-testbiome","i-lucide-sprout",{"title":36,"path":37,"stem":38,"icon":39},"Blueprints","\u002Fguides\u002Fblueprints","2.guides\u002F02.blueprints","i-lucide-drafting-compass",{"title":41,"path":42,"stem":43,"icon":44},"Customizing","\u002Fguides\u002Fcustomizing","2.guides\u002F03.customizing","i-lucide-sliders-horizontal",{"title":46,"path":47,"stem":48,"icon":49},"Parent\u002Fchild chains and .Under","\u002Fguides\u002Fparents-and-children","2.guides\u002F04.parents-and-children","i-lucide-git-fork",{"title":51,"path":52,"stem":53,"icon":54},"Fan-out","\u002Fguides\u002Ffan-out","2.guides\u002F05.fan-out","i-lucide-split",{"title":56,"path":57,"stem":58,"icon":59},"Sequences","\u002Fguides\u002Fsequences","2.guides\u002F06.sequences","i-lucide-list-ordered",{"title":61,"path":62,"stem":63,"icon":64},"Time and precision","\u002Fguides\u002Ftime-and-precision","2.guides\u002F07.time-and-precision","i-lucide-clock",{"title":66,"path":67,"stem":68,"icon":69},"Transients","\u002Fguides\u002Ftransients","2.guides\u002F08.transients","i-lucide-ghost",{"title":71,"path":72,"stem":73,"icon":74},"Aggregates","\u002Fguides\u002Faggregates","2.guides\u002F09.aggregates","i-lucide-boxes",{"title":76,"path":77,"stem":78,"icon":74},"Input blueprints","\u002Fguides\u002Finput-blueprints","2.guides\u002F09.input-blueprints",{"title":80,"path":81,"stem":82,"icon":83},"Save hooks and global defaults","\u002Fguides\u002Fsave-hooks-and-defaults","2.guides\u002F10.save-hooks-and-defaults","i-lucide-webhook",{"title":85,"path":86,"stem":87,"icon":88},"EF Core store","\u002Fguides\u002Fef-core-store","2.guides\u002F11.ef-core-store","i-lucide-database",{"title":90,"path":91,"stem":92,"icon":93},"No-DB unit tests","\u002Fguides\u002Fno-db-unit-tests","2.guides\u002F12.no-db-unit-tests","i-lucide-flask-conical",{"title":95,"path":96,"stem":97,"icon":98},"Generated grafts and scenario helpers","\u002Fguides\u002Fscenario-helpers-and-sugar","2.guides\u002F13.scenario-helpers-and-sugar","i-lucide-wand-sparkles",{"title":100,"path":101,"stem":102,"icon":103},"Constructor setup","\u002Fguides\u002Fconstructor-setup","2.guides\u002F14.constructor-setup","i-lucide-blocks",{"title":105,"path":106,"stem":107,"children":108,"icon":6},"Examples","\u002Fexamples","3.examples\u002F1.index",[109,111,116,121,126,130,135,140,145],{"title":105,"path":106,"stem":107,"icon":110},"i-lucide-library",{"title":112,"path":113,"stem":114,"icon":115},"Code reviews","\u002Fexamples\u002Fcode-reviews","3.examples\u002F2.code-reviews","i-lucide-git-pull-request",{"title":117,"path":118,"stem":119,"icon":120},"Membership","\u002Fexamples\u002Fmembership","3.examples\u002F3.membership","i-lucide-users",{"title":122,"path":123,"stem":124,"icon":125},"Board","\u002Fexamples\u002Fboard","3.examples\u002F4.board","i-lucide-kanban",{"title":127,"path":128,"stem":129,"icon":44},"Custom seed","\u002Fexamples\u002Fcustom-seed","3.examples\u002F5.custom-seed",{"title":131,"path":132,"stem":133,"icon":134},"Commerce","\u002Fexamples\u002Fcommerce","3.examples\u002F6.commerce","i-lucide-shopping-cart",{"title":136,"path":137,"stem":138,"icon":139},"Project management","\u002Fexamples\u002Fproject-management","3.examples\u002F7.project-management","i-lucide-folder-kanban",{"title":141,"path":142,"stem":143,"icon":144},"Learning","\u002Fexamples\u002Flearning","3.examples\u002F8.learning","i-lucide-graduation-cap",{"title":146,"path":147,"stem":148,"icon":149},"Docs ingest","\u002Fexamples\u002Fdocs-ingest","3.examples\u002F9.docs-ingest","i-lucide-file-search",{"title":151,"icon":6,"path":152,"stem":153,"children":154,"page":6},"Reference","\u002Freference","4.reference",[155],{"title":156,"path":157,"stem":158,"icon":159},"API cheat sheet","\u002Freference\u002Fapi-cheat-sheet","4.reference\u002F1.api-cheat-sheet","i-lucide-list-checks",{"title":161,"icon":6,"path":162,"stem":163,"children":164,"page":6},"Agent Skills","\u002Fagents","5.agents",[165],{"title":166,"path":167,"stem":168,"icon":169},"Agent skills","\u002Fagents\u002Fagent-skills","5.agents\u002F1.agent-skills","i-lucide-bot",{"id":171,"title":100,"body":172,"description":1487,"extension":1488,"links":1489,"meta":1490,"navigation":1491,"path":101,"seo":1492,"stem":102,"__hash__":1493},"docs\u002F2.guides\u002F14.constructor-setup.md",{"type":173,"value":174,"toc":1480},"minimark",[175,180,184,206,218,222,243,1354,1357,1371,1375,1390,1403,1407,1420,1431,1447,1451,1461,1466,1469,1476],[176,177,179],"h2",{"id":178},"a-fresh-baseline-for-each-test","A fresh baseline for each test",[181,182,183],"p",{},"Several tests in a class often start with the same owner, organization and repository. Repeating that chain in every method obscures the part of the scenario that differs. Put the common starting graph in the instance constructor, then let each test add the rows and properties its behavior needs.",[181,185,186,187,194,195,200,201,205],{},"Both ",[188,189,193],"a",{"href":190,"rel":191},"https:\u002F\u002Ftunit.dev\u002Fdocs\u002Fguides\u002Fbest-practices\u002F#new-instance-per-test",[192],"nofollow","TUnit"," and ",[188,196,199],{"href":197,"rel":198},"https:\u002F\u002Fxunit.net\u002Fdocs\u002Fshared-context#constructor-and-dispose",[192],"xUnit"," create a fresh test class instance for each test. The constructor calls ",[202,203,204],"code",{},"Start"," for that instance, so every test gets its own seed, session, entities and sequence state. The methods reuse the setup recipe; each execution builds a new graph.",[181,207,208,209,213,214,217],{},"Keep the baseline builder in an ",[210,211,212],"strong",{},"instance field",". Leave the session open in the constructor, extend it in the test, and call ",[202,215,216],{},"BuildAsync"," after the test's full setup is ready.",[176,219,221],{"id":220},"constructor-and-test-continuations","Constructor and test continuations",[181,223,224,225,228,229,232,233,238,239,242],{},"These examples use the ",[202,226,227],{},"CodeReviewSeed",", entities, traits and ",[202,230,231],{},"TestBiome"," entry point from the repository's ",[188,234,237],{"href":235,"rel":236},"https:\u002F\u002Fgithub.com\u002Fzeeq-ai\u002Fzeeq-biome\u002Ftree\u002Fmain\u002Ftests\u002FZeeq.Biome.Tests\u002FCodeReviews",[192],"CodeReviews sample",". In your project, use your own seed type and graft methods. The field's anchor type is ",[202,240,241],{},"CodeRepository[]",", because every Add returns a builder anchored to its output array, even for a singular Add.",[244,245,246,891],"code-group",{},[247,248,265],"pre",{"className":249,"code":250,"filename":193,"highlights":251,"language":263,"meta":264,"style":264},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","using TUnit.Assertions;\nusing TUnit.Core;\nusing Zeeq.Biome;\n\nnamespace Zeeq.Biome.Tests.CodeReviews;\n\npublic sealed class PullRequestTests\n{\n    private readonly BiomeBuilder\u003CCodeReviewSeed, CodeRepository[]> _base;\n    private readonly CodeRepository _repository;\n\n    public PullRequestTests()\n    {\n        \u002F\u002F Runs for each test instance; build only the common parent here.\n        _base = TestBiome.Start(out _).AddCodeRepository(out _repository);\n    }\n\n    [Test]\n    public async Task Closed_pull_request()\n    {\n        await _base\n            .AddPullRequest(out var pr, PullRequests.Closed)\n            .BuildAsync(); \u002F\u002F Complete this test's setup once.\n\n        await Assert.That(pr.Repository).IsSameReferenceAs(_repository);\n        await Assert.That(pr.Closed).IsTrue();\n        await Assert.That(pr.Number).IsEqualTo(1);\n    }\n\n    [Test]\n    public async Task Merged_pull_request()\n    {\n        \u002F\u002F Another instance: its repository and sequence are fresh.\n        await _base\n            .AddPullRequest(out var pr, PullRequests.Closed + PullRequests.Merged)\n            .BuildAsync();\n\n        await Assert.That(pr.Repository).IsSameReferenceAs(_repository);\n        await Assert.That(pr.Merged).IsTrue();\n        await Assert.That(pr.Number).IsEqualTo(1);\n    }\n}\n",[252,253,254,255,256,257,258,259,260,261,262],12,13,14,15,16,21,22,23,34,35,36,"csharp","",[202,266,267,290,304,319,326,351,356,373,379,410,424,429,443,449,456,498,504,509,521,537,542,551,583,596,601,636,663,696,701,706,715,729,734,740,747,783,792,797,826,851,880,885],{"__ignoreMap":264},[268,269,272,276,280,284,287],"span",{"class":270,"line":271},"line",1,[268,273,275],{"class":274},"sw1J6","using",[268,277,279],{"class":278},"sfCm-"," TUnit",[268,281,283],{"class":282},"sP7_E",".",[268,285,286],{"class":278},"Assertions",[268,288,289],{"class":282},";\n",[268,291,293,295,297,299,302],{"class":270,"line":292},2,[268,294,275],{"class":274},[268,296,279],{"class":278},[268,298,283],{"class":282},[268,300,301],{"class":278},"Core",[268,303,289],{"class":282},[268,305,307,309,312,314,317],{"class":270,"line":306},3,[268,308,275],{"class":274},[268,310,311],{"class":278}," Zeeq",[268,313,283],{"class":282},[268,315,316],{"class":278},"Biome",[268,318,289],{"class":282},[268,320,322],{"class":270,"line":321},4,[268,323,325],{"emptyLinePlaceholder":324},true,"\n",[268,327,329,333,335,337,339,341,344,346,349],{"class":270,"line":328},5,[268,330,332],{"class":331},"sG8yY","namespace",[268,334,311],{"class":278},[268,336,283],{"class":282},[268,338,316],{"class":278},[268,340,283],{"class":282},[268,342,343],{"class":278},"Tests",[268,345,283],{"class":282},[268,347,348],{"class":278},"CodeReviews",[268,350,289],{"class":282},[268,352,354],{"class":270,"line":353},6,[268,355,325],{"emptyLinePlaceholder":324},[268,357,359,363,366,369],{"class":270,"line":358},7,[268,360,362],{"class":361},"sbsja","public",[268,364,365],{"class":361}," sealed",[268,367,368],{"class":331}," class",[268,370,372],{"class":371},"sbgvK"," PullRequestTests\n",[268,374,376],{"class":270,"line":375},8,[268,377,378],{"class":282},"{\n",[268,380,382,385,388,391,394,396,399,402,405,408],{"class":270,"line":381},9,[268,383,384],{"class":361},"    private",[268,386,387],{"class":361}," readonly",[268,389,390],{"class":371}," BiomeBuilder",[268,392,393],{"class":282},"\u003C",[268,395,227],{"class":371},[268,397,398],{"class":282},",",[268,400,401],{"class":371}," CodeRepository",[268,403,404],{"class":282},"[]>",[268,406,407],{"class":371}," _base",[268,409,289],{"class":282},[268,411,413,415,417,419,422],{"class":270,"line":412},10,[268,414,384],{"class":361},[268,416,387],{"class":361},[268,418,401],{"class":371},[268,420,421],{"class":371}," _repository",[268,423,289],{"class":282},[268,425,427],{"class":270,"line":426},11,[268,428,325],{"emptyLinePlaceholder":324},[268,430,433,436,440],{"class":431,"line":252},[270,432],"highlight",[268,434,435],{"class":361},"    public",[268,437,439],{"class":438},"sGLFI"," PullRequestTests",[268,441,442],{"class":282},"()\n",[268,444,446],{"class":445,"line":253},[270,432],[268,447,448],{"class":282},"    {\n",[268,450,452],{"class":451,"line":254},[270,432],[268,453,455],{"class":454},"sutJx","        \u002F\u002F Runs for each test instance; build only the common parent here.\n",[268,457,459,463,467,470,472,474,477,480,483,486,489,491,493,495],{"class":458,"line":255},[270,432],[268,460,462],{"class":461},"su5hD","        _base ",[268,464,466],{"class":465},"smGrS","=",[268,468,469],{"class":461}," TestBiome",[268,471,283],{"class":282},[268,473,204],{"class":438},[268,475,476],{"class":282},"(",[268,478,479],{"class":361},"out",[268,481,482],{"class":461}," _",[268,484,485],{"class":282},").",[268,487,488],{"class":438},"AddCodeRepository",[268,490,476],{"class":282},[268,492,479],{"class":361},[268,494,421],{"class":461},[268,496,497],{"class":282},");\n",[268,499,501],{"class":500,"line":256},[270,432],[268,502,503],{"class":282},"    }\n",[268,505,507],{"class":270,"line":506},17,[268,508,325],{"emptyLinePlaceholder":324},[268,510,512,515,518],{"class":270,"line":511},18,[268,513,514],{"class":282},"    [",[268,516,517],{"class":371},"Test",[268,519,520],{"class":282},"]\n",[268,522,524,526,529,532,535],{"class":270,"line":523},19,[268,525,435],{"class":361},[268,527,528],{"class":361}," async",[268,530,531],{"class":371}," Task",[268,533,534],{"class":438}," Closed_pull_request",[268,536,442],{"class":282},[268,538,540],{"class":270,"line":539},20,[268,541,448],{"class":282},[268,543,545,548],{"class":544,"line":257},[270,432],[268,546,547],{"class":465},"        await",[268,549,550],{"class":461}," _base\n",[268,552,554,557,560,562,564,567,570,572,575,577,580],{"class":553,"line":258},[270,432],[268,555,556],{"class":282},"            .",[268,558,559],{"class":438},"AddPullRequest",[268,561,476],{"class":282},[268,563,479],{"class":361},[268,565,566],{"class":331}," var",[268,568,569],{"class":371}," pr",[268,571,398],{"class":282},[268,573,574],{"class":461}," PullRequests",[268,576,283],{"class":282},[268,578,579],{"class":461},"Closed",[268,581,582],{"class":282},")\n",[268,584,586,588,590,593],{"class":585,"line":259},[270,432],[268,587,556],{"class":282},[268,589,216],{"class":438},[268,591,592],{"class":282},"();",[268,594,595],{"class":454}," \u002F\u002F Complete this test's setup once.\n",[268,597,599],{"class":270,"line":598},24,[268,600,325],{"emptyLinePlaceholder":324},[268,602,604,606,609,611,614,616,619,621,624,626,629,631,634],{"class":270,"line":603},25,[268,605,547],{"class":465},[268,607,608],{"class":461}," Assert",[268,610,283],{"class":282},[268,612,613],{"class":438},"That",[268,615,476],{"class":282},[268,617,618],{"class":461},"pr",[268,620,283],{"class":282},[268,622,623],{"class":461},"Repository",[268,625,485],{"class":282},[268,627,628],{"class":438},"IsSameReferenceAs",[268,630,476],{"class":282},[268,632,633],{"class":461},"_repository",[268,635,497],{"class":282},[268,637,639,641,643,645,647,649,651,653,655,657,660],{"class":270,"line":638},26,[268,640,547],{"class":465},[268,642,608],{"class":461},[268,644,283],{"class":282},[268,646,613],{"class":438},[268,648,476],{"class":282},[268,650,618],{"class":461},[268,652,283],{"class":282},[268,654,579],{"class":461},[268,656,485],{"class":282},[268,658,659],{"class":438},"IsTrue",[268,661,662],{"class":282},"();\n",[268,664,666,668,670,672,674,676,678,680,683,685,688,690,694],{"class":270,"line":665},27,[268,667,547],{"class":465},[268,669,608],{"class":461},[268,671,283],{"class":282},[268,673,613],{"class":438},[268,675,476],{"class":282},[268,677,618],{"class":461},[268,679,283],{"class":282},[268,681,682],{"class":461},"Number",[268,684,485],{"class":282},[268,686,687],{"class":438},"IsEqualTo",[268,689,476],{"class":282},[268,691,693],{"class":692},"srdBf","1",[268,695,497],{"class":282},[268,697,699],{"class":270,"line":698},28,[268,700,503],{"class":282},[268,702,704],{"class":270,"line":703},29,[268,705,325],{"emptyLinePlaceholder":324},[268,707,709,711,713],{"class":270,"line":708},30,[268,710,514],{"class":282},[268,712,517],{"class":371},[268,714,520],{"class":282},[268,716,718,720,722,724,727],{"class":270,"line":717},31,[268,719,435],{"class":361},[268,721,528],{"class":361},[268,723,531],{"class":371},[268,725,726],{"class":438}," Merged_pull_request",[268,728,442],{"class":282},[268,730,732],{"class":270,"line":731},32,[268,733,448],{"class":282},[268,735,737],{"class":270,"line":736},33,[268,738,739],{"class":454},"        \u002F\u002F Another instance: its repository and sequence are fresh.\n",[268,741,743,745],{"class":742,"line":260},[270,432],[268,744,547],{"class":465},[268,746,550],{"class":461},[268,748,750,752,754,756,758,760,762,764,766,768,771,774,776,778,781],{"class":749,"line":261},[270,432],[268,751,556],{"class":282},[268,753,559],{"class":438},[268,755,476],{"class":282},[268,757,479],{"class":361},[268,759,566],{"class":331},[268,761,569],{"class":371},[268,763,398],{"class":282},[268,765,574],{"class":461},[268,767,283],{"class":282},[268,769,770],{"class":461},"Closed ",[268,772,773],{"class":465},"+",[268,775,574],{"class":461},[268,777,283],{"class":282},[268,779,780],{"class":461},"Merged",[268,782,582],{"class":282},[268,784,786,788,790],{"class":785,"line":262},[270,432],[268,787,556],{"class":282},[268,789,216],{"class":438},[268,791,662],{"class":282},[268,793,795],{"class":270,"line":794},37,[268,796,325],{"emptyLinePlaceholder":324},[268,798,800,802,804,806,808,810,812,814,816,818,820,822,824],{"class":270,"line":799},38,[268,801,547],{"class":465},[268,803,608],{"class":461},[268,805,283],{"class":282},[268,807,613],{"class":438},[268,809,476],{"class":282},[268,811,618],{"class":461},[268,813,283],{"class":282},[268,815,623],{"class":461},[268,817,485],{"class":282},[268,819,628],{"class":438},[268,821,476],{"class":282},[268,823,633],{"class":461},[268,825,497],{"class":282},[268,827,829,831,833,835,837,839,841,843,845,847,849],{"class":270,"line":828},39,[268,830,547],{"class":465},[268,832,608],{"class":461},[268,834,283],{"class":282},[268,836,613],{"class":438},[268,838,476],{"class":282},[268,840,618],{"class":461},[268,842,283],{"class":282},[268,844,780],{"class":461},[268,846,485],{"class":282},[268,848,659],{"class":438},[268,850,662],{"class":282},[268,852,854,856,858,860,862,864,866,868,870,872,874,876,878],{"class":270,"line":853},40,[268,855,547],{"class":465},[268,857,608],{"class":461},[268,859,283],{"class":282},[268,861,613],{"class":438},[268,863,476],{"class":282},[268,865,618],{"class":461},[268,867,283],{"class":282},[268,869,682],{"class":461},[268,871,485],{"class":282},[268,873,687],{"class":438},[268,875,476],{"class":282},[268,877,693],{"class":692},[268,879,497],{"class":282},[268,881,883],{"class":270,"line":882},41,[268,884,503],{"class":282},[268,886,888],{"class":270,"line":887},42,[268,889,890],{"class":282},"}\n",[247,892,895],{"className":249,"code":893,"filename":199,"highlights":894,"language":263,"meta":264,"style":264},"using Xunit;\nusing Zeeq.Biome;\n\nnamespace Zeeq.Biome.Tests.CodeReviews;\n\npublic sealed class PullRequestTests\n{\n    private readonly BiomeBuilder\u003CCodeReviewSeed, CodeRepository[]> _base;\n    private readonly CodeRepository _repository;\n\n    public PullRequestTests()\n    {\n        \u002F\u002F Runs for each test instance; build only the common parent here.\n        _base = TestBiome.Start(out _).AddCodeRepository(out _repository);\n    }\n\n    [Fact]\n    public async Task Closed_pull_request()\n    {\n        await _base\n            .AddPullRequest(out var pr, PullRequests.Closed)\n            .BuildAsync(); \u002F\u002F Complete this test's setup once.\n\n        Assert.Same(_repository, pr.Repository);\n        Assert.True(pr.Closed);\n        Assert.Equal(1, pr.Number);\n    }\n\n    [Fact]\n    public async Task Merged_pull_request()\n    {\n        \u002F\u002F Another instance: its repository and sequence are fresh.\n        await _base\n            .AddPullRequest(out var pr, PullRequests.Closed + PullRequests.Merged)\n            .BuildAsync();\n\n        Assert.Same(_repository, pr.Repository);\n        Assert.True(pr.Merged);\n        Assert.Equal(1, pr.Number);\n    }\n}\n",[426,252,253,254,255,539,257,258,736,260,261],[202,896,897,906,918,922,942,946,956,960,982,994,998,1007,1012,1017,1048,1053,1057,1066,1078,1082,1089,1114,1125,1129,1153,1172,1195,1199,1203,1211,1223,1227,1231,1238,1271,1280,1284,1306,1324,1346,1350],{"__ignoreMap":264},[268,898,899,901,904],{"class":270,"line":271},[268,900,275],{"class":274},[268,902,903],{"class":278}," Xunit",[268,905,289],{"class":282},[268,907,908,910,912,914,916],{"class":270,"line":292},[268,909,275],{"class":274},[268,911,311],{"class":278},[268,913,283],{"class":282},[268,915,316],{"class":278},[268,917,289],{"class":282},[268,919,920],{"class":270,"line":306},[268,921,325],{"emptyLinePlaceholder":324},[268,923,924,926,928,930,932,934,936,938,940],{"class":270,"line":321},[268,925,332],{"class":331},[268,927,311],{"class":278},[268,929,283],{"class":282},[268,931,316],{"class":278},[268,933,283],{"class":282},[268,935,343],{"class":278},[268,937,283],{"class":282},[268,939,348],{"class":278},[268,941,289],{"class":282},[268,943,944],{"class":270,"line":328},[268,945,325],{"emptyLinePlaceholder":324},[268,947,948,950,952,954],{"class":270,"line":353},[268,949,362],{"class":361},[268,951,365],{"class":361},[268,953,368],{"class":331},[268,955,372],{"class":371},[268,957,958],{"class":270,"line":358},[268,959,378],{"class":282},[268,961,962,964,966,968,970,972,974,976,978,980],{"class":270,"line":375},[268,963,384],{"class":361},[268,965,387],{"class":361},[268,967,390],{"class":371},[268,969,393],{"class":282},[268,971,227],{"class":371},[268,973,398],{"class":282},[268,975,401],{"class":371},[268,977,404],{"class":282},[268,979,407],{"class":371},[268,981,289],{"class":282},[268,983,984,986,988,990,992],{"class":270,"line":381},[268,985,384],{"class":361},[268,987,387],{"class":361},[268,989,401],{"class":371},[268,991,421],{"class":371},[268,993,289],{"class":282},[268,995,996],{"class":270,"line":412},[268,997,325],{"emptyLinePlaceholder":324},[268,999,1001,1003,1005],{"class":1000,"line":426},[270,432],[268,1002,435],{"class":361},[268,1004,439],{"class":438},[268,1006,442],{"class":282},[268,1008,1010],{"class":1009,"line":252},[270,432],[268,1011,448],{"class":282},[268,1013,1015],{"class":1014,"line":253},[270,432],[268,1016,455],{"class":454},[268,1018,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046],{"class":1019,"line":254},[270,432],[268,1021,462],{"class":461},[268,1023,466],{"class":465},[268,1025,469],{"class":461},[268,1027,283],{"class":282},[268,1029,204],{"class":438},[268,1031,476],{"class":282},[268,1033,479],{"class":361},[268,1035,482],{"class":461},[268,1037,485],{"class":282},[268,1039,488],{"class":438},[268,1041,476],{"class":282},[268,1043,479],{"class":361},[268,1045,421],{"class":461},[268,1047,497],{"class":282},[268,1049,1051],{"class":1050,"line":255},[270,432],[268,1052,503],{"class":282},[268,1054,1055],{"class":270,"line":256},[268,1056,325],{"emptyLinePlaceholder":324},[268,1058,1059,1061,1064],{"class":270,"line":506},[268,1060,514],{"class":282},[268,1062,1063],{"class":371},"Fact",[268,1065,520],{"class":282},[268,1067,1068,1070,1072,1074,1076],{"class":270,"line":511},[268,1069,435],{"class":361},[268,1071,528],{"class":361},[268,1073,531],{"class":371},[268,1075,534],{"class":438},[268,1077,442],{"class":282},[268,1079,1080],{"class":270,"line":523},[268,1081,448],{"class":282},[268,1083,1085,1087],{"class":1084,"line":539},[270,432],[268,1086,547],{"class":465},[268,1088,550],{"class":461},[268,1090,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112],{"class":1091,"line":257},[270,432],[268,1093,556],{"class":282},[268,1095,559],{"class":438},[268,1097,476],{"class":282},[268,1099,479],{"class":361},[268,1101,566],{"class":331},[268,1103,569],{"class":371},[268,1105,398],{"class":282},[268,1107,574],{"class":461},[268,1109,283],{"class":282},[268,1111,579],{"class":461},[268,1113,582],{"class":282},[268,1115,1117,1119,1121,1123],{"class":1116,"line":258},[270,432],[268,1118,556],{"class":282},[268,1120,216],{"class":438},[268,1122,592],{"class":282},[268,1124,595],{"class":454},[268,1126,1127],{"class":270,"line":259},[268,1128,325],{"emptyLinePlaceholder":324},[268,1130,1131,1134,1136,1139,1141,1143,1145,1147,1149,1151],{"class":270,"line":598},[268,1132,1133],{"class":461},"        Assert",[268,1135,283],{"class":282},[268,1137,1138],{"class":438},"Same",[268,1140,476],{"class":282},[268,1142,633],{"class":461},[268,1144,398],{"class":282},[268,1146,569],{"class":461},[268,1148,283],{"class":282},[268,1150,623],{"class":461},[268,1152,497],{"class":282},[268,1154,1155,1157,1159,1162,1164,1166,1168,1170],{"class":270,"line":603},[268,1156,1133],{"class":461},[268,1158,283],{"class":282},[268,1160,1161],{"class":438},"True",[268,1163,476],{"class":282},[268,1165,618],{"class":461},[268,1167,283],{"class":282},[268,1169,579],{"class":461},[268,1171,497],{"class":282},[268,1173,1174,1176,1178,1181,1183,1185,1187,1189,1191,1193],{"class":270,"line":638},[268,1175,1133],{"class":461},[268,1177,283],{"class":282},[268,1179,1180],{"class":438},"Equal",[268,1182,476],{"class":282},[268,1184,693],{"class":692},[268,1186,398],{"class":282},[268,1188,569],{"class":461},[268,1190,283],{"class":282},[268,1192,682],{"class":461},[268,1194,497],{"class":282},[268,1196,1197],{"class":270,"line":665},[268,1198,503],{"class":282},[268,1200,1201],{"class":270,"line":698},[268,1202,325],{"emptyLinePlaceholder":324},[268,1204,1205,1207,1209],{"class":270,"line":703},[268,1206,514],{"class":282},[268,1208,1063],{"class":371},[268,1210,520],{"class":282},[268,1212,1213,1215,1217,1219,1221],{"class":270,"line":708},[268,1214,435],{"class":361},[268,1216,528],{"class":361},[268,1218,531],{"class":371},[268,1220,726],{"class":438},[268,1222,442],{"class":282},[268,1224,1225],{"class":270,"line":717},[268,1226,448],{"class":282},[268,1228,1229],{"class":270,"line":731},[268,1230,739],{"class":454},[268,1232,1234,1236],{"class":1233,"line":736},[270,432],[268,1235,547],{"class":465},[268,1237,550],{"class":461},[268,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269],{"class":1240,"line":260},[270,432],[268,1242,556],{"class":282},[268,1244,559],{"class":438},[268,1246,476],{"class":282},[268,1248,479],{"class":361},[268,1250,566],{"class":331},[268,1252,569],{"class":371},[268,1254,398],{"class":282},[268,1256,574],{"class":461},[268,1258,283],{"class":282},[268,1260,770],{"class":461},[268,1262,773],{"class":465},[268,1264,574],{"class":461},[268,1266,283],{"class":282},[268,1268,780],{"class":461},[268,1270,582],{"class":282},[268,1272,1274,1276,1278],{"class":1273,"line":261},[270,432],[268,1275,556],{"class":282},[268,1277,216],{"class":438},[268,1279,662],{"class":282},[268,1281,1282],{"class":270,"line":262},[268,1283,325],{"emptyLinePlaceholder":324},[268,1285,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304],{"class":270,"line":794},[268,1287,1133],{"class":461},[268,1289,283],{"class":282},[268,1291,1138],{"class":438},[268,1293,476],{"class":282},[268,1295,633],{"class":461},[268,1297,398],{"class":282},[268,1299,569],{"class":461},[268,1301,283],{"class":282},[268,1303,623],{"class":461},[268,1305,497],{"class":282},[268,1307,1308,1310,1312,1314,1316,1318,1320,1322],{"class":270,"line":799},[268,1309,1133],{"class":461},[268,1311,283],{"class":282},[268,1313,1161],{"class":438},[268,1315,476],{"class":282},[268,1317,618],{"class":461},[268,1319,283],{"class":282},[268,1321,780],{"class":461},[268,1323,497],{"class":282},[268,1325,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344],{"class":270,"line":828},[268,1327,1133],{"class":461},[268,1329,283],{"class":282},[268,1331,1180],{"class":438},[268,1333,476],{"class":282},[268,1335,693],{"class":692},[268,1337,398],{"class":282},[268,1339,569],{"class":461},[268,1341,283],{"class":282},[268,1343,682],{"class":461},[268,1345,497],{"class":282},[268,1347,1348],{"class":270,"line":853},[268,1349,503],{"class":282},[268,1351,1352],{"class":270,"line":882},[268,1353,890],{"class":282},[181,1355,1356],{},"The assertions expose the setup strategy: both tests start with pull request number 1, and each request belongs to the repository created by its own constructor. In a behavior test, call the code under test after the setup and assert its result.",[181,1358,1359,1360,1363,1364,1366,1367,1370],{},"These examples omit the store and use ",[202,1361,1362],{},"NullStore",". ",[202,1365,216],{}," is optional for that case; it is shown at the final setup boundary so the same pattern works when ",[202,1368,1369],{},"TestBiome.Start"," receives a store.",[176,1372,1374],{"id":1373},"the-field-keeps-its-anchor","The field keeps its anchor",[181,1376,1377,1378,1381,1382,1385,1386,1389],{},"An Add returns a new builder view over the ",[210,1379,1380],{},"same session",". It does not move the anchor of a builder you already kept. Here, ",[202,1383,1384],{},"_base"," stays anchored to the constructor's repository, so another ",[202,1387,1388],{},"_base.AddPullRequest(...)"," in the same test creates a sibling under that repository. Sequences continue within that test's session.",[181,1391,1392,1393,1396,1397,1400,1401,283],{},"When a continuation needs an earlier parent, use ",[202,1394,1395],{},".Under(_repository)",". See ",[188,1398,1399],{"href":47},"Parents and children"," for branching. Keeping a base builder does not clone or reset the graph: all branches in one test belong to the same session and are completed by one ",[202,1402,216],{},[176,1404,1406],{"id":1405},"construct-synchronously-save-after-extending","Construct synchronously, save after extending",[181,1408,1409,1410,1412,1413,1416,1417,283],{},"Adds create entities immediately, so the constructor can prepare the baseline without asynchronous work. Constructors cannot await ",[202,1411,216],{},", and saving closes the session to further Adds. Keep the save in the test after its final Add; avoid blocking on asynchronous setup with ",[202,1414,1415],{},".Result"," or ",[202,1418,1419],{},".GetAwaiter().GetResult()",[181,1421,1422,1423,1425,1426,1428,1429,283],{},"For EF Core, create a context for each test instance and pass it to ",[202,1424,1369],{},". After the test extends the baseline, call ",[202,1427,216],{}," once and clear the change tracker before the code under test reads. Dispose the context through the framework's per-test cleanup lifecycle. See ",[188,1430,85],{"href":86},[181,1432,1433,1434,1416,1439,1446],{},"If creating the context or another dependency requires asynchronous initialization, use ",[188,1435,1438],{"href":1436,"rel":1437},"https:\u002F\u002Ftunit.dev\u002Fdocs\u002Fwriting-tests\u002Flifecycle\u002F",[192],"TUnit's per-test hooks",[188,1440,1442,1443],{"href":197,"rel":1441},[192],"xUnit's ",[202,1444,1445],{},"IAsyncLifetime"," to prepare those resources. TUnit property injection happens after the constructor, so a constructor cannot use a property-injected context; start the baseline in a per-test hook once that dependency is available. Keep its Biome session open for the test's continuation.",[176,1448,1450],{"id":1449},"keep-mutable-state-per-test","Keep mutable state per test",[181,1452,1453,1454,1457,1458,1460],{},"Create the seed, builder, entities, mutable clock and context for each test instance. A static builder, a shared fixture containing a builder, or a shared fake clock would carry mutations between tests. Share immutable blueprints and frozen ",[202,1455,1456],{},"BiomeOptions","; each constructor still calls ",[202,1459,204],{}," to create a fresh session.",[181,1462,1463,1464,283],{},"If the test advances time, create its provider with the baseline and pass the same instance to Biome and the code under test. See ",[188,1465,61],{"href":62},[181,1467,1468],{},"Separate test instances isolate the in-memory graph. A shared database still needs test-specific rows and an isolation or cleanup strategy; a fresh constructor alone does not isolate database state.",[181,1470,1471,1472,1475],{},"Keep the constructor's baseline small: only rows every test in the class needs. Put scenario-specific values in the test's continuation, or use a ",[188,1473,1474],{"href":96},"named scenario helper"," when only some tests share a longer chain. That leaves the behavior under test visible at the call site.",[1477,1478,1479],"style",{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":264,"searchDepth":271,"depth":292,"links":1481},[1482,1483,1484,1485,1486],{"id":178,"depth":292,"text":179},{"id":220,"depth":292,"text":221},{"id":1373,"depth":292,"text":1374},{"id":1405,"depth":292,"text":1406},{"id":1449,"depth":292,"text":1450},"Build a common starting graph in the test constructor, then extend a fresh Biome in each test.","md",null,{},{"icon":103},{"title":100,"description":1487},"1YxPJFRojPEg-uO_jGZ8gALwLTIDZNUrRthATw9gSt4",[1495,1497],{"title":95,"path":96,"stem":97,"description":1496,"icon":98,"children":-1},"Generated graft methods keep chains short. Named scenario helpers keep repeated chains explicit.",{"title":105,"path":106,"stem":107,"description":1498,"icon":110,"children":-1},"Eight complete example domains from the library's own test suite, each with annotated tests.",1791831050381]