Oprava: úprava dodávané položky číselníku se tiše ztrácela

Nacti() uložilo dodávanou vrstvu do referenčního snímku _vychozi a tytéž
objekty vložilo do kolekcí, na které se váže mřížka. Úprava buňky tak
mutovala i ten snímek – UlozRozdil pak porovnával stav sám se sebou, rozdíl
vyšel prázdný a oprava dodávané položky zmizela. Mazání a přidávání přitom
fungovalo (tam se reference nesdílí), takže se chyba dobře schovala.

Sluc nově vkládá dodávané položky jako hluboké kopie (serializací, stejně
jako klonování přílohy), takže snímek zůstane netknutý.

Nahlášeno na přejmenování kraje Karlovarský – přesně ten scénář teď hlídají
dva regresní testy; bez opravy oba padají.

Build 0 chyb / 0 varování, 57 testů zelených.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 11:26:10 +02:00
co-authored by Claude Opus 5
parent cd2b82db3c
commit f086e623d6
6 changed files with 60 additions and 6 deletions
+43
View File
@@ -178,6 +178,49 @@ public class CiselnikyVrstvyTesty
Assert.Equal(new[] { "Novák", "Černý" }, vysledek.Select(j => j.Hodnota));
}
[Fact]
public void UpravaDodavanePolozkyVMrizceSeZapiseDoRozdilu()
{
// Regrese: dodávané položky se dřív do mřížky vkládaly jako tytéž objekty, jaké držel
// referenční snímek dodávané vrstvy. Úprava v mřížce mutovala i snímek, rozdíl se pak
// počítal proti už změněným datům, vyšel prázdný a oprava se tiše ztratila.
// Mazání a přidávání přitom fungovalo, takže se to snadno přehlédne.
var dodavana = new List<Kraj>
{
new() { Nazev = "Jihomoravský" },
new() { Nazev = "Karlovarský" },
};
var vMrizce = new ObservableCollection<Kraj>();
CiselnikyStore.Sluc(vMrizce, dodavana, null);
// Uživatel přepíše buňku v mřížce.
vMrizce[1].Nazev = "Karlovarskýýýýý";
var rozdil = CiselnikyStore.Rozdil(vMrizce, dodavana);
Assert.Equal(new[] { "Karlovarskýýýýý" }, rozdil.Vlastni.Select(k => k.Nazev));
Assert.Equal(new[] { "Karlovarský" }, rozdil.Skryte);
// A po restartu programu tam ta úprava musí být.
var poRestartu = new ObservableCollection<Kraj>();
CiselnikyStore.Sluc(poRestartu, dodavana, rozdil);
Assert.Equal(new[] { "Jihomoravský", "Karlovarskýýýýý" }, poRestartu.Select(k => k.Nazev));
}
[Fact]
public void UpravaNemutujeDodavanouVrstvu()
{
var dodavana = new List<Organizace> { new() { Nazev = "SŽ Praha", Adresa = "Dlážděná 1003/7" } };
var vMrizce = new ObservableCollection<Organizace>();
CiselnikyStore.Sluc(vMrizce, dodavana, null);
vMrizce[0].Adresa = "jiná adresa";
Assert.Equal("Dlážděná 1003/7", dodavana[0].Adresa);
Assert.NotSame(dodavana[0], vMrizce[0]);
}
[Fact]
public void KlicSeBerePodleTypuPolozky()
{