/*
* Copyright 2014, Stratio.
*
* 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 com.stratio.deep.cassandra.entity;
import static com.stratio.deep.cassandra.entity.CellValidator.Kind;
import static com.stratio.deep.cassandra.entity.CellValidator.cellValidator;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Properties;
import java.util.Stack;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.management.relation.RoleList;
import javax.management.relation.RoleUnresolvedList;
import javax.print.attribute.standard.PrinterStateReasons;
import org.apache.cassandra.db.marshal.BooleanType;
import org.apache.cassandra.db.marshal.BytesType;
import org.apache.cassandra.db.marshal.DecimalType;
import org.apache.cassandra.db.marshal.DoubleType;
import org.apache.cassandra.db.marshal.FloatType;
import org.apache.cassandra.db.marshal.InetAddressType;
import org.apache.cassandra.db.marshal.Int32Type;
import org.apache.cassandra.db.marshal.IntegerType;
import org.apache.cassandra.db.marshal.ListType;
import org.apache.cassandra.db.marshal.LongType;
import org.apache.cassandra.db.marshal.MapType;
import org.apache.cassandra.db.marshal.SetType;
import org.apache.cassandra.db.marshal.TimeUUIDType;
import org.apache.cassandra.db.marshal.TimestampType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.db.marshal.UUIDType;
import org.testng.annotations.Test;
import com.datastax.driver.core.DataType;
/**
* Created by luca on 25/03/14.
*/
//TODO checkit
@Test
public class CellValidatorTest {
public void testEmptyInstantiation() {
CellValidator cv0 = cellValidator("hello");
assertNotNull(cv0);
assertEquals(cv0.getValidatorClassName(), "org.apache.cassandra.db.marshal.UTF8Type");
assertNull(cv0.getValidatorTypes());
assertEquals(cv0.validatorKind(), Kind.NOT_A_COLLECTION);
assertNotNull(cv0.getAbstractType());
assertEquals(cv0.getAbstractType(), UTF8Type.instance);
}
public void testDataTypeNoCollectionInstantiation() {
DataType type = DataType.inet();
CellValidator cv = cellValidator(type);
assertNotNull(cv);
assertEquals(cv.getValidatorClassName(), InetAddressType.class.getCanonicalName());
assertNull(cv.getValidatorTypes());
assertEquals(cv.validatorKind(), Kind.NOT_A_COLLECTION);
assertEquals(DataType.Name.INET, cv.getCqlTypeName());
assertNotNull(cv.getAbstractType());
assertEquals(cv.getAbstractType(), InetAddressType.instance);
}
public void testDataTypeSetInstantiation() {
DataType type = DataType.set(DataType.text());
CellValidator cv = cellValidator(type);
assertNotNull(cv);
assertEquals(cv.getValidatorClassName(), SetType.class.getName());
assertNotNull(cv.getValidatorTypes());
assertEquals(cv.validatorKind(), Kind.SET);
assertEquals(cv.getValidatorTypes().size(), 1);
assertEquals(cv.getValidatorTypes().iterator().next(), "text");
assertEquals(DataType.Name.SET, cv.getCqlTypeName());
try {
Collection<String> types = cv.getValidatorTypes();
types.add("test");
fail("Validator types collection must be inmutable");
} catch (Exception ex) {
// ok
}
// assertNotNull(cv.getAbstractType());
// assertEquals(cv.getAbstractType(), SetType.getInstance(UTF8Type.instance));
}
public void testDataTypeListInstantiation() {
try {
assertNull(cellValidator((DataType) null));
fail();
} catch (Exception e) {
//ok
}
DataType type = DataType.list(DataType.timeuuid());
CellValidator cv = cellValidator(type);
assertNotNull(cv);
assertEquals(cv.getValidatorClassName(), ListType.class.getName());
assertNotNull(cv.getValidatorTypes());
assertEquals(cv.validatorKind(), Kind.LIST);
assertEquals(cv.getValidatorTypes().size(), 1);
assertEquals(cv.getValidatorTypes().iterator().next(), "timeuuid");
assertEquals(DataType.Name.LIST, cv.getCqlTypeName());
try {
Collection<String> types = cv.getValidatorTypes();
types.add("test");
fail("Validator types collection must be inmutable");
} catch (Exception ex) {
// ok
}
// assertNotNull(cv.getAbstractType());
// assertEquals(cv.getAbstractType(), ListType.getInstance(TimeUUIDType.instance));
}
public void testBlobDataType() {
CellValidator cv = cellValidator(DataType.blob());
assertNotNull(cv);
assertEquals(cv.getValidatorClassName(), BytesType.class.getName());
assertNull(cv.getValidatorTypes());
assertNotNull(cv.getAbstractType());
assertEquals(cv.getAbstractType(), BytesType.instance);
}
public void testDataTypeMapInstantiation() {
DataType type = DataType.map(DataType.text(), DataType.bigint());
CellValidator cv = cellValidator(type);
assertNotNull(cv);
assertEquals(cv.getValidatorClassName(), MapType.class.getName());
assertNotNull(cv.getValidatorTypes());
assertEquals(cv.validatorKind(), Kind.MAP);
assertEquals(cv.getValidatorTypes().size(), 2);
Iterator<String> types = cv.getValidatorTypes().iterator();
assertEquals(types.next(), "text");
assertEquals(types.next(), "bigint");
assertEquals(DataType.Name.MAP, cv.getCqlTypeName());
try {
Collection<String> ctypes = cv.getValidatorTypes();
ctypes.add("test");
fail("Validator types collection must be inmutable");
} catch (Exception ex) {
// ok
}
// assertNotNull(cv.getAbstractType());
// assertEquals(cv.getAbstractType(), MapType.getInstance(UTF8Type.instance, LongType.instance));
}
public void testEquality() {
DataType type = DataType.map(DataType.text(), DataType.bigint());
CellValidator cv = cellValidator(type);
assertFalse(cv.equals(null));
assertTrue(cv.equals(cv));
assertFalse(cv.equals(cellValidator(DataType.timeuuid())));
assertFalse(cv.equals(cellValidator(DataType.map(DataType.timestamp(), DataType.uuid()))));
assertTrue(cv.equals(cellValidator(DataType.map(DataType.text(), DataType.bigint()))));
assertEquals(DataType.Name.MAP, cv.getCqlTypeName());
}
//TODO check it
public void testCellValidatorMethod() throws NoSuchFieldException {
//
// assertNull(cellValidator((Object) null));
//
// UUID uuid = UUID.fromString("AE47FBFD-A086-47C2-8C73-77D8A8E99F35");
// CellValidator cv = cellValidator(uuid);
// assertEquals(cv.getAbstractType(), UUIDType.instance);
// assertNull(cv.getValidatorTypes());
// assertEquals(cv.validatorKind(), Kind.NOT_A_COLLECTION);
//
// UUID testTimeUUID = UUID.fromString("A5C78940-9260-11E3-BAA8-0800200C9A66");
// cv = cellValidator(testTimeUUID);
// assertEquals(cv.getAbstractType(), TimeUUIDType.instance);
// assertNull(cv.getValidatorTypes());
// assertEquals(cv.validatorKind(), Kind.NOT_A_COLLECTION);
//
// BigInteger testBigInt = new BigInteger("9032809489230884980323498324376012647321674142290");
// cv = cellValidator(testBigInt);
//
// assertEquals(cv.getAbstractType(), IntegerType.instance);
// assertNull(cv.getValidatorTypes());
// assertEquals(cv.validatorKind(), Kind.NOT_A_COLLECTION);
//
// Field emails = CommonsTestEntity.class.getDeclaredField("emails");
//
// cv = cellValidator(emails);
// assertNotNull(cv);
// assertEquals(cv.getValidatorClassName(), SetType.class.getCanonicalName());
// assertEquals(cv.validatorKind(), CellValidator.Kind.SET);
// assertNotNull(cv.getValidatorTypes());
// assertEquals(cv.getValidatorTypes().size(), 1);
//
// Iterator<String> iter = cv.getValidatorTypes().iterator();
// assertEquals(iter.next(), "text");
//
// Field phones = CommonsTestEntity.class.getDeclaredField("phones");
//
// cv = cellValidator(phones);
// assertNotNull(cv);
// assertEquals(cv.getValidatorClassName(), ListType.class.getCanonicalName());
// assertEquals(cv.validatorKind(), Kind.LIST);
// assertNotNull(cv.getValidatorTypes());
// assertEquals(cv.getValidatorTypes().size(), 1);
//
// iter = cv.getValidatorTypes().iterator();
// assertEquals(iter.next(), "text");
//
// Field uuid2id = CommonsTestEntity.class.getDeclaredField("uuid2id");
//
// cv = cellValidator(uuid2id);
// assertNotNull(cv);
// assertEquals(cv.getValidatorClassName(), MapType.class.getCanonicalName());
// assertEquals(cv.validatorKind(), Kind.MAP);
// assertNotNull(cv.getValidatorTypes());
// assertEquals(cv.getValidatorTypes().size(), 2);
//
// iter = cv.getValidatorTypes().iterator();
// assertEquals(iter.next(), "uuid");
// assertEquals(iter.next(), "int");
}
public void testValidatorClassToKind() {
assertEquals(Kind.validatorClassToKind(null), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(TimeUUIDType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(UTF8Type.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(Int32Type.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(BooleanType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(TimestampType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(DecimalType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(LongType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(DoubleType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(FloatType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(InetAddressType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(IntegerType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(UUIDType.class), Kind.NOT_A_COLLECTION);
assertEquals(Kind.validatorClassToKind(SetType.class), Kind.SET);
assertEquals(Kind.validatorClassToKind(ListType.class), Kind.LIST);
assertEquals(Kind.validatorClassToKind(MapType.class), Kind.MAP);
}
public void testObjectToKind() {
assertEquals(Kind.objectToKind(null), Kind.NOT_A_COLLECTION);
/* let's try with some set implementation */
assertEquals(Kind.objectToKind(new HashSet()), Kind.SET);
assertEquals(Kind.objectToKind(new CopyOnWriteArraySet()), Kind.SET);
assertEquals(Kind.objectToKind(new ConcurrentSkipListSet()), Kind.SET);
assertEquals(Kind.objectToKind(new LinkedHashSet()), Kind.SET);
assertEquals(Kind.objectToKind(new TreeSet()), Kind.SET);
/* let's try with some list implementation */
assertEquals(Kind.objectToKind(new ArrayList()), Kind.LIST);
assertEquals(Kind.objectToKind(new CopyOnWriteArrayList<>()), Kind.LIST);
assertEquals(Kind.objectToKind(new LinkedList<>()), Kind.LIST);
assertEquals(Kind.objectToKind(new RoleList()), Kind.LIST);
assertEquals(Kind.objectToKind(new RoleUnresolvedList()), Kind.LIST);
assertEquals(Kind.objectToKind(new Stack()), Kind.LIST);
assertEquals(Kind.objectToKind(new Vector<>()), Kind.LIST);
/* let's try with some map implementation */
assertEquals(Kind.objectToKind(new HashMap()), Kind.MAP);
assertEquals(Kind.objectToKind(new ConcurrentHashMap<>()), Kind.MAP);
assertEquals(Kind.objectToKind(new ConcurrentSkipListMap<>()), Kind.MAP);
assertEquals(Kind.objectToKind(new Hashtable<>()), Kind.MAP);
assertEquals(Kind.objectToKind(new IdentityHashMap<>()), Kind.MAP);
assertEquals(Kind.objectToKind(new LinkedHashMap<>()), Kind.MAP);
assertEquals(Kind.objectToKind(new PrinterStateReasons()), Kind.MAP);
assertEquals(Kind.objectToKind(new Properties()), Kind.MAP);
assertEquals(Kind.objectToKind(new TreeMap<>()), Kind.MAP);
assertEquals(Kind.objectToKind(new WeakHashMap<>()), Kind.MAP);
}
}