using System; namespace Prism.UnitTests { public class HslTests : UnitTestSharp.TestFixture { public static Hsl Gray(double hue, double lightness) { return new Hsl(hue, 0, lightness); } public class CtorTests : UnitTestSharp.TestFixture { public void AssignsAllFourParts() { var color = new Hsl(0.25, 0.5, 0.75, 0.125); CheckEqual(0.25, color.Hue); CheckEqual(0.5, color.Saturation); CheckEqual(0.75, color.Lightness); CheckEqual(0.125, color.Alpha); } public void WithoutAlpha_IsOpaque() { CheckEqual(1.0, new Hsl(0.25, 0.5, 0.75).Alpha); } public void HueOutsideZeroToOne_Wraps() { CheckEqual(0.25, new Hsl(1.25, 1, 0.5).Hue); CheckEqual(0.75, new Hsl(-0.25, 1, 0.5).Hue); } public void NaNHue_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(double.NaN, 1, 0.5); } public void SaturationAboveOne_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(0, 1.1, 0.5); } public void NegativeSaturation_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(0, -0.1, 0.5); } public void LightnessAboveOne_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(0, 1, 1.1); } public void NaNLightness_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(0, 1, double.NaN); } public void AlphaAboveOne_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(0, 1, 0.5, 1.1); } public void NegativeAlpha_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new Hsl(0, 1, 0.5, -0.1); } } public class FromColorTests : UnitTestSharp.TestFixture { public void Red_IsFullySaturatedAtHalfLightness() { CheckEqual(new Hsl(0, 1, 0.5), Hsl.FromColor(Color.FromArgb(255, 0, 0))); } public void Yellow_IsASixthOfTheWayRound() { CheckEqual(new Hsl(1 / 6.0, 1, 0.5), Hsl.FromColor(Color.FromArgb(255, 255, 0))); } public void ADarkRed_KeepsFullSaturationAndLosesLightness() { CheckEqual(new Hsl(0, 1, 128 / 510.0), Hsl.FromColor(Color.FromArgb(128, 0, 0))); } public void APaleRed_KeepsFullSaturationAndGainsLightness() { CheckEqual(new Hsl(0, 1, 459 / 510.0), Hsl.FromColor(Color.FromArgb(255, 204, 204))); } public void AHalfSaturatedRed_HasHalfTheChroma() { CheckEqual(new Hsl(0, 127 / 255.0, 0.5), Hsl.FromColor(Color.FromArgb(191, 64, 64))); } public void Gray_HasHueZeroAndNoSaturation() { CheckEqual(new Hsl(0, 0, 256 / 510.0), Hsl.FromColor(Color.FromArgb(128, 128, 128))); } public void Black_IsAllZero() { CheckEqual(new Hsl(0, 0, 0), Hsl.FromColor(Color.FromArgb(0, 0, 0))); } public void White_IsFullLightnessWithNoSaturation() { CheckEqual(new Hsl(0, 0, 1), Hsl.FromColor(Color.FromArgb(255, 255, 255))); } public void AlphaIsCarriedOverAsACoverageFraction() { CheckEqual(128 / 255.0, Hsl.FromColor(Color.FromArgb(128, 255, 0, 0)).Alpha); } } public class ToSrgbTests : UnitTestSharp.TestFixture { public void KeepsTheChannelsUnrounded() { CheckEqual(new SrgbColor(1, 0.375, 0, 0.5), new Hsl(0.0625, 1, 0.5, 0.5).ToSrgb()); } } public class ToColorTests : UnitTestSharp.TestFixture { public void HueZero_IsRed() { CheckEqual(Color.FromArgb(255, 0, 0), new Hsl(0, 1, 0.5).ToColor()); } public void ASixthOfTheWayRound_IsYellow() { CheckEqual(Color.FromArgb(255, 255, 0), new Hsl(1 / 6.0, 1, 0.5).ToColor()); } public void AThirdOfTheWayRound_IsGreen() { CheckEqual(Color.FromArgb(0, 255, 0), new Hsl(2 / 6.0, 1, 0.5).ToColor()); } public void HalfwayRound_IsCyan() { CheckEqual(Color.FromArgb(0, 255, 255), new Hsl(3 / 6.0, 1, 0.5).ToColor()); } public void TwoThirdsOfTheWayRound_IsBlue() { CheckEqual(Color.FromArgb(0, 0, 255), new Hsl(4 / 6.0, 1, 0.5).ToColor()); } public void FiveSixthsOfTheWayRound_IsMagenta() { CheckEqual(Color.FromArgb(255, 0, 255), new Hsl(5 / 6.0, 1, 0.5).ToColor()); } public void HalfwayBetweenRedAndYellow_IsOrange() { CheckEqual(Color.FromArgb(255, 128, 0), new Hsl(1 / 12.0, 1, 0.5).ToColor()); } public void NoSaturation_IsAGrayOfThatLightness() { CheckEqual(Color.FromArgb(128, 128, 128), new Hsl(0.6, 0, 0.5).ToColor()); } public void LightnessZero_IsBlackWhateverTheHueAndSaturation() { CheckEqual(Color.FromArgb(0, 0, 0), new Hsl(0.6, 1, 0).ToColor()); } public void LightnessOne_IsWhiteWhateverTheHueAndSaturation() { CheckEqual(Color.FromArgb(255, 255, 255), new Hsl(0.6, 1, 1).ToColor()); } public void FullSaturationAboveHalfLightness_IsAPaleColor() { CheckEqual(Color.FromArgb(255, 204, 204), new Hsl(0, 1, 0.9).ToColor()); } public void HalfSaturationAtHalfLightness_HasHalfTheChroma() { CheckEqual(Color.FromArgb(191, 64, 64), new Hsl(0, 0.5, 0.5).ToColor()); } public void AlphaIsRoundedToAByte() { CheckEqual((byte)128, new Hsl(0, 1, 0.5, 0.5).ToColor().Alpha); } public void UndoesFromColor_ForAnOrange() { CheckEqual(Color.FromArgb(255, 165, 0), Hsl.FromColor(Color.FromArgb(255, 165, 0)).ToColor()); } public void UndoesFromColor_ForATeal() { CheckEqual(Color.FromArgb(0, 128, 128), Hsl.FromColor(Color.FromArgb(0, 128, 128)).ToColor()); } public void UndoesFromColor_ForAColorWithAlpha() { Color original = Color.FromArgb(77, 12, 34, 56); CheckEqual(original, Hsl.FromColor(original).ToColor()); } public void UndoesFromColor_ForAColorWithBlueTheLargest() { Color original = Color.FromArgb(200, 40, 220); CheckEqual(original, Hsl.FromColor(original).ToColor()); } } public class LerpTests : UnitTestSharp.TestFixture { public void AtZero_IsTheStart() { var from = new Hsl(0.25, 0.5, 0.5, 1); CheckEqual(from, Hsl.Lerp(from, new Hsl(0.5, 1, 0.75, 0), 0)); } public void AtOne_IsTheEnd() { var to = new Hsl(0.5, 1, 0.75, 0.5); CheckEqual(to, Hsl.Lerp(new Hsl(0.25, 0.5, 0.5, 1), to, 1)); } public void BlendsSaturationAndLightnessLinearly() { Hsl blended = Hsl.Lerp(new Hsl(0.25, 0.25, 0.25, 1), new Hsl(0.25, 0.75, 0.75, 1), 0.5); CheckEqual(new Hsl(0.25, 0.5, 0.5, 1), blended); } public void AlphaBlendsLinearly_LeavingTheSameColorAlone() { Hsl blended = Hsl.Lerp( new Hsl(0.25, 0.5, 0.5, 0.25), new Hsl(0.25, 0.5, 0.5, 0.75), 0.25); CheckEqual(new Hsl(0.25, 0.5, 0.5, 0.375), blended); } public void ATransparentStart_AddsNoColor() { Hsl blended = Hsl.Lerp( new Hsl(0.25, 0.25, 0.25, 0), new Hsl(0.5, 0.75, 0.75, 1), 0.5); CheckEqual(new Hsl(0.5, 0.75, 0.75, 0.5), blended); } public void ATransparentEnd_AddsNoColor() { Hsl blended = Hsl.Lerp( new Hsl(0.25, 0.25, 0.25, 1), new Hsl(0.5, 0.75, 0.75, 0), 0.5); CheckEqual(new Hsl(0.25, 0.25, 0.25, 0.5), blended); } public void BothTransparent_BlendTheColorsLinearly() { Hsl blended = Hsl.Lerp( new Hsl(0.25, 0.25, 0.25, 0), new Hsl(0.5, 0.75, 0.75, 0), 0.5); CheckEqual(new Hsl(0.375, 0.5, 0.5, 0), blended); } public void UnequalAlphas_WeighEachColorByItsAlpha() { Hsl blended = Hsl.Lerp( new Hsl(0.25, 0.25, 0.25, 0.25), new Hsl(0.5, 0.75, 0.75, 0.75), 0.5); CheckEqual(new Hsl(0.4375, 0.625, 0.625, 0.5), blended); } public void AmountBelowZero_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); Hsl.Lerp(new Hsl(0, 1, 0.5), new Hsl(0.5, 1, 0.5), -0.1); } public void AmountAboveOne_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); Hsl.Lerp(new Hsl(0, 1, 0.5), new Hsl(0.5, 1, 0.5), 1.1); } public void NaNAmount_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); Hsl.Lerp(new Hsl(0, 1, 0.5), new Hsl(0.5, 1, 0.5), double.NaN); } public class DirectionTests : UnitTestSharp.TestFixture { public void WithoutADirection_TakesTheShorterWay() { CheckEqual(0.0, Hsl.Lerp(new Hsl(0.875, 1, 0.5), new Hsl(0.125, 1, 0.5), 0.5).Hue); } public void Longest_TakesTheLongerArc() { CheckEqual( 0.875, Hsl.Lerp(new Hsl(0.25, 1, 0.5), new Hsl(0.5, 1, 0.5), 0.5, HueDirection.Longest).Hue); } public void Increasing_WrapsPastOneToReachALowerHue() { CheckEqual( 0.0, Hsl.Lerp(new Hsl(0.75, 1, 0.5), new Hsl(0.25, 1, 0.5), 0.5, HueDirection.Increasing).Hue); } public void Decreasing_WrapsPastZeroToReachAHigherHue() { CheckEqual( 0.0, Hsl.Lerp(new Hsl(0.25, 1, 0.5), new Hsl(0.75, 1, 0.5), 0.5, HueDirection.Decreasing).Hue); } public void AnUnknownDirection_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); Hsl.Lerp(new Hsl(0, 1, 0.5), new Hsl(0.5, 1, 0.5), 0.5, (HueDirection)99); } } public class ColorsWithoutAHueTests : UnitTestSharp.TestFixture { public void AGrayStart_TakesTheEndsHue() { CheckEqual(new Hsl(0.25, 0.5, 0.5), Hsl.Lerp(Gray(0.5, 0.5), new Hsl(0.25, 1, 0.5), 0.5)); } public void ABlackStart_TakesTheEndsHue() { CheckEqual(new Hsl(0.25, 1, 0.25), Hsl.Lerp(new Hsl(0.9, 1, 0), new Hsl(0.25, 1, 0.5), 0.5)); } public void AWhiteStart_TakesTheEndsHue() { CheckEqual(new Hsl(0.25, 1, 0.75), Hsl.Lerp(new Hsl(0.9, 1, 1), new Hsl(0.25, 1, 0.5), 0.5)); } public void AGrayEnd_KeepsTheStartsHue() { CheckEqual(new Hsl(0.25, 0.5, 0.5), Hsl.Lerp(new Hsl(0.25, 1, 0.5), Gray(0.5, 0.5), 0.5)); } public void ABlackEnd_KeepsTheStartsHue() { CheckEqual(new Hsl(0.25, 1, 0.25), Hsl.Lerp(new Hsl(0.25, 1, 0.5), new Hsl(0.9, 1, 0), 0.5)); } public void AWhiteEnd_KeepsTheStartsHue() { CheckEqual(new Hsl(0.25, 1, 0.75), Hsl.Lerp(new Hsl(0.25, 1, 0.5), new Hsl(0.9, 1, 1), 0.5)); } public void TwoWithoutAHue_KeepTheStartsHue() { CheckEqual(new Hsl(0.25, 0, 0.75), Hsl.Lerp(Gray(0.25, 0.5), Gray(0.75, 1), 0.5)); } } } public class EqualityTests : UnitTestSharp.TestFixture { public void SameParts_AreEqual() { CheckTrue(new Hsl(0.1, 0.2, 0.3, 0.4).Equals(new Hsl(0.1, 0.2, 0.3, 0.4))); CheckTrue(new Hsl(0.1, 0.2, 0.3, 0.4) == new Hsl(0.1, 0.2, 0.3, 0.4)); CheckFalse(new Hsl(0.1, 0.2, 0.3, 0.4) != new Hsl(0.1, 0.2, 0.3, 0.4)); } public void AnyDifferentPart_IsNotEqual() { var baseColor = new Hsl(0.1, 0.2, 0.3, 0.4); CheckFalse(baseColor.Equals(new Hsl(0.9, 0.2, 0.3, 0.4))); CheckFalse(baseColor.Equals(new Hsl(0.1, 0.9, 0.3, 0.4))); CheckFalse(baseColor.Equals(new Hsl(0.1, 0.2, 0.9, 0.4))); CheckFalse(baseColor.Equals(new Hsl(0.1, 0.2, 0.3, 0.9))); CheckTrue(baseColor != new Hsl(0.1, 0.2, 0.3, 0.9)); } public void BoxedColor_IsEqualToTheSameColor() { CheckTrue(new Hsl(0.1, 0.2, 0.3).Equals((object)new Hsl(0.1, 0.2, 0.3))); } public void ANonHsl_IsNotEqual() { CheckFalse(new Hsl(0.1, 0.2, 0.3).Equals("color")); } public void EqualColors_HaveTheSameHashCode() { CheckEqual(new Hsl(0.1, 0.2, 0.3, 0.4).GetHashCode(), new Hsl(0.1, 0.2, 0.3, 0.4).GetHashCode()); } } } }