Files

104 lines
3.1 KiB
C#

using Shouldly;
using Xunit;
namespace AtomUI.Controls.Shared.Tests.MediaQuery;
public class ResponsiveValueTests
{
[Fact]
public void ResponsiveInt_Uses_Mobile_First_Cascade_For_Partial_Map()
{
var value = ResponsiveInt.Parse("xs: 1, md: 3");
value.Resolve(MediaBreakPoint.ExtraSmall, 9).ShouldBe(1);
value.Resolve(MediaBreakPoint.Small, 9).ShouldBe(1);
value.Resolve(MediaBreakPoint.Medium, 9).ShouldBe(3);
value.Resolve(MediaBreakPoint.Large, 9).ShouldBe(3);
value.Resolve(MediaBreakPoint.ExtraExtraLarge, 9).ShouldBe(3);
}
[Fact]
public void ResponsiveInt_Returns_Fallback_When_No_Configured_Breakpoint_Is_Active()
{
var value = ResponsiveInt.Parse("xl: 4");
value.Resolve(MediaBreakPoint.Small, 2).ShouldBe(2);
}
[Fact]
public void ResponsiveInt_TryResolve_Distinguishes_Configured_Hit_From_Fallback()
{
var value = ResponsiveInt.Parse("xl: 4");
value.TryResolve(MediaBreakPoint.Large, out _).ShouldBeFalse();
value.TryResolve(MediaBreakPoint.ExtraLarge, out var resolved).ShouldBeTrue();
resolved.ShouldBe(4);
}
[Fact]
public void ResponsiveInt_Scalar_TryResolve_Applies_To_All_Breakpoints()
{
var value = new ResponsiveInt(3);
value.TryResolve(MediaBreakPoint.ExtraSmall, out var resolved).ShouldBeTrue();
resolved.ShouldBe(3);
}
[Fact]
public void ResponsiveInt_Supports_Xxxl_Breakpoint()
{
var value = ResponsiveInt.Parse("xs: 1, xxl: 3, xxxl: 4");
value.Resolve(MediaBreakPoint.ExtraExtraExtraLarge, 9).ShouldBe(4);
}
[Fact]
public void ResponsiveInt_Scalar_Value_Applies_To_All_Breakpoints()
{
var value = ResponsiveInt.Parse("3");
value.Resolve(MediaBreakPoint.ExtraSmall, 1).ShouldBe(3);
value.Resolve(MediaBreakPoint.ExtraExtraExtraLarge, 1).ShouldBe(3);
}
[Fact]
public void ResponsiveInt_Rejects_Duplicate_Breakpoint_Key()
{
Should.Throw<FormatException>(() => ResponsiveInt.Parse("xs: 1, xs: 2"));
}
[Fact]
public void ResponsiveDouble_Uses_Mobile_First_Cascade_For_Partial_Map()
{
var value = ResponsiveDouble.Parse("xs: 8, md: 16");
value.Resolve(MediaBreakPoint.Small, 0).ShouldBe(8);
value.Resolve(MediaBreakPoint.Large, 0).ShouldBe(16);
}
[Fact]
public void ResponsiveGutter_Resolves_Horizontal_And_Vertical_Independently()
{
var gutter = ResponsiveGutter.Parse("xs: 8, md: 16; xs: 4, xl: 24");
gutter.Resolve(MediaBreakPoint.Large, (0, 0)).ShouldBe((16, 4));
gutter.Resolve(MediaBreakPoint.ExtraLarge, (0, 0)).ShouldBe((16, 24));
}
[Fact]
public void ResponsiveGutter_Uses_Fallback_For_Implicit_Vertical_Value()
{
var gutter = ResponsiveGutter.Parse("xs: 8, md: 16");
gutter.Resolve(MediaBreakPoint.Large, (0, 12)).ShouldBe((16, 12));
}
[Fact]
public void ResponsiveGutter_Scalar_Value_Applies_To_Horizontal_And_Vertical()
{
var gutter = ResponsiveGutter.Parse("16");
gutter.Resolve(MediaBreakPoint.Large, (0, 12)).ShouldBe((16, 16));
}
}