/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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.datastax.driver.core;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Iterator;
import static com.datastax.driver.core.Assertions.assertThat;
import static org.testng.Assert.*;
public class DataTypeClassNameParserTest {
private ProtocolVersion protocolVersion = ProtocolVersion.NEWEST_SUPPORTED;
private CodecRegistry codecRegistry = new CodecRegistry();
@Test(groups = "unit")
public void parseOneTest() {
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.ByteType", protocolVersion, codecRegistry), DataType.tinyint());
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.ShortType", protocolVersion, codecRegistry), DataType.smallint());
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.SimpleDateType", protocolVersion, codecRegistry), DataType.date());
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.TimeType", protocolVersion, codecRegistry), DataType.time());
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.InetAddressType", protocolVersion, codecRegistry), DataType.inet());
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.ListType(org.apache.cassandra.db.marshal.UTF8Type)", protocolVersion, codecRegistry), DataType.list(DataType.text()));
assertEquals(DataTypeClassNameParser.parseOne("org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.UTF8Type)", protocolVersion, codecRegistry), DataType.text());
String s;
s = "org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type, org.apache.cassandra.db.marshal.Int32Type)";
assertEquals(DataTypeClassNameParser.parseOne(s, protocolVersion, codecRegistry), DataType.custom(s));
s = "org.apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.ListType(org.apache.cassandra.db.marshal.Int32Type))";
assertEquals(DataTypeClassNameParser.parseOne(s, protocolVersion, codecRegistry), DataType.list(DataType.cint()));
}
@Test(groups = "unit")
public void parseWithCompositeTest() {
String s = "org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.Int32Type, org.apache.cassandra.db.marshal.UTF8Type,";
s += "org.apache.cassandra.db.marshal.ColumnToCollectionType(6162:org.apache.cassandra.db.marshal.ListType(org.apache.cassandra.db.marshal.Int32Type)))";
DataTypeClassNameParser.ParseResult r1 = DataTypeClassNameParser.parseWithComposite(s, protocolVersion, codecRegistry);
assertTrue(r1.isComposite);
assertEquals(r1.types, Arrays.asList(DataType.cint(), DataType.text()));
assertEquals(r1.collections.size(), 1);
assertEquals(r1.collections.get("ab"), DataType.list(DataType.cint()));
DataTypeClassNameParser.ParseResult r2 = DataTypeClassNameParser.parseWithComposite("org.apache.cassandra.db.marshal.TimestampType", protocolVersion, codecRegistry);
assertFalse(r2.isComposite);
assertEquals(r2.types, Arrays.asList(DataType.timestamp()));
assertEquals(r2.collections.size(), 0);
}
@Test(groups = "unit")
public void parseUserTypes() {
String s = "org.apache.cassandra.db.marshal.UserType(foo,61646472657373,737472656574:org.apache.cassandra.db.marshal.UTF8Type,7a6970636f6465:org.apache.cassandra.db.marshal.Int32Type,70686f6e6573:org.apache.cassandra.db.marshal.SetType(org.apache.cassandra.db.marshal.UserType(foo,70686f6e65,6e616d65:org.apache.cassandra.db.marshal.UTF8Type,6e756d626572:org.apache.cassandra.db.marshal.UTF8Type)))";
UserType def = (UserType) DataTypeClassNameParser.parseOne(s, protocolVersion, codecRegistry);
assertEquals(def.getKeyspace(), "foo");
assertEquals(def.getTypeName(), "address");
Iterator<UserType.Field> iter = def.iterator();
UserType.Field field1 = iter.next();
assertEquals(field1.getName(), "street");
assertEquals(field1.getType(), DataType.text());
UserType.Field field2 = iter.next();
assertEquals(field2.getName(), "zipcode");
assertEquals(field2.getType(), DataType.cint());
UserType.Field field3 = iter.next();
assertEquals(field3.getName(), "phones");
DataType st = field3.getType();
assertEquals(st.getName(), DataType.Name.SET);
UserType subDef = (UserType) st.getTypeArguments().get(0);
assertEquals(subDef.getKeyspace(), "foo");
assertEquals(subDef.getTypeName(), "phone");
Iterator<UserType.Field> subIter = subDef.iterator();
UserType.Field subField1 = subIter.next();
assertEquals(subField1.getName(), "name");
assertEquals(subField1.getType(), DataType.text());
UserType.Field subField2 = subIter.next();
assertEquals(subField2.getName(), "number");
assertEquals(subField2.getType(), DataType.text());
}
@Test(groups = "unit")
public void parseTupleTest() {
String s = "org.apache.cassandra.db.marshal.TupleType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.FloatType)";
TupleType type = (TupleType) DataTypeClassNameParser.parseOne(s, protocolVersion, codecRegistry);
assertNotNull(type);
assertEquals(type.getComponentTypes().get(0), DataType.cint());
assertEquals(type.getComponentTypes().get(1), DataType.text());
assertEquals(type.getComponentTypes().get(2), DataType.cfloat());
}
@Test(groups = "unit")
public void parseNestedCollectionTest() {
// map<text, frozen<map<int,int>>>
String s = "org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.FrozenType(org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.Int32Type)))";
DataType parentMap = DataTypeClassNameParser.parseOne(s, protocolVersion, codecRegistry);
assertThat(parentMap)
.hasName(DataType.Name.MAP)
.isNotFrozen()
.hasTypeArgument(0, DataType.text());
DataType childMap = parentMap.getTypeArguments().get(1);
assertThat(childMap)
.hasName(DataType.Name.MAP)
.isFrozen()
.hasTypeArguments(DataType.cint(), DataType.cint());
}
}