File size: 6,555 Bytes
3ce1a40 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | using System.Text.Json;
using Repoverse.Core.Generation;
using Repoverse.Core.Model;
namespace Repoverse.Core.Tests;
public class GenerationTests
{
private static readonly Seed WorldSeed = new(42);
[Fact]
public void Same_inputs_produce_identical_manifest_json()
{
var a = JsonSerializer.Serialize(ManifestBuilder.Build(TestRepos.Slice(), WorldSeed), Json.Options);
var b = JsonSerializer.Serialize(ManifestBuilder.Build(TestRepos.Slice().Reverse().ToList(), WorldSeed), Json.Options);
Assert.Equal(a, b);
}
[Fact]
public void Different_world_seed_changes_building_seeds_but_not_layout()
{
var a = ManifestBuilder.Build(TestRepos.Slice(), WorldSeed);
var b = ManifestBuilder.Build(TestRepos.Slice(), new Seed(43));
Assert.All(a.Buildings.Zip(b.Buildings), p =>
{
Assert.NotEqual(p.First.Seed, p.Second.Seed);
Assert.Equal(p.First.Footprint, p.Second.Footprint);
});
}
[Theory]
[InlineData("ortho32", SemanticCategory.OperatingSystem, District.Kernel)]
[InlineData("fpga-lab", SemanticCategory.Hardware, District.HardwareIndustrial)]
[InlineData("tiny-llm", SemanticCategory.AgentSystem, District.Agent)]
[InlineData("proofs", SemanticCategory.FormalVerification, District.FormalMethods)]
[InlineData("ledger", SemanticCategory.Financial, District.Financial)]
[InlineData("site", SemanticCategory.WebInterface, District.WebInterface)]
[InlineData("corpus", SemanticCategory.Training, District.Training)]
[InlineData("deployer", SemanticCategory.SystemsInfrastructure, District.Infrastructure)]
[InlineData("wasmc", SemanticCategory.Compiler, District.Kernel)]
[InlineData("scratch", SemanticCategory.Experimental, District.Experimental)]
public void Slice_repositories_classify_into_distinct_districts(string name, SemanticCategory category, District district)
{
var b = ManifestBuilder.Build(TestRepos.Slice(), WorldSeed).Buildings.Single(x => x.Repo.Name == name);
Assert.Equal(category, b.Category.Value);
Assert.Equal(district, b.District.Value);
Assert.False(string.IsNullOrEmpty(b.Category.Why.Evidence));
}
[Fact]
public void Purpose_outweighs_language()
{
// §80: a Rust web server is a network system, not a foundry.
var repo = TestRepos.Make("api-gw", "HTTP proxy and RPC gateway", "Rust");
Assert.Equal(SemanticCategory.Networking, Classifier.Classify(repo).Value);
}
[Theory]
[InlineData("Guppy-to-IR translation with linear type enforcement", SemanticCategory.Compiler)]
[InlineData("A firmware build", SemanticCategory.Hardware)]
[InlineData("Quick fixes for the build", SemanticCategory.Experimental)] // "ui" inside "build"/"quick" is not a word
[InlineData("Theorems about schedulers", SemanticCategory.FormalVerification)]
public void Keywords_match_whole_words(string description, SemanticCategory expected) =>
Assert.Equal(expected, Classifier.Classify(TestRepos.Make("x", description, files: ["a.bin"])).Value);
[Fact]
public void Archived_repositories_move_to_the_archive_district()
{
var repos = new[] { TestRepos.Make("old-kernel", "kernel", "C", archived: true) };
var b = ManifestBuilder.Build(repos, WorldSeed).Buildings[0];
Assert.Equal(District.Archive, b.District.Value);
Assert.Equal(ConstructionState.Archived, b.Construction.Value);
}
[Fact]
public void Overrides_win_and_are_recorded_as_provenance()
{
var overrides = new Overrides(new Dictionary<string, Overrides.Entry>
{
["snapkitty/scratch"] = new() { Category = SemanticCategory.Quantum, Landmark = true },
}, "overrides.json");
var b = ManifestBuilder.Build(TestRepos.Slice(), WorldSeed, overrides).Buildings.Single(x => x.Repo.Name == "scratch");
Assert.Equal(SemanticCategory.Quantum, b.Category.Value);
Assert.Equal("manual-override", b.Category.Why.Rule);
Assert.True(b.Landmark);
}
[Fact]
public void Existing_buildings_keep_their_plots_when_repositories_are_added()
{
var first = ManifestBuilder.Build(TestRepos.Slice(), WorldSeed);
// "aaa-kernel" sorts first and would take slot 0 of the Kernel district in a fresh build.
var grown = TestRepos.Slice().Append(TestRepos.Make("aaa-kernel", "kernel hypervisor", "C")).ToList();
var second = ManifestBuilder.Build(grown, WorldSeed, previous: first);
foreach (var b in first.Buildings)
Assert.Equal(b.Footprint, second.Find(b.Repo)!.Footprint);
var newcomer = second.Buildings.Single(b => b.Repo.Name == "aaa-kernel");
Assert.DoesNotContain(first.Buildings, b => b.Plot == newcomer.Plot);
}
[Fact]
public void Buildings_never_overlap()
{
var repos = Enumerable.Range(0, 60).Select(i => TestRepos.Make($"k{i:00}", "kernel", "C")).ToList();
var m = ManifestBuilder.Build(repos, WorldSeed);
var fps = m.Buildings.Select(b => b.Footprint).ToList();
for (int i = 0; i < fps.Count; i++)
for (int j = i + 1; j < fps.Count; j++)
Assert.False(fps[i].X <= fps[j].MaxX && fps[j].X <= fps[i].MaxX && fps[i].Z <= fps[j].MaxZ && fps[j].Z <= fps[i].MaxZ,
$"{m.Buildings[i].Repo} overlaps {m.Buildings[j].Repo}");
}
[Fact]
public void Floors_follow_module_structure_not_raw_size()
{
var flat = TestRepos.Make("flat", "tool", "Go", Enumerable.Range(0, 40).Select(i => $"f{i}.go"));
var modular = TestRepos.Make("modular", "tool", "Go", Enumerable.Range(0, 40).Select(i => $"m{i % 20}/f{i}.go"));
var m = ManifestBuilder.Build([flat, modular], WorldSeed);
Assert.True(m.Find(modular.Id)!.Interior.Rooms.Count > m.Find(flat.Id)!.Interior.Rooms.Count);
}
[Fact]
public void Dependencies_only_link_repositories_in_the_world()
{
var a = TestRepos.Make("a", dependsOn: [new RepoId("snapkitty", "b"), new RepoId("elsewhere", "x")]);
var b = TestRepos.Make("b");
var edge = Assert.Single(ManifestBuilder.Build([a, b], WorldSeed).Dependencies);
Assert.Equal(("snapkitty/a", "snapkitty/b"), (edge.From.Key, edge.To.Key));
}
[Fact]
public void Duplicate_repositories_are_rejected()
{
var r = TestRepos.Make("dup");
Assert.Throws<ArgumentException>(() => ManifestBuilder.Build([r, r], WorldSeed));
}
}
|