/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.neo.loader.core.saver.impl.internal;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.amanzi.neo.loader.core.IMappedStringData;
import org.amanzi.neo.loader.core.impl.MappedStringData;
import org.amanzi.neo.loader.core.internal.IConfiguration;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.BooleanProperty;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.DoubleProperty;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.IntegerProperty;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.LongProperty;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.Property;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.StringProperty;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.TimestampProperty;
import org.amanzi.neo.loader.core.saver.impl.internal.AbstractSynonymsSaver.UndefinedProperty;
import org.amanzi.neo.loader.core.synonyms.Synonyms;
import org.amanzi.neo.loader.core.synonyms.Synonyms.SynonymType;
import org.amanzi.neo.loader.core.synonyms.SynonymsManager;
import org.amanzi.neo.models.exceptions.ModelException;
import org.amanzi.neo.nodetypes.INodeType;
import org.amanzi.neo.nodetypes.NodeTypeUtils;
import org.amanzi.neo.providers.IProjectModelProvider;
import org.amanzi.testing.AbstractMockitoTest;
import org.junit.Before;
import org.junit.Test;
/**
* TODO Purpose of
* <p>
* </p>
*
* @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com)
* @since 1.0.0
*/
public class AbstractSynonymsSaverTest extends AbstractMockitoTest {
private static final String SYNONYMS_TYPE = "synonyms_type";
private static final String HEADER_NAME = "header";
private static final String PROPERTY_NAME = "property";
private static final DateFormat DATE_TIME_PATTERN = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
private long currentTimestamp;
private enum TestNodeType implements INodeType {
TEST_TYPE_FOR_SAVER;
@Override
public String getId() {
return NodeTypeUtils.getTypeId(this);
}
}
public class TestAbstractSynonymsSaver extends AbstractSynonymsSaver<IConfiguration> {
/**
* @param projectModelProvider
* @param synonymsManager
*/
protected TestAbstractSynonymsSaver(final IProjectModelProvider projectModelProvider, final SynonymsManager synonymsManager) {
super(projectModelProvider, synonymsManager);
}
@Override
public void save(final IMappedStringData dataElement) {
}
@Override
protected String getSynonymsType() {
return SYNONYMS_TYPE;
}
@Override
protected void saveInModel(final IMappedStringData data) throws ModelException {
}
@Override
public void onFileParsingStarted(final File file) {
// TODO Auto-generated method stub
}
}
private SynonymsManager synonymsManager;
private AbstractSynonymsSaver<IConfiguration> saver;
private IProjectModelProvider projectModelProvider;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
synonymsManager = mock(SynonymsManager.class);
projectModelProvider = mock(IProjectModelProvider.class);
saver = spy(new TestAbstractSynonymsSaver(projectModelProvider, synonymsManager));
currentTimestamp = System.currentTimeMillis();
}
@Test
public void testCheckActivityOnGetElement() {
doReturn(AbstractSynonymsSaver.SKIPPED_PROPERTY).when(saver).createProperty(eq(TestNodeType.TEST_TYPE_FOR_SAVER),
any(String.class), eq(false));
saver.getElementProperties(TestNodeType.TEST_TYPE_FOR_SAVER, getData(5), false);
verify(saver, times(5)).createProperty(eq(TestNodeType.TEST_TYPE_FOR_SAVER), any(String.class), eq(false));
}
@Test
public void testCheckPropertyCachingOnGetElement() {
doReturn(AbstractSynonymsSaver.SKIPPED_PROPERTY).when(saver).createProperty(eq(TestNodeType.TEST_TYPE_FOR_SAVER),
any(String.class), eq(false));
saver.getElementProperties(TestNodeType.TEST_TYPE_FOR_SAVER, getData(5), false);
saver.getElementProperties(TestNodeType.TEST_TYPE_FOR_SAVER, getData(5), false);
verify(saver, times(5)).createProperty(eq(TestNodeType.TEST_TYPE_FOR_SAVER), any(String.class), eq(false));
}
@Test
public void testCheckCachingOnCreateProperty() {
when(synonymsManager.getSynonyms(SYNONYMS_TYPE, TestNodeType.TEST_TYPE_FOR_SAVER)).thenReturn(new ArrayList<Synonyms>());
saver.createProperty(TestNodeType.TEST_TYPE_FOR_SAVER, HEADER_NAME, false);
saver.createProperty(TestNodeType.TEST_TYPE_FOR_SAVER, HEADER_NAME, false);
verify(synonymsManager, times(1)).getSynonyms(SYNONYMS_TYPE, TestNodeType.TEST_TYPE_FOR_SAVER);
}
@Test
public void testCheckSkippedProperty() {
when(synonymsManager.getSynonyms(SYNONYMS_TYPE, TestNodeType.TEST_TYPE_FOR_SAVER)).thenReturn(new ArrayList<Synonyms>());
Property< ? > result = saver.createProperty(TestNodeType.TEST_TYPE_FOR_SAVER, HEADER_NAME, false);
assertEquals("unexpected property", AbstractSynonymsSaver.SKIPPED_PROPERTY, result);
}
@Test
public void testCheckUndefinedProperty() {
when(synonymsManager.getSynonyms(SYNONYMS_TYPE, TestNodeType.TEST_TYPE_FOR_SAVER)).thenReturn(new ArrayList<Synonyms>());
Property< ? > result = saver.createProperty(TestNodeType.TEST_TYPE_FOR_SAVER, HEADER_NAME, true);
assertEquals("unexpected property", UndefinedProperty.class, result.getClass());
assertEquals("unexpected property name", HEADER_NAME, result.getPropertyName());
}
@Test
public void testCheckClassDefinedProperty() {
List<Synonyms> synonymsList = createSynonyms(true);
when(synonymsManager.getSynonyms(SYNONYMS_TYPE, TestNodeType.TEST_TYPE_FOR_SAVER)).thenReturn(synonymsList);
for (SynonymType type : SynonymType.values()) {
String header = type.getSynonymClass() == null ? type.toString() : type.getSynonymClass().getSimpleName();
Property< ? > result = saver.createProperty(TestNodeType.TEST_TYPE_FOR_SAVER, header, false);
assertEquals("unexpected property", getPropertyClass(type), result.getClass());
assertEquals("unexpected property name", type == SynonymType.UNKOWN ? header.toLowerCase() : PROPERTY_NAME,
result.getPropertyName());
}
}
@Test
public void testCheckFullParsing() {
List<Synonyms> synonymsList = createSynonyms(false);
when(synonymsManager.getSynonyms(SYNONYMS_TYPE, TestNodeType.TEST_TYPE_FOR_SAVER)).thenReturn(synonymsList);
IMappedStringData data = getData();
Map<String, Object> result = saver.getElementProperties(TestNodeType.TEST_TYPE_FOR_SAVER, data, false);
assertEquals("unexpected size of result", data.size(), result.size());
for (Synonyms synonym : synonymsList) {
if (synonym.getSynonymType() != SynonymType.UNKOWN) {
assertTrue("property should exists", result.containsKey(synonym.getPropertyName()));
Object actualValue = result.get(synonym.getPropertyName());
Object value = getValueForType(synonym.getSynonymType());
assertEquals("unexpected value", value, actualValue);
}
}
}
@Test
public void testCheckAutoparsing() {
IMappedStringData data = getData();
for (SynonymType type : SynonymType.values()) {
if (type != SynonymType.UNKOWN) {
Property< ? > undefinedProperty = new UndefinedProperty(type.getSynonymClass().getSimpleName());
Object value = getValueForType(type);
assertEquals("unexpected parsed value", value, undefinedProperty.parse(data));
}
}
}
private Object getValueForType(final SynonymType type) {
Object value = null;
switch (type) {
case BOOLEAN:
value = Boolean.FALSE;
break;
case DOUBLE:
value = Double.MIN_VALUE;
break;
case INTEGER:
value = Integer.MAX_VALUE;
break;
case LONG:
value = Long.MAX_VALUE;
break;
case STRING:
value = String.class.getSimpleName();
break;
case TIMESTAMP:
value = currentTimestamp;
break;
default:
value = null;
break;
}
return value;
}
private IMappedStringData getData() {
IMappedStringData result = new MappedStringData();
for (SynonymType type : SynonymType.values()) {
String value = null;
switch (type) {
case BOOLEAN:
value = Boolean.FALSE.toString();
break;
case DOUBLE:
value = Double.toString(Double.MIN_VALUE);
break;
case INTEGER:
value = Integer.toString(Integer.MAX_VALUE);
break;
case LONG:
value = Long.toString(Long.MAX_VALUE);
break;
case STRING:
value = String.class.getSimpleName();
break;
case TIMESTAMP:
value = DATE_TIME_PATTERN.format(new Date(currentTimestamp));
break;
default:
value = null;
break;
}
if (value != null) {
result.put(type.getSynonymClass().getSimpleName(), value);
}
}
return result;
}
private Class< ? extends Property< ? >> getPropertyClass(final SynonymType type) {
switch (type) {
case BOOLEAN:
return BooleanProperty.class;
case DOUBLE:
return DoubleProperty.class;
case INTEGER:
return IntegerProperty.class;
case LONG:
return LongProperty.class;
case STRING:
return StringProperty.class;
case TIMESTAMP:
return TimestampProperty.class;
default:
return UndefinedProperty.class;
}
}
private List<Synonyms> createSynonyms(final boolean useDefault) {
List<Synonyms> result = new ArrayList<Synonyms>();
for (SynonymType type : SynonymType.values()) {
result.add(new Synonyms(useDefault ? PROPERTY_NAME : type.toString().toLowerCase(Locale.getDefault()), type,
Boolean.FALSE, getPossibleHeaders(type)));
}
return result;
}
private String[] getPossibleHeaders(final SynonymType type) {
return new String[] {type.getSynonymClass() == null ? type.toString() : type.getSynonymClass().getSimpleName()};
}
private IMappedStringData getData(final int count) {
MappedStringData result = new MappedStringData();
for (int i = 0; i < count; i++) {
result.put("property" + i, "value" + i);
}
return result;
}
}