/*
* Copyright 2013 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.registry;
import com.google.common.collect.Maps;
import org.junit.Before;
import org.junit.Test;
import org.terasology.context.Context;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
public class CoreRegistryTest {
private Context context;
/**
* Create a Context implementation instance an assign it to CoreRegistry before testing.
*/
@Before
public void setup() {
context = new ContextImplementation();
CoreRegistry.setContext(context);
}
/**
* Check if the context is changed with setContext method.
*/
@Test
public void testContextChange() {
CoreRegistry.setContext(new ContextImplementation());
assertNotEquals(CoreRegistry.get(Context.class), context);
}
/**
* Check if CoreRegistry returns null on its methods when the context is not defined.
*/
@Test
public void testNullReturnOnMissingContext() {
CoreRegistry.setContext(null);
assertEquals(CoreRegistry.put(Integer.class, 10), null);
assertEquals(CoreRegistry.get(Integer.class), null);
}
/**
* Test if the CoreRegistry context is being returned by the get method when the argument is Context.class
* independently of the Context implementation.
*/
@Test
public void testContextGetIndependenceFromContextInterfaceImplementation() {
assertEquals(CoreRegistry.get(Context.class), context);
assertEquals(context.get(Context.class), null);
}
/**
* Check if the CoreRegistry is calling the methods of its Context
*/
@Test
public void testContextMethodsCalled() {
// Load value in context
Integer value = 10;
CoreRegistry.put(Integer.class, value);
assertEquals(value, context.get(Integer.class));
assertEquals(context.get(Integer.class), CoreRegistry.get(Integer.class));
// Change context
CoreRegistry.setContext(new ContextImplementation());
assertNotEquals(CoreRegistry.get(Context.class), context);
assertEquals(CoreRegistry.get(Integer.class), null);
// Restore first context
CoreRegistry.setContext(context);
assertEquals(CoreRegistry.get(Integer.class), value);
}
private static class ContextImplementation implements Context {
private final Map<Class<?>, Object> map = Maps.newConcurrentMap();
@Override
public <T> T get(Class<? extends T> type) {
T result = type.cast(map.get(type));
if (result != null) {
return result;
}
return null;
}
@Override
public <T, U extends T> void put(Class<T> type, U object) {
map.put(type, object);
}
}
}