From 987bd783cf13c93104d10ff0355a43c4baaf6ef5 Mon Sep 17 00:00:00 2001 From: miko <1059665047@qq.com> Date: Wed, 25 Dec 2024 16:20:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?GifCaptcha.setRepeat=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=97=A0=E6=95=88=E5=80=BC=EF=BC=8C=E5=BA=94=E8=AF=A5=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E4=B8=BA=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/captcha/GifCaptcha.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java index 7da77496c..d32c195d3 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java @@ -113,9 +113,7 @@ public class GifCaptcha extends AbstractCaptcha { * @return this */ public GifCaptcha setRepeat(int repeat) { - if (repeat >= 0) { - this.repeat = repeat; - } + this.repeat = Math.max(repeat, 0); return this; } From 980d1e79e55c1cafc0c1ea9a482442579b76eb4a Mon Sep 17 00:00:00 2001 From: miko <1059665047@qq.com> Date: Wed, 25 Dec 2024 16:20:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?GifCaptcha=E9=83=A8=E5=88=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/captcha/GifCaptchaUtilTest.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 hutool-captcha/src/test/java/cn/hutool/captcha/GifCaptchaUtilTest.java diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/GifCaptchaUtilTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/GifCaptchaUtilTest.java new file mode 100644 index 000000000..e02f5f539 --- /dev/null +++ b/hutool-captcha/src/test/java/cn/hutool/captcha/GifCaptchaUtilTest.java @@ -0,0 +1,115 @@ +package cn.hutool.captcha; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.awt.*; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import static org.junit.jupiter.api.Assertions.*; + +public class GifCaptchaUtilTest { + + private GifCaptcha captcha; + + @BeforeEach + public void setUp() { + // 初始化 GifCaptcha 类的实例 + captcha = new GifCaptcha(200, 100, 4, 10); // width, height, codeCount, interfereCount + } + + // 使用反射调用私有方法 + private Object invokePrivateMethod(String methodName, Class[] parameterTypes, Object[] parameters) throws Exception { + Method method = GifCaptcha.class.getDeclaredMethod(methodName, parameterTypes); + method.setAccessible(true); // 允许访问私有方法 + return method.invoke(captcha, parameters); + } + + // 测试 setQuality() 方法 + @Test + public void testSetQuality() throws Exception { + captcha.setQuality(20); + // 通过反射获取 quality 字段的值并进行断言 + assertEquals(20, getPrivateField("quality"), "Quality 应该设置为 20"); + + captcha.setQuality(0); // 设置无效值,应该被设置为 1 + assertEquals(1, getPrivateField("quality"), "Quality 应该设置为 1,如果小于 1"); + } + + // 测试 setRepeat() 方法 + @Test + public void testSetRepeat() throws Exception { + captcha.setRepeat(5); + // 通过反射获取 repeat 字段的值并进行断言 + assertEquals(5, getPrivateField("repeat"), "Repeat 应该设置为 5"); + + captcha.setRepeat(-1); // 设置无效值,应该保持为 0 + assertEquals(0, getPrivateField("repeat"), "Repeat 应该设置为 0,如果设置了负值"); + } + + // 测试 setColorRange() 方法 + @Test + public void testSetColorRange() throws Exception { + captcha.setMinColor(100).setMaxColor(200); + // 通过反射获取 minColor 和 maxColor 字段的值并进行断言 + assertEquals(100, getPrivateField("minColor"), "Min color 应该设置为 100"); + assertEquals(200, getPrivateField("maxColor"), "Max color 应该设置为 200"); + } + + // 测试生成验证码图像的方法 createCode() + @Test + public void testCreateCode() throws Exception { + captcha.createCode(); + byte[] imageBytes = captcha.getImageBytes(); + + // 检查生成的图片字节是否不为 null 或空 + assertNotNull(imageBytes, "生成的图片字节不应该为 null"); + assertTrue(imageBytes.length > 0, "生成的图片字节不应该为空"); + + // 可选:你也可以通过解码图片字节,检查它是否是有效的 GIF 格式 + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(imageBytes); + + // 解码图片检查它是否为有效的 GIF(假设你有库可以解码 GIF) + // ImageIO.read(new ByteArrayInputStream(imageBytes)); // 可以取消注释来检查它是否是有效的 GIF + } + + // 测试 graphicsImage() 方法 + @Test + public void testGraphicsImage() throws Exception { + char[] chars = new char[]{'A', 'B', 'C', 'D'}; + Color[] colors = new Color[]{ + Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW + }; + + // 使用反射调用 private 方法 graphicsImage + Object result = invokePrivateMethod("graphicsImage", new Class[]{char[].class, Color[].class, char[].class, int.class}, new Object[]{chars, colors, chars, 0}); + + assertNotNull(result, "生成的图片不应该为 null"); + assertTrue(result instanceof java.awt.image.BufferedImage, "返回的结果应该是 BufferedImage 类型"); + } + + // 测试 getRandomColor() 方法 + @Test + public void testRandomColor() throws Exception { + // 使用反射调用 private 方法 getRandomColor + Object result = invokePrivateMethod("getRandomColor", new Class[]{int.class, int.class}, new Object[]{0, 255}); + + assertNotNull(result, "生成的颜色不应该为 null"); + assertTrue(result instanceof Color, "返回的结果应该是 Color 类型"); + + Color color = (Color) result; + assertTrue(color.getRed() >= 0 && color.getRed() <= 255, "颜色的红色分量应该在 0 到 255 之间"); + assertTrue(color.getGreen() >= 0 && color.getGreen() <= 255, "颜色的绿色分量应该在 0 到 255 之间"); + assertTrue(color.getBlue() >= 0 && color.getBlue() <= 255, "颜色的蓝色分量应该在 0 到 255 之间"); + } + + // 辅助方法:通过反射获取私有字段的值 + private Object getPrivateField(String fieldName) throws NoSuchFieldException, IllegalAccessException { + Field field = GifCaptcha.class.getDeclaredField(fieldName); + field.setAccessible(true); // 允许访问私有字段 + return field.get(captcha); + } +} From 79edb438311554a0593d80660927d1171ea613e3 Mon Sep 17 00:00:00 2001 From: miko <1059665047@qq.com> Date: Wed, 25 Dec 2024 16:47:34 +0800 Subject: [PATCH 3/3] =?UTF-8?q?ShearCaptcha=E9=83=A8=E5=88=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/captcha/ShearCaptchaTest.java | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 hutool-captcha/src/test/java/cn/hutool/captcha/ShearCaptchaTest.java diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/ShearCaptchaTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/ShearCaptchaTest.java new file mode 100644 index 000000000..b68cf1e96 --- /dev/null +++ b/hutool-captcha/src/test/java/cn/hutool/captcha/ShearCaptchaTest.java @@ -0,0 +1,148 @@ +package cn.hutool.captcha; +import cn.hutool.captcha.ShearCaptcha; +import cn.hutool.captcha.generator.RandomGenerator; +import cn.hutool.core.img.GraphicsUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.util.RandomUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.lang.reflect.Method; + +import static org.junit.jupiter.api.Assertions.*; + +public class ShearCaptchaTest { + + private ShearCaptcha captcha; + + @BeforeEach + public void setUp() { + // 初始化 ShearCaptcha 实例 + captcha = new ShearCaptcha(200, 100); + } + + // 测试构造函数和基本功能 + @Test + public void testConstructor() { + assertNotNull(captcha, "Captcha 实例应该被成功创建"); + } + + // 测试生成验证码图片的功能 + @Test + public void testCreateImage() { + String code = "ABCD"; + Image image = captcha.createImage(code); + assertNotNull(image, "验证码图片不应该为 null"); + assertTrue(image instanceof BufferedImage, "生成的图片应该是 BufferedImage 类型"); + + // 可选:进一步测试图像的内容 + BufferedImage bufferedImage = (BufferedImage) image; + assertEquals(200, bufferedImage.getWidth(), "图像宽度应该为 200"); + assertEquals(100, bufferedImage.getHeight(), "图像高度应该为 100"); + } + + // 测试绘制字符串的方法 + @Test + public void testDrawString() throws Exception { + String code = "ABCD"; + Method drawStringMethod = ShearCaptcha.class.getDeclaredMethod("drawString", Graphics2D.class, String.class); + drawStringMethod.setAccessible(true); + + Graphics2D g2d = (Graphics2D) new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB).getGraphics(); + drawStringMethod.invoke(captcha, g2d, code); + + assertNotNull(g2d, "Graphics2D 对象不应该为 null"); + assertTrue(g2d.getRenderingHints().containsKey(RenderingHints.KEY_ANTIALIASING), "应该启用抗锯齿"); + } + + // 测试 shear() 方法 + @Test + public void testShear() throws Exception { + // 使用反射测试 shear 方法 + Method shearMethod = ShearCaptcha.class.getDeclaredMethod("shear", Graphics.class, int.class, int.class, Color.class); + shearMethod.setAccessible(true); + + Graphics g = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB).getGraphics(); + shearMethod.invoke(captcha, g, 200, 100, Color.WHITE); + + // 假设没有明显的错误输出,认为测试通过 + assertNotNull(g, "Graphics 对象不应该为 null"); + } + + // 测试 shearX() 方法 + @Test + public void testShearX() throws Exception { + // 使用反射测试 shearX 方法 + Method shearXMethod = ShearCaptcha.class.getDeclaredMethod("shearX", Graphics.class, int.class, int.class, Color.class); + shearXMethod.setAccessible(true); + + Graphics g = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB).getGraphics(); + shearXMethod.invoke(captcha, g, 200, 100, Color.RED); + + // 假设没有明显的错误输出,认为测试通过 + assertNotNull(g, "Graphics 对象不应该为 null"); + } + + // 测试 shearY() 方法 + @Test + public void testShearY() throws Exception { + // 使用反射测试 shearY 方法 + Method shearYMethod = ShearCaptcha.class.getDeclaredMethod("shearY", Graphics.class, int.class, int.class, Color.class); + shearYMethod.setAccessible(true); + + Graphics g = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB).getGraphics(); + shearYMethod.invoke(captcha, g, 200, 100, Color.BLUE); + + // 假设没有明显的错误输出,认为测试通过 + assertNotNull(g, "Graphics 对象不应该为 null"); + } + + // 测试 drawInterfere() 方法 + @Test + public void testDrawInterfere() throws Exception { + // 使用反射测试 drawInterfere 方法 + Method drawInterfereMethod = ShearCaptcha.class.getDeclaredMethod("drawInterfere", Graphics.class, int.class, int.class, int.class, int.class, int.class, Color.class); + drawInterfereMethod.setAccessible(true); + + Graphics g = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB).getGraphics(); + drawInterfereMethod.invoke(captcha, g, 0, 0, 200, 100, 4, Color.GREEN); + + // 假设没有明显的错误输出,认为测试通过 + assertNotNull(g, "Graphics 对象不应该为 null"); + } + + // 测试验证码生成时的干扰线 + @Test + public void testDrawInterfereLines() { + // 设置干扰线数量 + captcha = new ShearCaptcha(200, 100, 4); + Image image = captcha.createImage("ABCD"); + + // 检查图像内容,判断干扰线是否正确绘制 + assertNotNull(image, "生成的验证码图片不应该为空"); + } + + // 测试验证码的尺寸 + @Test + public void testCaptchaSize() { + captcha = new ShearCaptcha(300, 150); + + String code = "XYZ"; + Image image = captcha.createImage(code); + + BufferedImage bufferedImage = (BufferedImage) image; + assertEquals(300, bufferedImage.getWidth(), "图像宽度应该为 300"); + assertEquals(150, bufferedImage.getHeight(), "图像高度应该为 150"); + } + + // 测试生成随机验证码字符 + @Test + public void testRandomGenerator() { + RandomGenerator randomGenerator = new RandomGenerator(4); + String code = randomGenerator.generate(); + assertNotNull(code, "生成的验证码字符不应该为 null"); + assertEquals(4, code.length(), "验证码字符长度应该为 4"); + } +}