diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c5f3f6b9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/accessors-smart/pom.xml b/accessors-smart/pom.xml index 4a3a5c16..f525e36a 100644 --- a/accessors-smart/pom.xml +++ b/accessors-smart/pom.xml @@ -41,7 +41,7 @@ org.junit.jupiter junit-jupiter-api - 5.6.2 + 5.7.1 test diff --git a/accessors-smart/src/main/java/net/minidev/asm/ASMUtil.java b/accessors-smart/src/main/java/net/minidev/asm/ASMUtil.java index b5752d9c..2f4e37c5 100644 --- a/accessors-smart/src/main/java/net/minidev/asm/ASMUtil.java +++ b/accessors-smart/src/main/java/net/minidev/asm/ASMUtil.java @@ -34,6 +34,9 @@ public class ASMUtil { /** * Append the call of proper autoboxing method for the given primitive type. + * + * @param mv MethodVisitor + * @param clz expected class */ public static void autoBoxing(MethodVisitor mv, Class clz) { autoBoxing(mv, Type.getType(clz)); @@ -69,72 +72,78 @@ static public Accessor[] getAccessors(Class type, FieldFilter filter) { /** * Append the call of proper autoboxing method for the given primitive type. + * + * @param mv MethodVisitor + * @param fieldType expected class */ protected static void autoBoxing(MethodVisitor mv, Type fieldType) { switch (fieldType.getSort()) { case Type.BOOLEAN: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;", false); break; case Type.BYTE: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;", false); break; case Type.CHAR: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;", false); break; case Type.SHORT: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;", false); break; case Type.INT: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); break; case Type.FLOAT: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;", false); break; case Type.LONG: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false); break; case Type.DOUBLE: - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false); break; } } /** * Append the call of proper extract primitive type of an boxed object. + * + * @param mv MethodVisitor + * @param fieldType expected class */ protected static void autoUnBoxing1(MethodVisitor mv, Type fieldType) { switch (fieldType.getSort()) { case Type.BOOLEAN: mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false); break; case Type.BYTE: mv.visitTypeInsn(CHECKCAST, "java/lang/Byte"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B", false); break; case Type.CHAR: mv.visitTypeInsn(CHECKCAST, "java/lang/Character"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C", false); break; case Type.SHORT: mv.visitTypeInsn(CHECKCAST, "java/lang/Short"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S", false); break; case Type.INT: mv.visitTypeInsn(CHECKCAST, "java/lang/Integer"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false); break; case Type.FLOAT: mv.visitTypeInsn(CHECKCAST, "java/lang/Float"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F", false); break; case Type.LONG: mv.visitTypeInsn(CHECKCAST, "java/lang/Long"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false); break; case Type.DOUBLE: mv.visitTypeInsn(CHECKCAST, "java/lang/Double"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false); break; case Type.ARRAY: mv.visitTypeInsn(CHECKCAST, fieldType.getInternalName()); @@ -147,40 +156,43 @@ protected static void autoUnBoxing1(MethodVisitor mv, Type fieldType) { /** * Append the call of proper extract primitive type of an boxed object. this * method use Number interface to unbox object + * + * @param mv MethodVisitor + * @param fieldType expected class */ protected static void autoUnBoxing2(MethodVisitor mv, Type fieldType) { switch (fieldType.getSort()) { case Type.BOOLEAN: mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false); break; case Type.BYTE: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "byteValue", "()B"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "byteValue", "()B", false); break; case Type.CHAR: mv.visitTypeInsn(CHECKCAST, "java/lang/Character"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C", false); break; case Type.SHORT: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "shortValue", "()S"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "shortValue", "()S", false); break; case Type.INT: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "intValue", "()I"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "intValue", "()I", false); break; case Type.FLOAT: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "floatValue", "()F"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "floatValue", "()F", false); break; case Type.LONG: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "longValue", "()J"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "longValue", "()J", false); break; case Type.DOUBLE: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "doubleValue", "()D"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "doubleValue", "()D", false); break; case Type.ARRAY: mv.visitTypeInsn(CHECKCAST, fieldType.getInternalName()); @@ -193,8 +205,7 @@ protected static void autoUnBoxing2(MethodVisitor mv, Type fieldType) { /** * return a array of new Label (used for switch/case generation) * - * @param cnt - * number of label to return + * @param cnt number of label to return */ public static Label[] newLabels(int cnt) { Label[] r = new Label[cnt]; @@ -203,6 +214,10 @@ public static Label[] newLabels(int cnt) { return r; } + /** + * @param key the field name + * @return setter name + */ public static String getSetterName(String key) { int len = key.length(); char[] b = new char[len + 3]; @@ -219,6 +234,10 @@ public static String getSetterName(String key) { return new String(b); } + /** + * @param key the field name + * @return getter name + */ public static String getGetterName(String key) { int len = key.length(); char[] b = new char[len + 3]; @@ -235,6 +254,10 @@ public static String getGetterName(String key) { return new String(b); } + /** + * @param key the boolean field name + * @return boolean getter name + */ public static String getIsName(String key) { int len = key.length(); char[] b = new char[len + 2]; diff --git a/accessors-smart/src/main/java/net/minidev/asm/BeansAccess.java b/accessors-smart/src/main/java/net/minidev/asm/BeansAccess.java index 929639f3..8ffc02b8 100644 --- a/accessors-smart/src/main/java/net/minidev/asm/BeansAccess.java +++ b/accessors-smart/src/main/java/net/minidev/asm/BeansAccess.java @@ -73,6 +73,7 @@ static public

BeansAccess

get(Class

type) { * to be access * @return the BeansAccess */ + @SuppressWarnings("deprecation") static public

BeansAccess

get(Class

type, FieldFilter filter) { { @SuppressWarnings("unchecked") diff --git a/accessors-smart/src/main/java/net/minidev/asm/BeansAccessBuilder.java b/accessors-smart/src/main/java/net/minidev/asm/BeansAccessBuilder.java index a0ea6281..cf88b3db 100644 --- a/accessors-smart/src/main/java/net/minidev/asm/BeansAccessBuilder.java +++ b/accessors-smart/src/main/java/net/minidev/asm/BeansAccessBuilder.java @@ -117,7 +117,7 @@ public Class bulid() { mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESPECIAL, METHOD_ACCESS_NAME, "", "()V"); + mv.visitMethodInsn(INVOKESPECIAL, METHOD_ACCESS_NAME, "", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); @@ -192,7 +192,7 @@ public Class bulid() { mv.visitFieldInsn(GETFIELD, classNameInternal, acc.getName(), fieldType.getDescriptor()); } else { String sig = Type.getMethodDescriptor(acc.getter); - mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.getter.getName(), sig); + mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.getter.getName(), sig, false); } ASMUtil.autoBoxing(mv, fieldType); mv.visitInsn(ARETURN); @@ -213,7 +213,7 @@ public Class bulid() { if (acc.getter == null) throw new RuntimeException("no Getter for field " + acc.getName() + " in class " + this.className); String sig = Type.getMethodDescriptor(acc.getter); - mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.getter.getName(), sig); + mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.getter.getName(), sig, false); } ASMUtil.autoBoxing(mv, fieldType); mv.visitInsn(ARETURN); @@ -244,7 +244,7 @@ public Class bulid() { for (Accessor acc : accs) { mv.visitVarInsn(ALOAD, 2); mv.visitLdcInsn(acc.fieldName); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFEQ, labels[i]); internalSetFiled(mv, acc); mv.visitLabel(labels[i]); @@ -270,7 +270,7 @@ public Class bulid() { for (Accessor acc : accs) { mv.visitVarInsn(ALOAD, 2); // methodName mv.visitLdcInsn(acc.fieldName); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFEQ, labels[i]); mv.visitVarInsn(ALOAD, 1); // object mv.visitTypeInsn(CHECKCAST, classNameInternal); @@ -279,7 +279,7 @@ public Class bulid() { mv.visitFieldInsn(GETFIELD, classNameInternal, acc.getName(), fieldType.getDescriptor()); } else { String sig = Type.getMethodDescriptor(acc.getter); - mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.getter.getName(), sig); + mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.getter.getName(), sig, false); } ASMUtil.autoBoxing(mv, fieldType); mv.visitInsn(ARETURN); @@ -302,7 +302,7 @@ public Class bulid() { mv.visitCode(); mv.visitTypeInsn(NEW, classNameInternal); mv.visitInsn(DUP); - mv.visitMethodInsn(INVOKESPECIAL, classNameInternal, "", "()V"); + mv.visitMethodInsn(INVOKESPECIAL, classNameInternal, "", "()V", false); mv.visitInsn(ARETURN); mv.visitMaxs(2, 1); mv.visitEnd(); @@ -359,15 +359,15 @@ private void internalSetFiled(MethodVisitor mv, Accessor acc) { String clsSig = Type.getInternalName(conMtd.getDeclaringClass()); String mtdName = conMtd.getName(); String mtdSig = Type.getMethodDescriptor(conMtd); - mv.visitMethodInsn(INVOKESTATIC, clsSig, mtdName, mtdSig); + mv.visitMethodInsn(INVOKESTATIC, clsSig, mtdName, mtdSig, false); } else if (acc.isEnum()) { // builtIn Enum Conversion Label isNull = new Label(); mv.visitJumpInsn(IFNULL, isNull); mv.visitVarInsn(ALOAD, 3); // mv.visitTypeInsn(CHECKCAST, "java/lang/String"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;"); - mv.visitMethodInsn(INVOKESTATIC, destClsName, "valueOf", "(Ljava/lang/String;)L" + destClsName + ";"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;", false); + mv.visitMethodInsn(INVOKESTATIC, destClsName, "valueOf", "(Ljava/lang/String;)L" + destClsName + ";", false); mv.visitVarInsn(ASTORE, 3); mv.visitLabel(isNull); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); @@ -380,7 +380,7 @@ private void internalSetFiled(MethodVisitor mv, Accessor acc) { Label isNull = new Label(); mv.visitJumpInsn(IFNULL, isNull); mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;", false); mv.visitVarInsn(ASTORE, 3); mv.visitLabel(isNull); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); @@ -396,7 +396,7 @@ private void internalSetFiled(MethodVisitor mv, Accessor acc) { mv.visitFieldInsn(PUTFIELD, classNameInternal, acc.getName(), fieldType.getDescriptor()); } else { String sig = Type.getMethodDescriptor(acc.setter); - mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.setter.getName(), sig); + mv.visitMethodInsn(INVOKEVIRTUAL, classNameInternal, acc.setter.getName(), sig, false); } mv.visitInsn(RETURN); } @@ -410,9 +410,9 @@ private void throwExIntParam(MethodVisitor mv, Class exCls) { mv.visitInsn(DUP); mv.visitLdcInsn("mapping " + this.className + " failed to map field:"); mv.visitVarInsn(ILOAD, 2); - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "toString", "(I)Ljava/lang/String;"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;"); - mv.visitMethodInsn(INVOKESPECIAL, exSig, "", "(Ljava/lang/String;)V"); + mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "toString", "(I)Ljava/lang/String;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;", false); + mv.visitMethodInsn(INVOKESPECIAL, exSig, "", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); } @@ -425,8 +425,8 @@ private void throwExStrParam(MethodVisitor mv, Class exCls) { mv.visitInsn(DUP); mv.visitLdcInsn("mapping " + this.className + " failed to map field:"); mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;"); - mv.visitMethodInsn(INVOKESPECIAL, exSig, "", "(Ljava/lang/String;)V"); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "concat", "(Ljava/lang/String;)Ljava/lang/String;", false); + mv.visitMethodInsn(INVOKESPECIAL, exSig, "", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); } diff --git a/accessors-smart/src/main/java/net/minidev/asm/DynamicClassLoader.java b/accessors-smart/src/main/java/net/minidev/asm/DynamicClassLoader.java index bdefd99c..1699f690 100644 --- a/accessors-smart/src/main/java/net/minidev/asm/DynamicClassLoader.java +++ b/accessors-smart/src/main/java/net/minidev/asm/DynamicClassLoader.java @@ -50,6 +50,7 @@ public static Class directLoad(Class parent, String clsName, return clzz; } + @SuppressWarnings("deprecation") public static T directInstance(Class parent, String clsName, byte[] clsData) throws InstantiationException, IllegalAccessException { Class clzz = directLoad(parent, clsName, clsData); return clzz.newInstance(); diff --git a/accessors-smart/src/test/java/net/minidev/asm/ASMTest.java b/accessors-smart/src/test/java/net/minidev/asm/ASMTest.java index 4363b0bc..705081c8 100644 --- a/accessors-smart/src/test/java/net/minidev/asm/ASMTest.java +++ b/accessors-smart/src/test/java/net/minidev/asm/ASMTest.java @@ -6,14 +6,13 @@ import org.junit.jupiter.api.Test; -// import junit.framework.TestCase; import net.minidev.asm.bean.BTest; public class ASMTest { @Test public void testGet() throws Exception { - long T1; + // long T1; BeansAccess acBT = BeansAccess.get(BTest.class); // BeansAccess acHand = new BTestBeansAccessB(); @@ -28,7 +27,7 @@ public void testGet() throws Exception { // String clsPath = FastMap1Builder.getName(m.size()); // String clsName = clsPath.replace("/", "."); - byte[] data; + // byte[] data; // data = FastMap1Builder.dump(m.size()); // data = FastMap2Builder.dump(m); diff --git a/json-smart-action/pom.xml b/json-smart-action/pom.xml index 60f111af..799426a9 100644 --- a/json-smart-action/pom.xml +++ b/json-smart-action/pom.xml @@ -3,11 +3,11 @@ net.minidev minidev-parent - 2.3 + 2.4.1 4.0.0 json-smart-action - JSON Small and Fast Parser + JSON-smart-action Small and Fast Parser JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language. @@ -47,11 +47,16 @@ 1.8 - - junit - junit - test - + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-params + test + net.minidev json-smart diff --git a/json-smart-action/src/main/java/net/minidev/json/actions/PathLocator.java b/json-smart-action/src/main/java/net/minidev/json/actions/PathLocator.java index f62efb51..c0a93595 100644 --- a/json-smart-action/src/main/java/net/minidev/json/actions/PathLocator.java +++ b/json-smart-action/src/main/java/net/minidev/json/actions/PathLocator.java @@ -56,6 +56,7 @@ public PathLocator with(PathDelimiter pathDelimiter) { return this; } + @SuppressWarnings("unchecked") public List locate(JSONObject object) { JSONTraverseAction action = new LocatePathsJsonAction(this.pathsToFind, pathDelimiter); JSONTraverser traversal = new JSONTraverser(action).with(pathDelimiter); diff --git a/json-smart-action/src/main/java/net/minidev/json/actions/PathsRetainer.java b/json-smart-action/src/main/java/net/minidev/json/actions/PathsRetainer.java index e641ec2e..013baa81 100644 --- a/json-smart-action/src/main/java/net/minidev/json/actions/PathsRetainer.java +++ b/json-smart-action/src/main/java/net/minidev/json/actions/PathsRetainer.java @@ -62,6 +62,7 @@ public PathsRetainer with(PathDelimiter pathDelimiter) { return this; } + @SuppressWarnings("unchecked") public JSONObject retain(JSONObject object) { /** * a path to retain which contains a path in the object, but is not itself a path in the object, diff --git a/json-smart-action/src/main/java/net/minidev/json/actions/navigate/TreeNavigator.java b/json-smart-action/src/main/java/net/minidev/json/actions/navigate/TreeNavigator.java index 7811d812..4d60353c 100644 --- a/json-smart-action/src/main/java/net/minidev/json/actions/navigate/TreeNavigator.java +++ b/json-smart-action/src/main/java/net/minidev/json/actions/navigate/TreeNavigator.java @@ -30,10 +30,10 @@ */ public class TreeNavigator, L extends List> { protected List pathsToNavigate; - protected NavigateAction action; + protected NavigateAction action; protected String pathPrefix = ""; - public TreeNavigator(NavigateAction action, List pathsToNavigate) { + public TreeNavigator(NavigateAction action, List pathsToNavigate) { if (action == null) { throw new IllegalArgumentException("NavigateAction cannot be null"); } @@ -41,12 +41,12 @@ public TreeNavigator(NavigateAction action, List pathsToNavigate) { this.pathsToNavigate = pathsToNavigate; } - public TreeNavigator with(String pathPrefix) { + public TreeNavigator with(String pathPrefix) { this.pathPrefix = pathPrefix; return this; } - public TreeNavigator(NavigateAction action, String... pathsToNavigate) { + public TreeNavigator(NavigateAction action, String... pathsToNavigate) { this(action, Arrays.asList(pathsToNavigate)); } @@ -71,6 +71,7 @@ public void nav(M object) throws Exception { action.end(); } + @SuppressWarnings("unchecked") public void nav(TreePath jp, M map) { if (map == null || !action.recurInto(jp, map)) { //source is null - navigation impossible @@ -103,6 +104,7 @@ public void nav(TreePath jp, M map) { action.recurEnd(jp, (M) map); } + @SuppressWarnings("unchecked") public void nav(TreePath jp, L list) { if (list == null || !action.recurInto(jp, (L) list)) { //list is null - navigation impossible diff --git a/json-smart-action/src/main/java/net/minidev/json/actions/traverse/KeysPrintAction.java b/json-smart-action/src/main/java/net/minidev/json/actions/traverse/KeysPrintAction.java index ad0e10ea..e19c74de 100644 --- a/json-smart-action/src/main/java/net/minidev/json/actions/traverse/KeysPrintAction.java +++ b/json-smart-action/src/main/java/net/minidev/json/actions/traverse/KeysPrintAction.java @@ -17,7 +17,7 @@ public boolean start(JSONObject object) { @Override public boolean traverseEntry(String fullPathToEntry, Entry entry) { - System.out.println(entry.getKey()); + // System.out.println(entry.getKey()); return true; } diff --git a/json-smart-action/src/main/java/net/minidev/json/actions/traverse/TreeTraverser.java b/json-smart-action/src/main/java/net/minidev/json/actions/traverse/TreeTraverser.java index 77f9085f..f410d6f6 100644 --- a/json-smart-action/src/main/java/net/minidev/json/actions/traverse/TreeTraverser.java +++ b/json-smart-action/src/main/java/net/minidev/json/actions/traverse/TreeTraverser.java @@ -23,12 +23,12 @@ public class TreeTraverser, L extends List protected PathDelimiter delim; protected String pathPrefix = ""; - public TreeTraverser(TreeTraverseAction action, PathDelimiter delim) { + public TreeTraverser(TreeTraverseAction action, PathDelimiter delim) { this.action = action; this.delim = delim; } - public TreeTraverser with(String pathPrefix) { + public TreeTraverser with(String pathPrefix) { this.pathPrefix = pathPrefix; return this; } @@ -40,6 +40,7 @@ public void traverse(M map) { action.end(); } + @SuppressWarnings("unchecked") private void depthFirst(String fullPath, M map) { if (map == null || map.entrySet() == null || !action.recurInto(fullPath, map)) { return; @@ -66,6 +67,7 @@ private void depthFirst(String fullPath, M map) { } } + @SuppressWarnings("unchecked") private void depthFirst(String fullPath, L list) { if (!action.recurInto(fullPath, (L) list)) { return; diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/ElementRemoverTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/ElementRemoverTest.java index c71aeac4..1e9451fd 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/ElementRemoverTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/ElementRemoverTest.java @@ -4,29 +4,24 @@ import net.minidev.json.JSONValue; import net.minidev.json.actions.ElementRemover; import net.minidev.json.parser.ParseException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.*; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import static org.junit.Assert.assertEquals; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests {@link ElementRemover} * * @author adoneitan@gmail.com */ -@RunWith(Parameterized.class) +// @RunWith(Parameterized.class) public class ElementRemoverTest { - private String jsonToClean; - private String elementsToRemove; - private String expectedJson; - public ElementRemoverTest(String jsonToClean, String elementsToRemove, String expectedJson) { - this.jsonToClean = filter(jsonToClean); - this.elementsToRemove = filter(elementsToRemove); - this.expectedJson = filter(expectedJson); + public ElementRemoverTest() { } private static String filter(String test) { @@ -35,22 +30,25 @@ private static String filter(String test) { return test.replace("'", "\""); } - @Parameterized.Parameters - public static Collection params() { - List list = Arrays.asList(new String[][]{ - {"{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", null, "{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}"}, - {"{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{}", "{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}"}, - {"{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k0':'v2'}", "{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}"}, - {"{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k2':'v2'}", "{'k0':{},'k1':{'k3':'v3'}}"}, - {"{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k0':{'k2':'v2'}}", "{'k1':{'k2':'v2','k3':'v3'}}"}, - {"{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k2':'v2','k3':'v3'}", "{'k0':{},'k1':{}}"}, - {"{'k0':{}}", "{}", "{'k0':{}}"}, - }); - return list; - } - - @Test - public void test() throws ParseException { + public static Stream params() { + return Stream.of( + Arguments.of("{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", null, "{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}"), + Arguments.of("{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{}", "{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}"), + Arguments.of("{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k0':'v2'}", "{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}"), + Arguments.of("{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k2':'v2'}", "{'k0':{},'k1':{'k3':'v3'}}"), + Arguments.of("{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k0':{'k2':'v2'}}", "{'k1':{'k2':'v2','k3':'v3'}}"), + Arguments.of("{'k0':{'k2':'v2'},'k1':{'k2':'v2','k3':'v3'}}", "{'k2':'v2','k3':'v3'}", "{'k0':{},'k1':{}}"), + Arguments.of("{'k0':{}}", "{}", "{'k0':{}}") + ); + }; + + @ParameterizedTest + @MethodSource("params") + public void test(String jsonToClean, String elementsToRemove, String expectedJson) throws ParseException { + jsonToClean = filter(jsonToClean); + elementsToRemove = filter(elementsToRemove); + expectedJson = filter(expectedJson); + JSONObject objectToClean = jsonToClean != null ? (JSONObject) JSONValue.parseWithException(jsonToClean) : null; JSONObject expectedObject = expectedJson != null ? (JSONObject) JSONValue.parseWithException(expectedJson) : null; JSONObject toRemove = elementsToRemove != null ? (JSONObject) JSONValue.parseWithException(elementsToRemove) : null; @@ -58,50 +56,4 @@ public void test() throws ParseException { er.remove(objectToClean); assertEquals(expectedObject, objectToClean); } - - // private ElementRemover switchKeyToRemove() - // { - // long m = System.currentTimeMillis(); - // if (elementsToRemove == null && m % 4 == 0) - // { - // System.out.println("cast to String"); - // return new ElementRemover((String)null); - // } - // else if (elementsToRemove == null && m % 4 == 1) - // { - // System.out.println("cast to String[]"); - // return new ElementRemover((String[])null); - // } - // else if (elementsToRemove == null && m % 4 == 2) - // { - // System.out.println("cast to JSONArray"); - // return new ElementRemover((JSONArray)null); - // } - // else if (elementsToRemove == null && m % 4 == 3) - // { - // System.out.println("cast to List"); - // return new ElementRemover((List)null); - // } - // else if (elementsToRemove instanceof String) - // { - // return new ElementRemover((String) elementsToRemove); - // } - // else if (elementsToRemove instanceof String[]) - // { - // return new ElementRemover((String[]) elementsToRemove); - // } - // else if (elementsToRemove instanceof JSONArray) - // { - // return new ElementRemover((JSONArray) elementsToRemove); - // } - // else if (elementsToRemove instanceof List) - // { - // return new ElementRemover((List) elementsToRemove); - // } - // else - // { - // throw new IllegalArgumentException("bad test setup: wrong type of key to remove"); - // } - // } - } diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/KeysPrintActionTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/KeysPrintActionTest.java index 20f5512b..b04b4d22 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/KeysPrintActionTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/KeysPrintActionTest.java @@ -1,11 +1,12 @@ package net.minidev.json.test.actions; +import org.junit.jupiter.api.Test; + import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; import net.minidev.json.actions.traverse.JSONTraverser; import net.minidev.json.actions.traverse.KeysPrintAction; import net.minidev.json.parser.ParseException; -import org.junit.Test; /** * @author adoneitan@gmail.com diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathLocatorTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathLocatorTest.java index ba904c34..99a02f5a 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathLocatorTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathLocatorTest.java @@ -5,126 +5,109 @@ import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; import net.minidev.json.parser.ParseException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; + +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; +import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * @author adoneitan@gmail.com */ -@RunWith(Parameterized.class) -public class PathLocatorTest -{ - private String jsonToSearch; - private Object keysToFind; - private String[] expectedFound; - - public PathLocatorTest(String jsonToSearch, Object keysToFind, String[] expectedFound) - { - this.jsonToSearch = jsonToSearch; - this.keysToFind = keysToFind; - this.expectedFound = expectedFound; - } - - @Parameterized.Parameters - public static Collection params() { - return Arrays.asList(new Object[][]{ +// @ExtendWith(Parameterized.class) +public class PathLocatorTest { + public static Stream params() { + return Stream.of( //nulls, bad/empty keys - {null, null, new String[]{} }, - {null, "", new String[]{} }, - {null, "k1", new String[]{} }, - {null, new String[]{}, new String[]{} }, - {null, new JSONArray(), new String[]{} }, - {null, new ArrayList(0), new String[]{} },//5 - + Arguments.of(null, null, new String[]{} ), + Arguments.of(null, "", new String[]{} ), + Arguments.of(null, "k1", new String[]{} ), + Arguments.of(null, new String[]{}, new String[]{} ), + Arguments.of(null, new JSONArray(), new String[]{} ), + Arguments.of(null, new ArrayList(0), new String[]{} ),//5 //empty json, bad/empty keys - {"{}", null, new String[]{} }, - {"{}", "", new String[]{} }, - {"{}", "k1", new String[]{} }, - {"{}", new String[]{}, new String[]{} }, - {"{}", new JSONArray(), new String[]{} },//10 - {"{}", new ArrayList(0), new String[]{} }, - + Arguments.of("{}", null, new String[]{} ), + Arguments.of("{}", "", new String[]{} ), + Arguments.of("{}", "k1", new String[]{} ), + Arguments.of("{}", new String[]{}, new String[]{} ), + Arguments.of("{}", new JSONArray(), new String[]{} ),//10 + Arguments.of("{}", new ArrayList(0), new String[]{} ), //simple json, bad/empty keys - {"{\"k0\":\"v0\"}", null, new String[]{} }, - {"{\"k0\":\"v0\"}", "", new String[]{} }, - {"{\"k0\":\"v0\"}", "k1", new String[]{} }, - {"{\"k0\":\"v0\"}", new String[]{}, new String[]{} },//15 - {"{\"k0\":\"v0\"}", new JSONArray(), new String[]{} }, - {"{\"k0\":\"v0\"}", new ArrayList(0), new String[]{} }, - + Arguments.of("{\"k0\":\"v0\"}", null, new String[]{} ), + Arguments.of("{\"k0\":\"v0\"}", "", new String[]{} ), + Arguments.of("{\"k0\":\"v0\"}", "k1", new String[]{} ), + Arguments.of("{\"k0\":\"v0\"}", new String[]{}, new String[]{} ),//15 + Arguments.of("{\"k0\":\"v0\"}", new JSONArray(), new String[]{} ), + Arguments.of("{\"k0\":\"v0\"}", new ArrayList(0), new String[]{} ), //simple json, valid/invalid keys - {"{\"k0\":\"v0\"}", "k0", new String[]{"k0"} }, - {"{\"k0\":\"v0\"}", "v0", new String[]{} }, - {"{\"k0\":\"v0\"}", "k0.k1", new String[]{} },//20 - {"{\"k0\":\"v0\"}", "k1.k0", new String[]{} }, - {"{\"k0\":null}", "k0", new String[]{"k0"} }, - {"{\"k0\":null}", null, new String[]{} }, - + Arguments.of("{\"k0\":\"v0\"}", "k0", new String[]{"k0"} ), + Arguments.of("{\"k0\":\"v0\"}", "v0", new String[]{} ), + Arguments.of("{\"k0\":\"v0\"}", "k0.k1", new String[]{} ),//20 + Arguments.of("{\"k0\":\"v0\"}", "k1.k0", new String[]{} ), + Arguments.of("{\"k0\":null}", "k0", new String[]{"k0"} ), + Arguments.of("{\"k0\":null}", null, new String[]{} ), //key with dot char - {"{\"k0.k1\":\"v0\"}", "k0", new String[]{} }, - {"{\"k0.k1\":\"v0\"}", "k1", new String[]{} },//25 - {"{\"k0.k1\":\"v0\"}", "k0.k1", new String[]{} }, - + Arguments.of("{\"k0.k1\":\"v0\"}", "k0", new String[]{} ), + Arguments.of("{\"k0.k1\":\"v0\"}", "k1", new String[]{} ),//25 + Arguments.of("{\"k0.k1\":\"v0\"}", "k0.k1", new String[]{} ), // key with dot ambiguity - {"{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0", new String[]{"k0"} }, - {"{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k1", new String[]{} }, - {"{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0.k1", new String[]{"k0.k1"} }, - {"{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1", new String[]{"k0.k1"} },//30 - {"{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1.k2", new String[]{"k0.k1.k2"} }, - {"{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k1.k2", new String[]{} }, - {"{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k0", new String[]{"k0"} }, - {"{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k1.k2", new String[]{"k1.k2"} }, - + Arguments.of("{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0", new String[]{"k0"} ), + Arguments.of("{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k1", new String[]{} ), + Arguments.of("{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0.k1", new String[]{"k0.k1"} ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1", new String[]{"k0.k1"} ),//30 + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1.k2", new String[]{"k0.k1.k2"} ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k1.k2", new String[]{} ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k0", new String[]{"k0"} ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k1.k2", new String[]{"k1.k2"} ), //ignore non-existent keys but keep good keys - {"{\"k0\":\"v0\",\"k1\":\"v1\"}", new String[]{"k0","k2"}, new String[]{"k0"} },//35 - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k2"}, new String[]{"k0"} }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2"}, new String[]{"k0", "k1.k2"} }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2.k3"}, new String[]{"k0"} }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2","k1"}, new String[]{"k0","k1","k1.k2"} }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1","k0.k2"}, new String[]{"k0","k1"} },//40 - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1","k2"}, new String[]{"k0","k1"} }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k2"}, new String[]{"k1.k2"} }, - + Arguments.of("{\"k0\":\"v0\",\"k1\":\"v1\"}", new String[]{"k0","k2"}, new String[]{"k0"} ),//35 + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k2"}, new String[]{"k0"} ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2"}, new String[]{"k0", "k1.k2"} ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2.k3"}, new String[]{"k0"} ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2","k1"}, new String[]{"k0","k1","k1.k2"} ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1","k0.k2"}, new String[]{"k0","k1"} ),//40 + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1","k2"}, new String[]{"k0","k1"} ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k2"}, new String[]{"k1.k2"} ), //arrays - key inside array treated as child - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0", new String[]{"k0"} }, - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1", new String[]{"k0.k1"} }, - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", new String[]{"k0.k1.k2"} },//45 - {"{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}", "k0.k1.k2", new String[]{"k0.k1.k2", "k0.k1.k2"} }, - }); + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0", new String[]{"k0"} ), + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1", new String[]{"k0.k1"} ), + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", new String[]{"k0.k1.k2"} ),//45 + Arguments.of("{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}", "k0.k1.k2", new String[]{"k0.k1.k2", "k0.k1.k2"} ) + ); } - @Test - public void test() throws ParseException + @ParameterizedTest + @MethodSource("params") + public void test(String jsonToSearch, Object keysToFind, String[] expectedFound) throws ParseException { JSONObject objectToSearch = jsonToSearch != null ? (JSONObject) JSONValue.parseWithException(jsonToSearch) : null; - PathLocator locator = switchKeyToRemove(); + PathLocator locator = switchKeyToRemove(keysToFind); List found = locator.locate(objectToSearch); assertEquals(Arrays.asList(expectedFound), found); } - private PathLocator switchKeyToRemove() + @SuppressWarnings("unchecked") + private PathLocator switchKeyToRemove(Object keysToFind) { long m = System.currentTimeMillis(); if (keysToFind == null && m % 4 == 0) { - System.out.println("cast to String"); + // System.out.println("cast to String"); return new PathLocator((String)null); } else if (keysToFind == null && m % 4 == 1) { - System.out.println("cast to String[]"); + // System.out.println("cast to String[]"); return new PathLocator((String[])null); } else if (keysToFind == null && m % 4 == 2) { - System.out.println("cast to JSONArray"); + // System.out.println("cast to JSONArray"); return new PathLocator((JSONArray)null); } else if (keysToFind == null && m % 4 == 3) { - System.out.println("cast to List"); + // System.out.println("cast to List"); return new PathLocator((List)null); } else if (keysToFind instanceof String) { return new PathLocator((String) keysToFind); diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathRemoverTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathRemoverTest.java index b50e9d97..c7b433e6 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathRemoverTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathRemoverTest.java @@ -5,101 +5,88 @@ import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; import net.minidev.json.parser.ParseException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; +import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * Tests {@link PathRemover} * * @author adoneitan@gmail.com */ -@RunWith(Parameterized.class) -public class PathRemoverTest -{ - private String jsonToClean; - private Object keyToRemove; - private String expectedJson; - - public PathRemoverTest(String jsonToClean, Object keyToRemove, String expectedJson) - { - this.jsonToClean = jsonToClean; - this.keyToRemove = keyToRemove; - this.expectedJson = expectedJson; - } - - @Parameterized.Parameters - public static Collection params() { - return Arrays.asList(new Object[][]{ - {null, "key", null }, // null json - {"{}", "key", "{}" }, // empty json - {"{\"first\": null}", null, "{\"first\": null}" }, // null key - {"{\"first\": null}", "", "{\"first\": null}" }, // empty string key - {"{\"first\": null}", new String[]{}, "{\"first\": null}" }, // empty string array key - {"{\"first\": null}", new JSONArray(), "{\"first\": null}" }, // empty json array key - {"{\"first\": null}", new ArrayList(0), "{\"first\": null}" }, // empty list key - {"{\"first\": null}", "first", "{}" }, // remove root key - {"{\"first.f1\": null}", "first.f1", "{}" }, // key with dot - {"{\"first.f1\": \"withDot\", \"first\":{\"f1\": null}}", "first.f1", "{\"first\":{}}" }, //9 key with dot ambiguity - {"{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}", "first.f2.f3.id", "{\"first\":{\"f2\":{\"f3\":{}}}}" }, // nested object remove single leaf - {"{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}", "notfound", "{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}" }, // nested object key does not exist - {"{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first.f2.f3.id", "{\"first\":{\"f2\":{\"f3\":{\"name\":\"me\"}}}}"}, // nested object remove first leaf - {"{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first.f2.f3.name", "{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}" }, //13 nested object remove last leaf - {"{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first.f2.f3", "{\"first\":{\"f2\":{}}}" }, // nested object remove intermediate node - {"{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first", "{}" }, // nested object remove root - {"{\"first\":{\"f2\":[[1,{\"id\":\"id1\"},3],4]}}", "first.f2.id", "{\"first\":{\"f2\":[[1,{},3],4]}}" }, // double nested array remove leaf - {"{\"first\":{\"f2\":[[1,{\"id\":\"id1\"},3],4]}}", "first.f2", "{\"first\":{}}" }, // double nested array remove array - {"{\"first\":[[1,{\"id\":\"id1\"},3],4]}", "first", "{}" }, // double nested array remove root - +// @RunWith(Parameterized.class) +public class PathRemoverTest { + public static Stream params() { + return Stream.of( + Arguments.of(null, "key", null ), // null json + Arguments.of("{}", "key", "{}" ), // empty json + Arguments.of("{\"first\": null}", null, "{\"first\": null}" ), // null key + Arguments.of("{\"first\": null}", "", "{\"first\": null}" ), // empty string key + Arguments.of("{\"first\": null}", new String[]{}, "{\"first\": null}" ), // empty string array key + Arguments.of("{\"first\": null}", new JSONArray(), "{\"first\": null}" ), // empty json array key + Arguments.of("{\"first\": null}", new ArrayList(0), "{\"first\": null}" ), // empty list key + Arguments.of("{\"first\": null}", "first", "{}" ), // remove root key + Arguments.of("{\"first.f1\": null}", "first.f1", "{}" ), // key with dot + Arguments.of("{\"first.f1\": \"withDot\", \"first\":{\"f1\": null}}", "first.f1", "{\"first\":{}}" ), //9 key with dot ambiguity + Arguments.of("{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}", "first.f2.f3.id", "{\"first\":{\"f2\":{\"f3\":{}}}}" ), // nested object remove single leaf + Arguments.of("{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}", "notfound", "{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}" ), // nested object key does not exist + Arguments.of("{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first.f2.f3.id", "{\"first\":{\"f2\":{\"f3\":{\"name\":\"me\"}}}}"), // nested object remove first leaf + Arguments.of("{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first.f2.f3.name", "{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\"}}}}" ), //13 nested object remove last leaf + Arguments.of("{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first.f2.f3", "{\"first\":{\"f2\":{}}}" ), // nested object remove intermediate node + Arguments.of("{\"first\":{\"f2\":{\"f3\":{\"id\":\"id1\",\"name\":\"me\"}}}}", "first", "{}" ), // nested object remove root + Arguments.of("{\"first\":{\"f2\":[[1,{\"id\":\"id1\"},3],4]}}", "first.f2.id", "{\"first\":{\"f2\":[[1,{},3],4]}}" ), // double nested array remove leaf + Arguments.of("{\"first\":{\"f2\":[[1,{\"id\":\"id1\"},3],4]}}", "first.f2", "{\"first\":{}}" ), // double nested array remove array + Arguments.of("{\"first\":[[1,{\"id\":\"id1\"},3],4]}", "first", "{}" ), // double nested array remove root //arrays - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1", "{\"k0\":{}}" }, // value is array - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[1,{},3,4]}}" }, // full path into array object - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.3" , "{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}" }, // full path into array primitive - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[1,{},{},3,4]}}" }, // full path into array with identical items - + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1", "{\"k0\":{}}" ), // value is array + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[1,{},3,4]}}" ), // full path into array object + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.3" , "{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}" ), // full path into array primitive + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[1,{},{},3,4]}}" ), // full path into array with identical items // composite json remove all roots - {"{\"first\": {\"f2\":{\"id\":\"id1\"}}, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}", + Arguments.of("{\"first\": {\"f2\":{\"id\":\"id1\"}}, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}", (JSONArray) JSONValue.parse("[\"first\",\"second\",\"third\",\"id\"]"), - "{}" }, + "{}" ), // composite json remove all leaves - {"{\"first\": {\"f2\":{\"id\":\"id1\"}}, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}", + Arguments.of("{\"first\": {\"f2\":{\"id\":\"id1\"}}, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}", (List) Arrays.asList("first.f2.id", "second.k1.id", "second.id", "third", "id"), - "{\"first\": {\"f2\":{}}, \"second\": [{\"k1\":{}}, 4, 5, 6, {}]}" }, - - }); + "{\"first\": {\"f2\":{}}, \"second\": [{\"k1\":{}}, 4, 5, 6, {}]}" ) + ); } - @Test - public void test() throws ParseException + @ParameterizedTest + @MethodSource("params") + public void test(String jsonToClean, Object keyToRemove, String expectedJson) throws ParseException { JSONObject objectToClean = jsonToClean != null ? (JSONObject) JSONValue.parseWithException(jsonToClean) : null; JSONObject expectedObject = expectedJson != null ? (JSONObject) JSONValue.parseWithException(expectedJson): null; - PathRemover cl = switchKeyToRemove(); + PathRemover cl = switchKeyToRemove(keyToRemove); cl.remove(objectToClean); assertEquals(expectedObject, objectToClean); } - private PathRemover switchKeyToRemove() + @SuppressWarnings("unchecked") + private PathRemover switchKeyToRemove(Object keyToRemove) { long m = System.currentTimeMillis(); if (keyToRemove == null && m % 4 == 0) { - System.out.println("cast to String"); + // System.out.println("cast to String"); return new PathRemover((String)null); } else if (keyToRemove == null && m % 4 == 1) { - System.out.println("cast to String[]"); + // System.out.println("cast to String[]"); return new PathRemover((String[])null); } else if (keyToRemove == null && m % 4 == 2) { - System.out.println("cast to JSONArray"); + // System.out.println("cast to JSONArray"); return new PathRemover((JSONArray)null); } else if (keyToRemove == null && m % 4 == 3) { - System.out.println("cast to List"); + // System.out.println("cast to List"); return new PathRemover((List)null); } else if (keyToRemove instanceof String) { return new PathRemover((String)keyToRemove); diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathReplicatorTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathReplicatorTest.java index 8bcb8db8..d93f74ac 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathReplicatorTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathReplicatorTest.java @@ -4,31 +4,21 @@ import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; + +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; +import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * @author adoneitan@gmail.com */ -@RunWith(Parameterized.class) public class PathReplicatorTest { - private String jsonSource; - private Object pathsToCopy; - private Object expected; - - public PathReplicatorTest(String jsonSource, Object pathsToCopy, Object expected) { - this.jsonSource = filter(jsonSource); - this.pathsToCopy = filter(pathsToCopy); - this.expected = filter(expected); - } @SuppressWarnings("unchecked") private static T filter(T obj) { @@ -39,122 +29,131 @@ private static T filter(T obj) { return obj; } - @Parameterized.Parameters - public static Collection params() { - return Arrays.asList(new Object[][] { + public static Stream params() { + return Stream.of( //nulls, bad/empty keys - {null, null, null }, - {null, "", null }, - {null, "k1", null }, - {null, new String[]{}, null }, - {null, new JSONArray(), null }, - {null, new ArrayList(0), null },//5 + Arguments.of(null, null, null ), + Arguments.of(null, "", null ), + Arguments.of(null, "k1", null ), + Arguments.of(null, new String[]{}, null ), + Arguments.of(null, new JSONArray(), null ), + Arguments.of(null, new ArrayList(0), null ),//5 //empty json, bad/empty keys - {"{}", null, "{}" }, - {"{}", "", "{}" }, - {"{}", "k1", "{}" }, - {"{}", new String[]{}, "{}" }, - {"{}", new JSONArray(), "{}" }, - {"{}", new ArrayList(0), "{}" },//11 + Arguments.of("{}", null, "{}" ), + Arguments.of("{}", "", "{}" ), + Arguments.of("{}", "k1", "{}" ), + Arguments.of("{}", new String[]{}, "{}" ), + Arguments.of("{}", new JSONArray(), "{}" ), + Arguments.of("{}", new ArrayList(0), "{}" ),//11 //simple json, bad/empty keys - {"{'k0':'v0'}", null, "{}" }, - {"{'k0':'v0'}", "", "{}" }, - {"{'k0':'v0'}", "k1", "{}" }, - {"{'k0':'v0'}", new String[]{}, "{}" }, - {"{'k0':'v0'}", new JSONArray(), "{}" }, - {"{'k0':'v0'}", new ArrayList(0), "{}" },//17 + Arguments.of("{'k0':'v0'}", null, "{}" ), + Arguments.of("{'k0':'v0'}", "", "{}" ), + Arguments.of("{'k0':'v0'}", "k1", "{}" ), + Arguments.of("{'k0':'v0'}", new String[]{}, "{}" ), + Arguments.of("{'k0':'v0'}", new JSONArray(), "{}" ), + Arguments.of("{'k0':'v0'}", new ArrayList(0), "{}" ),//17 //simple json, valid/invalid keys - {"{'k0':'v0'}", "k0", "{'k0':'v0'}" }, - {"{'k0':'v0'}", "v0", "{}" }, - {"{'k0':'v0'}", "k0.k1", "{}" },//20 - {"{'k0':'v0'}", "k1.k0", "{}" }, - {"{'k0':null}", "k0", "{'k0':null}" }, - {"{'k0':null}", "v0", "{}" }, + Arguments.of("{'k0':'v0'}", "k0", "{'k0':'v0'}" ), + Arguments.of("{'k0':'v0'}", "v0", "{}" ), + Arguments.of("{'k0':'v0'}", "k0.k1", "{}" ),//20 + Arguments.of("{'k0':'v0'}", "k1.k0", "{}" ), + Arguments.of("{'k0':null}", "k0", "{'k0':null}" ), + Arguments.of("{'k0':null}", "v0", "{}" ), //key with dot char - {"{'k0.k1':'v0'}", "k0", "{}" }, - {"{'k0.k1':'v0'}", "k1", "{}" }, - {"{'k0.k1':'v0'}", "k0.k1", "{}" }, + Arguments.of("{'k0.k1':'v0'}", "k0", "{}" ), + Arguments.of("{'k0.k1':'v0'}", "k1", "{}" ), + Arguments.of("{'k0.k1':'v0'}", "k0.k1", "{}" ), // key with dot ambiguity - {"{'k0.k1':'withDot','k0':{'k1':null}}", "k0", "{'k0':{}}" }, - {"{'k0.k1':'withDot','k0':{'k1':null}}", "k1", "{}" }, - {"{'k0.k1':'withDot','k0':{'k1':null}}", "k0.k1", "{'k0':{'k1':null}}" }, - {"{'k0':{'k1.k2':'dot','k1':{'k2':null}}}", "k0.k1", "{'k0':{'k1':{}}}" }, - {"{'k0':{'k1.k2':'dot','k1':{'k2':null}}}", "k0.k1.k2", "{'k0':{'k1':{'k2':null}}}" }, - {"{'k0':{'k1.k2':'dot','k1':{'k2':null}}}", "k1.k2", "{}" }, - {"{'k0':{'k1.k2':'dot'},'k1':{'k2':'v2'}}}", "k0", "{'k0':{}}}" }, - {"{'k0':{'k1.k2':'dot'},'k1':{'k2':'v2'}}}", "k1.k2", "{'k1':{'k2':'v2'}}}" }, - {"{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0.k2.k3.k4", "{}" }, - {"{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0.k2.k3", "{}" }, - {"{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0.k2", "{'k0':{'k2':{}}}" }, - {"{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0", "{'k0':{}}" },//38 + Arguments.of("{'k0.k1':'withDot','k0':{'k1':null}}", "k0", "{'k0':{}}" ), + Arguments.of("{'k0.k1':'withDot','k0':{'k1':null}}", "k1", "{}" ), + Arguments.of("{'k0.k1':'withDot','k0':{'k1':null}}", "k0.k1", "{'k0':{'k1':null}}" ), + Arguments.of("{'k0':{'k1.k2':'dot','k1':{'k2':null}}}", "k0.k1", "{'k0':{'k1':{}}}" ), + Arguments.of("{'k0':{'k1.k2':'dot','k1':{'k2':null}}}", "k0.k1.k2", "{'k0':{'k1':{'k2':null}}}" ), + Arguments.of("{'k0':{'k1.k2':'dot','k1':{'k2':null}}}", "k1.k2", "{}" ), + Arguments.of("{'k0':{'k1.k2':'dot'},'k1':{'k2':'v2'}}}", "k0", "{'k0':{}}}" ), + Arguments.of("{'k0':{'k1.k2':'dot'},'k1':{'k2':'v2'}}}", "k1.k2", "{'k1':{'k2':'v2'}}}" ), + Arguments.of("{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0.k2.k3.k4", "{}" ), + Arguments.of("{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0.k2.k3", "{}" ), + Arguments.of("{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0.k2", "{'k0':{'k2':{}}}" ), + Arguments.of("{'k0':{'k1':'v1','k2':{'k3.k4':'dot'}}}", "k0", "{'k0':{}}" ),//38 //ignore non-existent keys but keep good keys - {"{'k0':'v0','k1':'v1'}", new String[]{"k0","k2"}, "{'k0':'v0'}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k2"}, "{'k0':'v0'}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1.k2"}, "{'k0':'v0','k1':{'k2':'v2'}}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k0.k2"}, "{'k0':'v0'}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1.k2","k1"}, "{'k0':'v0','k1':{'k2':'v2'}}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1"}, "{'k0':'v0','k1':{}}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1","k2"}, "{'k0':'v0','k1':{}}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k1.k2"}, "{'k1':{'k2':'v2'}}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k1.k2.k3"}, "{}" }, - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0.k1.k2"}, "{}" },//48 - {"{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k1.k0"}, "{}" }, + Arguments.of("{'k0':'v0','k1':'v1'}", new String[]{"k0","k2"}, "{'k0':'v0'}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k2"}, "{'k0':'v0'}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1.k2"}, "{'k0':'v0','k1':{'k2':'v2'}}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k0.k2"}, "{'k0':'v0'}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1.k2","k1"}, "{'k0':'v0','k1':{'k2':'v2'}}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1"}, "{'k0':'v0','k1':{}}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0","k1","k2"}, "{'k0':'v0','k1':{}}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k1.k2"}, "{'k1':{'k2':'v2'}}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k1.k2.k3"}, "{}" ), + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k0.k1.k2"}, "{}" ),//48 + Arguments.of("{'k0':'v0','k1':{'k2':'v2'}}", new String[]{"k1.k0"}, "{}" ), //arrays - key inside array treated as child - {"{'k0':{'k1':[1,2,3,4]}}", "k0", "{'k0':{}}" }, - {"{'k0':{'k1':[1,2,3,4]}}", "k0.k1", "{'k0':{'k1':[1,2,3,4]}}" }, - {"{'k0':{'k1':[1,{'k2':'v2'},3,4]}}", "k0", "{'k0':{}}" }, - {"{'k0':{'k1':[1,{'k2':'v2'},3,4]}}", "k0.k1", "{'k0':{'k1':[1,{},3,4]}}" }, - {"{'k0':{'k1':[1,{'k2':'v2'},3,4]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'},{'k2':'v2'}]}}", "k0.k1", "{'k0':{'k1':[{},{}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'},{'k2':'v2'}]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'},{'k2':'v2'}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':'v4'}]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':'v4'}]}}", "k0.k3.k4", "{'k0':{'k3':[{'k4':'v4'}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", "k0.k3.k4", "{'k0':{'k3':[{'k4':{}}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", "k0.k3.k4.k5", "{'k0':{'k3':[{'k4':{'k5':'v5'}}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", new String[]{"k0.k1", "k0.k3"}, "{'k0':{'k3':[{}],'k1':[{}]}}" }, - {"{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", new String[]{"k0.k1", "k0.k3.k4.k5"}, "{'k0':{'k3':[{'k4':{'k5':'v5'}}],'k1':[{}]}}" }, - }); + Arguments.of("{'k0':{'k1':[1,2,3,4]}}", "k0", "{'k0':{}}" ), + Arguments.of("{'k0':{'k1':[1,2,3,4]}}", "k0.k1", "{'k0':{'k1':[1,2,3,4]}}" ), + Arguments.of("{'k0':{'k1':[1,{'k2':'v2'},3,4]}}", "k0", "{'k0':{}}" ), + Arguments.of("{'k0':{'k1':[1,{'k2':'v2'},3,4]}}", "k0.k1", "{'k0':{'k1':[1,{},3,4]}}" ), + Arguments.of("{'k0':{'k1':[1,{'k2':'v2'},3,4]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'},{'k2':'v2'}]}}", "k0.k1", "{'k0':{'k1':[{},{}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'},{'k2':'v2'}]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'},{'k2':'v2'}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':'v4'}]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':'v4'}]}}", "k0.k3.k4", "{'k0':{'k3':[{'k4':'v4'}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", "k0.k1.k2", "{'k0':{'k1':[{'k2':'v2'}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", "k0.k3.k4", "{'k0':{'k3':[{'k4':{}}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", "k0.k3.k4.k5", "{'k0':{'k3':[{'k4':{'k5':'v5'}}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", new String[]{"k0.k1", "k0.k3"}, "{'k0':{'k3':[{}],'k1':[{}]}}" ), + Arguments.of("{'k0':{'k1':[{'k2':'v2'}],'k3':[{'k4':{'k5':'v5'}}]}}", new String[]{"k0.k1", "k0.k3.k4.k5"}, "{'k0':{'k3':[{'k4':{'k5':'v5'}}],'k1':[{}]}}" ) + ); } - @Test - public void test() throws Exception { + @ParameterizedTest + @MethodSource("params") + public void test(String jsonSource, Object pathsToCopy, Object expected) throws Exception { + jsonSource = filter(jsonSource); + pathsToCopy = filter(pathsToCopy); + expected = filter(expected); + JSONObject objectSource = jsonSource != null ? (JSONObject) JSONValue.parseWithException(jsonSource) : null; - PathReplicator copier = switchKeyToCopy(); + PathReplicator copier = switchKeyToCopy(pathsToCopy); JSONObject copied = copier.replicate(objectSource); JSONObject expectedObj = expected != null ? (JSONObject) JSONValue.parseWithException((String) expected) : null; assertEquals(expectedObj, copied); } - @Test - public void test2() throws Exception { + @ParameterizedTest + @MethodSource("params") + public void test2(String jsonSource, Object pathsToCopy, Object expected) throws Exception { + jsonSource = filter(jsonSource); + pathsToCopy = filter(pathsToCopy); + expected = filter(expected); JSONObject objectSource = jsonSource != null ? (JSONObject) JSONValue.parseWithException(jsonSource) : null; - PathReplicator copier = switchKeyToCopy2(); + PathReplicator copier = switchKeyToCopy2(pathsToCopy); JSONObject copied = copier.replicate(objectSource); JSONObject expectedObj = expected != null ? (JSONObject) JSONValue.parseWithException((String) expected) : null; assertEquals(expectedObj, copied); } - private PathReplicator switchKeyToCopy() { + @SuppressWarnings("unchecked") + private PathReplicator switchKeyToCopy(Object pathsToCopy) { long m = System.currentTimeMillis(); if (pathsToCopy == null && m % 4 == 0) { - System.out.println("cast to String"); + // System.out.println("cast to String"); return new PathReplicator((String) null); } else if (pathsToCopy == null && m % 4 == 1) { - System.out.println("cast to String[]"); + // System.out.println("cast to String[]"); return new PathReplicator((String[]) null); } else if (pathsToCopy == null && m % 4 == 2) { - System.out.println("cast to JSONArray"); + // System.out.println("cast to JSONArray"); return new PathReplicator((JSONArray) null); } else if (pathsToCopy == null && m % 4 == 3) { - System.out.println("cast to List"); + // System.out.println("cast to List"); return new PathReplicator((List) null); } else if (pathsToCopy instanceof String) { return new PathReplicator((String) pathsToCopy); @@ -169,19 +168,20 @@ private PathReplicator switchKeyToCopy() { } } - private PathReplicator switchKeyToCopy2() { + @SuppressWarnings("unchecked") + private PathReplicator switchKeyToCopy2(Object pathsToCopy) { long m = System.currentTimeMillis(); if (pathsToCopy == null && m % 4 == 0) { - System.out.println("cast to String"); + // System.out.println("cast to String"); return new PathReplicator((String) null); } else if (pathsToCopy == null && m % 4 == 1) { - System.out.println("cast to String[]"); + // System.out.println("cast to String[]"); return new PathReplicator((String[]) null); } else if (pathsToCopy == null && m % 4 == 2) { - System.out.println("cast to JSONArray"); + // System.out.println("cast to JSONArray"); return new PathReplicator((JSONArray) null); } else if (pathsToCopy == null && m % 4 == 3) { - System.out.println("cast to List"); + // System.out.println("cast to List"); return new PathReplicator((List) null); } else if (pathsToCopy instanceof String) { return new PathReplicator((String) pathsToCopy); diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathsRetainerTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathsRetainerTest.java index f079e801..7c49b5e6 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/PathsRetainerTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/PathsRetainerTest.java @@ -6,132 +6,123 @@ import net.minidev.json.JSONValue; import net.minidev.json.actions.path.DotDelimiter; import net.minidev.json.parser.ParseException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; + +// import org.junit.runner.RunWith; +// import org.junit.runners.Parameterized; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author adoneitan@gmail.com */ -@RunWith(Parameterized.class) public class PathsRetainerTest { - private String jsonToReduce; - private Object keyToKeep; - private String expectedReducedJson; - - public PathsRetainerTest(String jsonToReduce, Object keyToKeep, String expectedReducedJson) { - this.jsonToReduce = jsonToReduce; - this.keyToKeep = keyToKeep; - this.expectedReducedJson = expectedReducedJson; - } - - @Parameterized.Parameters - public static Collection params() { - return Arrays - .asList(new Object[][] { - - //nulls, bad/empty keys - {null, null, null }, - {null, "", null }, - {null, "k1", null }, - {null, new String[]{}, null }, - {null, new JSONArray(), null }, - {null, new ArrayList(0), null },//5 - - //empty json, bad/empty keys - {"{}", null, "{}" }, - {"{}", "", "{}" }, - {"{}", "k1", "{}" }, - {"{}", new String[]{}, "{}" }, - {"{}", new JSONArray(), "{}" }, - {"{}", new ArrayList(0), "{}" },//11 - - //simple json, bad/empty keys - {"{\"k0\":\"v0\"}", null, "{}" }, - {"{\"k0\":\"v0\"}", "", "{}" }, - {"{\"k0\":\"v0\"}", "k1", "{}" }, - {"{\"k0\":\"v0\"}", new String[]{}, "{}" }, - {"{\"k0\":\"v0\"}", new JSONArray(), "{}" }, - {"{\"k0\":\"v0\"}", new ArrayList(0), "{}" },//17 - - //simple json, valid/invalid keys - {"{\"k0\":\"v0\"}", "k0", "{\"k0\":\"v0\"}" }, - {"{\"k0\":\"v0\"}", "v0", "{}" }, - {"{\"k0\":\"v0\"}", "k0.k1", "{}" }, - {"{\"k0\":\"v0\"}", "k1.k0", "{}" }, - {"{\"k0\":null}", "k0", "{\"k0\":null}" }, - {"{\"k0\":null}", "v0", "{}" },//23 - - //key with dot char - {"{\"k0.k1\":\"v0\"}", "k0", "{}" }, - {"{\"k0.k1\":\"v0\"}", "k1", "{}" }, - {"{\"k0.k1\":\"v0\"}", "k0.k1", "{}" }, - - // key with dot ambiguity - {"{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0", "{\"k0\":{}}" },//27 - {"{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k1", "{}" }, - {"{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0.k1", "{\"k0\":{\"k1\":null}}" },//29 - {"{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1", "{\"k0\":{\"k1\":{}}}" }, - {"{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1.k2", "{\"k0\":{\"k1\":{\"k2\":null}}}" },//31 - {"{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k1.k2", "{}" }, - {"{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k0", "{\"k0\":{}}}" }, - {"{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k1.k2", "{\"k1\":{\"k2\":\"v2\"}}}" }, - {"{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0.k2.k3.k4", "{}" }, - {"{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0.k2.k3", "{}" }, - {"{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0.k2", "{\"k0\":{\"k2\":{}}}" }, - {"{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0", "{\"k0\":{}}" }, - - //ignore non-existent keys but keep good keys - {"{\"k0\":\"v0\",\"k1\":\"v1\"}", new String[]{"k0","k2"}, "{\"k0\":\"v0\"}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k2"}, "{\"k0\":\"v0\"}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2"}, "{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k0.k2"}, "{\"k0\":\"v0\"}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2","k1"}, "{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1"}, "{\"k0\":\"v0\",\"k1\":{}}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1","k2"}, "{\"k0\":\"v0\",\"k1\":{}}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k2"}, "{\"k1\":{\"k2\":\"v2\"}}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k2.k3"}, "{}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0.k1.k2"}, "{}" }, - {"{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k0"}, "{}" }, - - //arrays - key inside array treated as child - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0", "{\"k0\":{}}" }, - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1", "{\"k0\":{\"k1\":[1,{},3,4]}}" }, - {"{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}" }, - {"{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}", "k0.k1", "{\"k0\":{\"k1\":[{},{}]}}" }, - {"{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}" }, - }); - } + + public static Stream params() { + return Stream.of( + //nulls, bad/empty keys + Arguments.of(null, null, null ), + Arguments.of(null, "", null ), + Arguments.of(null, "k1", null ), + Arguments.of(null, new String[]{}, null ), + Arguments.of(null, new JSONArray(), null ), + Arguments.of(null, new ArrayList(0), null ),//5 + //empty json, bad/empty keys + Arguments.of("{}", null, "{}" ), + Arguments.of("{}", "", "{}" ), + Arguments.of("{}", "k1", "{}" ), + Arguments.of("{}", new String[]{}, "{}" ), + Arguments.of("{}", new JSONArray(), "{}" ), + Arguments.of("{}", new ArrayList(0), "{}" ),//11 + //simple json, bad/empty keys + Arguments.of("{\"k0\":\"v0\"}", null, "{}" ), + Arguments.of("{\"k0\":\"v0\"}", "", "{}" ), + Arguments.of("{\"k0\":\"v0\"}", "k1", "{}" ), + Arguments.of("{\"k0\":\"v0\"}", new String[]{}, "{}" ), + Arguments.of("{\"k0\":\"v0\"}", new JSONArray(), "{}" ), + Arguments.of("{\"k0\":\"v0\"}", new ArrayList(0), "{}" ),//17 + //simple json, valid/invalid keys + Arguments.of("{\"k0\":\"v0\"}", "k0", "{\"k0\":\"v0\"}" ), + Arguments.of("{\"k0\":\"v0\"}", "v0", "{}" ), + Arguments.of("{\"k0\":\"v0\"}", "k0.k1", "{}" ), + Arguments.of("{\"k0\":\"v0\"}", "k1.k0", "{}" ), + Arguments.of("{\"k0\":null}", "k0", "{\"k0\":null}" ), + Arguments.of("{\"k0\":null}", "v0", "{}" ),//23 + //key with dot char + Arguments.of("{\"k0.k1\":\"v0\"}", "k0", "{}" ), + Arguments.of("{\"k0.k1\":\"v0\"}", "k1", "{}" ), + Arguments.of("{\"k0.k1\":\"v0\"}", "k0.k1", "{}" ), + // key with dot ambiguity + Arguments.of("{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0", "{\"k0\":{}}" ),//27 + Arguments.of("{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k1", "{}" ), + Arguments.of("{\"k0.k1\":\"withDot\",\"k0\":{\"k1\":null}}", "k0.k1", "{\"k0\":{\"k1\":null}}" ),//29 + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1", "{\"k0\":{\"k1\":{}}}" ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k0.k1.k2", "{\"k0\":{\"k1\":{\"k2\":null}}}" ),//31 + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\",\"k1\":{\"k2\":null}}}", "k1.k2", "{}" ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k0", "{\"k0\":{}}}" ), + Arguments.of("{\"k0\":{\"k1.k2\":\"dot\"},\"k1\":{\"k2\":\"v2\"}}}","k1.k2", "{\"k1\":{\"k2\":\"v2\"}}}" ), + Arguments.of("{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0.k2.k3.k4", "{}" ), + Arguments.of("{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0.k2.k3", "{}" ), + Arguments.of("{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0.k2", "{\"k0\":{\"k2\":{}}}" ), + Arguments.of("{\"k0\":{\"k1\":\"v1\",\"k2\":{\"k3.k4\":\"dot\"}}}", "k0", "{\"k0\":{}}" ), + + //ignore non-existent keys but keep good keys + Arguments.of("{\"k0\":\"v0\",\"k1\":\"v1\"}", new String[]{"k0","k2"}, "{\"k0\":\"v0\"}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k2"}, "{\"k0\":\"v0\"}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2"}, "{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k0.k2"}, "{\"k0\":\"v0\"}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1.k2","k1"}, "{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1"}, "{\"k0\":\"v0\",\"k1\":{}}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0","k1","k2"}, "{\"k0\":\"v0\",\"k1\":{}}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k2"}, "{\"k1\":{\"k2\":\"v2\"}}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k2.k3"}, "{}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k0.k1.k2"}, "{}" ), + Arguments.of("{\"k0\":\"v0\",\"k1\":{\"k2\":\"v2\"}}", new String[]{"k1.k0"}, "{}" ), + //arrays - key inside array treated as child + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0", "{\"k0\":{}}" ), + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1", "{\"k0\":{\"k1\":[1,{},3,4]}}" ), + Arguments.of("{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[1,{\"k2\":\"v2\"},3,4]}}" ), + Arguments.of("{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}", "k0.k1", "{\"k0\":{\"k1\":[{},{}]}}" ), + Arguments.of("{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}", "k0.k1.k2", "{\"k0\":{\"k1\":[{\"k2\":\"v2\"},{\"k2\":\"v2\"}]}}" ) + ); + } - @Test - public void test() throws ParseException { - JSONObject objectToReduce = jsonToReduce != null ? (JSONObject) JSONValue.parseWithException(jsonToReduce) : null; - JSONObject expectedReducedObj = expectedReducedJson != null ? (JSONObject) JSONValue.parseWithException(expectedReducedJson) : null; - PathsRetainer retainer = switchKeyToRemove().with(new DotDelimiter().withAcceptDelimiterInNodeName(false)); + + + @ParameterizedTest + @MethodSource("params") + public void test(String jsonToReduce, Object keyToKeep, String expectedReducedJson) throws ParseException { + JSONObject objectToReduce = jsonToReduce != null ? (JSONObject) JSONValue.parseWithException(jsonToReduce) + : null; + JSONObject expectedReducedObj = expectedReducedJson != null + ? (JSONObject) JSONValue.parseWithException(expectedReducedJson) + : null; + PathsRetainer retainer = switchKeyToRemove(keyToKeep).with(new DotDelimiter().withAcceptDelimiterInNodeName(false)); JSONObject reducedObj = retainer.retain(objectToReduce); assertEquals(expectedReducedObj, reducedObj); } - private PathsRetainer switchKeyToRemove() { + @SuppressWarnings("unchecked") + private PathsRetainer switchKeyToRemove(Object keyToKeep) { long m = System.currentTimeMillis(); if (keyToKeep == null && m % 4 == 0) { - System.out.println("cast to String"); + // System.out.println("cast to String"); return new PathsRetainer((String) null); } else if (keyToKeep == null && m % 4 == 1) { - System.out.println("cast to String[]"); + // System.out.println("cast to String[]"); return new PathsRetainer((String[]) null); } else if (keyToKeep == null && m % 4 == 2) { - System.out.println("cast to JSONArray"); + // System.out.println("cast to JSONArray"); return new PathsRetainer((JSONArray) null); } else if (keyToKeep == null && m % 4 == 3) { - System.out.println("cast to List"); + // System.out.println("cast to List"); return new PathsRetainer((List) null); } else if (keyToKeep instanceof String) { return new PathsRetainer((String) keyToKeep); diff --git a/json-smart-action/src/test/java/net/minidev/json/test/actions/TreePathTest.java b/json-smart-action/src/test/java/net/minidev/json/test/actions/TreePathTest.java index 4a890f39..617b6a8d 100644 --- a/json-smart-action/src/test/java/net/minidev/json/test/actions/TreePathTest.java +++ b/json-smart-action/src/test/java/net/minidev/json/test/actions/TreePathTest.java @@ -3,10 +3,11 @@ import net.minidev.json.actions.path.DotDelimiter; import net.minidev.json.actions.path.TreePath; import net.minidev.json.actions.path.PathDelimiter; -import org.junit.Test; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; /** * @author adoneitan@gmail.com diff --git a/json-smart/pom.xml b/json-smart/pom.xml index dcebceb9..0eb690d9 100644 --- a/json-smart/pom.xml +++ b/json-smart/pom.xml @@ -3,7 +3,7 @@ net.minidev minidev-parent - 2.4 + 2.4.1 4.0.0 @@ -49,9 +49,9 @@ - junit - junit - test + org.junit.jupiter + junit-jupiter-api + test net.minidev diff --git a/json-smart/src/main/java/net/minidev/json/JSONNavi.java b/json-smart/src/main/java/net/minidev/json/JSONNavi.java index d508ffd7..2a549475 100644 --- a/json-smart/src/main/java/net/minidev/json/JSONNavi.java +++ b/json-smart/src/main/java/net/minidev/json/JSONNavi.java @@ -86,6 +86,8 @@ public JSONNavi(String json, Class mapTo) { /** * return to root node + * + * @return the root node */ public JSONNavi root() { this.current = this.root; @@ -299,6 +301,8 @@ public JSONNavi add(Object... values) { /** * get the current object value as String if the current Object is null * return null. + * + * @return value as string */ public String asString() { if (current == null) @@ -311,6 +315,8 @@ public String asString() { /** * get the current value as double if the current Object is null return * Double.NaN + * + * @return value as double */ public double asDouble() { if (current instanceof Number) @@ -321,6 +327,8 @@ public double asDouble() { /** * get the current object value as Double if the current Double can not be * cast as Integer return null. + * + * @return value as Double */ public Double asDoubleObj() { if (current == null) @@ -336,8 +344,10 @@ public Double asDoubleObj() { /** * get the current value as float if the current Object is null return * Float.NaN + * + * @return value as float */ - public double asFloat() { + public float asFloat() { if (current instanceof Number) return ((Number) current).floatValue(); return Float.NaN; @@ -360,6 +370,8 @@ public Float asFloatObj() { /** * get the current value as int if the current Object is null return 0 + * + * @return value as Int */ public int asInt() { if (current instanceof Number) @@ -370,6 +382,7 @@ public int asInt() { /** * get the current object value as Integer if the current Object can not be * cast as Integer return null. + * @return the current node value as an Integer */ public Integer asIntegerObj() { if (current == null) @@ -390,6 +403,8 @@ public Integer asIntegerObj() { /** * get the current value as long if the current Object is null return 0 + * + * @return value as long */ public long asLong() { if (current instanceof Number) @@ -400,6 +415,8 @@ public long asLong() { /** * get the current object value as Long if the current Object can not be * cast as Long return null. + * + * @return value as Long */ public Long asLongObj() { if (current == null) @@ -417,6 +434,8 @@ public Long asLongObj() { /** * get the current value as boolean if the current Object is null or is not * a boolean return false + * + * @return boolean */ public boolean asBoolean() { if (current instanceof Boolean) @@ -427,6 +446,8 @@ public boolean asBoolean() { /** * get the current object value as Boolean if the current Object is not a * Boolean return null. + * + * @return Boolean object */ public Boolean asBooleanObj() { if (current == null) @@ -439,6 +460,7 @@ public Boolean asBooleanObj() { /** * Set current value as Json Object You can also skip this call, Objects can * be create automatically. + * @return the current node as an object */ @SuppressWarnings("unchecked") public JSONNavi object() { @@ -465,6 +487,8 @@ public JSONNavi object() { /** * Set current value as Json Array You can also skip this call Arrays can be * create automatically. + * + * @return the current node as an array */ @SuppressWarnings("unchecked") public JSONNavi array() { @@ -490,6 +514,8 @@ public JSONNavi array() { /** * set current value as Number + * @param num new value for the current node + * @return this for code chaining */ public JSONNavi set(Number num) { if (failure) @@ -501,6 +527,9 @@ public JSONNavi set(Number num) { /** * set current value as Boolean + * @param num new value for the current node + * + * @return this for code chaining */ public JSONNavi set(Boolean bool) { if (failure) @@ -512,6 +541,9 @@ public JSONNavi set(Boolean bool) { /** * set current value as String + * @param text text value + * + * @return this for code chaining */ public JSONNavi set(String text) { if (failure) @@ -543,6 +575,8 @@ else if (isArray(parent)) { /** * is the current node is an array + * + * @return true if the current node is an array */ public boolean isArray() { return isArray(current); @@ -550,6 +584,8 @@ public boolean isArray() { /** * is the current node is an object + * + * @return true if the current node is an object */ public boolean isObject() { return isObject(current); @@ -557,6 +593,8 @@ public boolean isObject() { /** * check if Object is an Array + * + * @return true if the object is an array */ private boolean isArray(Object obj) { if (obj == null) @@ -566,6 +604,7 @@ private boolean isArray(Object obj) { /** * check if Object is an Map + * @return true if the object node is an object */ private boolean isObject(Object obj) { if (obj == null) @@ -575,6 +614,7 @@ private boolean isObject(Object obj) { /** * internal cast to List + * @return casted object */ @SuppressWarnings("unchecked") private List a(Object obj) { diff --git a/json-smart/src/main/java/net/minidev/json/JSONValue.java b/json-smart/src/main/java/net/minidev/json/JSONValue.java index 4272662d..86b41081 100644 --- a/json-smart/src/main/java/net/minidev/json/JSONValue.java +++ b/json-smart/src/main/java/net/minidev/json/JSONValue.java @@ -287,6 +287,10 @@ public static Object parse(String s) { /** * Parse Json input to a java Object keeping element order * + * @param in json source + * + * @return a OrderedMap preserving field order. + * * @since 1.0.6.1 */ public static Object parseKeepingOrder(Reader in) { @@ -300,7 +304,11 @@ public static Object parseKeepingOrder(Reader in) { /** * Parse Json input to a java Object keeping element order * - * @since 1.0.6.1 + * @param in json source + * + * @return a OrderedMap preserving field order.\ + * + * @since 1.0.6.1 */ public static Object parseKeepingOrder(String in) { try { @@ -310,32 +318,15 @@ public static Object parseKeepingOrder(String in) { } } - /** - * Parse Json Using SAX event handler - * - * @since 1.0.6.2 - * @removed in 2.0 - */ - // public static void SAXParse(String input, ContentHandler handler) throws - // ParseException { - // } - - /** - * Parse Json Using SAX event handler - * - * @since 1.0.6.2 - * @removed in 2.0 - */ - // public static void SAXParse(Reader input, ContentHandler handler) throws - // ParseException, IOException { - // } - /** * Reformat Json input keeping element order * + * @param input text to parse + * @param style parse options + * * @since 1.0.6.2 * - * need to be rewrite in 2.0 + * @return json string */ public static String compress(String input, JSONStyle style) { try { @@ -350,6 +341,8 @@ public static String compress(String input, JSONStyle style) { /** * Compress Json input keeping element order * + * @param input text to parse + * * @since 1.0.6.1 * * need to be rewrite in 2.0 @@ -360,6 +353,7 @@ public static String compress(String input) { /** * Compress Json input keeping element order + * @param input text to parse * * @since 1.0.6.1 */ @@ -370,6 +364,8 @@ public static String uncompress(String input) { /** * Parse JSON text into java object from the input source. * + * @param in source to parse + * * @see JSONParser * * @return Instance of the following: JSONObject, JSONArray, String, @@ -382,6 +378,7 @@ public static Object parseWithException(byte[] in) throws IOException, ParseExce /** * Parse JSON text into java object from the input source. * + * @param in source to parse * @see JSONParser * * @return Instance of the following: JSONObject, JSONArray, String, @@ -394,6 +391,8 @@ public static Object parseWithException(InputStream in) throws IOException, Pars /** * Parse JSON text into java object from the input source. * + * @param in source to parse + * * @see JSONParser * * @return Instance of the following: JSONObject, JSONArray, String, @@ -406,21 +405,28 @@ public static Object parseWithException(Reader in) throws IOException, ParseExce /** * Parse JSON text into java object from the input source. * + * @param input string to parse + * @see JSONParser * + * @throws ParseException if input in invalid + * * @return Instance of the following: JSONObject, JSONArray, String, * java.lang.Number, java.lang.Boolean, null */ - public static Object parseWithException(String s) throws ParseException { - return new JSONParser(DEFAULT_PERMISSIVE_MODE).parse(s, defaultReader.DEFAULT); + public static Object parseWithException(String input) throws ParseException { + return new JSONParser(DEFAULT_PERMISSIVE_MODE).parse(input, defaultReader.DEFAULT); } /** * Parse input json as a mapTo class * - * mapTo can be a bean + * @param in source to parse + * @param mapTo destination type, mapTo can be a javabean * * @since 2.0 + * + * @return unserialized object of type mapTo */ public static T parseWithException(String in, Class mapTo) throws ParseException { JSONParser p = new JSONParser(DEFAULT_PERMISSIVE_MODE); @@ -430,6 +436,8 @@ public static T parseWithException(String in, Class mapTo) throws ParseEx /** * Parse valid RFC4627 JSON text into java object from the input source. * + * @param in source to parse + * @see JSONParser * * @return Instance of the following: JSONObject, JSONArray, String, @@ -442,6 +450,7 @@ public static Object parseStrict(Reader in) throws IOException, ParseException { /** * Parse valid RFC4627 JSON text into java object from the input source. * + * @param s source to parse * @see JSONParser * * @return Instance of the following: JSONObject, JSONArray, String, @@ -558,7 +567,7 @@ public static void registerReader(Class type, JsonReaderI mapper) { *

* If this object is a Map or a List, and it's also a JSONStreamAware or a * JSONAware, JSONStreamAware or JSONAware will be considered firstly. - *

+ *

* * @see JSONObject#writeJSON(Map, Appendable) * @see JSONArray#writeJSONString(List, Appendable) @@ -593,6 +602,10 @@ public static void writeJSONString(Object value, Appendable out, JSONStyle compr * JSONAware, JSONStreamAware or JSONAware will be considered firstly. *

* + * @param value object to serialize + * + * @return json string + * * @see JSONObject#writeJSON(Map, Appendable) * @see JSONArray#writeJSONString(List, Appendable) */ @@ -610,6 +623,9 @@ public static String toJSONString(Object value) { * both JSONAware and Map or List with "this" as the parameter, use * JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead. * + * @param object to serialize + * @param compression serialisation options + * * @see JSONObject#toJSONString(Map) * @see JSONArray#toJSONString(List) * @@ -633,6 +649,11 @@ public static String escape(String s) { /** * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters * (U+0000 through U+001F). + * + * @param s string to escape + * @param compression compression options + * + * @return escaped string */ public static String escape(String s, JSONStyle compression) { if (s == null) diff --git a/json-smart/src/main/java/net/minidev/json/writer/JsonReaderI.java b/json-smart/src/main/java/net/minidev/json/writer/JsonReaderI.java index 54127734..ea350448 100644 --- a/json-smart/src/main/java/net/minidev/json/writer/JsonReaderI.java +++ b/json-smart/src/main/java/net/minidev/json/writer/JsonReaderI.java @@ -25,7 +25,7 @@ * * @author uriel Chemouni * - * @param + * @param result type */ public abstract class JsonReaderI { public final JsonReader base; @@ -33,7 +33,7 @@ public abstract class JsonReaderI { /** * Reader can be link to the JsonReader Base * - * @param base + * @param base parent reader */ public JsonReaderI(JsonReader base) { this.base = base; @@ -43,6 +43,7 @@ public JsonReaderI(JsonReader base) { /** * called when json-smart parser meet an object key + * @param key key name */ public JsonReaderI startObject(String key) throws ParseException, IOException { throw new RuntimeException(ERR_MSG + " startObject(String key) in " + this.getClass() + " key=" + key); @@ -51,8 +52,7 @@ public JsonReaderI startObject(String key) throws ParseException, IOException /** * called when json-smart parser start an array. * - * @param key - * the destination key name, or null. + * @param key the destination key name, or null. */ public JsonReaderI startArray(String key) throws ParseException, IOException { throw new RuntimeException(ERR_MSG + " startArray in " + this.getClass() + " key=" + key); diff --git a/json-smart/src/test/java/net/minidev/json/test/JSONSimpleTest.java b/json-smart/src/test/java/net/minidev/json/test/JSONSimpleTest.java index 99b055d4..875f4261 100644 --- a/json-smart/src/test/java/net/minidev/json/test/JSONSimpleTest.java +++ b/json-smart/src/test/java/net/minidev/json/test/JSONSimpleTest.java @@ -1,10 +1,14 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONArray; import net.minidev.json.parser.JSONParser; -public class JSONSimpleTest extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class JSONSimpleTest { + @Test public void testLong() throws Exception { String s = "[1]"; JSONParser p = new JSONParser(JSONParser.MODE_JSON_SIMPLE); @@ -12,6 +16,7 @@ public void testLong() throws Exception { assertEquals(Long.valueOf(1), (Long) array.get(0)); } + @Test public void testDefault() throws Exception { String s = "[1]"; JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE); diff --git a/json-smart/src/test/java/net/minidev/json/test/MustThrows.java b/json-smart/src/test/java/net/minidev/json/test/MustThrows.java index f013561a..2c844f4e 100644 --- a/json-smart/src/test/java/net/minidev/json/test/MustThrows.java +++ b/json-smart/src/test/java/net/minidev/json/test/MustThrows.java @@ -1,19 +1,26 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; + public class MustThrows { + @Test public static void testStrictInvalidJson(String json, int execptionType) throws Exception { testStrictInvalidJson(json, execptionType, null); } + @Test public static void testStrictInvalidJson(String json, int execptionType, Class cls) throws Exception { testInvalidJson(json, JSONParser.MODE_RFC4627, execptionType, cls); } + @Test public static void testInvalidJson(String json, int permissifMode, int execptionType) throws Exception { testInvalidJson(json, permissifMode, execptionType, null); } @@ -26,11 +33,11 @@ public static void testInvalidJson(String json, int permissifMode, int execption p.parse(json); else p.parse(json, cls); - TestCase.assertFalse("Exception Should Occure parsing:" + json, true); + assertFalse(true, "Exception Should Occure parsing:" + json); } catch (ParseException e) { if (execptionType == -1) execptionType = e.getErrorType(); - TestCase.assertEquals(execptionType, e.getErrorType()); + assertEquals(execptionType, e.getErrorType()); } } diff --git a/json-smart/src/test/java/net/minidev/json/test/TestBigDigitUnrestricted.java b/json-smart/src/test/java/net/minidev/json/test/TestBigDigitUnrestricted.java index 7dbc00a9..8619a113 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestBigDigitUnrestricted.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestBigDigitUnrestricted.java @@ -1,28 +1,33 @@ package net.minidev.json.test; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.math.BigDecimal; -import junit.framework.TestCase; import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; -public class TestBigDigitUnrestricted extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestBigDigitUnrestricted { public static String[] VALID_DOUBLE_JSON = new String[] {"{\"v\":0.12345678912345678}"}; + @Test public void testRestrictedBigDigit() throws Exception { JSONParser p = new JSONParser(JSONParser.MODE_RFC4627); String json = VALID_DOUBLE_JSON[0]; JSONObject obj = (JSONObject) p.parse(json); Object value = obj.get("v"); - assertEquals("Should not Store this big number as a double", Double.class, value.getClass()); + assertEquals(Double.class, value.getClass(), "Should not Store this big number as a double"); } + @Test public void testUnrestrictedBigDigit() throws Exception { JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE); String json = VALID_DOUBLE_JSON[0]; JSONObject obj = (JSONObject) p.parse(json); Object value = obj.get("v"); - assertEquals("Should not Store this big number as a double", BigDecimal.class, value.getClass()); + assertEquals(BigDecimal.class, value.getClass(), "Should not Store this big number as a double"); } } diff --git a/json-smart/src/test/java/net/minidev/json/test/TestBigValue.java b/json-smart/src/test/java/net/minidev/json/test/TestBigValue.java index f7944492..1184fc90 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestBigValue.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestBigValue.java @@ -1,19 +1,23 @@ package net.minidev.json.test; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.math.BigDecimal; import java.math.BigInteger; import java.util.HashMap; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; -import junit.framework.TestCase; -public class TestBigValue extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestBigValue { String bigStr = "12345678901234567890123456789"; /** * test BigDecimal serialization */ + @Test public void testBigDecimal() { HashMap map = new HashMap(); BigDecimal bigDec = new BigDecimal(bigStr + "." + bigStr); @@ -29,6 +33,7 @@ public void testBigDecimal() { /** * test BigInteger serialization */ + @Test public void testBigInteger() { HashMap map = new HashMap(); BigInteger bigInt = new BigInteger(bigStr); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestCompressor.java b/json-smart/src/test/java/net/minidev/json/test/TestCompressor.java index 7e367aae..5c0b9b40 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestCompressor.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestCompressor.java @@ -1,9 +1,13 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestCompressor extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class TestCompressor { + @Test public void testCompressor() { String j = "{'a':{'b':'c','d':'e'},f:[1,2,'XYZ']}".replace('\'', '"'); String sol = j.replace(" ", "").replace("\"", ""); @@ -11,6 +15,7 @@ public void testCompressor() { assertEquals(sol, comp); } + @Test public void testCompressor2() { String j = "[{} ]"; String sol = j.replace(" ", ""); @@ -18,6 +23,7 @@ public void testCompressor2() { assertEquals(sol, comp); } + @Test public void testCompressor3() { String j = "[[],[],[] ]"; String sol = j.replace(" ", ""); @@ -25,6 +31,7 @@ public void testCompressor3() { assertEquals(sol, comp); } + @Test public void testCompressor4() { String j = "[[1],[2,3],[4] ]"; String sol = j.replace(" ", ""); @@ -32,6 +39,7 @@ public void testCompressor4() { assertEquals(sol, comp); } + @Test public void testCompressor5() { String j = "[{},{},{} ]"; String sol = j.replace(" ", ""); @@ -39,6 +47,7 @@ public void testCompressor5() { assertEquals(sol, comp); } + @Test public void testCompressor6() { String j = "[{a:b},{c:d},{e:f}]"; String sol = j; diff --git a/json-smart/src/test/java/net/minidev/json/test/TestCompressorFlags.java b/json-smart/src/test/java/net/minidev/json/test/TestCompressorFlags.java index d8909c70..aaeb79cf 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestCompressorFlags.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestCompressorFlags.java @@ -1,18 +1,22 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONObject; import net.minidev.json.JSONStyle; import net.minidev.json.JSONValue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + /** * Test all Compression Styles * * @author Uriel Chemouni <uchemouni@gmail.com> * */ -public class TestCompressorFlags extends TestCase { +public class TestCompressorFlags { + @Test public void testProtect() throws Exception { String compressed = "{k:value}"; String nCompress = "{\"k\":\"value\"}"; @@ -42,6 +46,7 @@ public void testProtect() throws Exception { assertEquals("{\"k\":value}", r); } + @Test public void testAggresive() throws Exception { String r; JSONStyle style; @@ -76,6 +81,7 @@ public void testAggresive() throws Exception { assertEquals("{a b:c d}", r); } + @Test public void test4Web() throws Exception { String NProtectValue = "{\"k\":\"http:\\/\\/url\"}"; diff --git a/json-smart/src/test/java/net/minidev/json/test/TestFloat.java b/json-smart/src/test/java/net/minidev/json/test/TestFloat.java index a3e07f33..8c2553e4 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestFloat.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestFloat.java @@ -1,11 +1,13 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONObject; import net.minidev.json.JSONStyle; import net.minidev.json.parser.JSONParser; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; -public class TestFloat extends TestCase { +public class TestFloat { public static String[] TRUE_NUMBERS = new String[] { "1.0", "123.456", "1.0E1", "123.456E12", "1.0E+1", "123.456E+12", "1.0E-1", "123.456E-12", "1.0e1", "123.456e12", "1.0e+1", "123.456e+12", "1.0e-1", "123.456e-12" }; @@ -13,6 +15,7 @@ public class TestFloat extends TestCase { public static String[] FALSE_NUMBERS = new String[] { "1.0%", "123.45.6", "1.0E", "++123.456E12", "+-01", "1.0E+1.2" }; + @Test public void testPrecisionFloat() throws Exception { JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE); for (int len = 15; len < 25; len++) { @@ -24,10 +27,11 @@ public void testPrecisionFloat() throws Exception { String json = "{v:" + s + "}"; JSONObject obj = (JSONObject) p.parse(json); Object value = obj.get("v").toString(); - assertEquals("Should not loose precision on a " + len + " digits long", s, value); + assertEquals(s, value, "Should not loose precision on a " + len + " digits long"); } } + @Test public void testFloat() throws Exception { JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE); for (String s : TRUE_NUMBERS) { @@ -35,29 +39,31 @@ public void testFloat() throws Exception { Double val = Double.valueOf(s.trim()); JSONObject obj = (JSONObject) p.parse(json); Object value = obj.get("v"); - assertEquals("Should be parse as double", val, value); + assertEquals(val, value, "Should be parse as double"); } } + @Test public void testNonFloat() throws Exception { JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE); for (String s : FALSE_NUMBERS) { String json = "{v:" + s + "}"; JSONObject obj = (JSONObject) p.parse(json); - assertEquals("Should be parse as string", s, obj.get("v")); + assertEquals(s, obj.get("v"), "Should be parse as string"); String correct = "{\"v\":\"" + s + "\"}"; - assertEquals("Should be re serialized as", correct, obj.toJSONString()); + assertEquals(correct, obj.toJSONString(), "Should be re serialized as"); } } /** * Error reported in issue 44 */ + @Test public void testUUID() { String UUID = "58860611416142319131902418361e88"; JSONObject obj = new JSONObject(); obj.put("uuid", UUID); - String compressed =obj.toJSONString(JSONStyle.MAX_COMPRESS); + String compressed = obj.toJSONString(JSONStyle.MAX_COMPRESS); assertTrue(compressed.contains("uuid:\"")); } } diff --git a/json-smart/src/test/java/net/minidev/json/test/TestFloatStrict.java b/json-smart/src/test/java/net/minidev/json/test/TestFloatStrict.java index cac76981..43a96918 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestFloatStrict.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestFloatStrict.java @@ -1,21 +1,26 @@ package net.minidev.json.test; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; -public class TestFloatStrict extends TestCase { +public class TestFloatStrict { + @Test public void testFloat() throws Exception { for (String s : TestFloat.TRUE_NUMBERS) { String json = "{\"v\":" + s + "}"; Double val = Double.valueOf(s.trim()); JSONObject obj = (JSONObject) new JSONParser(JSONParser.MODE_RFC4627).parse(json); Object value = obj.get("v"); - assertEquals("Should be parse as double", val, value); + assertEquals(val, value, "Should be parse as double"); } } + @Test public void testNonFloat() throws Exception { for (String s : TestFloat.FALSE_NUMBERS) { String json = "{\"v\":" + s + "}"; diff --git a/json-smart/src/test/java/net/minidev/json/test/TestInts.java b/json-smart/src/test/java/net/minidev/json/test/TestInts.java index abf56737..a1a061f0 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestInts.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestInts.java @@ -1,27 +1,33 @@ package net.minidev.json.test; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.math.BigDecimal; import java.math.BigInteger; +import org.junit.jupiter.api.Test; + import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; -import junit.framework.TestCase; -public class TestInts extends TestCase { +public class TestInts { + @Test public void testIntMax() throws Exception { String s = "{t:" + Integer.MAX_VALUE + "}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertEquals(o.get("t"), Integer.MAX_VALUE); } + @Test public void testIntMin() throws Exception { String s = "{t:" + Integer.MIN_VALUE + "}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertEquals(o.get("t"), Integer.MIN_VALUE); } + @Test public void testIntResult() throws Exception { String s = "{\"t\":1}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_RFC4627).parse(s); @@ -34,18 +40,21 @@ public void testIntResult() throws Exception { assertEquals(o.get("t"), Integer.valueOf(1)); } + @Test public void testInt() throws Exception { String s = "{t:90}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertEquals(o.get("t"), Integer.valueOf(90)); } + @Test public void testIntNeg() throws Exception { String s = "{t:-90}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertEquals(o.get("t"), -90); } + @Test public void testBigInt() throws Exception { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) @@ -57,6 +66,7 @@ public void testBigInt() throws Exception { assertEquals(o.get("t"), big); } + @Test public void testBigDoubleInt() throws Exception { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) @@ -74,6 +84,7 @@ public void testBigDoubleInt() throws Exception { assertEquals(o.get("t"), big); } + @Test public void testjunkTaillingData() throws Exception { String s = "{\"t\":124}$ifsisg045"; diff --git a/json-smart/src/test/java/net/minidev/json/test/TestInvalidNumber.java b/json-smart/src/test/java/net/minidev/json/test/TestInvalidNumber.java index b5a3b14a..1c90daae 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestInvalidNumber.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestInvalidNumber.java @@ -1,6 +1,10 @@ package net.minidev.json.test; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; + import net.minidev.json.JSONObject; import net.minidev.json.JSONStyle; import net.minidev.json.JSONValue; @@ -9,7 +13,7 @@ * @author uriel * */ -public class TestInvalidNumber extends TestCase { +public class TestInvalidNumber { private void validFloatAsFloat(String test) { JSONObject o = new JSONObject(); @@ -18,7 +22,7 @@ private void validFloatAsFloat(String test) { assertEquals("{a:\"" + test + "\"}", comp); o = JSONValue.parse(comp, JSONObject.class); Object convertedValue = o.get("a"); - assertEquals("Should handle valid number '" + test + "' as number", convertedValue, test); + assertEquals(convertedValue, test, "Should handle valid number '" + test + "' as number"); } private void invalidFloatAsText(String test) { @@ -28,45 +32,50 @@ private void invalidFloatAsText(String test) { assertEquals("{a:" + test + "}", comp); o = JSONValue.parse(comp, JSONObject.class); Object convertedValue = o.get("a"); - assertEquals("should handle invalid number '" + test + "' as string", convertedValue, test); + assertEquals(convertedValue, test, "should handle invalid number '" + test + "' as string"); } + @Test public void testF1() { validFloatAsFloat("51e88"); } + @Test public void testF2() { validFloatAsFloat("51e+88"); } + @Test public void testF3() { validFloatAsFloat("51e-88"); } + @Test public void testF4() { invalidFloatAsText("51ee88"); } + @Test public void testCVE_2021_27568() { try { JSONValue.parseWithException("{a:-.}"); - assertFalse("should Throws Exception before", true); + assertFalse(true, "should Throws Exception before"); } catch (Exception e) { - assertEquals("should throw EOF", e.getMessage(), "Unexpected token -. at position 5."); + assertEquals(e.getMessage(), "Unexpected token -. at position 5.", "should throw EOF"); } try { JSONValue.parseWithException("{a:2e+}"); - assertFalse("should Throws Exception before", true); + assertFalse(true, "should Throws Exception before"); } catch (Exception e) { - assertEquals("should throw EOF", e.getMessage(), "Unexpected token 2e+ at position 6."); + assertEquals(e.getMessage(), "Unexpected token 2e+ at position 6.", "should throw EOF"); } try { JSONValue.parseWithException("{a:[45e-}"); - assertFalse("should Throws Exception before", true); + assertFalse(true, "should Throws Exception before"); } catch (Exception e) { - assertEquals("should throw EOF", e.getMessage(), "Unexpected End Of File position 8: EOF"); + assertEquals(e.getMessage(), "Unexpected End Of File position 8: EOF", "should throw EOF"); } } } diff --git a/json-smart/src/test/java/net/minidev/json/test/TestKeyword.java b/json-smart/src/test/java/net/minidev/json/test/TestKeyword.java index 74572300..f55265e3 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestKeyword.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestKeyword.java @@ -3,10 +3,14 @@ import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; -import junit.framework.TestCase; -public class TestKeyword extends TestCase { +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +public class TestKeyword { + + @Test public void testBool() throws Exception { String s = "{t:true}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); @@ -17,18 +21,21 @@ public void testBool() throws Exception { assertEquals(o.get("t"), false); } + @Test public void testNull() throws Exception { String s = "{t:null}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertNull(o.get("t")); } + @Test public void testNaN() throws Exception { String s = "{t:NaN}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertEquals(o.get("t"), Float.NaN); } + @Test public void testNaNStrict() throws Exception { String s = "{\"t\":NaN}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_TOKEN); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestMisc.java b/json-smart/src/test/java/net/minidev/json/test/TestMisc.java index e31e4cdb..9fe0a002 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestMisc.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestMisc.java @@ -1,17 +1,22 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; -public class TestMisc extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +public class TestMisc { + + @Test public void testIssue23() throws Exception { String s = JSONValue.toJSONString(new int[] { 1, 2, 50, 1234, 10000 }); assertEquals("[1,2,50,1234,10000]", s); } + @Test public void testEmptyStrict() throws Exception { String s = "{\"key1\":\"v1\", \"key2\":{}, \"key3\":[]}"; JSONObject o = (JSONObject) JSONValue.parseStrict(s); @@ -21,6 +26,7 @@ public void testEmptyStrict() throws Exception { assertEquals(((JSONArray) o.get("key3")).size(), 0); } + @Test public void testBool() throws Exception { String s = "{\"key1\":\"v1\", \"key2\":{}, \"key3\":[]}"; JSONObject o = (JSONObject) JSONValue.parseWithException(s); @@ -30,30 +36,35 @@ public void testBool() throws Exception { assertEquals(((JSONArray) o.get("key3")).size(), 0); } + @Test public void testInt() throws Exception { String s = "123"; Object o = JSONValue.parseWithException(s); assertEquals(o, 123); } + @Test public void testFloat() throws Exception { String s = "123.5"; Object o = JSONValue.parseWithException(s); assertEquals(o, Double.valueOf(123.5)); } + @Test public void testFloat2() throws Exception { String s = "123.5E1"; Object o = JSONValue.parseWithException(s); assertEquals(o, Double.valueOf(1235)); } + @Test public void testFloat3() throws Exception { String s = "123..5"; Object o = JSONValue.parseWithException(s); assertEquals(o, "123..5"); } + @Test public void testFloat4() throws Exception { String s = "123é.5"; Object o = JSONValue.parseWithException(s); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestNavi.java b/json-smart/src/test/java/net/minidev/json/test/TestNavi.java index f4d22f82..63345d20 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestNavi.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestNavi.java @@ -1,10 +1,14 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONAwareEx; import net.minidev.json.JSONNavi; -public class TestNavi extends TestCase { +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class TestNavi { + @Test public void testNaviWrite() { JSONNavi nav = JSONNavi.newInstance(); nav.set("name", "jhone").set("age", 42).at("childName").add("fifi", "riri", "loulou").up().at("cat") @@ -14,6 +18,7 @@ public void testNaviWrite() { assertEquals(s1, s2); } + @Test public void testNaviWrite2() { JSONNavi nav = JSONNavi.newInstance(); nav.at("name").set("toto").up().set("tutu", "V2").at("size").set("width", 10).set("higth", 35).up(3) @@ -26,11 +31,12 @@ public void testNaviWrite2() { assertEquals(s1, s2); } + @Test public void testNaviRead() { String json = "{name:foo,str:null,ar:[1,2,3,4]}"; JSONNavi nav = new JSONNavi(json, JSONAwareEx.class); nav.at(5); - assertTrue("Navigator should be in error stat", nav.hasFailure()); + assertTrue(nav.hasFailure(), "Navigator should be in error stat"); nav.root(); assertEquals(3, nav.at("ar").at(2).asInt()); nav.up(2); @@ -39,6 +45,7 @@ public void testNaviRead() { assertEquals("foo", nav.at("name").asString()); } + @Test public void testNaviWriteArray() { String expected = "{'type':'bundle','data':[{'type':'object','name':'obj1'},{'type':'object','name':'obj2'}]}".replace('\'', '"'); JSONNavi nav = JSONNavi.newInstance(); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestNumberPrecision.java b/json-smart/src/test/java/net/minidev/json/test/TestNumberPrecision.java index 829b0a2d..62c91ee3 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestNumberPrecision.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestNumberPrecision.java @@ -1,12 +1,16 @@ package net.minidev.json.test; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.math.BigInteger; -import junit.framework.TestCase; import net.minidev.json.JSONArray; import net.minidev.json.JSONValue; -public class TestNumberPrecision extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestNumberPrecision { + @Test public void testMaxLong() { Long v = Long.MAX_VALUE; String s = "[" + v + "]"; @@ -15,6 +19,7 @@ public void testMaxLong() { assertEquals(v, r); } + @Test public void testMinLong() { Long v = Long.MIN_VALUE; String s = "[" + v + "]"; @@ -23,6 +28,7 @@ public void testMinLong() { assertEquals(v, r); } + @Test public void testMinBig() { BigInteger v = BigInteger.valueOf(Long.MIN_VALUE).subtract(BigInteger.ONE); String s = "[" + v + "]"; @@ -31,6 +37,7 @@ public void testMinBig() { assertEquals(v, r); } + @Test public void testMaxBig() { BigInteger v = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE); String s = "[" + v + "]"; diff --git a/json-smart/src/test/java/net/minidev/json/test/TestStrict.java b/json-smart/src/test/java/net/minidev/json/test/TestStrict.java index f58232e6..b41ae73b 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestStrict.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestStrict.java @@ -1,12 +1,16 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; -public class TestStrict extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +public class TestStrict { + + @Test public void testS1() throws Exception { String text = "My Test"; String s = "{t:\"" + text + "\"}"; @@ -14,6 +18,7 @@ public void testS1() throws Exception { assertEquals(o.get("t"), text); } + @Test public void testS2() throws Exception { String text = "My Test"; String s = "{t:'" + text + "'}"; @@ -21,6 +26,7 @@ public void testS2() throws Exception { assertEquals(o.get("t"), text); } + @Test public void testSEscape() throws Exception { String text = "My\r\nTest"; String text2 = "My\\r\\nTest"; @@ -29,6 +35,7 @@ public void testSEscape() throws Exception { assertEquals(o.get("t"), text); } + @Test public void testBadString() throws Exception { String s = "{\"t\":\"Before\u000CAfter\"}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); @@ -44,6 +51,7 @@ public void testBadString() throws Exception { /** * issue report gitHub 8 by jochenberger */ + @Test public void testDataAfterValue() throws Exception { String s = "{\"foo\":\"bar\"x}"; MustThrows.testInvalidJson(s, JSONParser.MODE_STRICTEST | JSONParser.ACCEPT_TAILLING_SPACE, ParseException.ERROR_UNEXPECTED_TOKEN); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestString.java b/json-smart/src/test/java/net/minidev/json/test/TestString.java index 3720b419..b9254868 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestString.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestString.java @@ -1,16 +1,21 @@ package net.minidev.json.test; -import junit.framework.TestCase; import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; -public class TestString extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +public class TestString { + + @Test public void testS0() throws Exception { MustThrows.testStrictInvalidJson("{\"1\":\"one\"\n\"2\":\"two\"}", ParseException.ERROR_UNEXPECTED_TOKEN); } + @Test public void testS1() throws Exception { String text = "My Test"; String s = "{t:\"" + text + "\"}"; @@ -18,6 +23,7 @@ public void testS1() throws Exception { assertEquals(o.get("t"), text); } + @Test public void testS2() throws Exception { String text = "My Test"; String s = "{t:'" + text + "'}"; @@ -25,6 +31,7 @@ public void testS2() throws Exception { assertEquals(o.get("t"), text); } + @Test public void testSEscape() throws Exception { String text = "My\r\nTest"; String text2 = "My\\r\\nTest"; @@ -33,6 +40,7 @@ public void testSEscape() throws Exception { assertEquals(o.get("t"), text); } + @Test public void testBadString() throws Exception { String s = "{\"t\":\"Before\u000CAfter\"}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestStringStrict.java b/json-smart/src/test/java/net/minidev/json/test/TestStringStrict.java index 4e1d5334..c8fb77f7 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestStringStrict.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestStringStrict.java @@ -1,15 +1,19 @@ package net.minidev.json.test; +import org.junit.jupiter.api.Test; + import net.minidev.json.parser.ParseException; -import junit.framework.TestCase; -public class TestStringStrict extends TestCase { +public class TestStringStrict { + @Test public void testS1() throws Exception { String text = "My Test"; String s = "{t:\"" + text + "\"}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_TOKEN); } + + @Test public void testSEscape() throws Exception { String text2 = "My\\r\\nTest"; String s = "{\"t\":'" + text2 + "'}"; diff --git a/json-smart/src/test/java/net/minidev/json/test/TestTruncated.java b/json-smart/src/test/java/net/minidev/json/test/TestTruncated.java index e22efe17..8c6ea839 100644 --- a/json-smart/src/test/java/net/minidev/json/test/TestTruncated.java +++ b/json-smart/src/test/java/net/minidev/json/test/TestTruncated.java @@ -1,20 +1,24 @@ package net.minidev.json.test; import net.minidev.json.parser.ParseException; -import junit.framework.TestCase; -public class TestTruncated extends TestCase { +import org.junit.jupiter.api.Test; +public class TestTruncated { + + @Test public void testS1() throws Exception { String s = "{\"key\":{}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_EOF); } + @Test public void testS2() throws Exception { String s = "{\"key\":"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_EOF); } + @Test public void testS3() throws Exception { String s = "{\"key\":123"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_EOF); diff --git a/json-smart/src/test/java/net/minidev/json/test/TestUtf8.java b/json-smart/src/test/java/net/minidev/json/test/TestUtf8.java deleted file mode 100644 index b3576ef2..00000000 --- a/json-smart/src/test/java/net/minidev/json/test/TestUtf8.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.minidev.json.test; - -import java.io.ByteArrayInputStream; -import java.io.StringReader; - -import junit.framework.TestCase; -import net.minidev.json.JSONObject; -import net.minidev.json.JSONValue; - -public class TestUtf8 extends TestCase { - // Sinhalese language - static String[] nonLatinTexts = new String[] { "සිංහල ජාතිය", "日本語", "Русский", "فارسی", "한국어", "Հայերեն", "हिन्दी", "עברית", "中文", "አማርኛ", "മലയാളം", - "ܐܬܘܪܝܐ", "მარგალური" }; - - public void testString() throws Exception { - for (String nonLatinText : nonLatinTexts) { - String s = "{\"key\":\"" + nonLatinText + "\"}"; - JSONObject obj = (JSONObject) JSONValue.parse(s); - String v = (String) obj.get("key"); // result is incorrect - assertEquals(v, nonLatinText); - } - } - - public void testReader() throws Exception { - for (String nonLatinText : nonLatinTexts) { - String s = "{\"key\":\"" + nonLatinText + "\"}"; - StringReader reader = new StringReader(s); - JSONObject obj = (JSONObject) JSONValue.parse(reader); - - String v = (String) obj.get("key"); // result is incorrect - assertEquals(v, nonLatinText); - } - } - - public void testInputStream() throws Exception { - for (String nonLatinText : nonLatinTexts) { - String s = "{\"key\":\"" + nonLatinText + "\"}"; - ByteArrayInputStream bis = new ByteArrayInputStream(s.getBytes("utf8")); - JSONObject obj = (JSONObject) JSONValue.parse(bis); - String v = (String) obj.get("key"); // result is incorrect - assertEquals(v, nonLatinText); - } - } - - public void testBytes() throws Exception { - for (String nonLatinText : nonLatinTexts) { - String s = "{\"key\":\"" + nonLatinText + "\"}"; - byte[] bs = s.getBytes("utf8"); - JSONObject obj = (JSONObject) JSONValue.parse(bs); - String v = (String) obj.get("key"); // result is incorrect - assertEquals(v, nonLatinText); - } - } -} diff --git a/json-smart/src/test/java/net/minidev/json/test/strict/TestExcessiveComma.java b/json-smart/src/test/java/net/minidev/json/test/strict/TestExcessiveComma.java index 6d072929..22a613fb 100644 --- a/json-smart/src/test/java/net/minidev/json/test/strict/TestExcessiveComma.java +++ b/json-smart/src/test/java/net/minidev/json/test/strict/TestExcessiveComma.java @@ -1,47 +1,55 @@ package net.minidev.json.test.strict; -import junit.framework.TestCase; import net.minidev.json.JSONValue; import net.minidev.json.parser.ParseException; import net.minidev.json.test.MustThrows; -public class TestExcessiveComma extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestExcessiveComma { + @Test public void testExcessiveComma1A() throws Exception { String s = "[1,2,,3]"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); JSONValue.parseWithException(s); } + @Test public void testExcessiveComma2A() throws Exception { String s = "[1,2,]"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); JSONValue.parseWithException(s); } + @Test public void testExcessiveComma3A() throws Exception { String s = "[,]"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); JSONValue.parseWithException(s); } + @Test public void testExcessiveComma4A() throws Exception { String s = "[,5]"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); JSONValue.parseWithException(s); } + @Test public void testExcessiveComma1O() throws Exception { String s = "{\"a\":1,,\"b\":1}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); JSONValue.parseWithException(s); } + @Test public void testExcessiveComma2O() throws Exception { String s = "{\"a\":1,}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); JSONValue.parseWithException(s); } + @Test public void testExcessiveComma3O() throws Exception { String s = "{,}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_CHAR); diff --git a/json-smart/src/test/java/net/minidev/json/test/strict/TestSpecialChar.java b/json-smart/src/test/java/net/minidev/json/test/strict/TestSpecialChar.java index d6dadd0c..3041332f 100644 --- a/json-smart/src/test/java/net/minidev/json/test/strict/TestSpecialChar.java +++ b/json-smart/src/test/java/net/minidev/json/test/strict/TestSpecialChar.java @@ -1,6 +1,9 @@ package net.minidev.json.test.strict; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + import net.minidev.json.JSONArray; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; @@ -11,8 +14,9 @@ * @author uriel * */ -public class TestSpecialChar extends TestCase { +public class TestSpecialChar { + @Test public void testSpecial127() throws Exception { String s127 = String.format("%c", 127); String s = String.format("[\"%c\"]", 127); @@ -22,6 +26,7 @@ public void testSpecial127() throws Exception { assertEquals(o.get(0), s127); } + @Test public void testSpecial31() throws Exception { String s = String.format("[\"%c\"]", 31); MustThrows.testInvalidJson(s, JSONParser.MODE_STRICTEST, ParseException.ERROR_UNEXPECTED_CHAR); diff --git a/json-smart/src/test/java/net/minidev/json/test/strict/TestTaillingJunk.java b/json-smart/src/test/java/net/minidev/json/test/strict/TestTaillingJunk.java index 9b204acd..c710b7f0 100644 --- a/json-smart/src/test/java/net/minidev/json/test/strict/TestTaillingJunk.java +++ b/json-smart/src/test/java/net/minidev/json/test/strict/TestTaillingJunk.java @@ -1,16 +1,20 @@ package net.minidev.json.test.strict; -import junit.framework.TestCase; import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; import net.minidev.json.test.MustThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + /** * @since 1.0.7 */ -public class TestTaillingJunk extends TestCase { +public class TestTaillingJunk { + @Test public void testTaillingSpace() throws Exception { String s = "{\"t\":0} "; MustThrows.testInvalidJson(s, JSONParser.MODE_STRICTEST, ParseException.ERROR_UNEXPECTED_TOKEN); @@ -20,23 +24,27 @@ public void testTaillingSpace() throws Exception { assertEquals(o.get("t"), 0); } + @Test public void testTaillingSpace2() throws Exception { String s = "{\"t\":0} \r\n "; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_STRICTEST | JSONParser.ACCEPT_TAILLING_SPACE).parse(s); assertEquals(o.get("t"), 0); } + @Test public void testTaillingData() throws Exception { String s = "{\"t\":0} 0"; MustThrows.testInvalidJson(s, JSONParser.MODE_STRICTEST, ParseException.ERROR_UNEXPECTED_TOKEN, null); } + @Test public void testTaillingDataPermisive() throws Exception { String s = "{\"t\":0} 0"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); assertEquals(o.get("t"), 0); } + @Test public void testTaillingDataWithSpaceAllowed() throws Exception { String s = "{\"t\":0}{"; MustThrows.testInvalidJson(s, JSONParser.MODE_STRICTEST | JSONParser.ACCEPT_TAILLING_SPACE, ParseException.ERROR_UNEXPECTED_TOKEN); diff --git a/json-smart/src/test/java/net/minidev/json/test/strict/TestZeroLead.java b/json-smart/src/test/java/net/minidev/json/test/strict/TestZeroLead.java index 0ed53e00..723e6139 100644 --- a/json-smart/src/test/java/net/minidev/json/test/strict/TestZeroLead.java +++ b/json-smart/src/test/java/net/minidev/json/test/strict/TestZeroLead.java @@ -1,6 +1,5 @@ package net.minidev.json.test.strict; -import junit.framework.TestCase; import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; @@ -8,11 +7,16 @@ import net.minidev.json.parser.ParseException; import net.minidev.json.test.MustThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + /** * @since 1.0.7 */ -public class TestZeroLead extends TestCase { +public class TestZeroLead { + @Test public void test0O() throws Exception { String s = "{\"t\":0}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_RFC4627).parse(s); @@ -20,6 +24,7 @@ public void test0O() throws Exception { JSONValue.parseWithException(s); } + @Test public void test0A() throws Exception { String s = "[0]"; JSONArray o = (JSONArray) new JSONParser(JSONParser.MODE_RFC4627).parse(s); @@ -27,6 +32,7 @@ public void test0A() throws Exception { JSONValue.parseWithException(s); } + @Test public void test0Float() throws Exception { String s = "[00.0]"; // strict @@ -35,6 +41,7 @@ public void test0Float() throws Exception { JSONValue.parseWithException(s); } + @Test public void test01Float() throws Exception { String s = "[01.0]"; // strict @@ -43,6 +50,7 @@ public void test01Float() throws Exception { JSONValue.parseWithException(s); } + @Test public void test00001() throws Exception { String s = "{\"t\":00001}"; JSONObject o = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); @@ -50,21 +58,10 @@ public void test00001() throws Exception { JSONValue.parseWithException(s); } + @Test public void test00001Strict() throws Exception { String s = "{\"t\":00001}"; MustThrows.testStrictInvalidJson(s, ParseException.ERROR_UNEXPECTED_LEADING_0); JSONValue.parseWithException(s); } - - // disable in 1.1 - // public void testDup() throws Exception { - // String s = "{'t':1,'t':2}"; - // try { - // new JSONParser(JSONParser.MODE_PERMISSIVE).parse(s); - // assertEquals("Should Stack", ""); - // } catch (ParseException e) { - // assertEquals(ParseException.ERROR_UNEXPECTED_DUPLICATE_KEY, e.getErrorType()); - // } - // } - } diff --git a/json-smart/src/test/java/net/minidev/json/test/writer/TestWriteFeatures.java b/json-smart/src/test/java/net/minidev/json/test/writer/TestWriteFeatures.java index cf99e67b..21d0511a 100644 --- a/json-smart/src/test/java/net/minidev/json/test/writer/TestWriteFeatures.java +++ b/json-smart/src/test/java/net/minidev/json/test/writer/TestWriteFeatures.java @@ -1,11 +1,15 @@ package net.minidev.json.test.writer; -import junit.framework.TestCase; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + import net.minidev.json.JSONStyle; import net.minidev.json.JSONValue; -public class TestWriteFeatures extends TestCase { +public class TestWriteFeatures { + @Test public void testS1() throws Exception { Beans beans = new Beans(); String s = JSONValue.toJSONString(beans, JSONStyle.MAX_COMPRESS); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestAdvancedMapper.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestAdvancedMapper.java index 71e4abac..d08ebc59 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestAdvancedMapper.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestAdvancedMapper.java @@ -1,15 +1,19 @@ package net.minidev.json.testMapping; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.text.SimpleDateFormat; import java.util.Date; -import junit.framework.TestCase; +import org.junit.jupiter.api.Test; + import net.minidev.asm.BeansAccessConfig; import net.minidev.json.JSONValue; -public class TestAdvancedMapper extends TestCase { +public class TestAdvancedMapper { public static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + @Test public void testCustomBean() throws Exception { BeansAccessConfig.addTypeMapper(Object.class, MyLocalConverterot.class); String s = "{'val':2,'date':'19/04/2010'}"; diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestCustomMappingInstant.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestCustomMappingInstant.java index 49884c64..1076f58e 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestCustomMappingInstant.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestCustomMappingInstant.java @@ -2,11 +2,12 @@ import java.io.IOException; -import junit.framework.TestCase; import net.minidev.json.JSONStyle; import net.minidev.json.JSONValue; import net.minidev.json.parser.ParseException; +import org.junit.jupiter.api.Test; + /** * Test JDK 8+ java.time.Instant * @@ -15,8 +16,9 @@ * @author uriel * */ -public class TestCustomMappingInstant extends TestCase { +public class TestCustomMappingInstant { + @Test public void test_dummy() throws IOException { @SuppressWarnings("unused") ParseException e = null; diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestDate.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestDate.java index d515dda8..b4a386bf 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestDate.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestDate.java @@ -1,9 +1,13 @@ package net.minidev.json.testMapping; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestDate extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class TestDate { + @Test public void testBooleans() throws Exception { String s = "[true,true,false]"; boolean[] bs = new boolean[] { true, true, false }; @@ -11,6 +15,7 @@ public void testBooleans() throws Exception { assertEquals(s, s2); } + @Test public void testInts() throws Exception { String s = "[1,2,3]"; int[] bs = new int[] { 1, 2, 3 }; diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestFieldRename.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestFieldRename.java index 201206f0..d5a06631 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestFieldRename.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestFieldRename.java @@ -1,15 +1,20 @@ package net.minidev.json.testMapping; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestFieldRename extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class TestFieldRename { public static class TRen { public String new_; public String default_; } + @Test public void testRemap() throws Exception { String text = "{'new':'foo','default':'bar'}"; JSONValue.remapField(TRen.class, "default", "default_"); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapBeans.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapBeans.java index 54e0a71b..6faaa205 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapBeans.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapBeans.java @@ -2,35 +2,42 @@ import java.util.Map; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestMapBeans extends TestCase { +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +public class TestMapBeans { + + @Test public void testObjInts() throws Exception { String s = "{\"vint\":[1,2,3]}"; T1 r = JSONValue.parse(s, T1.class); assertEquals(3, r.vint[2]); } + @Test public void testObjIntKey() throws Exception { String s = "{\"data\":{\"1\":\"toto\"}}"; T2 r = JSONValue.parse(s, T2.class); assertEquals("toto", r.data.get(1)); } + @Test public void testObjEnumKey() throws Exception { String s = "{\"data\":{\"red\":10}}"; T3 r = JSONValue.parse(s, T3.class); assertEquals((Integer)10, r.data.get(ColorEnum.red)); } + @Test public void testObjBool1() throws Exception { String s = "{\"data\":true}"; T4 r = JSONValue.parse(s, T4.class); assertEquals(true, r.data); } + @Test public void testObjBool2() throws Exception { String s = "{\"data\":true}"; T5 r = JSONValue.parse(s, T5.class); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPrimArrays.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPrimArrays.java index 0dabfd92..890c1b9c 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPrimArrays.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPrimArrays.java @@ -1,15 +1,20 @@ package net.minidev.json.testMapping; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestMapPrimArrays extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class TestMapPrimArrays { + @Test public void testInts() throws Exception { String s = "[1,2,3]"; int[] r = JSONValue.parse(s, int[].class); assertEquals(3, r[2]); } + @Test public void testIntss() throws Exception { String s = "[[1],[2],[3,4]]"; int[][] r = JSONValue.parse(s, int[][].class); @@ -17,24 +22,28 @@ public void testIntss() throws Exception { assertEquals(4, r[2][1]); } + @Test public void testLongs() throws Exception { String s = "[1,2,3]"; long[] r = JSONValue.parse(s, long[].class); assertEquals(3, r[2]); } + @Test public void testFloat() throws Exception { String s = "[1.2,22.4,3.14]"; float[] r = JSONValue.parse(s, float[].class); assertEquals(3.14F, r[2]); } + @Test public void testDouble() throws Exception { String s = "[1.2,22.4,3.14]"; double[] r = JSONValue.parse(s, double[].class); assertEquals(3.14, r[2]); } + @Test public void testBooleans() throws Exception { String s = "[true,true,false]"; boolean[] r = JSONValue.parse(s, boolean[].class); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic.java index ba046aa9..670f8828 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic.java @@ -1,12 +1,16 @@ package net.minidev.json.testMapping; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.Map; import java.util.TreeMap; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestMapPublic extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestMapPublic { + @Test public void testObjInts() throws Exception { String s = "{\"vint\":[1,2,3]}"; T1 r = JSONValue.parse(s, T1.class); @@ -15,6 +19,7 @@ public void testObjInts() throws Exception { String MultiTyepJson = "{\"name\":\"B\",\"age\":120,\"cost\":12000,\"flag\":3,\"valid\":true,\"f\":1.2,\"d\":1.5,\"l\":12345678912345}"; + @Test public void testObjMixte() throws Exception { T2 r = JSONValue.parse(MultiTyepJson, T2.class); assertEquals("B", r.name); @@ -27,6 +32,7 @@ public void testObjMixte() throws Exception { assertEquals(12345678912345L, r.l); } + @Test public void testObjMixtePrim() throws Exception { T3 r = JSONValue.parse(MultiTyepJson, T3.class); assertEquals("B", r.name); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic2.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic2.java index 7e15a4b6..b0a19b92 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic2.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestMapPublic2.java @@ -1,19 +1,24 @@ package net.minidev.json.testMapping; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.Map; import java.util.TreeMap; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestMapPublic2 extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestMapPublic2 { String s = "{\"data\":{\"a\":\"b\"}}"; + @Test public void testMapPublicInterface() throws Exception { T5 r = JSONValue.parse(s, T5.class); assertEquals(1, r.data.size()); } + @Test public void testMapPublicMapClass() throws Exception { T6 r = JSONValue.parse(s, T6.class); assertEquals(1, r.data.size()); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestSerPrimArrays.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestSerPrimArrays.java index 03e5b35a..5c3c67bd 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestSerPrimArrays.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestSerPrimArrays.java @@ -1,12 +1,15 @@ package net.minidev.json.testMapping; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.text.SimpleDateFormat; import java.util.Date; -import junit.framework.TestCase; import net.minidev.json.JSONValue; -public class TestSerPrimArrays extends TestCase { +import org.junit.jupiter.api.Test; + +public class TestSerPrimArrays { SimpleDateFormat sdf; String testDateString; @@ -22,12 +25,14 @@ public TestSerPrimArrays() { } + @Test public void testDate() throws Exception { String s = "'" + testDateString + "'"; Date dt = JSONValue.parse(s, Date.class); assertEquals(dt, this.testDate); } + @Test public void testDtObj() throws Exception { String s = "{date:'" + testDateString + "'}"; ADate dt = JSONValue.parse(s, ADate.class); diff --git a/json-smart/src/test/java/net/minidev/json/testMapping/TestUpdater.java b/json-smart/src/test/java/net/minidev/json/testMapping/TestUpdater.java index bd3c0759..3f279f01 100644 --- a/json-smart/src/test/java/net/minidev/json/testMapping/TestUpdater.java +++ b/json-smart/src/test/java/net/minidev/json/testMapping/TestUpdater.java @@ -1,14 +1,18 @@ package net.minidev.json.testMapping; -import junit.framework.TestCase; import net.minidev.json.JSONValue; import net.minidev.json.testMapping.TestMapPublic.T123; import net.minidev.json.testMapping.TestMapPublic.T1; import net.minidev.json.testMapping.TestMapPublic.T2; import net.minidev.json.testMapping.TestMapPublic.T3; -public class TestUpdater extends TestCase { +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +public class TestUpdater { + + @Test public void testUpdate1() throws Exception { T3 t3 = new T3(); t3.age = 20; @@ -22,6 +26,7 @@ public void testUpdate1() throws Exception { assertEquals((Long) 120000L, t3.l); } + @Test public void testUpdateExistingBeans() throws Exception { T123 t123 = new T123(); T1 t1 = new T1(); @@ -39,6 +44,7 @@ public void testUpdateExistingBeans() throws Exception { assertEquals(res.t3.name, "valueT3"); } + @Test public void testUpdateNullBean() throws Exception { T123 t123 = new T123(); T1 t1 = new T1(); diff --git a/pom.xml b/pom.xml index 57b87b2b..65a502a5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 net.minidev minidev-parent - 2.4 + 2.4.1 Minidev super pom minidev common properties. pom @@ -95,7 +95,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.3 + 2.10.4 false @@ -219,7 +219,7 @@ org.apache.maven.plugins maven-release-plugin - 2.5.2 + 2.5.3 forked-path -Psonatype-oss-release @@ -266,9 +266,16 @@ ${project.version} - junit - junit - 4.13.1 + org.junit.jupiter + junit-jupiter-api + 5.7.1 + test + + + org.junit.jupiter + junit-jupiter-params + 5.7.1 + test