diff --git a/ColorHelper.Tests/Generator/ColorGenerator.cs b/ColorHelper.Tests/Generator/ColorGenerator.cs index 7563dce..85d2c27 100644 --- a/ColorHelper.Tests/Generator/ColorGenerator.cs +++ b/ColorHelper.Tests/Generator/ColorGenerator.cs @@ -39,7 +39,7 @@ public void GetRandomColorHsl() var result = ColorGenerator.GetRandomColor(); Assert.NotNull((HSL)result); } - + [Test] public void GetRandomColorXyz() { @@ -66,5 +66,33 @@ public void GetDarkRandomColor() Assert.That(result.G, Is.LessThanOrEqualTo(80)); Assert.That(result.B, Is.LessThanOrEqualTo(80)); } + + [Test] + [Repeat(100)] + public void GetRandomColorExact() + { + var result = ColorGenerator.GetRandomColorExact("helloworld".GetHashCode()); + Assert.NotNull((RGB)result); + } + + [Test] + [Repeat(100)] + public void GetRandomColorExactLight() + { + var result = ColorGenerator.GetRandomColorExact("helloworld".GetHashCode(), ColorGenerator.ColorThemesEnum.Light); + Assert.That(result.R, Is.GreaterThanOrEqualTo(170)); + Assert.That(result.G, Is.GreaterThanOrEqualTo(170)); + Assert.That(result.B, Is.GreaterThanOrEqualTo(170)); + } + + [Test] + [Repeat(100)] + public void GetRandomColorExactDark() + { + var result = ColorGenerator.GetRandomColorExact("helloworld".GetHashCode(), ColorGenerator.ColorThemesEnum.Dark); + Assert.That(result.R, Is.LessThanOrEqualTo(80)); + Assert.That(result.G, Is.LessThanOrEqualTo(80)); + Assert.That(result.B, Is.LessThanOrEqualTo(80)); + } } } \ No newline at end of file diff --git a/ColorHelper/Color/ColorThemesEnum.cs b/ColorHelper/Color/ColorThemesEnum.cs new file mode 100644 index 0000000..235c632 --- /dev/null +++ b/ColorHelper/Color/ColorThemesEnum.cs @@ -0,0 +1,12 @@ +namespace ColorHelper +{ + public static partial class ColorGenerator + { + public enum ColorThemesEnum + { + Default, + Light, + Dark + } + } +} \ No newline at end of file diff --git a/ColorHelper/Generator/ColorGenerator.cs b/ColorHelper/Generator/ColorGenerator.cs index 6d86040..4954217 100644 --- a/ColorHelper/Generator/ColorGenerator.cs +++ b/ColorHelper/Generator/ColorGenerator.cs @@ -2,46 +2,73 @@ namespace ColorHelper { - public static class ColorGenerator + public static partial class ColorGenerator { public static T GetRandomColor() where T: IColor { - return GetRandomColor(new RgbRandomColorFilter()); + return GetRandomColor(GetColorFilter(ColorThemesEnum.Default)); } public static T GetLightRandomColor() where T : IColor { - const byte minRangeValue = 170; + return GetRandomColor(GetColorFilter(ColorThemesEnum.Light)); + } - RgbRandomColorFilter filter = new RgbRandomColorFilter(); - filter.minR = minRangeValue; - filter.minG = minRangeValue; - filter.minB = minRangeValue; + public static T GetDarkRandomColor() where T : IColor + { + return GetRandomColor(GetColorFilter(ColorThemesEnum.Dark)); + } - return GetRandomColor(filter); + public static T GetRandomColorExact(int hashCode, ColorThemesEnum colorTheme = ColorThemesEnum.Default) where T : IColor + { + return GetRandomColorExact(hashCode, GetColorFilter(colorTheme)); } - public static T GetDarkRandomColor() where T : IColor + private static RgbRandomColorFilter GetColorFilter(ColorThemesEnum colorTheme) { const byte maxRangeValue = 80; + const byte minRangeValue = 170; RgbRandomColorFilter filter = new RgbRandomColorFilter(); - filter.maxR = maxRangeValue; - filter.maxG = maxRangeValue; - filter.maxB = maxRangeValue; - return GetRandomColor(filter); + switch (colorTheme) + { + case ColorThemesEnum.Default: + break; + case ColorThemesEnum.Light: + filter.minR = minRangeValue; + filter.minG = minRangeValue; + filter.minB = minRangeValue; + break; + case ColorThemesEnum.Dark: + filter.maxR = maxRangeValue; + filter.maxG = maxRangeValue; + filter.maxB = maxRangeValue; + break; + } + + return filter; } private static T GetRandomColor(RgbRandomColorFilter filter) where T : IColor { Random random = new Random(DateTime.Now.Millisecond); + return GetRandomColor(filter, random); + } + private static T GetRandomColorExact(int hashCode, RgbRandomColorFilter filter) where T : IColor + { + Random random = new Random(DateTime.Now.Millisecond + hashCode); + return GetRandomColor(filter, random); + } + + private static T GetRandomColor(RgbRandomColorFilter filter, Random random) where T : IColor + { RGB rgb = new RGB( (byte)random.Next(filter.minR, filter.maxR), (byte)random.Next(filter.minG, filter.maxG), (byte)random.Next(filter.minB, filter.maxB)); - + return ConvertRgbToNecessaryColorType(rgb); }