using Blacklight.Core; using System; using System.Reflection; using UnitTestSharp; using DrawingSize = System.Drawing.Size; namespace Glass.Blacklight.UnitTests { public class PageTextureCacheTests : TestFixture { private static readonly Assembly ThisAssembly = typeof(PageTextureCacheTests).Assembly; private static readonly Assembly OtherAssembly = typeof(string).Assembly; private static Texture NewTexture() { return new FontRendererTests.SizedTexture(new DrawingSize(64, 64)); } public class GetOrCreateTests : TestFixture { public void FirstRequest_ReturnsWhatCreateMakes() { var cache = new PageTextureCache(); Texture made = NewTexture(); Texture returned = cache.GetOrCreate(ThisAssembly, "Fonts.Page_0.png", () => made); CheckTrue(ReferenceEquals(made, returned)); CheckEqual(1, cache.Count); } public void RepeatRequest_ReturnsTheSameTextureWithoutCreatingAnother() { var cache = new PageTextureCache(); Texture first = cache.GetOrCreate(ThisAssembly, "Fonts.Page_0.png", NewTexture); int created = 0; Texture second = cache.GetOrCreate(ThisAssembly, "Fonts.Page_0.png", () => { ++created; return NewTexture(); }); CheckTrue(ReferenceEquals(first, second)); CheckEqual(0, created); CheckEqual(1, cache.Count); } public void DifferentResources_GetTheirOwnTextures() { var cache = new PageTextureCache(); Texture first = cache.GetOrCreate(ThisAssembly, "Fonts.Sans-16px_0.png", NewTexture); Texture second = cache.GetOrCreate(ThisAssembly, "Fonts.Sans-32px_0.png", NewTexture); CheckFalse(ReferenceEquals(first, second)); CheckEqual(2, cache.Count); } public void SameResourceInDifferentAssemblies_GetsItsOwnTexturePerAssembly() { var cache = new PageTextureCache(); Texture first = cache.GetOrCreate(ThisAssembly, "Fonts.Page_0.png", NewTexture); Texture second = cache.GetOrCreate(OtherAssembly, "Fonts.Page_0.png", NewTexture); CheckFalse(ReferenceEquals(first, second)); CheckEqual(2, cache.Count); } public void NullAssembly_Throws() { var cache = new PageTextureCache(); CheckThrow(typeof(ArgumentNullException)); cache.GetOrCreate(null, "Fonts.Page_0.png", NewTexture); } public void NullResource_Throws() { var cache = new PageTextureCache(); CheckThrow(typeof(ArgumentNullException)); cache.GetOrCreate(ThisAssembly, null, NewTexture); } public void NullCreate_Throws() { var cache = new PageTextureCache(); CheckThrow(typeof(ArgumentNullException)); cache.GetOrCreate(ThisAssembly, "Fonts.Page_0.png", null); } public void ACreateThatThrows_LeavesNothingCached() { var cache = new PageTextureCache(); try { cache.GetOrCreate(ThisAssembly, "Fonts.Page_0.png", () => throw new InvalidOperationException()); } catch (InvalidOperationException) { } CheckEqual(0, cache.Count); } } } }