You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
5.7 KiB
184 lines
5.7 KiB
using NUnit.Framework;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace UnityEditor.Rendering.Tests
|
|
{
|
|
class SweepLineRectUtilsTests
|
|
{
|
|
const float Epsilon = 1e-5f;
|
|
|
|
static object[][] s_Empty = new object[][]
|
|
{
|
|
new object[] { new List<Rect>() }
|
|
};
|
|
|
|
[Test]
|
|
[TestCaseSource("s_Empty")]
|
|
public void TestEmpty(List<Rect> rects)
|
|
{
|
|
var area = SweepLineRectUtils.CalculateRectUnionArea(rects);
|
|
Assert.That(area, Is.EqualTo(0f).Within(Epsilon));
|
|
}
|
|
|
|
static object[][] s_SingleRect = new object[][]
|
|
{
|
|
new object[] { new Rect(0.1f, 0.2f, 0.3f, 0.4f), 0.12f },
|
|
new object[] { new Rect(0f, 0f, 1f, 1f), 1f },
|
|
};
|
|
|
|
[Test]
|
|
[TestCaseSource("s_SingleRect")]
|
|
public void SingleRect(Rect r, float expected)
|
|
{
|
|
var area = SweepLineRectUtils.CalculateRectUnionArea(new List<Rect> { r });
|
|
Assert.That(area, Is.EqualTo(expected).Within(Epsilon));
|
|
}
|
|
|
|
static object[][] s_NonOverlapping = new object[][]
|
|
{
|
|
new object[]
|
|
{
|
|
new List<Rect> { new Rect(0f, 0f, 0.5f, 0.5f), new Rect(0.5f, 0.5f, 0.5f, 0.5f) }, 0.5f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0f, 0f, 0.2f, 0.2f), // 0.04
|
|
new Rect(0.2f, 0f, 0.3f, 0.2f), // 0.06
|
|
new Rect(0.5f, 0.5f, 0.25f, 0.25f) // 0.0625
|
|
},
|
|
0.1625f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect> { new Rect(0f, 0f, 0.5f, 1f), new Rect(0.5f, 0f, 0.5f, 1f) }, 1f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect> { new Rect(0.2f, 0.2f, 0f, 0.5f), new Rect(0.2f, 0.2f, 0.5f, 0f) }, 0f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect> { new Rect(0f, 0f, 0f, 0f), new Rect(0.1f, 0.1f, 0.2f, 0.3f) }, 0.06f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0f, 0.3f, 0.3f, 0.3f),
|
|
new Rect(0.6f, 0.3f, 0.3f, 0.3f),
|
|
new Rect(0.3f, 0.3f, 0.3f, 0.3f),
|
|
new Rect(0f, 0.6f, 0.3f, 0.3f),
|
|
new Rect(0.7f, 0.7f, 0.3f, 0.3f),
|
|
},
|
|
0.45f
|
|
}
|
|
};
|
|
|
|
[Test]
|
|
[TestCaseSource("s_NonOverlapping")]
|
|
public void NonOverlappingRects(List<Rect> rects, float expected)
|
|
{
|
|
var area = SweepLineRectUtils.CalculateRectUnionArea(rects);
|
|
Assert.That(area, Is.EqualTo(expected).Within(Epsilon));
|
|
}
|
|
|
|
static object[][] s_Overlapping = new object[][]
|
|
{
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0.2f, 0.2f, 0.4f, 0.3f),
|
|
new Rect(0.2f, 0.2f, 0.4f, 0.3f)
|
|
},
|
|
0.4f * 0.3f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0f, 0f, 0.6f, 0.5f),
|
|
new Rect(0.3f, 0f, 0.6f, 0.5f)
|
|
},
|
|
0.9f * 0.5f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0f, 0.3f, 0.4f, 0.4f),
|
|
new Rect(0.6f, 0.3f, 0.4f, 0.4f),
|
|
new Rect(0.3f, 0f, 0.4f, 0.4f),
|
|
new Rect(0.3f, 0.6f, 0.4f, 0.4f)
|
|
},
|
|
0.64f - 0.04f
|
|
}
|
|
};
|
|
|
|
[Test]
|
|
[TestCaseSource("s_Overlapping")]
|
|
public void OverlappingRects(List<Rect> rects, float expected)
|
|
{
|
|
var area = SweepLineRectUtils.CalculateRectUnionArea(rects);
|
|
Assert.That(area, Is.EqualTo(expected).Within(Epsilon));
|
|
}
|
|
|
|
static object[][] s_ClampingOutside = new object[][]
|
|
{
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(-0.2f, -0.2f, 0.3f, 0.3f), // clamps to [0,0,0.1,0.1] area 0.01
|
|
new Rect(0.9f, 0.9f, 0.5f, 0.5f), // clamps to [0.9,0.9,0.1,0.1] area 0.01
|
|
},
|
|
0.02f
|
|
},
|
|
new object[] { new List<Rect> { new Rect(-10f, -10f, 20f, 20f) }, 1f }
|
|
};
|
|
|
|
[Test]
|
|
[TestCaseSource("s_ClampingOutside")]
|
|
public void ClampingOutside(List<Rect> rects, float expected)
|
|
{
|
|
var area = SweepLineRectUtils.CalculateRectUnionArea(rects);
|
|
Assert.That(area, Is.EqualTo(expected).Within(Epsilon));
|
|
}
|
|
|
|
static object[][] s_IntervalsSorting = new object[][]
|
|
{
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0.0f, 0.2f, 0.2f, 0.2f),
|
|
new Rect(0.0f, 0.0f, 0.2f, 0.1f),
|
|
new Rect(0.0f, 0.3f, 0.2f, 0.2f),
|
|
},
|
|
0.2f * 0.4f
|
|
},
|
|
new object[]
|
|
{
|
|
new List<Rect>
|
|
{
|
|
new Rect(0.0f, 0.0f, 0.2f, 0.1f),
|
|
new Rect(0.3f, 0.0f, 0.3f, 0.1f),
|
|
new Rect(0.5f, 0.0f, 0.2f, 0.1f),
|
|
},
|
|
0.6f * 0.1f
|
|
}
|
|
};
|
|
|
|
[Test]
|
|
[TestCaseSource("s_IntervalsSorting")]
|
|
public void IntervalsSorting(List<Rect> rects, float expected)
|
|
{
|
|
var area = SweepLineRectUtils.CalculateRectUnionArea(rects);
|
|
Assert.That(area, Is.EqualTo(expected).Within(Epsilon));
|
|
}
|
|
}
|
|
}
|