dbMango/Tests.Rms.Risk.Mango/PivotKeysComponentTests.cs
Alexander Shabarshov 2a7a24c9e7 Initial contribution
2025-11-03 14:43:26 +00:00

125 lines
5.0 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* dbMango
*
* Copyright 2025 Deutsche Bank AG
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using global::Rms.Risk.Mango.Pivot.UI.Pivot;
namespace Tests.Rms.Risk.Mango;
[TestFixture]
public class PivotKeysComponentTests
{
private static PivotKeysComponent.ItemWithSelection Make(string text) =>
new() { Text = text, IsSelected = false, Changed = (_, _) => { } };
[Test]
public void ReorderItemsUnsafe_EmptyFiltered_ReturnsCopySameOrder()
{
var items = new List<PivotKeysComponent.ItemWithSelection> { Make("A"), Make("B"), Make("C") };
var result = PivotKeysComponent.ReorderItemsUnsafe(items, Array.Empty<PivotKeysComponent.ItemWithSelection>());
Assert.That(result, Is.SameAs(items));
}
[Test]
public void ReorderItemsUnsafe_SubsetSameOrder_ReturnsOriginalOrder()
{
var a = Make("A"); var b = Make("B"); var c = Make("C"); var d = Make("D"); var e = Make("E");
var items = new List<PivotKeysComponent.ItemWithSelection> { a, b, c, d, e };
var filtered = new List<PivotKeysComponent.ItemWithSelection> { b, d };
var result = PivotKeysComponent.ReorderItemsUnsafe(items, filtered);
Assert.That(result.Select(x => x.Text), Is.EqualTo(new[] { "A", "B", "C", "D", "E" }));
}
[Test]
public void ReorderItemsUnsafe_ReverseContiguousSubset_ReordersOnlySubset()
{
var a = Make("A"); var b = Make("B"); var c = Make("C"); var d = Make("D"); var e = Make("E"); var f = Make("F");
var items = new List<PivotKeysComponent.ItemWithSelection> { a, b, c, d, e, f };
var filtered = new List<PivotKeysComponent.ItemWithSelection> { d, c, b }; // reverse B,C,D
var result = PivotKeysComponent.ReorderItemsUnsafe(items, filtered);
Assert.That(result.Select(x => x.Text), Is.EqualTo(new[] { "A", "D", "C", "B", "E", "F" }));
Assert.That(IsSubsequence(result.Select(x => x.Text), new[] { "A", "E", "F" }), Is.True);
}
[Test]
public void ReorderItemsUnsafe_MoveNonContiguousItems_PreservesOthersOrder()
{
var a = Make("A"); var b = Make("B"); var c = Make("C"); var d = Make("D");
var e = Make("E"); var f = Make("F"); var g = Make("G"); var h = Make("H");
var items = new List<PivotKeysComponent.ItemWithSelection> { a, b, c, d, e, f, g, h };
var filtered = new List<PivotKeysComponent.ItemWithSelection> { h, b, f }; // new requested order
var result = PivotKeysComponent.ReorderItemsUnsafe(items, filtered);
Assert.Multiple(() =>
{
Assert.That(result.Where(x => filtered.Contains(x)).Select(x => x.Text), Is.EqualTo(new[] { "H", "B", "F" }));
Assert.That(IsSubsequence(result.Select(x => x.Text), new[] { "A", "C", "D", "E", "G" }), Is.True);
Assert.That(result.Select(x => x.Text).OrderBy(x => x), Is.EqualTo(items.Select(x => x.Text).OrderBy(x => x)));
});
}
[Test]
public void ReorderItemsUnsafe_ItemMovedBackward_PreservesOthersOrder()
{
var a = Make("A"); var b = Make("B"); var c = Make("C"); var d = Make("D"); var e = Make("E");
var items = new List<PivotKeysComponent.ItemWithSelection> { a, b, c, d, e };
var filtered = new List<PivotKeysComponent.ItemWithSelection> { d, b }; // d before b (b originally before d)
var result = PivotKeysComponent.ReorderItemsUnsafe(items, filtered);
Assert.That(result.Select(x => x.Text), Is.EqualTo(new[] { "A", "D", "B", "C", "E" }));
Assert.That(IsSubsequence(result.Select(x => x.Text), new[] { "A", "C", "E" }), Is.True);
}
[Test]
public void ReorderItemsUnsafe_InvalidSubset_Throws()
{
var a = Make("A"); var b = Make("B");
var items = new List<PivotKeysComponent.ItemWithSelection> { a, b };
var outside = Make("X");
Assert.That(() => PivotKeysComponent.ReorderItemsUnsafe(items, new[] { outside }),
Throws.TypeOf<ArgumentException>());
}
private static bool IsSubsequence(IEnumerable<string> sequence, IEnumerable<string> subseq)
{
using var iter = sequence.GetEnumerator();
foreach (var target in subseq)
{
var found = false;
while (iter.MoveNext())
{
if (iter.Current == target)
{
found = true;
break;
}
}
if (!found) return false;
}
return true;
}
}