Rileva la family table di assiemi e chiude i punti oscuri residui del parser .asm

AsmRecordReader.LeggiMembri ora lancia InvalidDataException quando un assieme e'
esso stesso un'istanza di family table (members descriverebbe solo una
rappresentazione, non le istanze sorelle) invece di restituire un risultato
sbagliato in silenzio - il chiamante ripiega sull'euristica testuale, che risolve
gia' correttamente il caso. Aggiunti due controlli di coerenza analoghi (conteggio
grezzo vs interpretato dei record ConfigName; occorrenze multiple di "members"),
verificati senza falsi positivi su tutti i 350 .asm reali della share.

Documentazione riorganizzata per distinguere cio' che e' verificato contro una BOM
Creo di riferimento da cio' che e' verificato solo su scala (conteggi), e cio' che
resta genuinamente non risolto.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5 committed 2026-09-22 09:20:56 +02:00
1 parent 28a72c80b2
commit 9af426ca1b
3 files changed
+215 -52

No files matched your search

+33
View File
@@ -111,6 +111,39 @@ public class AsmRecordReaderTests
Assert.Throws<InvalidDataException>(() => AsmRecordReader.LeggiMembri(dati));
}
[Fact]
public void Assieme_family_table_con_generic_name_lancia_eccezione()
{
// Regressione: 2546220101.asm (docs/formato-asm-record.md §7) e' esso stesso
// un'istanza di family table (model_name "2546220101_C01" + generic_name vuoto); il
// suo "members" descrive solo questa rappresentazione, non le 4 istanze reali della
// BOM Creo. Va segnalato invece di restituire silenziosamente il contenuto sbagliato.
byte[] dati = Asm(1, Membro(1, 2, "9244206098"),
extra: Bytes(0xe0, 0x01, "model_t_type", 0, 2,
0xe0, 0x0a, "model_name", 0, "2546220101_C01", 0,
0xe0, 0x0a, "generic_name", 0, 0));
Assert.Throws<InvalidDataException>(() => AsmRecordReader.LeggiMembri(dati));
}
[Fact]
public void Generic_name_senza_suffisso_istanza_non_lancia_eccezione()
{
// Regressione: su ~7% dei file reali della share compare un record "model_name" +
// "generic_name" (vuoto) che NON e' il sintomo della family table di assiemi - il
// valore non ha il suffisso "_C0n" delle istanze (es. e' un codice qualunque non
// correlato al nome del file). In quei casi "members" e' letto correttamente e va
// usato normalmente, non bloccato per un falso positivo.
byte[] dati = Asm(1, Membro(1, 2, "9244206098"),
extra: Bytes(0xe0, 0x01, "model_t_type", 0, 2,
0xe0, 0x0a, "model_name", 0, "9244230117", 0,
0xe0, 0x0a, "generic_name", 0, 0));
var membri = AsmRecordReader.LeggiMembri(dati);
Assert.Single(membri);
}
[Fact]
public void Sezione_members_assente_lancia_eccezione()
{