feat: 准备 1.4.0 稳定版本
Build / build (push) Has been cancelled
Build / Paper 1.21.11 / Java 21 (push) Has been cancelled
Build / Paper 26.1.2 / Java 25 (push) Has been cancelled
Build / Paper 26.2 / Java 25 (push) Has been cancelled

This commit is contained in:
2026-08-02 12:18:04 +08:00
parent 19ddd3fa99
commit 4fc709bdb7
52 changed files with 1487 additions and 526 deletions
@@ -0,0 +1,45 @@
package cn.infstar.essentialsC.admin;
import cn.infstar.essentialsC.util.AtomicYamlWriter;
import org.bukkit.configuration.file.YamlConfiguration;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;
import java.util.logging.Logger;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class AdminModeStoreTest {
@TempDir
Path temporaryDirectory;
@Test
void migratesLegacyPlayersIntoIndependentFiles() throws Exception {
UUID playerId = UUID.randomUUID();
Path legacyFile = temporaryDirectory.resolve("admin-mode.yml");
YamlConfiguration legacy = new YamlConfiguration();
legacy.set("players." + playerId + ".active", true);
legacy.set("players." + playerId + ".normal.level", 27);
AtomicYamlWriter.save(legacy, legacyFile.toFile());
AdminModeStore store = new AdminModeStore(
temporaryDirectory.resolve("admin-mode").toFile(), legacyFile.toFile(), Logger.getAnonymousLogger());
YamlConfiguration migrated = store.load(playerId);
assertNotNull(migrated);
assertTrue(migrated.getBoolean("active"));
assertEquals(27, migrated.getInt("normal.level"));
assertTrue(Files.exists(temporaryDirectory.resolve("admin-mode").resolve(playerId + ".yml")));
assertFalse(Files.exists(legacyFile));
try (var backups = Files.list(temporaryDirectory)) {
assertTrue(backups.anyMatch(path -> path.getFileName().toString().startsWith("admin-mode.legacy-")));
}
}
}
@@ -0,0 +1,23 @@
package cn.infstar.essentialsC.compat.jei;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
class RecipeGroupingTest {
@Test
void groupsValuesInOnePassAndPreservesOrder() {
List<String> recipes = List.of("crafting:first", "smelting:second", "crafting:third");
Map<String, List<String>> grouped = RecipeGrouping.groupBy(
recipes, value -> value.substring(0, value.indexOf(':')));
assertEquals(List.of("crafting", "smelting"), grouped.keySet().stream().toList());
assertEquals(List.of("crafting:first", "crafting:third"), grouped.get("crafting"));
assertEquals(List.of("smelting:second"), grouped.get("smelting"));
}
}
@@ -58,4 +58,19 @@ class AtomicYamlWriterTest {
assertTrue(YamlConfiguration.loadConfiguration(target.toFile()).getBoolean("written"));
}
@Test
void preservesParsedChineseComments() throws Exception {
Path target = temporaryDirectory.resolve("commented.yml");
YamlConfiguration configuration = new YamlConfiguration();
configuration.options().parseComments(true);
configuration.loadFromString("# 中文配置注释\nenabled: false\n");
configuration.set("enabled", true);
AtomicYamlWriter.save(configuration, target.toFile());
String saved = Files.readString(target, StandardCharsets.UTF_8);
assertTrue(saved.contains("# 中文配置注释"));
assertTrue(saved.contains("enabled: true"));
}
}