From 7c7cef44ecedbe2d346e793409759b105158014b Mon Sep 17 00:00:00 2001 From: Giao Ho Date: Mon, 20 Mar 2023 11:51:24 +0700 Subject: [PATCH] Backup and restore value for enum --- .../joutvhu/model/tester/EqualsTester.java | 26 +++++++- .../model/tester/GetterSetterTester.java | 64 ++++++++++++++++--- 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/joutvhu/model/tester/EqualsTester.java b/src/main/java/com/joutvhu/model/tester/EqualsTester.java index f316573..2f60e45 100644 --- a/src/main/java/com/joutvhu/model/tester/EqualsTester.java +++ b/src/main/java/com/joutvhu/model/tester/EqualsTester.java @@ -2,7 +2,9 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; class EqualsTester implements Tester { @@ -61,9 +63,19 @@ private void deepTest(T model, T newModel) { } private void deepTest(T model, T newModel, Field[] fields, Set tested) { + boolean restore = modelClass.isEnum(); + Map backup = new HashMap<>(); for (Field field : fields) { try { - if (!tested.contains(field) && !Modifier.isFinal(field.getModifiers())) { + if (restore) { + field.setAccessible(true); + backup.put(field, field.get(model)); + } + } catch (Throwable e) { + // Do nothing + } + try { + if (!tested.contains(field) && !Modifier.isFinal(field.getModifiers()) && !Modifier.isStatic(field.getModifiers())) { tested.add(field); field.setAccessible(true); Class fieldType = field.getType(); @@ -89,6 +101,18 @@ else if (fieldType == short.class) field.set(newModel, field.get(model)); } } catch (Throwable e) { + // Do nothing + } + } + if (restore && !backup.isEmpty()) { + for (Map.Entry entry : backup.entrySet()) { + try { + Field field = entry.getKey(); + Object value = entry.getValue(); + field.set(model, value); + } catch (Throwable e) { + // Do nothing + } } } } diff --git a/src/main/java/com/joutvhu/model/tester/GetterSetterTester.java b/src/main/java/com/joutvhu/model/tester/GetterSetterTester.java index b637dcf..14df1eb 100644 --- a/src/main/java/com/joutvhu/model/tester/GetterSetterTester.java +++ b/src/main/java/com/joutvhu/model/tester/GetterSetterTester.java @@ -1,7 +1,9 @@ package com.joutvhu.model.tester; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -46,33 +48,49 @@ private boolean testMethods(T model, Method[] methods, Set tested) { if (isGetter(method)) { Field field = getField(method); if (checkName(method, field)) { - boolean result = field != null ? - testGetter(model, method, field) : - testGetter(model, method); - if (success) success = result; + if (field != null && method.getReturnType().equals(field.getType()) && + !Modifier.isFinal(field.getModifiers()) && + !Modifier.isStatic(field.getModifiers())) { + success = testGetter(model, method, field) && success; + } else { + success = testGetter(model, method) && success; + } } } else if (isSetter(method)) { Field field = getField(method); if (checkName(method, field)) { - boolean result = field != null ? - testSetter(model, method, field) : - testSetter(model, method); - if (success) success = result; + if (field != null && method.getParameterTypes()[0].equals(field.getType()) && + !Modifier.isFinal(field.getModifiers()) && + !Modifier.isStatic(field.getModifiers())) { + success = testSetter(model, method, field) && success; + } else { + success = testSetter(model, method) && success; + } } } } return success; } - private Object createTestValue(Class fieldClass) { + private Object createTestValue(Class fieldClass) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { try { return Creator.anyOf(fieldClass).create(); } catch (Throwable e) { - return null; + if (Creator.isNullable(fieldClass)) + return null; + throw e; } } private boolean testGetter(T model, Method method, Field field) { + boolean restore = modelClass.isEnum(); + Object backup = null; + try { + field.setAccessible(true); + backup = field.get(model); + } catch (Throwable e) { + restore = false; + } try { Object value = createTestValue(field.getType()); field.setAccessible(true); @@ -88,6 +106,15 @@ private boolean testGetter(T model, Method method, Field field) { } catch (Throwable e) { System.err.println("Error: " + modelClass.getName() + "." + method.getName() + "()"); e.printStackTrace(); + } finally { + if (restore) { + try { + field.setAccessible(true); + field.set(model, backup); + } catch (Throwable e) { + // Do nothing + } + } } return false; } @@ -106,6 +133,14 @@ private boolean testGetter(T model, Method method) { } private boolean testSetter(T model, Method method, Field field) { + boolean restore = modelClass.isEnum(); + Object backup = null; + try { + field.setAccessible(true); + backup = field.get(model); + } catch (Throwable e) { + restore = false; + } try { Object value = createTestValue(method.getParameterTypes()[0]); method.setAccessible(true); @@ -121,6 +156,15 @@ private boolean testSetter(T model, Method method, Field field) { } catch (Throwable e) { System.err.println("Error: " + modelClass.getName() + "." + method.getName() + "(" + method.getParameterTypes()[0].getName() + ")"); e.printStackTrace(); + } finally { + if (restore) { + try { + field.setAccessible(true); + field.set(model, backup); + } catch (Throwable e) { + // Do nothing + } + } } return false; }