Files
Test/Library/PackageCache/com.unity.ugui@eb824e41fbc7/Tests/Runtime/UGUI/SafeArea/SafeAreaTests.cs
T
2026-11-01 23:39:55 +02:00

363 lines
12 KiB
C#

using NUnit.Framework;
using UnityEngine;
using UnityEngine.UI;
namespace SafeAreaTests
{
internal class SafeAreaCalculationBlackBoxTests
{
private const float Epsilon = 0.0001f;
private const int ScreenWidth = 1000;
private const int ScreenHeight = 2000;
private static void AssertAnchors(
(Vector2 min, Vector2 max) actual,
float minX,
float minY,
float maxX,
float maxY)
{
Assert.That(actual.min.x, Is.EqualTo(minX).Within(Epsilon));
Assert.That(actual.min.y, Is.EqualTo(minY).Within(Epsilon));
Assert.That(actual.max.x, Is.EqualTo(maxX).Within(Epsilon));
Assert.That(actual.max.y, Is.EqualTo(maxY).Within(Epsilon));
}
private static Rect MakeSafeArea(float leftInset, float bottomInset, float rightInset, float topInset)
{
return new Rect(
leftInset,
bottomInset,
ScreenWidth - leftInset - rightInset,
ScreenHeight - bottomInset - topInset);
}
[TestCase(0, 0, false)]
[TestCase(0, SafeArea.AlignmentMode.CenterHorizontally, false)]
[TestCase(0, SafeArea.AlignmentMode.CenterVertically, false)]
[TestCase(0, SafeArea.AlignmentMode.CenterHorizontally | SafeArea.AlignmentMode.CenterVertically, false)]
[TestCase(0, 0, true)]
[TestCase(0, SafeArea.AlignmentMode.CenterHorizontally, true)]
[TestCase(0, SafeArea.AlignmentMode.CenterVertically, true)]
[TestCase(0, SafeArea.AlignmentMode.CenterHorizontally | SafeArea.AlignmentMode.CenterVertically, true)]
public void CalculateAnchors_WhenNoEdgesRespected_ReturnsFullScreen(
SafeArea.SafeAreaMode safeAreaFlags,
SafeArea.AlignmentMode alignmentFlags,
bool flipped)
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
safeAreaFlags,
alignmentFlags,
flipped);
AssertAnchors(actual, 0f, 0f, 1f, 1f);
}
[TestCase(false)]
[TestCase(true)]
public void CalculateAnchors_WhenSafeAreaIsFullScreen_ReturnsFullScreen(bool flipped)
{
var safeArea = new Rect(0, 0, ScreenWidth, ScreenHeight);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right | SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
SafeArea.AlignmentMode.CenterHorizontally | SafeArea.AlignmentMode.CenterVertically,
flipped);
AssertAnchors(actual, 0f, 0f, 1f, 1f);
}
[Test]
public void CalculateAnchors_WhenAllEdgesRespectedAndNoAlignment_ReturnsNormalizedSafeArea()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right | SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
0,
false);
AssertAnchors(actual, 0.1f, 0.1f, 0.85f, 0.85f);
}
[Test]
public void CalculateAnchors_WhenOnlyLeftRespected_OnlyLeftAnchorIsInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left,
0,
false);
AssertAnchors(actual, 0.1f, 0f, 1f, 1f);
}
[Test]
public void CalculateAnchors_WhenOnlyRightRespected_OnlyRightAnchorIsInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Right,
0,
false);
AssertAnchors(actual, 0f, 0f, 0.85f, 1f);
}
[Test]
public void CalculateAnchors_WhenOnlyBottomRespected_OnlyBottomAnchorIsInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Bottom,
0,
false);
AssertAnchors(actual, 0f, 0.1f, 1f, 1f);
}
[Test]
public void CalculateAnchors_WhenOnlyTopRespected_OnlyTopAnchorIsInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Top,
0,
false);
AssertAnchors(actual, 0f, 0f, 1f, 0.85f);
}
[Test]
public void CalculateAnchors_WhenLeftAndRightRespected_HorizontalAnchorsAreInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right,
0,
false);
AssertAnchors(actual, 0.1f, 0f, 0.85f, 1f);
}
[Test]
public void CalculateAnchors_WhenTopAndBottomRespected_VerticalAnchorsAreInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
0,
false);
AssertAnchors(actual, 0f, 0.1f, 1f, 0.85f);
}
[Test]
public void CalculateAnchors_WhenAlignedHorizontally_UsesLargerHorizontalInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right,
SafeArea.AlignmentMode.CenterHorizontally,
false);
AssertAnchors(actual, 0.15f, 0f, 0.85f, 1f);
}
[Test]
public void CalculateAnchors_WhenAlignedVertically_UsesLargerVerticalInset()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
SafeArea.AlignmentMode.CenterVertically,
false);
AssertAnchors(actual, 0f, 0.15f, 1f, 0.85f);
}
[Test]
public void CalculateAnchors_WhenAlignedBothAxes_UsesLargestInsetOnEachAxis()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right | SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
SafeArea.AlignmentMode.CenterHorizontally | SafeArea.AlignmentMode.CenterVertically,
false);
AssertAnchors(actual, 0.15f, 0.15f, 0.85f, 0.85f);
}
[Test]
public void CalculateAnchors_WhenHorizontallyAlignedAndFlipped_AlignmentAppliesVertically()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
SafeArea.AlignmentMode.CenterHorizontally,
true);
AssertAnchors(actual, 0f, 0.15f, 1f, 0.85f);
}
[Test]
public void CalculateAnchors_WhenVerticallyAlignedAndFlipped_AlignmentAppliesHorizontally()
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right,
SafeArea.AlignmentMode.CenterVertically,
true);
AssertAnchors(actual, 0.15f, 0f, 0.85f, 1f);
}
[TestCase(0, 0, false)]
[TestCase(1, 0, false)]
[TestCase(2, 0, false)]
[TestCase(4, 0, false)]
[TestCase(8, 0, false)]
[TestCase(3, 0, false)]
[TestCase(12, 0, false)]
[TestCase(15, 0, false)]
[TestCase(15, 1, false)]
[TestCase(15, 2, false)]
[TestCase(15, 3, false)]
[TestCase(15, 1, true)]
[TestCase(15, 2, true)]
[TestCase(15, 3, true)]
[TestCase(5, 1, false)]
[TestCase(10, 2, false)]
[TestCase(5, 1, true)]
[TestCase(10, 2, true)]
public void CalculateAnchors_AlwaysReturnsNormalizedOrderedAnchors(
int safeAreaFlags,
int alignmentFlags,
bool flipped)
{
var safeArea = MakeSafeArea(100, 200, 150, 300);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
(SafeArea.SafeAreaMode)safeAreaFlags,
(SafeArea.AlignmentMode)alignmentFlags,
flipped);
Assert.That(actual.min.x, Is.InRange(0f, 1f));
Assert.That(actual.min.y, Is.InRange(0f, 1f));
Assert.That(actual.max.x, Is.InRange(0f, 1f));
Assert.That(actual.max.y, Is.InRange(0f, 1f));
Assert.That(actual.min.x, Is.LessThanOrEqualTo(actual.max.x));
Assert.That(actual.min.y, Is.LessThanOrEqualTo(actual.max.y));
}
[TestCase(1)]
[TestCase(2)]
[TestCase(4)]
[TestCase(8)]
[TestCase(3)]
[TestCase(12)]
[TestCase(15)]
public void CalculateAnchors_WithSymmetricInsets_RespectedAxisRemainsSymmetric(int safeAreaFlags)
{
var safeArea = MakeSafeArea(100, 200, 100, 200);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
(SafeArea.SafeAreaMode)safeAreaFlags,
0,
false);
if ((((SafeArea.SafeAreaMode)safeAreaFlags) & SafeArea.SafeAreaMode.Left) != 0 &&
(((SafeArea.SafeAreaMode)safeAreaFlags) & SafeArea.SafeAreaMode.Right) != 0)
{
Assert.That(actual.min.x, Is.EqualTo(1f - actual.max.x).Within(Epsilon));
}
if ((((SafeArea.SafeAreaMode)safeAreaFlags) & SafeArea.SafeAreaMode.Bottom) != 0 &&
(((SafeArea.SafeAreaMode)safeAreaFlags) & SafeArea.SafeAreaMode.Top) != 0)
{
Assert.That(actual.min.y, Is.EqualTo(1f - actual.max.y).Within(Epsilon));
}
}
[TestCase(false)]
[TestCase(true)]
public void CalculateAnchors_WhenInsetsAreZero_ReturnsFullScreen(bool flipped)
{
var safeArea = MakeSafeArea(0, 0, 0, 0);
var actual = SafeArea.CalculateAnchors(
ScreenWidth,
ScreenHeight,
safeArea,
SafeArea.SafeAreaMode.Left | SafeArea.SafeAreaMode.Right | SafeArea.SafeAreaMode.Top | SafeArea.SafeAreaMode.Bottom,
SafeArea.AlignmentMode.CenterHorizontally | SafeArea.AlignmentMode.CenterVertically,
flipped);
AssertAnchors(actual, 0f, 0f, 1f, 1f);
}
}
}