/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.everrest.core.impl.provider.json; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; import org.everrest.core.impl.provider.json.JsonUtils.Types; import org.everrest.core.impl.provider.json.tst.BeanWithTransientField; import org.everrest.core.impl.provider.json.tst.Book; import org.everrest.core.impl.provider.json.tst.BookEnum; import org.everrest.core.impl.provider.json.tst.IBook; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import static com.google.common.collect.Sets.newHashSet; import static java.util.stream.Collectors.toSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @RunWith(DataProviderRunner.class) public class JsonUtilsTest { @DataProvider public static Object[][] createJsonStringData() { return new Object[][]{ {"string", "\"string\""}, {"s\ntring\n", "\"s\\ntring\\n\""}, {"s\tring", "\"s\\tring\""}, {"st\ring", "\"st\\ring\""}, {"str\\ing", "\"str\\\\ing\""}, {"stri\"ng", "\"stri\\\"ng\""}, {"stri\bng", "\"stri\\bng\""}, {"stri\fng", "\"stri\\fng\""}, {"stri/ng", "\"stri/ng\""}, {"", "\"\""}, {null, "\"\""} }; } @UseDataProvider("createJsonStringData") @Test public void createsJsonString(String sourceString, String expectedJsonString) { assertEquals(expectedJsonString, JsonUtils.getJsonString(sourceString)); } @DataProvider public static Object[][] knownTypesByClassData() { return new Object[][]{ {Boolean.class, Types.BOOLEAN}, {Byte.class, Types.BYTE}, {Short.class, Types.SHORT}, {Integer.class, Types.INT}, {Long.class, Types.LONG}, {Float.class, Types.FLOAT}, {Double.class, Types.DOUBLE}, {Character.class, Types.CHAR}, {String.class, Types.STRING}, {Class.class, Types.CLASS}, {boolean.class, Types.BOOLEAN}, {byte.class, Types.BYTE}, {short.class, Types.SHORT}, {int.class, Types.INT}, {long.class, Types.LONG}, {float.class, Types.FLOAT}, {double.class, Types.DOUBLE}, {char.class, Types.CHAR}, {boolean[].class, Types.ARRAY_BOOLEAN}, {byte[].class, Types.ARRAY_BYTE}, {short[].class, Types.ARRAY_SHORT}, {int[].class, Types.ARRAY_INT}, {long[].class, Types.ARRAY_LONG}, {double[].class, Types.ARRAY_DOUBLE}, {float[].class, Types.ARRAY_FLOAT}, {char[].class, Types.ARRAY_CHAR}, {String[].class, Types.ARRAY_STRING}, {Enum.class, Types.ENUM}, {Object[].class, Types.ARRAY_OBJECT}, {List.class, Types.COLLECTION}, {Map.class, Types.MAP} }; } @UseDataProvider("knownTypesByClassData") @Test public void resolvesKnownTypesByClass(Class<?> aClass, Types expectedType) { assertEquals(expectedType, JsonUtils.getType(aClass)); } @DataProvider public static Object[][] knownTypesByInstanceData() { return new Object[][]{ {Boolean.TRUE, Types.BOOLEAN}, {Byte.valueOf("7"), Types.BYTE}, {Short.valueOf("7"), Types.SHORT}, {Integer.valueOf("7"), Types.INT}, {Long.valueOf("7"), Types.LONG}, {Float.valueOf("7.7"), Types.FLOAT}, {Double.valueOf("7.7"), Types.DOUBLE}, {Character.valueOf('a'), Types.CHAR}, {"string", Types.STRING}, {true, Types.BOOLEAN}, {(byte)7, Types.BYTE}, {(short)7, Types.SHORT}, {7, Types.INT}, {7L, Types.LONG}, {7.7F, Types.FLOAT}, {7.7, Types.DOUBLE}, {'a', Types.CHAR}, {new boolean[0], Types.ARRAY_BOOLEAN}, {new byte[0], Types.ARRAY_BYTE}, {new short[0], Types.ARRAY_SHORT}, {new int[0], Types.ARRAY_INT}, {new long[0], Types.ARRAY_LONG}, {new double[0], Types.ARRAY_DOUBLE}, {new float[0], Types.ARRAY_FLOAT}, {new char[0], Types.ARRAY_CHAR}, {new String[0], Types.ARRAY_STRING}, {BookEnum.BEGINNING_C, Types.ENUM}, {new Object[0], Types.ARRAY_OBJECT}, {new ArrayList<>(), Types.COLLECTION}, {new HashMap<>(), Types.MAP}, {null, Types.NULL} }; } @UseDataProvider("knownTypesByInstanceData") @Test public void resolvesKnownTypesByInstance(Object instance, Types expectedType) { assertEquals(expectedType, JsonUtils.getType(instance)); } @Test public void getsListOfTransientFieldsFromClass() { Set<String> transientFields = JsonUtils.getTransientFields(BeanWithTransientField.class); transientFields = filterFieldsInsertedByJacocoFrameworkDuringInstrumentation(transientFields); assertEquals(newHashSet("transientField", "jsonTransientField"), transientFields); } @Test public void getsListOfTransientFieldsFromSuperClass() { Set<String> transientFields = JsonUtils.getTransientFields(ExtensionOfBeanWithTransientField.class); transientFields = filterFieldsInsertedByJacocoFrameworkDuringInstrumentation(transientFields); assertEquals(newHashSet("transientField", "jsonTransientField"), transientFields); } public static class ExtensionOfBeanWithTransientField extends BeanWithTransientField {} @Test public void createsProxyObjectForInterface() { IBook book = JsonUtils.createProxy(IBook.class); assertNotNull(book); assertEquals(null, book.getAuthor()); assertEquals(null, book.getTitle()); assertEquals(0, book.getPages()); assertEquals(0.0, book.getPrice(), 0.01); assertEquals(0L, book.getIsdn()); assertEquals(false, book.getAvailability()); assertEquals(false, book.getDelivery()); book.setAuthor("Vincent Massol"); book.setTitle("JUnit in Action"); book.setPages(386); book.setPrice(19.37); book.setIsdn(93011099534534L); book.setAvailability(true); book.setDelivery(false); assertEquals("Vincent Massol", book.getAuthor()); assertEquals("JUnit in Action", book.getTitle()); assertEquals(386, book.getPages()); assertEquals(19.37, book.getPrice(), 0.01); assertEquals(93011099534534L, book.getIsdn()); assertEquals(true, book.getAvailability()); assertEquals(false, book.getDelivery()); assertNotNull(book.toString()); } @Test(expected = IllegalArgumentException.class) public void failsCreateProxyObjectForNull() { JsonUtils.createProxy(null); } @Test(expected = IllegalArgumentException.class) public void failsCreateProxyObjectForNonInterface() { JsonUtils.createProxy(Book.class); } private Set<String> filterFieldsInsertedByJacocoFrameworkDuringInstrumentation(Set<String> initialSet) { return initialSet.stream().filter(field -> !field.startsWith("$jacocoData")).collect(toSet()); } }