diff --git a/pom.xml b/pom.xml index d16ac36..2ed5b0e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,19 +6,35 @@ xyz.zhouxy.plusone plusone-commons - 1.0.0-RC2 + 1.0.0-RC3 + UTF-8 1.8 1.8 1.8 - 3.17.0 - 33.3.1-jre + + + 33.4.0-jre 2.13.0 + + + 3.17.0 + 1.2.13 + 5.11.4 + 1.18.36 + 5.8.35 + 3.5.19 + 2.2.224 + 2.18.2 + 2.12.1 + + + com.google.guava guava @@ -32,7 +48,7 @@ true - + org.apache.commons @@ -44,55 +60,55 @@ ch.qos.logback logback-classic - 1.2.11 + ${logback.version} test org.junit.jupiter junit-jupiter-api - 5.9.2 + ${junit.version} test org.junit.jupiter junit-jupiter-engine - 5.9.2 + ${junit.version} test org.junit.jupiter junit-jupiter-params - 5.9.2 + ${junit.version} test org.projectlombok lombok - 1.18.26 + ${lombok.version} true test cn.hutool - hutool-all - 5.8.25 + hutool-core + ${hutool.version} test org.mybatis mybatis - 3.5.17 + ${mybatis.version} test com.h2database h2 - 2.2.224 + ${h2.version} test @@ -100,20 +116,20 @@ com.fasterxml.jackson.core jackson-databind - 2.13.5 + ${jackson.version} test com.fasterxml.jackson.datatype jackson-datatype-jsr310 - 2.13.5 + ${jackson.version} test com.google.code.gson gson - 2.11.0 + ${gson.version} test diff --git a/src/main/java/xyz/zhouxy/plusone/commons/annotation/ReaderMethod.java b/src/main/java/xyz/zhouxy/plusone/commons/annotation/ReaderMethod.java index 2b84d99..8504f0c 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/annotation/ReaderMethod.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/annotation/ReaderMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import java.lang.annotation.Target; * * @author ZhouXY * @since 1.0 + * @see WriterMethod */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/xyz/zhouxy/plusone/commons/annotation/Virtual.java b/src/main/java/xyz/zhouxy/plusone/commons/annotation/Virtual.java index 65fd6d2..3302ded 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/annotation/Virtual.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/annotation/Virtual.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,9 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 标识该方法是可虚方法。 + * 标识该方法是虚方法。 *

该注解用于提醒、强调父类虽然有默认实现,但子类可以根据自己的需要覆写。

