/**
* Copyright (C) 2009-2013 FoundationDB, LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.foundationdb.server.types;
import com.foundationdb.server.types.service.ReflectiveInstanceFinder;
import com.foundationdb.server.types.value.ValueSource;
import com.foundationdb.util.AkibanAppender;
import org.joda.time.DateTimeZone;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collection;
import java.util.Locale;
import static com.foundationdb.server.types.value.ValueSources.valuefromObject;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public abstract class TypeFormattingTestBase
{
public static Object[] tCase(TClass tClass, Object o, String str, String json, String literal) {
return new Object[] { tClass, valuefromObject(o, tClass.instance(true)), str, json, literal };
}
public static Collection<Object[]> checkParams(TBundleID bundle, Collection<Object[]> params, TClass... ignore) throws Exception {
ReflectiveInstanceFinder finder = new ReflectiveInstanceFinder();
Collection<? extends TClass> allTypes = finder.find(TClass.class);
for(TClass tClass : allTypes) {
if(tClass.name().bundleId() == bundle) {
boolean found = false;
for(Object[] tc : params) {
if(tc[0] == tClass) {
found = true;
break;
}
}
if(!found && !Arrays.asList(ignore).contains(tClass)) {
fail("no case for " + tClass.name());
}
}
}
return params;
}
private final ValueSource valueSource;
private final String str;
private final String json;
private final String literal;
public TypeFormattingTestBase(TClass tClass, ValueSource valueSource, String str, String json, String literal) {
this.valueSource = valueSource;
this.str = str;
this.json = json;
this.literal = literal;
}
private void checkNull(TClass tClass) {
TInstance inst = tClass.instance(true);
ValueSource source = valuefromObject(null, inst);
check(source, "NULL", "null", "NULL");
}
private static void check(ValueSource source, String formatted, String formattedJSON, String formattedLiteral) {
FormatOptions FORMAT_OPTS = new FormatOptions();
FORMAT_OPTS.set(FormatOptions.BinaryFormatOption.HEX);
FORMAT_OPTS.set(FormatOptions.JsonBinaryFormatOption.HEX);
String typeName = source.getType().typeClass().name().toString();
StringBuilder sb = new StringBuilder();
AkibanAppender out = AkibanAppender.of(sb);
sb.setLength(0);
source.getType().format(source, out);
assertEquals(typeName + " str", formatted, sb.toString());
sb.setLength(0);
source.getType().formatAsJson(source, out, FORMAT_OPTS);
assertEquals(typeName + " json", formattedJSON, sb.toString());
sb.setLength(0);
source.getType().formatAsLiteral(source, out);
assertEquals(typeName + " literal", formattedLiteral, sb.toString());
}
@Test
public void test() {
DateTimeZone orig = DateTimeZone.getDefault();
DateTimeZone.setDefault(DateTimeZone.UTC);
try {
checkNull(valueSource.getType().typeClass());
check(valueSource, str, json, literal);
} finally {
DateTimeZone.setDefault(orig);
}
}
@Test
public void testFrenchCanadianLocale() {
Locale orig = Locale.getDefault();
Locale.setDefault(Locale.CANADA_FRENCH);
try {
test();
} finally {
Locale.setDefault(orig);
}
}
}