Verhindere Passt-auf-alles-Stapel ohne gemeinsame Merkmale

proposeAssignment verlangt jetzt zusätzlich zur bisherigen
Verträglichkeitsprüfung, dass Stapel und Modul mindestens ein Merkmal
gemeinsam belegt haben. Ein Stapel mit vollständig leerem Spec (Rot-Fall,
"neuer Stapel") hatte sonst mit jedem Modul null gemeinsame Felder und
galt fälschlich als verträglich mit allem.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
vchuser
2026-07-28 18:09:04 +02:00
co-authored by Claude Opus 5
parent cfdccb3f74
commit 00bc62f546
2 changed files with 45 additions and 2 deletions
+27
View File
@@ -131,6 +131,33 @@ test('moveEntry legt fuer einen neuen Stapel eine eigene Kopie des Specs an', ()
assert.equal(a.spec.partNumber, null, 'eine Ergaenzung des neu angelegten Stapel-Specs darf das Eintrags-Spec nicht veraendern');
});
test('ein Stapel ohne jede erkannte Angabe ist fuer kein Modul Kandidat', () => {
const session = createSession();
scan(session, emptySpec()); // Stapel A, vollstaendig leeres Spec (Rot-Fall)
const plan = proposeAssignment(session, s64());
assert.equal(plan.kind, 'new', 'ein leerer Stapel darf keine Kandidatur begruenden');
assert.notEqual(plan.stackId, 'A');
});
test('ein Stapel mit nur der Kapazitaet ist Kandidat fuer ein Modul gleicher Kapazitaet', () => {
const session = createSession();
scan(session, { ...emptySpec(), capacityGb: 64 });
const plan = proposeAssignment(session, { ...emptySpec(), capacityGb: 64 });
assert.equal(plan.kind, 'match');
assert.equal(plan.stackId, 'A');
});
test('ein voellig unerkanntes Modul erzeugt einen eigenen Stapel und zieht keine weiteren an sich', () => {
const session = createSession();
const erster = scan(session, emptySpec());
const zweiter = scan(session, emptySpec());
assert.notEqual(erster.stackId, zweiter.stackId, 'zwei unerkannte Module ohne gemeinsame Grundlage teilen sich keinen Stapel');
assert.equal(session.stacks.length, 2);
const plan = proposeAssignment(session, s64());
assert.equal(plan.kind, 'new', 'der leere Stapel darf ein erkanntes Modul nicht an sich ziehen');
});
test('undoLast-Vertrag: nach einem Umsortieren wird weiterhin der zuletzt erfasste Eintrag zurueckgenommen', () => {
const session = createSession();
const a = scan(session, s64());