diff --git a/ContentGrabbingJi-core/src/test/java/net/lamgc/cgj/bot/framework/JsonFrameworkDescriptorSerializerTest.java b/ContentGrabbingJi-core/src/test/java/net/lamgc/cgj/bot/framework/JsonFrameworkDescriptorSerializerTest.java index f93ed72..c59e88e 100644 --- a/ContentGrabbingJi-core/src/test/java/net/lamgc/cgj/bot/framework/JsonFrameworkDescriptorSerializerTest.java +++ b/ContentGrabbingJi-core/src/test/java/net/lamgc/cgj/bot/framework/JsonFrameworkDescriptorSerializerTest.java @@ -19,6 +19,8 @@ package net.lamgc.cgj.bot.framework; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import net.lamgc.cgj.bot.framework.message.BotCodeDescriptor; import net.lamgc.cgj.bot.framework.util.AuthorJsonSerializer; import net.lamgc.cgj.bot.framework.util.BotCodeDescriptorJsonSerializer; @@ -36,17 +38,31 @@ import java.util.regex.Pattern; public class JsonFrameworkDescriptorSerializerTest { + private final static Gson gson = getGson(); + @Test public void deserializerTest() throws IOException { - InputStream resource = getClass().getClassLoader().getResourceAsStream("test-framework.json"); - if (resource == null) { - Assert.fail("未找到测试用资源: test-framework.json"); - } FrameworkDescriptor descriptor; - try (Reader resourceReader = new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8))) { - descriptor = getGson().fromJson(resourceReader, DefaultFrameworkDescriptor.class); + JsonObject rawObject; + try (Reader resourceReader = getResourceAsReader("test-framework.json")) { + rawObject = gson.fromJson(resourceReader, JsonObject.class); + descriptor = gson.fromJson(rawObject, DefaultFrameworkDescriptor.class); } + assertDescriptor(descriptor); + assertDescriptor(gson.fromJson(gson.toJson(descriptor), DefaultFrameworkDescriptor.class)); + } + + private static Reader getResourceAsReader(String resourceName) { + InputStream resource = JsonFrameworkDescriptorSerializerTest.class + .getClassLoader().getResourceAsStream(resourceName); + if (resource == null) { + Assert.fail("未找到测试用资源: " + resourceName); + } + return new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8)); + } + + private void assertDescriptor(FrameworkDescriptor descriptor) { Assert.assertEquals("cgj-mirai", descriptor.getPluginId()); Assert.assertEquals("test", descriptor.getPluginDescription()); Assert.assertEquals("3.0.0-alpha", descriptor.getVersion()); @@ -56,8 +72,8 @@ public class JsonFrameworkDescriptorSerializerTest { Assert.assertEquals("com.example.FrameworkMain", descriptor.getPluginClass()); List expectedDependency = new ArrayList<>(); - expectedDependency.add(new PluginDependency("xxx@1.0.0")); - expectedDependency.add(new PluginDependency("xxx optional add->?@1.0.0")); + expectedDependency.add(new PluginDependency("RequireDepend@1.0.0")); + expectedDependency.add(new PluginDependency("OptionalDepend?@1.0.0")); Assert.assertEquals(expectedDependency, descriptor.getDependencies()); @@ -79,7 +95,69 @@ public class JsonFrameworkDescriptorSerializerTest { Assert.fail("存在不符的表达式: " + pattern.pattern()); } } + } + @Test(expected = JsonParseException.class) + public void author_missingFieldTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badAuthor-MissingField-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void author_invalidFieldTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badAuthor-InvalidField-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void author_NonAObjectTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badAuthor-NonObject-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void botCode_NonAObjectTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badBotCode-NonObject-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void platform_NonAObjectTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badPlatform-NonObject-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void platform_MissingNameFieldTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badPlatform-MissingField-Name-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void platform_MissingIdentifyFieldTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badPlatform-MissingField-Identify-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void pluginDependency_NonPrimitiveTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badPluginDependency-NonPrimitive-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } + } + + @Test(expected = JsonParseException.class) + public void pluginDependency_NonStringTest() throws IOException { + try (Reader resourceReader = getResourceAsReader("badPluginDependency-NonString-framework.json")) { + gson.fromJson(resourceReader, DefaultFrameworkDescriptor.class); + } } private static Gson getGson() { diff --git a/ContentGrabbingJi-core/src/test/resources/badAuthor-InvalidField-framework.json b/ContentGrabbingJi-core/src/test/resources/badAuthor-InvalidField-framework.json new file mode 100644 index 0000000..45e4380 --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badAuthor-InvalidField-framework.json @@ -0,0 +1,33 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": { + "name": "Tencent QQ", + "identify": "qq" + }, + "authors": [ + { + "name": [ + "invalid array" + ] + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badAuthor-MissingField-framework.json b/ContentGrabbingJi-core/src/test/resources/badAuthor-MissingField-framework.json new file mode 100644 index 0000000..b1838b2 --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badAuthor-MissingField-framework.json @@ -0,0 +1,31 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": { + "name": "Tencent QQ", + "identify": "qq" + }, + "authors": [ + { + "desc": "Missing name field" + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badAuthor-NonObject-framework.json b/ContentGrabbingJi-core/src/test/resources/badAuthor-NonObject-framework.json new file mode 100644 index 0000000..88b357c --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badAuthor-NonObject-framework.json @@ -0,0 +1,29 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": { + "name": "Tencent QQ", + "identify": "qq" + }, + "authors": [ + "invalid data" + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badBotCode-NonObject-framework.json b/ContentGrabbingJi-core/src/test/resources/badBotCode-NonObject-framework.json new file mode 100644 index 0000000..61e4c0e --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badBotCode-NonObject-framework.json @@ -0,0 +1,27 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": { + "name": "Tencent QQ", + "identify": "qq" + }, + "authors": [ + { + "name": "LamGC", + "url": "https://github.com/LamGC", + "email": "lam827@lamgc.net" + } + ], + "botCode": "invalid value" +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badPlatform-MissingField-Identify-framework.json b/ContentGrabbingJi-core/src/test/resources/badPlatform-MissingField-Identify-framework.json new file mode 100644 index 0000000..68bfd88 --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badPlatform-MissingField-Identify-framework.json @@ -0,0 +1,32 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": { + "name": "Tencent QQ" + }, + "authors": [ + { + "name": "LamGC", + "url": "https://github.com/LamGC", + "email": "lam827@lamgc.net" + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badPlatform-MissingField-Name-framework.json b/ContentGrabbingJi-core/src/test/resources/badPlatform-MissingField-Name-framework.json new file mode 100644 index 0000000..3b81354 --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badPlatform-MissingField-Name-framework.json @@ -0,0 +1,32 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": { + "identify": "qq" + }, + "authors": [ + { + "name": "LamGC", + "url": "https://github.com/LamGC", + "email": "lam827@lamgc.net" + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badPlatform-NonObject-framework.json b/ContentGrabbingJi-core/src/test/resources/badPlatform-NonObject-framework.json new file mode 100644 index 0000000..5d85649 --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badPlatform-NonObject-framework.json @@ -0,0 +1,30 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" + ], + + "platform": "invalid value", + "authors": [ + { + "name": "LamGC", + "url": "https://github.com/LamGC", + "email": "lam827@lamgc.net" + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badPluginDependency-NonPrimitive-framework.json b/ContentGrabbingJi-core/src/test/resources/badPluginDependency-NonPrimitive-framework.json new file mode 100644 index 0000000..c802411 --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badPluginDependency-NonPrimitive-framework.json @@ -0,0 +1,34 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + { + "desc": "Error type" + } + ], + + "platform": { + "name": "Tencent QQ", + "identify": "qq" + }, + "authors": [ + { + "name": "LamGC", + "url": "https://github.com/LamGC", + "email": "lam827@lamgc.net" + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/badPluginDependency-NonString-framework.json b/ContentGrabbingJi-core/src/test/resources/badPluginDependency-NonString-framework.json new file mode 100644 index 0000000..7aecebd --- /dev/null +++ b/ContentGrabbingJi-core/src/test/resources/badPluginDependency-NonString-framework.json @@ -0,0 +1,32 @@ +// 该文件为 framework.json 格式完整示例, 非测试用文件. +{ + "id": "cgj-mirai", + "description": "test", + "version": "3.0.0-alpha", + "requiresVersion": "=>3.0.0", + "provider": "Github@LamGC, Github@mamoe", + "license": "AGPL-3.0", + "frameworkClass": "com.example.FrameworkMain", + "dependencies": [ + 12345 + ], + + "platform": { + "name": "Tencent QQ", + "identify": "qq" + }, + "authors": [ + { + "name": "LamGC", + "url": "https://github.com/LamGC", + "email": "lam827@lamgc.net" + } + ], + "botCode": { + "patterns": [ + "(?:\\[mirai:([^:]+)\\])", + "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + ] + } +} \ No newline at end of file diff --git a/ContentGrabbingJi-core/src/test/resources/test-framework.json b/ContentGrabbingJi-core/src/test/resources/test-framework.json index 21ce630..74f69fb 100644 --- a/ContentGrabbingJi-core/src/test/resources/test-framework.json +++ b/ContentGrabbingJi-core/src/test/resources/test-framework.json @@ -7,8 +7,8 @@ "license": "AGPL-3.0", "frameworkClass": "com.example.FrameworkMain", "dependencies": [ - "xxx@1.0.0", - "xxx optional add->?@1.0.0" + "RequireDepend@1.0.0", + "OptionalDepend?@1.0.0" ], "platform": { @@ -26,7 +26,11 @@ "patterns": [ "(?:\\[mirai:([^:]+)\\])", "(?:\\[mirai:([^\\]]*)?:(.*?)?\\])", - "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])" + "(?:\\[mirai:([^\\]]*)?(:(.*?))*?\\])", + { + "tips": "invalid data" + }, + 123456 ] } } \ No newline at end of file