feat: advance legacy UI behavior parity
This commit is contained in:
@@ -221,6 +221,111 @@ public sealed class LegacyComparisonWorkflowTests
|
||||
Assert.False(snapshot.IsBusy);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Uc3_AllowsExactDuplicatePairsAndMovesOrDeletesOnlyTheSelectedStableRow()
|
||||
{
|
||||
var data = new FakeDataService { DomesticResults = [Samsung, SkHynix] };
|
||||
var store = new FakePairStore();
|
||||
var controller = CreateController(data, store);
|
||||
var search = await controller.SearchDomesticAsync(string.Empty);
|
||||
controller.ChooseDomesticResult(search.DomesticSearch.Results[0].SelectionId);
|
||||
controller.ChooseDomesticResult(search.DomesticSearch.Results[1].SelectionId);
|
||||
|
||||
var firstAdd = await controller.AddDraftPairAsync();
|
||||
var firstRowId = Assert.Single(firstAdd.SavedPairs).RowId;
|
||||
var secondAdd = await controller.AddDraftPairAsync();
|
||||
var secondRowId = secondAdd.SavedPairs[1].RowId;
|
||||
|
||||
Assert.NotEqual(firstRowId, secondRowId);
|
||||
Assert.Equal(
|
||||
new[] { firstRowId, secondRowId },
|
||||
secondAdd.SavedPairs.Select(pair => pair.RowId));
|
||||
Assert.All(
|
||||
secondAdd.SavedPairs,
|
||||
pair => Assert.Equal("SK하이닉스 ↔ 삼성전자", pair.DisplayLabel));
|
||||
Assert.Collection(
|
||||
store.Writes[^1],
|
||||
row => Assert.Equal(
|
||||
new LegacyComparisonPairWriteRow(
|
||||
1,
|
||||
"SK하이닉스",
|
||||
"코스피",
|
||||
"삼성전자",
|
||||
"코스피"),
|
||||
row),
|
||||
row => Assert.Equal(
|
||||
new LegacyComparisonPairWriteRow(
|
||||
2,
|
||||
"SK하이닉스",
|
||||
"코스피",
|
||||
"삼성전자",
|
||||
"코스피"),
|
||||
row));
|
||||
|
||||
controller.SelectSavedPair(secondRowId);
|
||||
var moved = await controller.MoveSelectedPairAsync(
|
||||
LegacyComparisonPairMoveDirection.Up);
|
||||
|
||||
Assert.Equal(
|
||||
new[] { secondRowId, firstRowId },
|
||||
moved.SavedPairs.Select(pair => pair.RowId));
|
||||
Assert.Equal(secondRowId, moved.SelectedPairId);
|
||||
Assert.True(moved.SavedPairs[0].IsSelected);
|
||||
Assert.False(moved.SavedPairs[1].IsSelected);
|
||||
|
||||
var deleted = await controller.DeleteSelectedPairAsync();
|
||||
|
||||
var remaining = Assert.Single(deleted.SavedPairs);
|
||||
Assert.Equal(firstRowId, remaining.RowId);
|
||||
Assert.True(remaining.IsSelected);
|
||||
Assert.Equal(firstRowId, deleted.SelectedPairId);
|
||||
Assert.Single(store.Writes[^1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Uc3_DuplicatePairSaveRoundTripPreservesPhysicalRowOrder()
|
||||
{
|
||||
var data = new FakeDataService();
|
||||
data.Resolve(Samsung, "삼성전자", "코스피");
|
||||
data.Resolve(SkHynix, "SK하이닉스", "코스피");
|
||||
data.Resolve(Apple, "APPLE", string.Empty);
|
||||
var store = new FakePairStore
|
||||
{
|
||||
Bytes = EncodeCp949(
|
||||
("삼성전자", "코스피", "SK하이닉스", "코스피"),
|
||||
("삼성전자", "코스피", "SK하이닉스", "코스피"),
|
||||
("코스피 지수", string.Empty, "APPLE", string.Empty))
|
||||
};
|
||||
var controller = CreateController(data, store);
|
||||
var loaded = await controller.LoadSavedPairsAsync();
|
||||
var thirdRowId = loaded.SavedPairs[2].RowId;
|
||||
controller.SelectSavedPair(thirdRowId);
|
||||
|
||||
var moved = await controller.MoveSelectedPairAsync(
|
||||
LegacyComparisonPairMoveDirection.Up);
|
||||
|
||||
Assert.Equal(
|
||||
new[]
|
||||
{
|
||||
"삼성전자 ↔ SK하이닉스",
|
||||
"코스피 지수 ↔ APPLE",
|
||||
"삼성전자 ↔ SK하이닉스"
|
||||
},
|
||||
moved.SavedPairs.Select(pair => pair.DisplayLabel));
|
||||
Assert.Equal(new[] { 1, 2, 3 }, store.Writes[^1].Select(row => row.RowNumber));
|
||||
|
||||
var reloadedStore = new FakePairStore
|
||||
{
|
||||
Bytes = EncodeCp949(store.Writes[^1])
|
||||
};
|
||||
var reloaded = await CreateController(data, reloadedStore).LoadSavedPairsAsync();
|
||||
|
||||
Assert.Equal(
|
||||
moved.SavedPairs.Select(pair => pair.DisplayLabel),
|
||||
reloaded.SavedPairs.Select(pair => pair.DisplayLabel));
|
||||
Assert.Equal(3, reloaded.SavedPairs.Select(pair => pair.RowId).Distinct().Count());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SavedPairMoveAndDelete_PreserveActiveRowAndPersistPhysicalOrder()
|
||||
{
|
||||
@@ -424,6 +529,13 @@ public sealed class LegacyComparisonWorkflowTests
|
||||
return encoding.GetBytes(string.Join("\r\n", lines) + "\r\n");
|
||||
}
|
||||
|
||||
private static byte[] EncodeCp949(IReadOnlyList<LegacyComparisonPairWriteRow> rows) =>
|
||||
EncodeCp949(rows.Select(row => (
|
||||
row.FirstName,
|
||||
row.FirstMarket,
|
||||
row.SecondName,
|
||||
row.SecondMarket)).ToArray());
|
||||
|
||||
private sealed class FakeDataService : ILegacyComparisonDataService
|
||||
{
|
||||
private readonly Dictionary<LegacyComparisonStoredTargetReference, LegacyComparisonTarget>
|
||||
|
||||
Reference in New Issue
Block a user