- * + * * @author ZhouXY * @since 0.1.0 */ diff --git a/src/main/java/xyz/zhouxy/plusone/commons/annotation/WriterMethod.java b/src/main/java/xyz/zhouxy/plusone/commons/annotation/WriterMethod.java index 518217d..f2aa0fb 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/annotation/WriterMethod.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/annotation/WriterMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import java.lang.annotation.Target; * * @author ZhouXY * @since 1.0 + * @see ReaderMethod */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/xyz/zhouxy/plusone/commons/collection/CollectionTools.java b/src/main/java/xyz/zhouxy/plusone/commons/collection/CollectionTools.java index f5e671b..2f0c776 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/collection/CollectionTools.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/collection/CollectionTools.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,11 @@ import java.util.Set; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multiset; +import com.google.common.collect.RangeSet; +import com.google.common.collect.Table; + /** * 集合工具类 * @@ -33,9 +38,9 @@ import javax.annotation.Nullable; */ public class CollectionTools { - // TODO [添加] 新增其它集合类型,如 guava 的扩展集合等 - - // isEmpty + // ================================ + // #region - isEmpty + // ================================ public static boolean isEmpty(@Nullable Collection collection) { return collection == null || collection.isEmpty(); @@ -45,7 +50,29 @@ public class CollectionTools { return map == null || map.isEmpty(); } - // isNotEmpty + public static boolean isEmpty(@Nullable Table table) { + return table == null || table.isEmpty(); + } + + public static boolean isEmpty(@Nullable Multimap map) { + return map == null || map.isEmpty(); + } + + public static boolean isEmpty(@Nullable Multiset set) { + return set == null || set.isEmpty(); + } + + public static boolean isEmpty(@Nullable RangeSet set) { + return set == null || set.isEmpty(); + } + + // ================================ + // #endregion - isEmpty + // ================================ + + // ================================ + // #region - isNotEmpty + // ================================ public static boolean isNotEmpty(@Nullable Collection collection) { return collection != null && !collection.isEmpty(); @@ -55,6 +82,30 @@ public class CollectionTools { return map != null && !map.isEmpty(); } + public static boolean isNotEmpty(@Nullable Table table) { + return table != null && !table.isEmpty(); + } + + public static boolean isNotEmpty(@Nullable Multimap map) { + return map != null && !map.isEmpty(); + } + + public static boolean isNotEmpty(@Nullable Multiset set) { + return set != null && !set.isEmpty(); + } + + public static boolean isNotEmpty(@Nullable RangeSet set) { + return set != null && !set.isEmpty(); + } + + // ================================ + // #endregion - isNotEmpty + // ================================ + + // ================================ + // #region - nullToEmpty + // ================================ + @Nonnull public static List nullToEmptyList(@Nullable List list) { return list == null ? Collections.emptyList() : list; @@ -70,6 +121,10 @@ public class CollectionTools { return map == null ? Collections.emptyMap() : map; } + // ================================ + // #endregion - nullToEmpty + // ================================ + private CollectionTools() { throw new IllegalStateException("Utility class"); } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/exception/ExceptionType.java b/src/main/java/xyz/zhouxy/plusone/commons/exception/MultiTypesException.java similarity index 53% rename from src/main/java/xyz/zhouxy/plusone/commons/exception/ExceptionType.java rename to src/main/java/xyz/zhouxy/plusone/commons/exception/MultiTypesException.java index f8ad83b..60156c7 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/exception/ExceptionType.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/exception/MultiTypesException.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,30 +20,45 @@ import javax.annotation.Nonnull; import xyz.zhouxy.plusone.commons.base.IWithCode; /** - * 异常类型 + * MultiTypesException * *

- * 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的异常类型。 - * 该枚举实现本接口,用于基于不同类型创建异常。 + * 异常在不同场景下被抛出,可以用不同的枚举值,表示不同的场景类型。 + *

+ *

+ * 异常实现 {@link MultiTypesException} 的 {@link #getType} 方法,返回对应的场景类型。 + *

+ *

+ * 表示场景类型的枚举实现 {@link ExceptionType},其中的工厂方法用于创建类型对象。 + *

* *
- * public final class LoginException extends RuntimeException {
+ * public final class LoginException
+ *         extends RuntimeException
+ *         implements MultiTypesException<LoginException, LoginException.Type> {
  *     private final Type type;
- *     private LoginException(Type type, String message) {
+ *     private LoginException(@Nonnull Type type, @Nonnull String message) {
  *         super(message);
  *         this.type = type;
  *     }
  *
- *     private LoginException(Type type, Throwable cause) {
+ *     private LoginException(@Nonnull Type type, @Nonnull Throwable cause) {
  *         super(cause);
  *         this.type = type;
  *     }
  *
- *     private LoginException(Type type, String message, Throwable cause) {
+ *     private LoginException(@Nonnull Type type,
+ *                            @Nonnull String message,
+ *                            @Nonnull Throwable cause) {
  *         super(message, cause);
  *         this.type = type;
  *     }
  *
+ *     @Override
+ *     public @Nonnull Type getType() {
+ *         return this.type;
+ *     }
+ *
  *     // ...
  *
  *     public enum Type implements ExceptionType {
@@ -60,43 +75,38 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
  *         @Nonnull
  *         private final String defaultMessage;
  *
- *         Type(String code, String defaultMessage) {
+ *         Type(@Nonnull String code, @Nonnull String defaultMessage) {
  *             this.code = code;
  *             this.defaultMessage = defaultMessage;
  *         }
  *
  *         @Override
- *         @Nonnull
- *         public String getCode() {
+ *         public @Nonnull String getCode() {
  *             return code;
  *         }
  *
  *         @Override
- *         public String getDefaultMessage() {
+ *         public @Nonnull String getDefaultMessage() {
  *             return defaultMessage;
  *         }
  *
  *         @Override
- *         @Nonnull
- *         public LoginException create() {
+ *         public @Nonnull LoginException create() {
  *             return new LoginException(this, this.defaultMessage);
  *         }
  *
  *         @Override
- *         @Nonnull
- *         public LoginException create(String message) {
+ *         public @Nonnull LoginException create(String message) {
  *             return new LoginException(this, message);
  *         }
  *
  *         @Override
- *         @Nonnull
- *         public LoginException create(Throwable cause) {
+ *         public @Nonnull LoginException create(Throwable cause) {
  *             return new LoginException(this, cause);
  *         }
  *
  *         @Override
- *         @Nonnull
- *         public LoginException create(String message, Throwable cause) {
+ *         public @Nonnull LoginException create(String message, Throwable cause) {
  *             return new LoginException(this, message, cause);
  *         }
  *     }
@@ -109,22 +119,33 @@ import xyz.zhouxy.plusone.commons.base.IWithCode;
  * 
*

* - * @author ZhouXY + * @author ZhouXY + * @since 1.0.0 */ -public interface ExceptionType extends IWithCode { - - String getDefaultMessage(); +public interface MultiTypesException> { @Nonnull - E create(); + T getType(); - @Nonnull - E create(String message); + default @Nonnull String getTypeCode() { + return getType().getCode(); + } - @Nonnull - E create(Throwable cause); + public static interface ExceptionType extends IWithCode { - @Nonnull - E create(String message, Throwable cause); + String getDefaultMessage(); + @Nonnull + E create(); + + @Nonnull + E create(String message); + + @Nonnull + E create(Throwable cause); + + @Nonnull + E create(String message, Throwable cause); + + } } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java b/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java index 0a86545..69a1d65 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/exception/ParsingFailureException.java @@ -21,6 +21,7 @@ import java.time.format.DateTimeParseException; import javax.annotation.Nonnull; import xyz.zhouxy.plusone.commons.exception.business.RequestParamsException; +import xyz.zhouxy.plusone.commons.exception.MultiTypesException.ExceptionType; /** * 解析失败异常 @@ -37,7 +38,9 @@ import xyz.zhouxy.plusone.commons.exception.business.RequestParamsException; * @author ZhouXY * @since 0.1.0 */ -public final class ParsingFailureException extends RuntimeException { +public final class ParsingFailureException + extends RuntimeException + implements MultiTypesException { private final Type type; @@ -94,14 +97,12 @@ public final class ParsingFailureException extends RuntimeException { return Type.NUMBER_PARSING_FAILURE.create(message, cause); } + @Override + @Nonnull public Type getType() { return type; } - public String getCode() { - return this.type.code; - } - public static final Type DEFAULT = Type.DEFAULT; public static final Type NUMBER_PARSING_FAILURE = Type.NUMBER_PARSING_FAILURE; public static final Type DATE_TIME_PARSING_FAILURE = Type.DATE_TIME_PARSING_FAILURE; @@ -127,37 +128,32 @@ public final class ParsingFailureException extends RuntimeException { } @Override - @Nonnull - public String getCode() { + public @Nonnull String getCode() { return code; } @Override - public String getDefaultMessage() { + public @Nonnull String getDefaultMessage() { return defaultMessage; } @Override - @Nonnull - public ParsingFailureException create() { + public @Nonnull ParsingFailureException create() { return new ParsingFailureException(this, this.defaultMessage); } @Override - @Nonnull - public ParsingFailureException create(String message) { + public @Nonnull ParsingFailureException create(String message) { return new ParsingFailureException(this, message); } @Override - @Nonnull - public ParsingFailureException create(Throwable cause) { + public @Nonnull ParsingFailureException create(Throwable cause) { return new ParsingFailureException(this, cause); } @Override - @Nonnull - public ParsingFailureException create(String message, Throwable cause) { + public @Nonnull ParsingFailureException create(String message, Throwable cause) { return new ParsingFailureException(this, message, cause); } } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java b/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java index aacf7a6..ec4cb55 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/exception/business/InvalidInputException.java @@ -18,7 +18,8 @@ package xyz.zhouxy.plusone.commons.exception.business; import javax.annotation.Nonnull; -import xyz.zhouxy.plusone.commons.exception.ExceptionType; +import xyz.zhouxy.plusone.commons.exception.MultiTypesException.ExceptionType; +import xyz.zhouxy.plusone.commons.exception.MultiTypesException; /** * InvalidInputException @@ -33,7 +34,9 @@ import xyz.zhouxy.plusone.commons.exception.ExceptionType; * @author ZhouXY * @since 0.1.0 */ -public final class InvalidInputException extends RequestParamsException { +public final class InvalidInputException + extends RequestParamsException + implements MultiTypesException { private final Type type; @@ -73,14 +76,12 @@ public final class InvalidInputException extends RequestParamsException { this(Type.DEFAULT, message, cause); } + @Override + @Nonnull public Type getType() { return this.type; } - public Object getCode() { - return this.type.code; - } - public enum Type implements ExceptionType { DEFAULT("00", "用户输入内容非法"), CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS("01", "包含非法恶意跳转链接"), @@ -90,9 +91,9 @@ public final class InvalidInputException extends RequestParamsException { ; @Nonnull - final String code; + private final String code; @Nonnull - final String defaultMessage; + private final String defaultMessage; Type(String code, String defaultMsg) { this.code = code; @@ -100,37 +101,32 @@ public final class InvalidInputException extends RequestParamsException { } @Override - @Nonnull - public String getCode() { + public @Nonnull String getCode() { return code; } @Override - public String getDefaultMessage() { + public @Nonnull String getDefaultMessage() { return defaultMessage; } @Override - @Nonnull - public InvalidInputException create() { + public @Nonnull InvalidInputException create() { return new InvalidInputException(this); } @Override - @Nonnull - public InvalidInputException create(String message) { + public @Nonnull InvalidInputException create(String message) { return new InvalidInputException(this, message); } @Override - @Nonnull - public InvalidInputException create(Throwable cause) { + public @Nonnull InvalidInputException create(Throwable cause) { return new InvalidInputException(this, cause); } @Override - @Nonnull - public InvalidInputException create(String message, Throwable cause) { + public @Nonnull InvalidInputException create(String message, Throwable cause) { return new InvalidInputException(this, message, cause); } } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponse.java b/src/main/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponse.java index d33d0df..a4ac327 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponse.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,109 +17,107 @@ package xyz.zhouxy.plusone.commons.model.dto; import java.util.Objects; -import java.util.function.BooleanSupplier; -import java.util.function.Supplier; - import javax.annotation.Nullable; -import xyz.zhouxy.plusone.commons.util.AssertTools; - /** * 统一结果,对返回给前端的数据进行封装。 * + *

+ * SUCCESS: 2000000 + *

+ * * @author ZhouXY */ -public abstract class UnifiedResponse { +public class UnifiedResponse { - private Object status; + private String code; private String message; - private @Nullable Object data; + private @Nullable T data; - public static UnifiedResponse success() { - return new SuccessResult(); + // ================================ + // #region - Constructors + // ================================ + + private UnifiedResponse(String code, @Nullable String message) { + this(code, message, null); } - public static UnifiedResponse success(@Nullable String message) { - return new SuccessResult(message); - } - - public static UnifiedResponse success(@Nullable String message, @Nullable Object data) { - return new SuccessResult(message, data); - } - - public static UnifiedResponse error(@Nullable String message) { - return new ErrorResult(message); - } - - public static UnifiedResponse error(@Nullable String message, @Nullable Object data) { - return new ErrorResult(message, data); - } - - public static UnifiedResponse error(Object status, @Nullable String message) { - return new ErrorResult(status, message); - } - - public static UnifiedResponse error(Object status, @Nullable String message, @Nullable Object data) { - return new ErrorResult(status, message, data); - } - - public static UnifiedResponse error(Object status, Throwable e) { - return new ErrorResult(status, e); - } - - public static UnifiedResponse of(Object status, @Nullable String message) { - return new CustomResult(status, message); - } - - public static UnifiedResponse of(Object status, @Nullable String message, @Nullable Object data) { - return new CustomResult(status, message, data); - } - - public static UnifiedResponse of(final boolean isSuccess, - final Supplier successResult, final Supplier errorResult) { - AssertTools.checkNotNull(successResult, "Success supplier must not be null."); - AssertTools.checkNotNull(errorResult, "Error supplier must not be null."); - return isSuccess ? successResult.get() : errorResult.get(); - } - - public static UnifiedResponse of(final BooleanSupplier isSuccess, - final Supplier successResult, final Supplier errorResult) { - AssertTools.checkNotNull(isSuccess, "Conditions for success must not be null."); - AssertTools.checkNotNull(successResult, "Success supplier must not be null."); - AssertTools.checkNotNull(errorResult, "Error supplier must not be null."); - return isSuccess.getAsBoolean() ? successResult.get() : errorResult.get(); - } - - protected UnifiedResponse(Object status, @Nullable String message) { - setStatus(status); - setMessage(message); - } - - protected UnifiedResponse(Object status, @Nullable String message, @Nullable Object data) { - setStatus(status); - setMessage(message); - setData(data); - } - - private void setStatus(Object status) { - this.status = Objects.requireNonNull(status); - } - - private void setMessage(@Nullable String message) { + private UnifiedResponse(String code, @Nullable String message, @Nullable T data) { + this.code = Objects.requireNonNull(code); this.message = message == null ? "" : message; - } - - private void setData(@Nullable Object data) { this.data = data; } - // Constructors end + // ================================ + // #endregion - Constructors + // ================================ - // Getters + public static final String SUCCESS_CODE = "2000000"; + private static final String DEFAULT_SUCCESS_MSG = "SUCCESS"; - public Object getStatus() { - return status; + // ================================ + // #region - success + // ================================ + + public static UnifiedResponse success() { + return new UnifiedResponse<>(SUCCESS_CODE, DEFAULT_SUCCESS_MSG); + } + + public static UnifiedResponse success(@Nullable String message) { + return new UnifiedResponse<>(SUCCESS_CODE, message); + } + + public static UnifiedResponse success(@Nullable String message, @Nullable T data) { + return new UnifiedResponse<>(SUCCESS_CODE, message, data); + } + + // ================================ + // #endregion - success + // ================================ + + // ================================ + // #region - error + // ================================ + + public static UnifiedResponse error(String code, @Nullable String message) { + return new UnifiedResponse<>(code, message); + } + + public static UnifiedResponse error(String code, @Nullable String message, @Nullable T data) { + return new UnifiedResponse<>(code, message, data); + } + + public static UnifiedResponse error(String code, Throwable e) { + return new UnifiedResponse<>(code, e.getMessage()); + } + + // ================================ + // #endregion - error + // ================================ + + // ================================ + // #region - of + // ================================ + + public static UnifiedResponse of(String code, @Nullable String message) { + return new UnifiedResponse<>(code, message); + } + + public static UnifiedResponse of(String code, @Nullable String message, @Nullable T data) { + return new UnifiedResponse<>(code, message, data); + } + + // ================================ + // #endregion - of + // ================================ + + // ================================ + // #region - Getters + // ================================ + + public String getCode() { + return code; } public String getMessage() { @@ -127,16 +125,18 @@ public abstract class UnifiedResponse { } @Nullable - public Object getData() { + public T getData() { return data; } - // Getters end + // ================================ + // #endregion - Getters + // ================================ @Override public String toString() { - return String.format("{status: %s, message: \"%s\", data: %s}", - transValue(this.status), this.message, transValue(this.data)); + return String.format("{code: \"%s\", message: \"%s\", data: %s}", + this.code, this.message, transValue(this.data)); } private static String transValue(Object value) { @@ -148,62 +148,4 @@ public abstract class UnifiedResponse { } return String.valueOf(value); } - - protected static class SuccessResult extends UnifiedResponse { - public static final String SUCCESS_STATUS = "2000000"; - - private static final String DEFAULT_SUCCESS_MSG = "SUCCESS"; - - SuccessResult() { - super(SUCCESS_STATUS, DEFAULT_SUCCESS_MSG); - } - - SuccessResult(@Nullable String message) { - super(SUCCESS_STATUS, message); - } - - SuccessResult(@Nullable String message, @Nullable Object data) { - super(SUCCESS_STATUS, message, data); - } - } - - protected static class ErrorResult extends UnifiedResponse { - public static final String DEFAULT_ERROR_STATUS = "9999999"; - - ErrorResult(@Nullable String message) { - super(DEFAULT_ERROR_STATUS, message); - } - - ErrorResult(@Nullable String message, @Nullable Object data) { - super(DEFAULT_ERROR_STATUS, message, data); - } - - ErrorResult(Object status, @Nullable String message) { - super(status, message); - } - - ErrorResult(Object status, @Nullable String message, @Nullable Object data) { - super(status, message, data); - } - - ErrorResult(Object status, Throwable e) { - super(status, Objects.requireNonNull(e).getMessage()); - } - } - - /** - * 自定义结果 - * - * @author ZhouXY - */ - protected static class CustomResult extends UnifiedResponse { - - CustomResult(Object status, @Nullable String message) { - super(status, message); - } - - CustomResult(Object status, @Nullable String message, @Nullable Object data) { - super(status, message, data); - } - } } diff --git a/src/main/java/xyz/zhouxy/plusone/commons/time/YearQuarter.java b/src/main/java/xyz/zhouxy/plusone/commons/time/YearQuarter.java index 947b065..dfaf3c6 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/time/YearQuarter.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/time/YearQuarter.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -281,14 +281,6 @@ public final class YearQuarter implements Comparable, Serializable return this.compareTo(other) > 0; } - public static YearQuarter min(YearQuarter yearQuarter1, YearQuarter yearQuarter2) { - return yearQuarter1.compareTo(yearQuarter2) <= 0 ? yearQuarter1 : yearQuarter2; - } - - public static YearQuarter max(YearQuarter yearQuarter1, YearQuarter yearQuarter2) { - return yearQuarter1.compareTo(yearQuarter2) >= 0 ? yearQuarter1 : yearQuarter2; - } - // #endregion // #region - toString diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/IdGenerator.java b/src/main/java/xyz/zhouxy/plusone/commons/util/IdGenerator.java index 2bf8276..cd72ac9 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/IdGenerator.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/IdGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,8 @@ import java.util.Objects; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.Nonnull; + /** * ID 生成器 * @@ -30,7 +32,7 @@ import java.util.concurrent.ConcurrentHashMap; * * @see UUID * @see IdWorker - * @author ZhouXY + * @author ZhouXY */ public class IdGenerator { @@ -48,7 +50,7 @@ public class IdGenerator { return toSimpleString(UUID.randomUUID()); } - public static String toSimpleString(UUID uuid) { + public static String toSimpleString(@Nonnull UUID uuid) { AssertTools.checkArgument(Objects.nonNull(uuid)); return (uuidDigits(uuid.getMostSignificantBits() >> 32, 8) + uuidDigits(uuid.getMostSignificantBits() >> 16, 4) + diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/IdWorker.java b/src/main/java/xyz/zhouxy/plusone/commons/util/IdWorker.java index 20b59bc..4d42af6 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/IdWorker.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/IdWorker.java @@ -42,7 +42,7 @@ import xyz.zhouxy.plusone.commons.exception.system.NoAvailableMacFoundException; *
  • 关于若干读者,阅读“改良版雪花算法”后提出的几个共性问题的回复。
  • * *

    - * @author ZhouXY + * @author ZhouXY */ public class IdWorker { diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/RandomTools.java b/src/main/java/xyz/zhouxy/plusone/commons/util/RandomTools.java index 07f54bf..d4b3cef 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/RandomTools.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/RandomTools.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ import javax.annotation.Nonnull; *

    * 建议调用方自行维护 Random 对象 *

    - * @author ZhouXY + * @author ZhouXY */ public final class RandomTools { diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/TreeBuilder.java b/src/main/java/xyz/zhouxy/plusone/commons/util/TreeBuilder.java index 10e8e7a..824d645 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/TreeBuilder.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/TreeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/java/xyz/zhouxy/plusone/commons/collection/CollectionToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/collection/CollectionToolsTests.java index 97fdef5..8362c54 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/collection/CollectionToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/collection/CollectionToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,14 @@ package xyz.zhouxy.plusone.commons.collection; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.lang.reflect.Constructor; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -30,14 +34,24 @@ import java.util.Set; import org.junit.jupiter.api.Test; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.HashMultiset; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multiset; +import com.google.common.collect.Range; +import com.google.common.collect.RangeSet; import com.google.common.collect.Sets; +import com.google.common.collect.Table; +import com.google.common.collect.TreeRangeSet; public class CollectionToolsTests { @Test void testIsEmpty() { + // Collection List list = new ArrayList<>(); assertTrue(CollectionTools.isEmpty(list)); assertFalse(CollectionTools.isNotEmpty(list)); @@ -46,6 +60,7 @@ public class CollectionToolsTests { assertFalse(CollectionTools.isEmpty(list)); assertTrue(CollectionTools.isNotEmpty(list)); + // Map Map map = new HashMap<>(); assertTrue(CollectionTools.isEmpty(map)); assertFalse(CollectionTools.isNotEmpty(map)); @@ -53,6 +68,43 @@ public class CollectionToolsTests { map.put("2", 2); assertFalse(CollectionTools.isEmpty(map)); assertTrue(CollectionTools.isNotEmpty(map)); + + // Table + Table table = HashBasedTable.create(); + assertTrue(CollectionTools.isEmpty(table)); + assertFalse(CollectionTools.isNotEmpty(table)); + + table.put("ABC", "d", 4); + assertFalse(CollectionTools.isEmpty(table)); + assertTrue(CollectionTools.isNotEmpty(table)); + + // Multimap + Multimap multimap = HashMultimap.create(); + assertTrue(CollectionTools.isEmpty(multimap)); + assertFalse(CollectionTools.isNotEmpty(multimap)); + + multimap.put("ABC", "d"); + assertFalse(CollectionTools.isEmpty(multimap)); + assertTrue(CollectionTools.isNotEmpty(multimap)); + + // Multiset + Multiset multiset = HashMultiset.create(); + assertTrue(CollectionTools.isEmpty(multiset)); + assertFalse(CollectionTools.isNotEmpty(multiset)); + + multiset.add("ABC"); + assertFalse(CollectionTools.isEmpty(multiset)); + assertTrue(CollectionTools.isNotEmpty(multiset)); + + // RangeSet + RangeSet rangeSet = TreeRangeSet.create(); + assertTrue(CollectionTools.isEmpty(rangeSet)); + assertFalse(CollectionTools.isNotEmpty(rangeSet)); + + rangeSet.add(Range.closed(0, 100)); + rangeSet.add(Range.openClosed(100, 200)); + assertFalse(CollectionTools.isEmpty(rangeSet)); + assertTrue(CollectionTools.isNotEmpty(rangeSet)); } @Test @@ -69,4 +121,18 @@ public class CollectionToolsTests { assertSame(map, CollectionTools.nullToEmptyMap(map)); assertEquals(Collections.emptyMap(), CollectionTools.nullToEmptyMap(null)); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = CollectionTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/constant/PatternConstsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/constant/PatternConstsTests.java index 88304d6..5a216a4 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/constant/PatternConstsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/constant/PatternConstsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package xyz.zhouxy.plusone.commons.constant; import static org.junit.jupiter.api.Assertions.*; +import java.lang.reflect.Constructor; +import java.util.Arrays; import java.util.regex.Matcher; import org.junit.jupiter.api.Test; @@ -232,4 +234,38 @@ class PatternConstsTests { // ================================ // #endregion - Chinese2ndIdCardNumber // ================================ + + // ================================ + // #region - invoke constructor + // ================================ + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors; + constructors = RegexConsts.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + + constructors = PatternConsts.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } + + // ================================ + // #endregion - invoke constructor + // ================================ } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/exception/test/InvalidInputExceptionTests.java b/src/test/java/xyz/zhouxy/plusone/commons/exception/test/InvalidInputExceptionTests.java index 79a2bfc..8133dc3 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/exception/test/InvalidInputExceptionTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/exception/test/InvalidInputExceptionTests.java @@ -38,7 +38,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.create(); }); assertSame(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS, e.getType()); - assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.getCode(), e.getTypeCode()); assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.getDefaultMessage(), e.getMessage()); assertNull(e.getCause()); } @@ -50,7 +50,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.create(message); }); assertSame(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS, e.getType()); - assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -62,7 +62,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.PICTURE_CONTAINS_ILLEGAL_INFORMATION.create(message); }); assertSame(InvalidInputException.Type.PICTURE_CONTAINS_ILLEGAL_INFORMATION, e.getType()); - assertEquals(InvalidInputException.Type.PICTURE_CONTAINS_ILLEGAL_INFORMATION.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.PICTURE_CONTAINS_ILLEGAL_INFORMATION.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -77,7 +77,7 @@ public class InvalidInputExceptionTests { }); assertSame(InvalidInputException.Type.INFRINGE_COPYRIGHT, e.getType()); - assertEquals(InvalidInputException.Type.INFRINGE_COPYRIGHT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.INFRINGE_COPYRIGHT.getCode(), e.getTypeCode()); log.info("{}", e.getMessage()); assertEquals(nfe.toString(), e.getMessage()); assertSame(nfe, e.getCause()); @@ -92,7 +92,7 @@ public class InvalidInputExceptionTests { }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -106,7 +106,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.create(message, nfe); }); assertSame(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS, e.getType()); - assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_AND_MALICIOUS_LINKS.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertSame(nfe, e.getCause()); } @@ -120,7 +120,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.create(message, nfe); }); assertSame(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS, e.getType()); - assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertSame(nfe, e.getCause()); } @@ -134,7 +134,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.create(message, npe); }); assertSame(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS, e.getType()); - assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -148,7 +148,7 @@ public class InvalidInputExceptionTests { throw InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.create(message, nfe); }); assertSame(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS, e.getType()); - assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.CONTAINS_ILLEGAL_WORDS.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -167,7 +167,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertEquals(InvalidInputException.Type.DEFAULT.getDefaultMessage(), e.getMessage()); assertNull(e.getCause()); } @@ -179,7 +179,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(message); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -191,7 +191,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(message); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -206,7 +206,7 @@ public class InvalidInputExceptionTests { }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); log.info("{}", e.getMessage()); assertEquals(nfe.toString(), e.getMessage()); assertSame(nfe, e.getCause()); @@ -221,7 +221,7 @@ public class InvalidInputExceptionTests { }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -235,7 +235,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(message, nfe); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertSame(nfe, e.getCause()); } @@ -249,7 +249,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(message, nfe); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertSame(nfe, e.getCause()); } @@ -263,7 +263,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(message, npe); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -277,7 +277,7 @@ public class InvalidInputExceptionTests { throw new InvalidInputException(message, nfe); }); assertSame(InvalidInputException.Type.DEFAULT, e.getType()); - assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getCode()); + assertEquals(InvalidInputException.Type.DEFAULT.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/exception/test/ParsingFailureExceptionTests.java b/src/test/java/xyz/zhouxy/plusone/commons/exception/test/ParsingFailureExceptionTests.java index 13ecd13..77d31a4 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/exception/test/ParsingFailureExceptionTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/exception/test/ParsingFailureExceptionTests.java @@ -41,7 +41,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.DATE_TIME_PARSING_FAILURE.create(); }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getDefaultMessage(), e.getMessage()); assertNull(e.getCause()); } @@ -53,7 +53,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.JSON_PARSING_FAILURE.create(message); }); assertSame(ParsingFailureException.Type.JSON_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.Type.JSON_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.Type.JSON_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -65,7 +65,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.XML_PARSING_FAILURE.create(message); }); assertSame(ParsingFailureException.XML_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.XML_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.XML_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -80,7 +80,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); log.info("{}", e.getMessage()); assertEquals(nfe.toString(), e.getMessage()); assertSame(nfe, e.getCause()); @@ -95,7 +95,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -109,7 +109,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.NUMBER_PARSING_FAILURE.create(message, nfe); }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertSame(nfe, e.getCause()); } @@ -123,7 +123,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.DATE_TIME_PARSING_FAILURE.create(message, nfe); }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertSame(nfe, e.getCause()); } @@ -137,7 +137,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.DATE_TIME_PARSING_FAILURE.create(message, npe); }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -151,7 +151,7 @@ public class ParsingFailureExceptionTests { throw ParsingFailureException.DATE_TIME_PARSING_FAILURE.create(message, nfe); }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -175,7 +175,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(dtpe.getMessage(), e.getMessage()); assertSame(dtpe, e.getCause()); } @@ -189,7 +189,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getDefaultMessage(), e.getMessage()); assertNull(e.getCause()); } @@ -206,7 +206,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertSame(dtpe, e.getCause()); } @@ -223,7 +223,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertSame(dtpe, e.getCause()); } @@ -238,7 +238,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -253,7 +253,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.DATE_TIME_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.DATE_TIME_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } @@ -277,7 +277,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(dtpe.getMessage(), e.getMessage()); assertSame(dtpe, e.getCause()); } @@ -291,7 +291,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getDefaultMessage(), e.getMessage()); assertNull(e.getCause()); } @@ -308,7 +308,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertSame(dtpe, e.getCause()); } @@ -325,7 +325,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertSame(dtpe, e.getCause()); } @@ -340,7 +340,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertEquals(message, e.getMessage()); assertNull(e.getCause()); } @@ -355,7 +355,7 @@ public class ParsingFailureExceptionTests { }); assertSame(ParsingFailureException.NUMBER_PARSING_FAILURE, e.getType()); - assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getCode()); + assertEquals(ParsingFailureException.NUMBER_PARSING_FAILURE.getCode(), e.getTypeCode()); assertNull(e.getMessage()); assertNull(e.getCause()); } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/function/FunctionTests.java b/src/test/java/xyz/zhouxy/plusone/commons/function/FunctionTests.java index 17d6aca..501235a 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/function/FunctionTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/function/FunctionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,13 @@ package xyz.zhouxy.plusone.commons.function; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import java.lang.reflect.Constructor; +import java.util.Arrays; import java.util.Objects; import java.util.function.Predicate; @@ -33,4 +38,18 @@ class FunctionTests { .and(StringUtils::isNotBlank); assertFalse(predicate.test(str), "校验应是不通过"); } + + @Test + void test_constructorOfPredicateTools_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = PredicateTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponseTests.java b/src/test/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponseTests.java index 45a6ed2..8595ccc 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponseTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/model/dto/UnifiedResponseTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import xyz.zhouxy.plusone.commons.exception.business.BizException; -import xyz.zhouxy.plusone.commons.model.dto.UnifiedResponse.SuccessResult; @Slf4j public @@ -52,439 +51,314 @@ class UnifiedResponseTests { @Test void testSuccess_WithoutArgument() throws Exception { // 1. success without argument - UnifiedResponse success = UnifiedResponse.success(); - assertEquals(SuccessResult.SUCCESS_STATUS, success.getStatus()); + UnifiedResponse success = UnifiedResponse.success(); + assertEquals("2000000", success.getCode()); assertEquals("SUCCESS", success.getMessage()); assertNull(success.getData()); String jacksonSuccess = jackson.writeValueAsString(success); log.info("jacksonSuccess: {}", jacksonSuccess); - assertEquals("{\"status\":\"2000000\",\"message\":\"SUCCESS\"}", jacksonSuccess); + assertEquals("{\"code\":\"2000000\",\"message\":\"SUCCESS\"}", jacksonSuccess); } @Test void testSuccess_WithMessage() throws Exception { // 2. success with message - UnifiedResponse successWithMessage = UnifiedResponse.success("成功"); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithMessage.getStatus()); + UnifiedResponse successWithMessage = UnifiedResponse.success("成功"); + assertEquals("2000000", successWithMessage.getCode()); assertEquals("成功", successWithMessage.getMessage()); assertNull(successWithMessage.getData()); String jacksonSuccessWithMessage = jackson.writeValueAsString(successWithMessage); log.info("jacksonSuccessWithMessage: {}", jacksonSuccessWithMessage); - assertEquals("{\"status\":\"2000000\",\"message\":\"成功\"}", jacksonSuccessWithMessage); + assertEquals("{\"code\":\"2000000\",\"message\":\"成功\"}", jacksonSuccessWithMessage); } @Test void testSuccess_WithMessageAndNullData() throws Exception { // success with message and null data - final UnifiedResponse successWithMessageAndNullData = UnifiedResponse.success("查询成功", null); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithMessageAndNullData.getStatus()); + final UnifiedResponse successWithMessageAndNullData = UnifiedResponse.success("查询成功", null); + assertEquals("2000000", successWithMessageAndNullData.getCode()); assertEquals("查询成功", successWithMessageAndNullData.getMessage()); assertNull(successWithMessageAndNullData.getData()); final String jacksonSuccessWithMessageAndNullData = jackson.writeValueAsString(successWithMessageAndNullData); log.info("jacksonSuccessWithMessageAndNullData: {}", jacksonSuccessWithMessageAndNullData); - assertEquals("{\"status\":\"2000000\",\"message\":\"查询成功\"}", jacksonSuccessWithMessageAndNullData); + assertEquals("{\"code\":\"2000000\",\"message\":\"查询成功\"}", jacksonSuccessWithMessageAndNullData); - assertEquals("{status: \"2000000\", message: \"查询成功\", data: null}", successWithMessageAndNullData.toString()); + assertEquals("{code: \"2000000\", message: \"查询成功\", data: null}", successWithMessageAndNullData.toString()); } @Test void testSuccess_WithMessageAndStringData() throws Exception { - UnifiedResponse successWithStringData = UnifiedResponse.success("查询成功", "zhouxy"); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithStringData.getStatus()); + UnifiedResponse successWithStringData = UnifiedResponse.success("查询成功", "zhouxy"); + assertEquals("2000000", successWithStringData.getCode()); assertEquals("查询成功", successWithStringData.getMessage()); assertEquals("zhouxy", successWithStringData.getData()); String jacksonSuccessWithStringData = jackson.writeValueAsString(successWithStringData); log.info("jacksonSuccessWithStringData: {}", jacksonSuccessWithStringData); - assertEquals("{\"status\":\"2000000\",\"message\":\"查询成功\",\"data\":\"zhouxy\"}", jacksonSuccessWithStringData); + assertEquals("{\"code\":\"2000000\",\"message\":\"查询成功\",\"data\":\"zhouxy\"}", jacksonSuccessWithStringData); - assertEquals("{status: \"2000000\", message: \"查询成功\", data: \"zhouxy\"}", successWithStringData.toString()); + assertEquals("{code: \"2000000\", message: \"查询成功\", data: \"zhouxy\"}", successWithStringData.toString()); } @Test void testSuccess_WithMessageAndIntegerData() throws Exception { - final UnifiedResponse successWithIntegerData = UnifiedResponse.success("查询成功", 1); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithIntegerData.getStatus()); + final UnifiedResponse successWithIntegerData = UnifiedResponse.success("查询成功", 1); + assertEquals("2000000", successWithIntegerData.getCode()); assertEquals("查询成功", successWithIntegerData.getMessage()); assertEquals(1, successWithIntegerData.getData()); final String jacksonSuccessWithIntegerData = jackson.writeValueAsString(successWithIntegerData); log.info("jacksonSuccessWithIntegerData: {}", jacksonSuccessWithIntegerData); - assertEquals("{\"status\":\"2000000\",\"message\":\"查询成功\",\"data\":1}", jacksonSuccessWithIntegerData); + assertEquals("{\"code\":\"2000000\",\"message\":\"查询成功\",\"data\":1}", jacksonSuccessWithIntegerData); - assertEquals("{status: \"2000000\", message: \"查询成功\", data: 1}", successWithIntegerData.toString()); + assertEquals("{code: \"2000000\", message: \"查询成功\", data: 1}", successWithIntegerData.toString()); } @Test void testSuccess_WithMessageAndData() throws Exception { - UnifiedResponse successWithData = UnifiedResponse.success("查询成功", pageResult); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithData.getStatus()); + UnifiedResponse> successWithData = UnifiedResponse.success("查询成功", pageResult); + assertEquals("2000000", successWithData.getCode()); assertEquals("查询成功", successWithData.getMessage()); assertNotNull(successWithData.getData()); assertEquals(pageResult, successWithData.getData()); String jacksonSuccessWithData = jackson.writeValueAsString(successWithData); log.info("jacksonSuccessWithData: {}", jacksonSuccessWithData); - assertEquals("{\"status\":\"2000000\",\"message\":\"查询成功\",\"data\":{\"total\":108,\"content\":[{\"username\":\"zhouxy1\",\"email\":\"zhouxy1@gmail.com\"},{\"username\":\"zhouxy2\",\"email\":\"zhouxy2@gmail.com\"}]}}", jacksonSuccessWithData); + assertEquals("{\"code\":\"2000000\",\"message\":\"查询成功\",\"data\":{\"total\":108,\"content\":[{\"username\":\"zhouxy1\",\"email\":\"zhouxy1@gmail.com\"},{\"username\":\"zhouxy2\",\"email\":\"zhouxy2@gmail.com\"}]}}", jacksonSuccessWithData); } @Test void testSuccess_WithNullMessage() throws Exception { // 3. success with null message - UnifiedResponse successWithNullMessage = UnifiedResponse.success(null); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithNullMessage.getStatus()); + UnifiedResponse successWithNullMessage = UnifiedResponse.success(null); + assertEquals("2000000", successWithNullMessage.getCode()); assertEquals("", successWithNullMessage.getMessage()); assertNull(successWithNullMessage.getData()); String jacksonSuccessWithNullMessage = jackson.writeValueAsString(successWithNullMessage); log.info("jacksonSuccessWithNullMessage: {}", jacksonSuccessWithNullMessage); - assertEquals("{\"status\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithNullMessage); + assertEquals("{\"code\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithNullMessage); } // success with null message and null data @Test void testSuccess_WithNullMessageAndNullData() throws Exception { - final UnifiedResponse successWithNullMessageAndNullData = UnifiedResponse.success(null, null); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithNullMessageAndNullData.getStatus()); + final UnifiedResponse successWithNullMessageAndNullData = UnifiedResponse.success(null, null); + assertEquals("2000000", successWithNullMessageAndNullData.getCode()); assertEquals("", successWithNullMessageAndNullData.getMessage()); assertNull(successWithNullMessageAndNullData.getData()); final String jacksonSuccessWithNullMessageAndNullData = jackson.writeValueAsString(successWithNullMessageAndNullData); log.info("jacksonSuccessWithNullMessageAndNullData: {}", jacksonSuccessWithNullMessageAndNullData); - assertEquals("{\"status\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithNullMessageAndNullData); + assertEquals("{\"code\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithNullMessageAndNullData); - assertEquals("{status: \"2000000\", message: \"\", data: null}", successWithNullMessageAndNullData.toString()); + assertEquals("{code: \"2000000\", message: \"\", data: null}", successWithNullMessageAndNullData.toString()); } @Test void testSuccess_WithNullMessageAndData() throws Exception { // success with null message and data final User user = new User("zhouxy", "zhouxy@code108.cn"); - final UnifiedResponse successWithNullMessageAndData = UnifiedResponse.success(null, user); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithNullMessageAndData.getStatus()); + final UnifiedResponse successWithNullMessageAndData = UnifiedResponse.success(null, user); + assertEquals("2000000", successWithNullMessageAndData.getCode()); assertEquals("", successWithNullMessageAndData.getMessage()); assertEquals(user, successWithNullMessageAndData.getData()); final String jacksonSuccessWithNullMessageAndData = jackson.writeValueAsString(successWithNullMessageAndData); log.info("jacksonSuccessWithNullMessageAndData: {}", jacksonSuccessWithNullMessageAndData); - assertEquals("{\"status\":\"2000000\",\"message\":\"\",\"data\":{\"username\":\"zhouxy\",\"email\":\"zhouxy@code108.cn\"}}", + assertEquals("{\"code\":\"2000000\",\"message\":\"\",\"data\":{\"username\":\"zhouxy\",\"email\":\"zhouxy@code108.cn\"}}", jacksonSuccessWithNullMessageAndData); } @Test void testSuccess_WithEmptyMessage() throws Exception { // 4. success with empty message - UnifiedResponse successWithEmptyMessage = UnifiedResponse.success(""); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithEmptyMessage.getStatus()); + UnifiedResponse successWithEmptyMessage = UnifiedResponse.success(""); + assertEquals("2000000", successWithEmptyMessage.getCode()); assertEquals("", successWithEmptyMessage.getMessage()); assertNull(successWithEmptyMessage.getData()); String jacksonSuccessWithEmptyMessage = jackson.writeValueAsString(successWithEmptyMessage); log.info("jacksonSuccessWithEmptyMessage: {}", jacksonSuccessWithEmptyMessage); - assertEquals("{\"status\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithEmptyMessage); + assertEquals("{\"code\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithEmptyMessage); } // success with empty message and null data @Test void testSuccess_WithEmptyMessageAndNullData() throws Exception { - final UnifiedResponse successWithEmptyMessageAndNullData = UnifiedResponse.success("", null); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithEmptyMessageAndNullData.getStatus()); + final UnifiedResponse successWithEmptyMessageAndNullData = UnifiedResponse.success("", null); + assertEquals("2000000", successWithEmptyMessageAndNullData.getCode()); assertEquals("", successWithEmptyMessageAndNullData.getMessage()); assertNull(successWithEmptyMessageAndNullData.getData()); final String jacksonSuccessWithEmptyMessageAndNullData = jackson.writeValueAsString(successWithEmptyMessageAndNullData); log.info("jacksonSuccessWithEmptyMessageAndNullData: {}", jacksonSuccessWithEmptyMessageAndNullData); - assertEquals("{\"status\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithEmptyMessageAndNullData); + assertEquals("{\"code\":\"2000000\",\"message\":\"\"}", jacksonSuccessWithEmptyMessageAndNullData); - assertEquals("{status: \"2000000\", message: \"\", data: null}", successWithEmptyMessageAndNullData.toString()); + assertEquals("{code: \"2000000\", message: \"\", data: null}", successWithEmptyMessageAndNullData.toString()); } // success with empty message and data @Test void testSuccess_WithEmptyMessageAndData() throws Exception { final User user = new User("zhouxy", "zhouxy@gmail.com"); - final UnifiedResponse successWithEmptyMessageAndData = UnifiedResponse.success("", user); - assertEquals(SuccessResult.SUCCESS_STATUS, successWithEmptyMessageAndData.getStatus()); + final UnifiedResponse successWithEmptyMessageAndData = UnifiedResponse.success("", user); + assertEquals("2000000", successWithEmptyMessageAndData.getCode()); assertEquals("", successWithEmptyMessageAndData.getMessage()); assertEquals(user, successWithEmptyMessageAndData.getData()); final String jacksonSuccessWithEmptyMessageAndData = jackson.writeValueAsString(successWithEmptyMessageAndData); log.info("jacksonSuccessWithEmptyMessageAndData: {}", jacksonSuccessWithEmptyMessageAndData); - assertEquals("{\"status\":\"2000000\",\"message\":\"\",\"data\":{\"username\":\"zhouxy\",\"email\":\"zhouxy@gmail.com\"}}", jacksonSuccessWithEmptyMessageAndData); - } - - @Test - void testError_WithMessage() throws Exception { - UnifiedResponse errorWithMessage = UnifiedResponse.error("查询失败"); - assertEquals("9999999", errorWithMessage.getStatus()); - assertEquals("查询失败", errorWithMessage.getMessage()); - assertNull(errorWithMessage.getData()); - - final String jacksonErrorWithMessage = jackson.writeValueAsString(errorWithMessage); - assertEquals("{\"status\":\"9999999\",\"message\":\"查询失败\"}", jacksonErrorWithMessage); - final String gsonErrorWithMessage = gson.toJson(errorWithMessage); - assertEquals("{\"status\":\"9999999\",\"message\":\"查询失败\"}", gsonErrorWithMessage); - } - - @Test - void testError_WithMessage_AndNullData() throws Exception { - UnifiedResponse errorWithMessageAndNullData = UnifiedResponse.error("查询失败", (Object) null); - assertEquals("9999999", errorWithMessageAndNullData.getStatus()); - assertEquals("查询失败", errorWithMessageAndNullData.getMessage()); - assertNull(errorWithMessageAndNullData.getData()); - - final String jacksonErrorWithMessageAndNullData = jackson.writeValueAsString(errorWithMessageAndNullData); - assertEquals("{\"status\":\"9999999\",\"message\":\"查询失败\"}", jacksonErrorWithMessageAndNullData); - final String gsonErrorWithMessageAndNullData = gson.toJson(errorWithMessageAndNullData); - assertEquals("{\"status\":\"9999999\",\"message\":\"查询失败\"}", gsonErrorWithMessageAndNullData); - } - - @Test - void testError_WithMessage_AndData() throws Exception { - final User user = new User("zhouxy", "zhouxy@gmail.com"); - UnifiedResponse errorWithMessageAndData = UnifiedResponse.error("查询失败", user); - assertEquals("9999999", errorWithMessageAndData.getStatus()); - assertEquals("查询失败", errorWithMessageAndData.getMessage()); - assertEquals(user, errorWithMessageAndData.getData()); - - final String jacksonErrorWithMessageAndData = jackson.writeValueAsString(errorWithMessageAndData); - assertEquals("{\"status\":\"9999999\",\"message\":\"查询失败\",\"data\":{\"username\":\"zhouxy\",\"email\":\"zhouxy@gmail.com\"}}", - jacksonErrorWithMessageAndData); - final String gsonErrorWithMessageAndData = gson.toJson(errorWithMessageAndData); - assertEquals("{\"status\":\"9999999\",\"message\":\"查询失败\",\"data\":{\"username\":\"zhouxy\",\"email\":\"zhouxy@gmail.com\"}}", - gsonErrorWithMessageAndData); - } - - @Test - void testError_WithNullMessage() throws Exception { - UnifiedResponse errorWithNullMessage = UnifiedResponse.error((String) null); - assertEquals("9999999", errorWithNullMessage.getStatus()); - assertEquals("", errorWithNullMessage.getMessage()); - assertNull(errorWithNullMessage.getData()); - - final String jacksonErrorWithNullMessage = jackson.writeValueAsString(errorWithNullMessage); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", jacksonErrorWithNullMessage); - final String gsonErrorWithNullMessage = gson.toJson(errorWithNullMessage); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", gsonErrorWithNullMessage); - } - - @Test - void testError_WithNullMessage_AndNullData() throws Exception { - UnifiedResponse errorWithNullMessageAndNullData = UnifiedResponse.error((String) null, (User) null); - assertEquals("9999999", errorWithNullMessageAndNullData.getStatus()); - assertEquals("", errorWithNullMessageAndNullData.getMessage()); - assertNull(errorWithNullMessageAndNullData.getData()); - - final String jacksonErrorWithNullMessageAndNullData = jackson.writeValueAsString(errorWithNullMessageAndNullData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", jacksonErrorWithNullMessageAndNullData); - final String gsonErrorWithNullMessageAndNullData = gson.toJson(errorWithNullMessageAndNullData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", gsonErrorWithNullMessageAndNullData); - } - - @Test - void testError_WithNullMessage_AndData() throws Exception { - final User user = new User("zhouxy1", "zhouxy1@gmail.com"); - UnifiedResponse errorWithNullMessageAndData = UnifiedResponse.error((String) null, user); - assertEquals("9999999", errorWithNullMessageAndData.getStatus()); - assertEquals("", errorWithNullMessageAndData.getMessage()); - assertEquals(user, errorWithNullMessageAndData.getData()); - - final String jacksonErrorWithNullMessageAndData = jackson.writeValueAsString(errorWithNullMessageAndData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\",\"data\":{\"username\":\"zhouxy1\",\"email\":\"zhouxy1@gmail.com\"}}", - jacksonErrorWithNullMessageAndData); - final String gsonErrorWithNullMessageAndData = gson.toJson(errorWithNullMessageAndData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\",\"data\":{\"username\":\"zhouxy1\",\"email\":\"zhouxy1@gmail.com\"}}", - gsonErrorWithNullMessageAndData); - } - - @Test - void testError_WithEmptyMessage() throws Exception { - UnifiedResponse errorWithEmptyMessage = UnifiedResponse.error(""); - assertEquals("9999999", errorWithEmptyMessage.getStatus()); - assertEquals("", errorWithEmptyMessage.getMessage()); - assertNull(errorWithEmptyMessage.getData()); - final String jacksonErrorWithEmptyMessage = jackson.writeValueAsString(errorWithEmptyMessage); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", jacksonErrorWithEmptyMessage); - final String gsonErrorWithEmptyMessage = gson.toJson(errorWithEmptyMessage); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", gsonErrorWithEmptyMessage); - } - - @Test - void testError_WithEmptyMessage_AndNullData() throws Exception { - UnifiedResponse errorWithEmptyMessageAndNullData = UnifiedResponse.error("", (User) null); - assertEquals("9999999", errorWithEmptyMessageAndNullData.getStatus()); - assertEquals("", errorWithEmptyMessageAndNullData.getMessage()); - assertNull(errorWithEmptyMessageAndNullData.getData()); - - final String jacksonErrorEmptyNullMessageAndNullData = jackson.writeValueAsString(errorWithEmptyMessageAndNullData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", jacksonErrorEmptyNullMessageAndNullData); - final String gsonErrorWithEmptyMessageAndNullData = gson.toJson(errorWithEmptyMessageAndNullData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\"}", gsonErrorWithEmptyMessageAndNullData); - } - - @Test - void testError_WithEmptyMessage_AndData() throws Exception { - final User user = new User("zhouxy1", "zhouxy1@gmail.com"); - UnifiedResponse errorWithEmptyMessageAndData = UnifiedResponse.error("", user); - assertEquals("9999999", errorWithEmptyMessageAndData.getStatus()); - assertEquals("", errorWithEmptyMessageAndData.getMessage()); - assertEquals(user, errorWithEmptyMessageAndData.getData()); - - final String jacksonErrorWithEmptyMessageAndData = jackson.writeValueAsString(errorWithEmptyMessageAndData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\",\"data\":{\"username\":\"zhouxy1\",\"email\":\"zhouxy1@gmail.com\"}}", - jacksonErrorWithEmptyMessageAndData); - final String gsonErrorWithEmptyMessageAndData = gson.toJson(errorWithEmptyMessageAndData); - assertEquals("{\"status\":\"9999999\",\"message\":\"\",\"data\":{\"username\":\"zhouxy1\",\"email\":\"zhouxy1@gmail.com\"}}", - gsonErrorWithEmptyMessageAndData); + assertEquals("{\"code\":\"2000000\",\"message\":\"\",\"data\":{\"username\":\"zhouxy\",\"email\":\"zhouxy@gmail.com\"}}", jacksonSuccessWithEmptyMessageAndData); } @Test void testError_WithStatusAndMessage() throws Exception { - final UnifiedResponse errorWithStatusAndMessage = UnifiedResponse.error(108, "查询失败"); - assertEquals(108, errorWithStatusAndMessage.getStatus()); + final UnifiedResponse errorWithStatusAndMessage = UnifiedResponse.error("108", "查询失败"); + assertEquals("108", errorWithStatusAndMessage.getCode()); assertEquals("查询失败", errorWithStatusAndMessage.getMessage()); assertNull(errorWithStatusAndMessage.getData()); - assertEquals("{status: 108, message: \"查询失败\", data: null}", errorWithStatusAndMessage.toString()); + assertEquals("{code: \"108\", message: \"查询失败\", data: null}", errorWithStatusAndMessage.toString()); final String jacksonErrorWithStatusAndMessage = jackson.writeValueAsString(errorWithStatusAndMessage); log.info("jacksonErrorWithStatusAndMessage: {}", jacksonErrorWithStatusAndMessage); - assertEquals("{\"status\":108,\"message\":\"查询失败\"}", jacksonErrorWithStatusAndMessage); + assertEquals("{\"code\":\"108\",\"message\":\"查询失败\"}", jacksonErrorWithStatusAndMessage); final String gsonErrorWithStatusAndMessage = gson.toJson(errorWithStatusAndMessage); - assertEquals("{\"status\":108,\"message\":\"查询失败\"}", gsonErrorWithStatusAndMessage); + assertEquals("{\"code\":\"108\",\"message\":\"查询失败\"}", gsonErrorWithStatusAndMessage); } @Test void testError_WithStatusAndMessage_AndNullData() throws Exception { - final UnifiedResponse errorWithStatusAndMessageAndNullData = UnifiedResponse.error(108, "查询失败", null); - assertEquals(108, errorWithStatusAndMessageAndNullData.getStatus()); + final UnifiedResponse errorWithStatusAndMessageAndNullData = UnifiedResponse.error("108", "查询失败", null); + assertEquals("108", errorWithStatusAndMessageAndNullData.getCode()); assertEquals("查询失败", errorWithStatusAndMessageAndNullData.getMessage()); assertNull(errorWithStatusAndMessageAndNullData.getData()); - assertEquals("{status: 108, message: \"查询失败\", data: null}", errorWithStatusAndMessageAndNullData.toString()); + assertEquals("{code: \"108\", message: \"查询失败\", data: null}", errorWithStatusAndMessageAndNullData.toString()); final String jacksonErrorWithStatusAndMessageAndNullData = jackson.writeValueAsString(errorWithStatusAndMessageAndNullData); log.info("jacksonErrorWithStatusAndMessage: {}", jacksonErrorWithStatusAndMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"查询失败\"}", jacksonErrorWithStatusAndMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"查询失败\"}", jacksonErrorWithStatusAndMessageAndNullData); final String gsonErrorWithStatusAndMessageAndNullData = gson.toJson(errorWithStatusAndMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"查询失败\"}", gsonErrorWithStatusAndMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"查询失败\"}", gsonErrorWithStatusAndMessageAndNullData); } @Test void testError_WithStatusAndMessage_AndData() throws Exception { final PageResult emptyPageResult = PageResult.empty(); - final UnifiedResponse errorWithStatusAndMessageAndData = UnifiedResponse.error(108, "查询失败", emptyPageResult); - assertEquals(108, errorWithStatusAndMessageAndData.getStatus()); + final UnifiedResponse> errorWithStatusAndMessageAndData = UnifiedResponse.error("108", "查询失败", emptyPageResult); + assertEquals("108", errorWithStatusAndMessageAndData.getCode()); assertEquals("查询失败", errorWithStatusAndMessageAndData.getMessage()); assertEquals(emptyPageResult, errorWithStatusAndMessageAndData.getData()); - assertEquals("{status: 108, message: \"查询失败\", data: PageResult [total=0, content=[]]}", errorWithStatusAndMessageAndData.toString()); + assertEquals("{code: \"108\", message: \"查询失败\", data: PageResult [total=0, content=[]]}", errorWithStatusAndMessageAndData.toString()); final String jacksonErrorWithStatusAndMessageAndData = jackson.writeValueAsString(errorWithStatusAndMessageAndData); - assertEquals("{\"status\":108,\"message\":\"查询失败\",\"data\":{\"total\":0,\"content\":[]}}", + assertEquals("{\"code\":\"108\",\"message\":\"查询失败\",\"data\":{\"total\":0,\"content\":[]}}", jacksonErrorWithStatusAndMessageAndData); final String gsonErrorWithStatusAndMessageAndData = gson.toJson(errorWithStatusAndMessageAndData); - assertEquals("{\"status\":108,\"message\":\"查询失败\",\"data\":{\"total\":0,\"content\":[]}}", + assertEquals("{\"code\":\"108\",\"message\":\"查询失败\",\"data\":{\"total\":0,\"content\":[]}}", gsonErrorWithStatusAndMessageAndData); } @Test void testError_WithStatusAndNullMessage() throws Exception { - UnifiedResponse errorWithStatusAndNullMessage = UnifiedResponse.error(500, (String) null); - assertEquals(500, errorWithStatusAndNullMessage.getStatus()); + UnifiedResponse errorWithStatusAndNullMessage = UnifiedResponse.error("500", (String) null); + assertEquals("500", errorWithStatusAndNullMessage.getCode()); assertEquals("", errorWithStatusAndNullMessage.getMessage()); assertNull(errorWithStatusAndNullMessage.getData()); final String jacksonErrorWithStatusAndNullMessage = jackson.writeValueAsString(errorWithStatusAndNullMessage); - assertEquals("{\"status\":500,\"message\":\"\"}", jacksonErrorWithStatusAndNullMessage); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", jacksonErrorWithStatusAndNullMessage); final String gsonErrorWithStatusAndNullMessage = gson.toJson(errorWithStatusAndNullMessage); - assertEquals("{\"status\":500,\"message\":\"\"}", gsonErrorWithStatusAndNullMessage); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", gsonErrorWithStatusAndNullMessage); } @Test void testError_WithStatusAndNullMessage_AndNullData() throws Exception { - UnifiedResponse errorWithStatusAndNullMessageAndNullData = UnifiedResponse.error(500, (String) null, null); + UnifiedResponse errorWithStatusAndNullMessageAndNullData = UnifiedResponse.error("500", (String) null, null); - assertEquals(500, errorWithStatusAndNullMessageAndNullData.getStatus()); + assertEquals("500", errorWithStatusAndNullMessageAndNullData.getCode()); assertEquals("", errorWithStatusAndNullMessageAndNullData.getMessage()); assertNull(errorWithStatusAndNullMessageAndNullData.getData()); final String jacksonErrorWithStatusAndNullMessageAndNullData = jackson.writeValueAsString(errorWithStatusAndNullMessageAndNullData); - assertEquals("{\"status\":500,\"message\":\"\"}", jacksonErrorWithStatusAndNullMessageAndNullData); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", jacksonErrorWithStatusAndNullMessageAndNullData); final String gsonErrorWithStatusAndNullMessageAndNullData = gson.toJson(errorWithStatusAndNullMessageAndNullData); - assertEquals("{\"status\":500,\"message\":\"\"}", gsonErrorWithStatusAndNullMessageAndNullData); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", gsonErrorWithStatusAndNullMessageAndNullData); } @Test void testError_WithStatusAndNullMessage_AndData() throws Exception { PageResult emptyPageResult = PageResult.empty(); - UnifiedResponse errorWithStatusAndNullMessageAndData = UnifiedResponse.error(500, (String) null, emptyPageResult); - assertEquals(500, errorWithStatusAndNullMessageAndData.getStatus()); + UnifiedResponse> errorWithStatusAndNullMessageAndData = UnifiedResponse.error("500", (String) null, emptyPageResult); + assertEquals("500", errorWithStatusAndNullMessageAndData.getCode()); assertEquals("", errorWithStatusAndNullMessageAndData.getMessage()); assertEquals(emptyPageResult, errorWithStatusAndNullMessageAndData.getData()); final String jacksonErrorWithStatusAndNullMessageAndData = jackson.writeValueAsString(errorWithStatusAndNullMessageAndData); - assertEquals("{\"status\":500,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonErrorWithStatusAndNullMessageAndData); + assertEquals("{\"code\":\"500\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonErrorWithStatusAndNullMessageAndData); final String gsonErrorWithStatusAndNullMessageAndData = gson.toJson(errorWithStatusAndNullMessageAndData); - assertEquals("{\"status\":500,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonErrorWithStatusAndNullMessageAndData); + assertEquals("{\"code\":\"500\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonErrorWithStatusAndNullMessageAndData); } @Test void testError_WithStatusAndEmptyMessage() throws Exception { - UnifiedResponse errorWithStatusAndEmptyMessage = UnifiedResponse.error(500, ""); - assertEquals(500, errorWithStatusAndEmptyMessage.getStatus()); + UnifiedResponse errorWithStatusAndEmptyMessage = UnifiedResponse.error("500", ""); + assertEquals("500", errorWithStatusAndEmptyMessage.getCode()); assertEquals("", errorWithStatusAndEmptyMessage.getMessage()); assertNull(errorWithStatusAndEmptyMessage.getData()); final String jacksonErrorWithStatusAndEmptyMessage = jackson.writeValueAsString(errorWithStatusAndEmptyMessage); - assertEquals("{\"status\":500,\"message\":\"\"}", jacksonErrorWithStatusAndEmptyMessage); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", jacksonErrorWithStatusAndEmptyMessage); final String gsonErrorWithStatusAndEmptyMessage = gson.toJson(errorWithStatusAndEmptyMessage); - assertEquals("{\"status\":500,\"message\":\"\"}", gsonErrorWithStatusAndEmptyMessage); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", gsonErrorWithStatusAndEmptyMessage); } @Test void testError_WithStatusAndEmptyMessage_AndNullData() throws Exception { - UnifiedResponse errorWithStatusAndEmptyMessageAndNullData = UnifiedResponse.error(500, "", null); + UnifiedResponse errorWithStatusAndEmptyMessageAndNullData = UnifiedResponse.error("500", "", null); - assertEquals(500, errorWithStatusAndEmptyMessageAndNullData.getStatus()); + assertEquals("500", errorWithStatusAndEmptyMessageAndNullData.getCode()); assertEquals("", errorWithStatusAndEmptyMessageAndNullData.getMessage()); assertNull(errorWithStatusAndEmptyMessageAndNullData.getData()); final String jacksonErrorWithStatusAndEmptyMessageAndNullData = jackson.writeValueAsString(errorWithStatusAndEmptyMessageAndNullData); - assertEquals("{\"status\":500,\"message\":\"\"}", jacksonErrorWithStatusAndEmptyMessageAndNullData); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", jacksonErrorWithStatusAndEmptyMessageAndNullData); final String gsonErrorWithStatusAndEmptyMessageAndNullData = gson.toJson(errorWithStatusAndEmptyMessageAndNullData); - assertEquals("{\"status\":500,\"message\":\"\"}", gsonErrorWithStatusAndEmptyMessageAndNullData); + assertEquals("{\"code\":\"500\",\"message\":\"\"}", gsonErrorWithStatusAndEmptyMessageAndNullData); } @Test void testError_WithStatusAndEmptyMessage_AndData() throws Exception { PageResult emptyPageResult = PageResult.empty(); - UnifiedResponse errorWithStatusAndEmptyMessageAndData = UnifiedResponse.error(500, "", emptyPageResult); - assertEquals(500, errorWithStatusAndEmptyMessageAndData.getStatus()); + UnifiedResponse> errorWithStatusAndEmptyMessageAndData = UnifiedResponse.error("500", "", emptyPageResult); + assertEquals("500", errorWithStatusAndEmptyMessageAndData.getCode()); assertEquals("", errorWithStatusAndEmptyMessageAndData.getMessage()); assertEquals(emptyPageResult, errorWithStatusAndEmptyMessageAndData.getData()); final String jacksonErrorWithStatusAndEmptyMessageAndData = jackson.writeValueAsString(errorWithStatusAndEmptyMessageAndData); - assertEquals("{\"status\":500,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonErrorWithStatusAndEmptyMessageAndData); + assertEquals("{\"code\":\"500\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonErrorWithStatusAndEmptyMessageAndData); final String gsonErrorWithStatusAndEmptyMessageAndData = gson.toJson(errorWithStatusAndEmptyMessageAndData); - assertEquals("{\"status\":500,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonErrorWithStatusAndEmptyMessageAndData); + assertEquals("{\"code\":\"500\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonErrorWithStatusAndEmptyMessageAndData); } @Test void testError_WithStatusAndThrowable() throws Exception { final IllegalArgumentException e = new IllegalArgumentException("ID cannot be null"); - final UnifiedResponse errorWithStatusThrowable = UnifiedResponse.error(500, e); - assertEquals(500, errorWithStatusThrowable.getStatus()); + final UnifiedResponse errorWithStatusThrowable = UnifiedResponse.error("500", e); + assertEquals("500", errorWithStatusThrowable.getCode()); assertEquals("ID cannot be null", errorWithStatusThrowable.getMessage()); assertNull(errorWithStatusThrowable.getData()); - assertEquals("{\"status\":500,\"message\":\"ID cannot be null\"}", jackson.writeValueAsString(errorWithStatusThrowable)); - assertEquals("{\"status\":500,\"message\":\"ID cannot be null\"}", gson.toJson(errorWithStatusThrowable)); + assertEquals("{\"code\":\"500\",\"message\":\"ID cannot be null\"}", jackson.writeValueAsString(errorWithStatusThrowable)); + assertEquals("{\"code\":\"500\",\"message\":\"ID cannot be null\"}", gson.toJson(errorWithStatusThrowable)); } @Test void testError_WithStatusAndNullThrowable() { - assertThrows(NullPointerException.class, () -> UnifiedResponse.error(500, (Throwable) null)); + assertThrows(NullPointerException.class, () -> UnifiedResponse.error("500", (Throwable) null)); } @Test void testError_WithNullStatus() { - final Object nullStatus = null; + final String nullStatus = null; final String nullMessage = null; final User user = new User("zhouxy", "zhouxy@gmail.com"); @@ -512,143 +386,143 @@ class UnifiedResponseTests { @Test void testOf_WithStatusAndMessage() throws Exception { - final UnifiedResponse ofWithStatusAndMessage = UnifiedResponse.of(108, "This is a message."); - assertEquals(108, ofWithStatusAndMessage.getStatus()); + final UnifiedResponse ofWithStatusAndMessage = UnifiedResponse.of("108", "This is a message."); + assertEquals("108", ofWithStatusAndMessage.getCode()); assertEquals("This is a message.", ofWithStatusAndMessage.getMessage()); assertNull(ofWithStatusAndMessage.getData()); final String jacksonOfWithStatusAndMessage = jackson.writeValueAsString(ofWithStatusAndMessage); log.info("jacksonOfWithStatusAndMessage: {}", jacksonOfWithStatusAndMessage); - assertEquals("{\"status\":108,\"message\":\"This is a message.\"}", jacksonOfWithStatusAndMessage); + assertEquals("{\"code\":\"108\",\"message\":\"This is a message.\"}", jacksonOfWithStatusAndMessage); - assertEquals("{status: 108, message: \"This is a message.\", data: null}", ofWithStatusAndMessage.toString()); + assertEquals("{code: \"108\", message: \"This is a message.\", data: null}", ofWithStatusAndMessage.toString()); final String gsonOfWithStatusAndMessage = gson.toJson(ofWithStatusAndMessage); - assertEquals("{\"status\":108,\"message\":\"This is a message.\"}", gsonOfWithStatusAndMessage); + assertEquals("{\"code\":\"108\",\"message\":\"This is a message.\"}", gsonOfWithStatusAndMessage); } @Test void testOf_WithStatusAndMessage_AndNullData() throws Exception { - final UnifiedResponse ofWithStatusAndMessageAndNullData = UnifiedResponse.of(108, "This is a message.", null); - assertEquals(108, ofWithStatusAndMessageAndNullData.getStatus()); + final UnifiedResponse ofWithStatusAndMessageAndNullData = UnifiedResponse.of("108", "This is a message.", null); + assertEquals("108", ofWithStatusAndMessageAndNullData.getCode()); assertEquals("This is a message.", ofWithStatusAndMessageAndNullData.getMessage()); assertNull(ofWithStatusAndMessageAndNullData.getData()); final String jacksonOfWithStatusAndMessageAndNullData = jackson.writeValueAsString(ofWithStatusAndMessageAndNullData); log.info("jacksonOfWithStatusAndMessage: {}", jacksonOfWithStatusAndMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"This is a message.\"}", jacksonOfWithStatusAndMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"This is a message.\"}", jacksonOfWithStatusAndMessageAndNullData); - assertEquals("{status: 108, message: \"This is a message.\", data: null}", ofWithStatusAndMessageAndNullData.toString()); + assertEquals("{code: \"108\", message: \"This is a message.\", data: null}", ofWithStatusAndMessageAndNullData.toString()); final String gsonOfWithStatusAndMessageAndNullData = gson.toJson(ofWithStatusAndMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"This is a message.\"}", gsonOfWithStatusAndMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"This is a message.\"}", gsonOfWithStatusAndMessageAndNullData); } @Test void testOf_WithStatusAndMessage_AndData() throws Exception { final PageResult emptyPageResult = PageResult.empty(); - final UnifiedResponse ofWithStatusAndMessageAndData - = UnifiedResponse.of(108, "This is a message.", emptyPageResult); - assertEquals("{status: 108, message: \"This is a message.\", data: PageResult [total=0, content=[]]}", + final UnifiedResponse> ofWithStatusAndMessageAndData + = UnifiedResponse.of("108", "This is a message.", emptyPageResult); + assertEquals("{code: \"108\", message: \"This is a message.\", data: PageResult [total=0, content=[]]}", ofWithStatusAndMessageAndData.toString()); - assertEquals(108, ofWithStatusAndMessageAndData.getStatus()); + assertEquals("108", ofWithStatusAndMessageAndData.getCode()); assertEquals("This is a message.", ofWithStatusAndMessageAndData.getMessage()); assertEquals(emptyPageResult, ofWithStatusAndMessageAndData.getData()); final String jacksonOfWithStatusAndMessageAndData = jackson.writeValueAsString(ofWithStatusAndMessageAndData); - assertEquals("{\"status\":108,\"message\":\"This is a message.\",\"data\":{\"total\":0,\"content\":[]}}", + assertEquals("{\"code\":\"108\",\"message\":\"This is a message.\",\"data\":{\"total\":0,\"content\":[]}}", jacksonOfWithStatusAndMessageAndData); final String gsonOfWithStatusAndMessageAndData = gson.toJson(ofWithStatusAndMessageAndData); - assertEquals("{\"status\":108,\"message\":\"This is a message.\",\"data\":{\"total\":0,\"content\":[]}}", + assertEquals("{\"code\":\"108\",\"message\":\"This is a message.\",\"data\":{\"total\":0,\"content\":[]}}", gsonOfWithStatusAndMessageAndData); } @Test void testOf_WithStatusAndNullMessage() throws Exception { - UnifiedResponse ofWithStatusAndNullMessage = UnifiedResponse.of(108, (String) null); - assertEquals(108, ofWithStatusAndNullMessage.getStatus()); + UnifiedResponse ofWithStatusAndNullMessage = UnifiedResponse.of("108", (String) null); + assertEquals("108", ofWithStatusAndNullMessage.getCode()); assertEquals("", ofWithStatusAndNullMessage.getMessage()); assertNull(ofWithStatusAndNullMessage.getData()); final String jacksonOfWithStatusAndNullMessage = jackson.writeValueAsString(ofWithStatusAndNullMessage); - assertEquals("{\"status\":108,\"message\":\"\"}", jacksonOfWithStatusAndNullMessage); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", jacksonOfWithStatusAndNullMessage); final String gsonOfWithStatusAndNullMessage = gson.toJson(ofWithStatusAndNullMessage); - assertEquals("{\"status\":108,\"message\":\"\"}", gsonOfWithStatusAndNullMessage); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", gsonOfWithStatusAndNullMessage); } @Test void testOf_WithStatusAndNullMessage_AndNullData() throws Exception { - UnifiedResponse ofWithStatusAndNullMessageAndNullData = UnifiedResponse.of(108, (String) null, null); + UnifiedResponse ofWithStatusAndNullMessageAndNullData = UnifiedResponse.of("108", (String) null, null); - assertEquals(108, ofWithStatusAndNullMessageAndNullData.getStatus()); + assertEquals("108", ofWithStatusAndNullMessageAndNullData.getCode()); assertEquals("", ofWithStatusAndNullMessageAndNullData.getMessage()); assertNull(ofWithStatusAndNullMessageAndNullData.getData()); final String jacksonOfWithStatusAndNullMessageAndNullData = jackson.writeValueAsString(ofWithStatusAndNullMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"\"}", jacksonOfWithStatusAndNullMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", jacksonOfWithStatusAndNullMessageAndNullData); final String gsonOfWithStatusAndNullMessageAndNullData = gson.toJson(ofWithStatusAndNullMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"\"}", gsonOfWithStatusAndNullMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", gsonOfWithStatusAndNullMessageAndNullData); } @Test void testOf_WithStatusAndNullMessage_AndData() throws Exception { PageResult emptyPageResult = PageResult.empty(); - UnifiedResponse ofWithStatusAndNullMessageAndData = UnifiedResponse.of(108, (String) null, emptyPageResult); - assertEquals(108, ofWithStatusAndNullMessageAndData.getStatus()); + UnifiedResponse> ofWithStatusAndNullMessageAndData = UnifiedResponse.of("108", (String) null, emptyPageResult); + assertEquals("108", ofWithStatusAndNullMessageAndData.getCode()); assertEquals("", ofWithStatusAndNullMessageAndData.getMessage()); assertEquals(emptyPageResult, ofWithStatusAndNullMessageAndData.getData()); final String jacksonOfWithStatusAndNullMessageAndData = jackson.writeValueAsString(ofWithStatusAndNullMessageAndData); - assertEquals("{\"status\":108,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonOfWithStatusAndNullMessageAndData); + assertEquals("{\"code\":\"108\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonOfWithStatusAndNullMessageAndData); final String gsonOfWithStatusAndNullMessageAndData = gson.toJson(ofWithStatusAndNullMessageAndData); - assertEquals("{\"status\":108,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonOfWithStatusAndNullMessageAndData); + assertEquals("{\"code\":\"108\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonOfWithStatusAndNullMessageAndData); } @Test void testOf_WithStatusAndEmptyMessage() throws Exception { - UnifiedResponse ofWithStatusAndEmptyMessage = UnifiedResponse.of(108, ""); - assertEquals(108, ofWithStatusAndEmptyMessage.getStatus()); + UnifiedResponse ofWithStatusAndEmptyMessage = UnifiedResponse.of("108", ""); + assertEquals("108", ofWithStatusAndEmptyMessage.getCode()); assertEquals("", ofWithStatusAndEmptyMessage.getMessage()); assertNull(ofWithStatusAndEmptyMessage.getData()); final String jacksonOfWithStatusAndEmptyMessage = jackson.writeValueAsString(ofWithStatusAndEmptyMessage); - assertEquals("{\"status\":108,\"message\":\"\"}", jacksonOfWithStatusAndEmptyMessage); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", jacksonOfWithStatusAndEmptyMessage); final String gsonOfWithStatusAndEmptyMessage = gson.toJson(ofWithStatusAndEmptyMessage); - assertEquals("{\"status\":108,\"message\":\"\"}", gsonOfWithStatusAndEmptyMessage); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", gsonOfWithStatusAndEmptyMessage); } @Test void testOf_WithStatusAndEmptyMessage_AndNullData() throws Exception { - UnifiedResponse ofWithStatusAndEmptyMessageAndNullData = UnifiedResponse.of(108, "", null); + UnifiedResponse ofWithStatusAndEmptyMessageAndNullData = UnifiedResponse.of("108", "", null); - assertEquals(108, ofWithStatusAndEmptyMessageAndNullData.getStatus()); + assertEquals("108", ofWithStatusAndEmptyMessageAndNullData.getCode()); assertEquals("", ofWithStatusAndEmptyMessageAndNullData.getMessage()); assertNull(ofWithStatusAndEmptyMessageAndNullData.getData()); final String jacksonOfWithStatusAndEmptyMessageAndNullData = jackson.writeValueAsString(ofWithStatusAndEmptyMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"\"}", jacksonOfWithStatusAndEmptyMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", jacksonOfWithStatusAndEmptyMessageAndNullData); final String gsonOfWithStatusAndEmptyMessageAndNullData = gson.toJson(ofWithStatusAndEmptyMessageAndNullData); - assertEquals("{\"status\":108,\"message\":\"\"}", gsonOfWithStatusAndEmptyMessageAndNullData); + assertEquals("{\"code\":\"108\",\"message\":\"\"}", gsonOfWithStatusAndEmptyMessageAndNullData); } @Test void testOf_WithStatusAndEmptyMessage_AndData() throws Exception { PageResult emptyPageResult = PageResult.empty(); - UnifiedResponse ofWithStatusAndEmptyMessageAndData = UnifiedResponse.of(108, "", emptyPageResult); - assertEquals(108, ofWithStatusAndEmptyMessageAndData.getStatus()); + UnifiedResponse> ofWithStatusAndEmptyMessageAndData = UnifiedResponse.of("108", "", emptyPageResult); + assertEquals("108", ofWithStatusAndEmptyMessageAndData.getCode()); assertEquals("", ofWithStatusAndEmptyMessageAndData.getMessage()); assertEquals(emptyPageResult, ofWithStatusAndEmptyMessageAndData.getData()); final String jacksonOfWithStatusAndEmptyMessageAndData = jackson.writeValueAsString(ofWithStatusAndEmptyMessageAndData); - assertEquals("{\"status\":108,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonOfWithStatusAndEmptyMessageAndData); + assertEquals("{\"code\":\"108\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", jacksonOfWithStatusAndEmptyMessageAndData); final String gsonOfWithStatusAndEmptyMessageAndData = gson.toJson(ofWithStatusAndEmptyMessageAndData); - assertEquals("{\"status\":108,\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonOfWithStatusAndEmptyMessageAndData); + assertEquals("{\"code\":\"108\",\"message\":\"\",\"data\":{\"total\":0,\"content\":[]}}", gsonOfWithStatusAndEmptyMessageAndData); } @Test void testOf_WithNullStatus() { - final Object nullStatus = null; + final String nullStatus = null; final String nullMessage = null; final User user = new User("zhouxy", "zhouxy@gmail.com"); diff --git a/src/test/java/xyz/zhouxy/plusone/commons/time/YearQuarterTests.java b/src/test/java/xyz/zhouxy/plusone/commons/time/YearQuarterTests.java index fcb14a6..70e4c7e 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/time/YearQuarterTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/time/YearQuarterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1173,19 +1173,4 @@ public class YearQuarterTests { } } } - - @ParameterizedTest - @ValueSource(ints = { -1, 0, 1, 1900, 2000, 2023, 2024, Year.MAX_VALUE, Year.MIN_VALUE }) - void test_min_And_max_sameYear(int year) { - YearQuarter yq1 = YearQuarter.of(year, 1); - YearQuarter anotherYq1 = YearQuarter.of(year, 1); - - assertEquals(yq1, YearQuarter.max(yq1, anotherYq1)); - assertEquals(yq1, YearQuarter.min(yq1, anotherYq1)); - - YearQuarter yq2 = YearQuarter.of(year, 2); - assertEquals(yq2, YearQuarter.max(yq1, yq2)); - assertEquals(yq1, YearQuarter.min(yq1, yq2)); - - } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/ArrayToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/ArrayToolsTests.java index 32423a1..3521906 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/ArrayToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/ArrayToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,11 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -1087,4 +1089,26 @@ public class ArrayToolsTests { // #endregion // ================================ + // ================================ + // #region - invoke constructor + // ================================ + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = ArrayTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } + + // ================================ + // #endregion - invoke constructor + // ================================ + } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/AssertToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/AssertToolsTests.java index b6ea20e..5127592 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/AssertToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/AssertToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,9 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.*; +import java.lang.reflect.Constructor; import java.time.LocalDate; +import java.util.Arrays; import java.util.Optional; import java.util.function.Supplier; @@ -939,4 +941,25 @@ public class AssertToolsTests { // #endregion - Condition + // ================================ + // #region - invoke constructor + // ================================ + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = AssertTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } + + // ================================ + // #endregion - invoke constructor + // ================================ } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/BigDecimalsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/BigDecimalsTests.java index 2fc6a0c..61e2b98 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/BigDecimalsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/BigDecimalsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,9 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.*; +import java.lang.reflect.Constructor; import java.math.BigDecimal; +import java.util.Arrays; import org.junit.jupiter.api.Test; @@ -202,4 +204,17 @@ public class BigDecimalsTests { assertEquals(bd, BigDecimals.of("10")); } + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = BigDecimals.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java index a1796bf..03005ae 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/DateTimeToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,12 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.lang.reflect.Constructor; import java.time.DateTimeException; import java.time.Instant; import java.time.LocalDate; @@ -32,6 +34,7 @@ import java.time.Year; import java.time.YearMonth; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; @@ -493,4 +496,27 @@ class DateTimeToolsTests { // ================================ // #endregion - toString // ================================ + + // ================================ + // #region - invoke constructor + // ================================ + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = DateTimeTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } + + // ================================ + // #endregion - invoke constructor + // ================================ + } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/EnumToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/EnumToolsTests.java index d4442cd..9a695af 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/EnumToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/EnumToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,15 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.lang.reflect.Constructor; +import java.util.Arrays; + import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -222,4 +227,18 @@ class EnumToolsTests { assertSame(MyEnum.VALUE_0, EnumTools.valueOf(MyEnum.class, null, MyEnum.VALUE_0)); assertNull(EnumTools.valueOf(MyEnum.class, null, null)); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = EnumTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/IdGeneratorTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/IdGeneratorTests.java index ccc3f59..f970df1 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/IdGeneratorTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/IdGeneratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,12 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import java.lang.reflect.Constructor; +import java.util.Arrays; import java.util.Set; import java.util.UUID; import java.util.concurrent.LinkedBlockingQueue; @@ -83,4 +88,17 @@ public class IdGeneratorTests { IdGenerator.toSimpleString(id)); } + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = IdGenerator.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/NumbersTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/NumbersTests.java index 1e2435f..0f8b9b1 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/NumbersTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/NumbersTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,16 @@ package xyz.zhouxy.plusone.commons.util; import org.junit.jupiter.api.Test; + +import java.lang.reflect.Constructor; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Arrays; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; public class NumbersTests { @@ -184,4 +191,18 @@ class NumbersTests { BigDecimal result = Numbers.nullToZero(value); assertEquals(BigDecimal.ZERO, result); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = Numbers.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/OptionalToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/OptionalToolsTests.java index 79199e4..6569fca 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/OptionalToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/OptionalToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,13 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.lang.reflect.Constructor; +import java.util.Arrays; import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; @@ -184,4 +187,18 @@ class OptionalToolsTests { Double result = OptionalTools.toDouble(OptionalDouble.of(10.0)); assertEquals(10.0, result, 0.0001); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = OptionalTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/RandomToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/RandomToolsTests.java index 2f63bc6..7a05601 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/RandomToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/RandomToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,13 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.lang.reflect.Constructor; import java.security.SecureRandom; +import java.util.Arrays; import java.util.Random; import org.junit.jupiter.api.BeforeAll; @@ -102,4 +106,18 @@ public class RandomToolsTests { String result = RandomTools.secureRandomStr(sourceCharactersString, 5); assertEquals(5, result.length()); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = RandomTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/RegexToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/RegexToolsTests.java index 0d3fb8d..7ad974f 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/RegexToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/RegexToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.*; +import java.lang.reflect.Constructor; +import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -162,4 +164,18 @@ class RegexToolsTests { RegexTools.getMatcher("abc", pattern); }); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = RegexTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java index b383ee6..94d88a5 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,14 @@ package xyz.zhouxy.plusone.commons.util; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.lang.reflect.Constructor; +import java.util.Arrays; + import org.junit.jupiter.api.Test; public @@ -84,4 +88,18 @@ class StringToolsTests { void repeat_ZeroTimes_ReturnsEmptyString() { assertEquals("", StringTools.repeat("Hello", 0)); } + + @Test + void test_constructor_isNotAccessible_ThrowsIllegalStateException() { + Constructor[] constructors = StringTools.class.getDeclaredConstructors(); + Arrays.stream(constructors) + .forEach(constructor -> { + assertFalse(constructor.isAccessible()); + constructor.setAccessible(true); + Throwable cause = assertThrows(Exception.class, constructor::newInstance) + .getCause(); + assertInstanceOf(IllegalStateException.class, cause); + assertEquals("Utility class", cause.getMessage()); + }); + } } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/TreeBuilderTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/TreeBuilderTests.java index 4249c40..cc7c022 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/TreeBuilderTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/TreeBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ class TreeBuilderTests { Menu::getMenuCode, menu -> Optional.ofNullable(menu.parentMenuCode), MenuList::addChild, - Menu.orderNumComparator); + Comparator.comparing(Menu::getOrderNum)); @Test void testBuildTreeAndSortedByOrderNum() { @@ -70,31 +70,35 @@ class TreeBuilderTests { List menuTreeSortedByOrderNum = treeBuilder.buildTree(clonedMenus); log.info("menuTreeSortedByOrderNum: {}", new Gson().toJson(menuTreeSortedByOrderNum)); - assertEquals(clonedMenus.stream() + assertEquals( + clonedMenus.stream() .filter(menu -> menu.getParentMenuCode() == null) - .sorted(Menu.orderNumComparator) + .sorted(Comparator.comparing(Menu::getOrderNum)) .collect(Collectors.toList()), - menuTreeSortedByOrderNum); + menuTreeSortedByOrderNum); Map menuMap = new HashMap<>(); for (Menu element : clonedMenus) { menuMap.put(element.getMenuCode(), element); } - assertEquals(Arrays.stream(new Menu[] { B001, B002, B003, B004 }) - .sorted(Menu.orderNumComparator) + assertEquals( + Arrays.stream(new Menu[] { B001, B002, B003, B004 }) + .sorted(Comparator.comparing(Menu::getOrderNum)) .collect(Collectors.toList()), - MenuList.class.cast(menuMap.get("B")).children); + MenuList.class.cast(menuMap.get("B")).children); - assertEquals(Arrays.stream(new Menu[] { C1, C2, C3 }) - .sorted(Menu.orderNumComparator) + assertEquals( + Arrays.stream(new Menu[] { C1, C2, C3 }) + .sorted(Comparator.comparing(Menu::getOrderNum)) .collect(Collectors.toList()), - MenuList.class.cast(menuMap.get("C")).children); + MenuList.class.cast(menuMap.get("C")).children); - assertEquals(Arrays.stream(new Menu[] { C1001, C1002 }) - .sorted(Menu.orderNumComparator) + assertEquals( + Arrays.stream(new Menu[] { C1001, C1002 }) + .sorted(Comparator.comparing(Menu::getOrderNum)) .collect(Collectors.toList()), - MenuList.class.cast(menuMap.get("C1")).children); + MenuList.class.cast(menuMap.get("C1")).children); } @@ -103,16 +107,16 @@ class TreeBuilderTests { List clonedMenus; clonedMenus = menus.stream().map(ObjectUtil::clone).collect(Collectors.toList()); - List menuTreeSortedByMenuCode = treeBuilder.buildTree( - clonedMenus, - (a, b) -> a.getMenuCode().compareTo(b.getMenuCode())); + List menuTreeSortedByMenuCode = treeBuilder + .buildTree(clonedMenus, Comparator.comparing(Menu::getMenuCode)); log.info("menuTreeSortedByMenuCode: {}", new Gson().toJson(menuTreeSortedByMenuCode)); - assertEquals(clonedMenus.stream() + assertEquals( + clonedMenus.stream() .filter(menu -> menu.getParentMenuCode() == null) - .sorted((a, b) -> a.getMenuCode().compareTo(b.getMenuCode())) + .sorted(Comparator.comparing(Menu::getMenuCode)) .collect(Collectors.toList()), - menuTreeSortedByMenuCode); + menuTreeSortedByMenuCode); Map menuMap = new HashMap<>(); for (Menu element : clonedMenus) { @@ -160,9 +164,6 @@ class TreeBuilderTests { return orderNum; } - public static Comparator orderNumComparator = - (a, b) -> Integer.compare(a.getOrderNum(), b.getOrderNum()); - private static final long serialVersionUID = 20240917181424L; }