/* * Copyright 2015 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.assets; import com.google.common.collect.ImmutableSet; import org.junit.Test; import org.terasology.assets.management.AssetManager; import org.terasology.assets.management.Context; import org.terasology.assets.management.ContextManager; import org.terasology.assets.management.MapAssetTypeManager; import org.terasology.assets.test.OptionalAnswer; import org.terasology.assets.test.Return; import org.terasology.assets.test.stubs.inheritance.AlternateAsset; import org.terasology.assets.test.stubs.inheritance.AlternateAssetData; import org.terasology.assets.test.stubs.inheritance.AlternateAssetFactory; import org.terasology.assets.test.stubs.inheritance.ChildAsset; import org.terasology.assets.test.stubs.inheritance.ChildAssetData; import org.terasology.assets.test.stubs.inheritance.ChildAssetFactory; import org.terasology.assets.test.stubs.inheritance.ParentAsset; import org.terasology.assets.test.stubs.text.Text; import org.terasology.assets.test.stubs.text.TextData; import org.terasology.assets.test.stubs.text.TextFactory; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author Immortius */ public class AssetManagerTest { private static final ResourceUrn ENGINE_TEST_URN = new ResourceUrn("engine", "test"); private static final ResourceUrn ENGINE_TEST2_URN = new ResourceUrn("engine", "test2"); private static final ResourceUrn MORE_TEST_URN = new ResourceUrn("more", "test"); private MapAssetTypeManager assetTypeManager = new MapAssetTypeManager(); private AssetManager assetManager = new AssetManager(assetTypeManager); private AssetType<Text, TextData> textAssetType = assetTypeManager.createAssetType(Text.class, new TextFactory()); private AssetType<ChildAsset, ChildAssetData> childAssetType = assetTypeManager.createAssetType(ChildAsset.class, new ChildAssetFactory()); private AssetType<AlternateAsset, AlternateAssetData> alternateAssetType = assetTypeManager.createAssetType(AlternateAsset.class, new AlternateAssetFactory()); @Test public void getAvailableAssets() { assertTrue(assetManager.getAvailableAssets(Text.class).isEmpty()); AssetDataProducer<TextData> producer = mock(AssetDataProducer.class); when(producer.getAvailableAssetUrns()).thenReturn(ImmutableSet.of(ENGINE_TEST_URN)); textAssetType.addProducer(producer); assertEquals(ImmutableSet.of(ENGINE_TEST_URN), assetManager.getAvailableAssets(Text.class)); } @Test public void getAvailableAssetsCombinesInheritedAssets() { AssetDataProducer<ChildAssetData> childProducer = mock(AssetDataProducer.class); when(childProducer.getAvailableAssetUrns()).thenReturn(ImmutableSet.of(ENGINE_TEST_URN)); childAssetType.addProducer(childProducer); AssetDataProducer<AlternateAssetData> alternateProducer = mock(AssetDataProducer.class); when(alternateProducer.getAvailableAssetUrns()).thenReturn(ImmutableSet.of(ENGINE_TEST2_URN)); alternateAssetType.addProducer(alternateProducer); assertEquals(ImmutableSet.of(ENGINE_TEST_URN, ENGINE_TEST2_URN), assetManager.getAvailableAssets(ParentAsset.class)); } @Test public void checkIfAssetIsLoaded() { textAssetType.loadAsset(ENGINE_TEST_URN, new TextData("moo")); assertFalse(assetManager.isLoaded(MORE_TEST_URN, Text.class)); assertFalse(assetManager.isLoaded(ENGINE_TEST_URN, AlternateAsset.class)); assertTrue(assetManager.isLoaded(ENGINE_TEST_URN, Text.class)); } @Test public void getLoadedAssetUrns() { textAssetType.loadAsset(ENGINE_TEST_URN, new TextData("moo")); assertEquals(ImmutableSet.of(ENGINE_TEST_URN), assetManager.getLoadedAssetUrns(Text.class)); } @Test public void getLoadedAssetUrnsCombinesInherited() { childAssetType.loadAsset(ENGINE_TEST_URN, new ChildAssetData()); alternateAssetType.loadAsset(ENGINE_TEST2_URN, new AlternateAssetData()); assertEquals(ImmutableSet.of(ENGINE_TEST_URN, ENGINE_TEST2_URN), assetManager.getLoadedAssetUrns(ParentAsset.class)); } @Test public void getLoadedAssets() { Text asset = textAssetType.loadAsset(ENGINE_TEST_URN, new TextData("moo")); assertEquals(ImmutableSet.of(asset), assetManager.getLoadedAssets(Text.class)); } @Test public void getLoadedAssetsCombinesInherited() { ChildAsset asset1 = childAssetType.loadAsset(ENGINE_TEST_URN, new ChildAssetData()); AlternateAsset asset2 = alternateAssetType.loadAsset(ENGINE_TEST2_URN, new AlternateAssetData()); Set<ParentAsset> expected = ImmutableSet.of(asset1, asset2); Set<ParentAsset> actual = assetManager.getLoadedAssets(ParentAsset.class); assertEquals(expected, actual); } @Test public void resolveWithoutContext() { AssetDataProducer<ChildAssetData> childProducer = mock(AssetDataProducer.class); when(childProducer.getModulesProviding(ENGINE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST_URN.getModuleName())); childAssetType.addProducer(childProducer); AssetDataProducer<AlternateAssetData> alternateProducer = mock(AssetDataProducer.class); when(alternateProducer.getModulesProviding(ENGINE_TEST2_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST2_URN.getModuleName())); alternateAssetType.addProducer(alternateProducer); assertEquals(ImmutableSet.of(ENGINE_TEST_URN), assetManager.resolve(ENGINE_TEST_URN.getResourceName().toString(), ParentAsset.class)); assertEquals(ImmutableSet.of(ENGINE_TEST2_URN), assetManager.resolve(ENGINE_TEST2_URN.getResourceName().toString(), ParentAsset.class)); } @Test public void resolveWithExplicitContext() { AssetDataProducer<ChildAssetData> childProducer = mock(AssetDataProducer.class); when(childProducer.getModulesProviding(ENGINE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST_URN.getModuleName())); childAssetType.addProducer(childProducer); AssetDataProducer<AlternateAssetData> alternateProducer = mock(AssetDataProducer.class); when(alternateProducer.getModulesProviding(ENGINE_TEST2_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST2_URN.getModuleName())); alternateAssetType.addProducer(alternateProducer); assertEquals(ImmutableSet.of(ENGINE_TEST_URN), assetManager.resolve(ENGINE_TEST_URN.getResourceName().toString(), ParentAsset.class, ENGINE_TEST_URN.getModuleName())); assertEquals(ImmutableSet.of(ENGINE_TEST2_URN), assetManager.resolve(ENGINE_TEST2_URN.getResourceName().toString(), ParentAsset.class, ENGINE_TEST2_URN.getModuleName())); } @Test public void resolveWithContextFromContextManager() { AssetDataProducer<ChildAssetData> childProducer = mock(AssetDataProducer.class); when(childProducer.getModulesProviding(ENGINE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST_URN.getModuleName())); childAssetType.addProducer(childProducer); AssetDataProducer<AlternateAssetData> alternateProducer = mock(AssetDataProducer.class); when(alternateProducer.getModulesProviding(ENGINE_TEST2_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST2_URN.getModuleName())); alternateAssetType.addProducer(alternateProducer); try (Context ignored = ContextManager.beginContext(ENGINE_TEST_URN.getModuleName())) { assertEquals(ImmutableSet.of(ENGINE_TEST_URN), assetManager.resolve(ENGINE_TEST_URN.getResourceName().toString(), ParentAsset.class)); assertEquals(ImmutableSet.of(ENGINE_TEST2_URN), assetManager.resolve(ENGINE_TEST2_URN.getResourceName().toString(), ParentAsset.class)); } } @Test public void resolveCombinesAcrossInherited() { AssetDataProducer<ChildAssetData> childProducer = mock(AssetDataProducer.class); when(childProducer.getModulesProviding(ENGINE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST_URN.getModuleName())); childAssetType.addProducer(childProducer); AssetDataProducer<AlternateAssetData> alternateProducer = mock(AssetDataProducer.class); when(alternateProducer.getModulesProviding(MORE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(MORE_TEST_URN.getModuleName())); alternateAssetType.addProducer(alternateProducer); assertEquals(ImmutableSet.of(ENGINE_TEST_URN, MORE_TEST_URN), assetManager.resolve(ENGINE_TEST_URN.getResourceName().toString(), ParentAsset.class)); } @Test public void getAsset() { Text text = textAssetType.loadAsset(ENGINE_TEST_URN, new TextData("moo")); assertEquals(text, assetManager.getAsset(ENGINE_TEST_URN, Text.class).get()); } @Test public void getAssetAcrossInherited() { ChildAsset child = childAssetType.loadAsset(ENGINE_TEST_URN, new ChildAssetData()); AlternateAsset alternate = alternateAssetType.loadAsset(ENGINE_TEST2_URN, new AlternateAssetData()); assertEquals(child, assetManager.getAsset(ENGINE_TEST_URN, ParentAsset.class).get()); assertEquals(alternate, assetManager.getAsset(ENGINE_TEST2_URN, ParentAsset.class).get()); } @Test public void getAssetAcrossInheritedFailsIfMultipleResolutionOptions() { AssetDataProducer<ChildAssetData> childProducer = mock(AssetDataProducer.class, new OptionalAnswer()); when(childProducer.redirect(any(ResourceUrn.class))).then(Return.firstArgument()); when(childProducer.getModulesProviding(ENGINE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(ENGINE_TEST_URN.getModuleName())); childAssetType.addProducer(childProducer); AssetDataProducer<AlternateAssetData> alternateProducer = mock(AssetDataProducer.class, new OptionalAnswer()); when(alternateProducer.redirect(any(ResourceUrn.class))).then(Return.firstArgument()); when(alternateProducer.getModulesProviding(MORE_TEST_URN.getResourceName())).thenReturn(ImmutableSet.of(MORE_TEST_URN.getModuleName())); alternateAssetType.addProducer(alternateProducer); childAssetType.loadAsset(ENGINE_TEST_URN, new ChildAssetData()); alternateAssetType.loadAsset(MORE_TEST_URN, new AlternateAssetData()); assertFalse(assetManager.getAsset(ENGINE_TEST_URN.getResourceName().toString(), ParentAsset.class).isPresent()); } }