SharedPreferences
import com.m8test.script.GlobalVariables.*
/**
* Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
* 全局变量: _storages
*/
// 辅助函数
fun assertLog(name: String, actual: Any?, expected: Any?) {
if (actual == expected) {
_console.log("✅ [$name] Passed. Result: $actual")
} else {
_console.error("❌ [$name] Failed.\n Expected: $expected\n Actual : $actual")
}
}
_console.log("🚀 开始测试 Storage 存储模块...")
// ==========================================
// 1. 初始化与 Storages 管理测试
// ==========================================
val storeName = "test_config_pref"
// 确保测试环境干净:先尝试移除该名称的存储
// remove 返回 boolean
_storages.remove(storeName)
// 获取存储实例
// 如果不存在会自动创建/打开
val store = _storages.get(storeName)
if (store != null) {
_console.log("✅ 获取 Storage 实例成功: $storeName")
} else {
_console.error("❌ 获取 Storage 实例失败")
throw RuntimeException("Storage is null")
}
// 确保是一个空的或干净的存储
store.clear()
// ==========================================
// 2. 基础增删改查 (CRUD)
// ==========================================
_console.log("\n--- 测试 Put & Get ---")
// Put
val putRes1 = store.put("username", "M8Tester")
val putRes2 = store.put("api_token", "abcdef123456")
val putRes3 = store.put("login_count", "10") // 接口定义 value 必须是 String
assertLog("put('username')", putRes1, true)
assertLog("put('api_token')", putRes2, true)
// Get (存在的键)
val username = store.get("username", "default_user")
assertLog("get('username')", username, "M8Tester")
// Get (不存在的键,测试默认值)
val missingVal = store.get("not_exist_key", "DEFAULT_VAL")
assertLog("get(不存在的键)", missingVal, "DEFAULT_VAL")
// ==========================================
// 3. 状态判断 (Contains)
// ==========================================
_console.log("\n--- 测试 Contains ---")
assertLog("contains('api_token')", store.contains("api_token"), true)
assertLog("contains('ghost_key')", store.contains("ghost_key"), false)
// ==========================================
// 4. 遍历 (ForEach)
// ==========================================
_console.log("\n--- 测试 ForEach ---")
var count = 0
val keysFound = mutableListOf<String>()
// forEach
store.forEach { key, value ->
_console.log(" Iterating -> Key: $key, Value: $value")
keysFound.add(key)
count++
}
// 验证遍历的数量和内容是否正确
// 我们插入了 3 个: username, api_token, login_count
assertLog("forEach 数量统计", count, 3)
if (keysFound.contains("username") && keysFound.contains("login_count")) {
_console.log("✅ forEach 内容验证通过")
} else {
_console.error("❌ forEach 内容验证失败: $keysFound")
}
// ==========================================
// 5. 移除与清空 (Remove & Clear)
// ==========================================
_console.log("\n--- 测试 Remove & Clear ---")
// Remove 单个 Key
val removeRes = store.remove("username")
assertLog("remove('username')", removeRes, true)
assertLog("contains('username') after remove", store.contains("username"), false)
// Clear 全部
val clearRes = store.clear()
assertLog("clear()", clearRes, true)
// 验证是否为空
// 通过再次遍历或检查 contains 验证
val isEmpty = !store.contains("api_token") && !store.contains("login_count")
assertLog("验证 clear 后数据为空", isEmpty, true)
// ==========================================
// 6. 销毁存储实例 (Storages.remove)
// ==========================================
_console.log("\n--- 测试 Storages.remove ---")
// 移除整个存储实例(通常意味着删除底层的 XML 文件或数据库文件)
val storageRemoveRes = _storages.remove(storeName)
assertLog("storages.remove", storageRemoveRes, true)
// 再次获取该名称的 storage,应该是全新的(空的)
// 此时 get 不会返回 null,而是返回一个新的空实例
val newStore = _storages.get(storeName)
// 验证旧数据确实没了(虽然我们在步骤 5 已经 clear 了,但为了测试 remove 的逻辑,这里假设其重置了状态)
// 使用 !! 假设 get 返回非空,或者安全调用
assertLog("新实例不包含旧数据", newStore?.contains("api_token") ?: false, false)
_console.log("🎉 Storage 接口测试完毕。")
_script.getThreads().getMain().setBackground(true)
/**
* Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
* 全局变量: $storages
*/
$console.log("🚀 开始测试 Storage 存储模块...")
// ==========================================
// 1. 初始化与 Storages 管理测试
// ==========================================
def storeName = "test_config_pref"
// 确保测试环境干净:先尝试移除该名称的存储
// remove 返回 boolean
$storages.remove(storeName)
// 获取存储实例
// 如果不存在会自动创建/打开
def store = $storages.get(storeName)
if (store != null) {
$console.log("✅ 获取 Storage 实例成功: ${storeName}")
} else {
$console.error("❌ 获取 Storage 实例失败")
return
}
// 确保是一个空的或干净的存储
store.clear()
// ==========================================
// 2. 基础增删改查 (CRUD)
// ==========================================
$console.log("\n--- 测试 Put & Get ---")
// Put
def putRes1 = store.put("username", "M8Tester")
def putRes2 = store.put("api_token", "abcdef123456")
def putRes3 = store.put("login_count", "10") // 接口定义 value 必须是 String
assertLog("put('username')", putRes1, true)
assertLog("put('api_token')", putRes2, true)
// Get (存在的键)
def username = store.get("username", "default_user")
assertLog("get('username')", username, "M8Tester")
// Get (不存在的键,测试默认值)
def missingVal = store.get("not_exist_key", "DEFAULT_VAL")
assertLog("get(不存在的键)", missingVal, "DEFAULT_VAL")
// ==========================================
// 3. 状态判断 (Contains)
// ==========================================
$console.log("\n--- 测试 Contains ---")
assertLog("contains('api_token')", store.contains("api_token"), true)
assertLog("contains('ghost_key')", store.contains("ghost_key"), false)
// ==========================================
// 4. 遍历 (ForEach)
// ==========================================
$console.log("\n--- 测试 ForEach ---")
def count = 0
def keysFound = []
// forEach 接收一个 BiConsumer (String, String) -> Unit
store.forEach { key, value ->
$console.log(" Iterating -> Key: ${key}, Value: ${value}")
keysFound.add(key)
count++
}
// 验证遍历的数量和内容是否正确
// 我们插入了 3 个: username, api_token, login_count
assertLog("forEach 数量统计", count, 3)
if (keysFound.contains("username") && keysFound.contains("login_count")) {
$console.log("✅ forEach 内容验证通过")
} else {
$console.error("❌ forEach 内容验证失败: " + keysFound)
}
// ==========================================
// 5. 移除与清空 (Remove & Clear)
// ==========================================
$console.log("\n--- 测试 Remove & Clear ---")
// Remove 单个 Key
def removeRes = store.remove("username")
assertLog("remove('username')", removeRes, true)
assertLog("contains('username') after remove", store.contains("username"), false)
// Clear 全部
def clearRes = store.clear()
assertLog("clear()", clearRes, true)
// 验证是否为空
// 通过再次遍历或检查 contains 验证
def isEmpty = !store.contains("api_token") && !store.contains("login_count")
assertLog("验证 clear 后数据为空", isEmpty, true)
// ==========================================
// 6. 销毁存储实例 (Storages.remove)
// ==========================================
$console.log("\n--- 测试 Storages.remove ---")
// 移除整个存储实例(通常意味着删除底层的 XML 文件或数据库文件)
def storageRemoveRes = $storages.remove(storeName)
assertLog("storages.remove", storageRemoveRes, true)
// 再次获取该名称的 storage,应该是全新的(空的)
// 此时 get 不会返回 null,而是返回一个新的空实例
def newStore = $storages.get(storeName)
// 验证旧数据确实没了(虽然我们在步骤 5 已经 clear 了,但为了测试 remove 的逻辑,这里假设其重置了状态)
assertLog("新实例不包含旧数据", newStore.contains("api_token"), false)
$console.log("🎉 Storage 接口测试完毕。")
// ==========================================
// 辅助函数
// ==========================================
def assertLog(name, actual, expected) {
if (actual == expected) {
$console.log("✅ [${name}] Passed. Result: ${actual}")
} else {
$console.error("❌ [${name}] Failed.\n Expected: ${expected}\n Actual : ${actual}")
}
}
$script.getThreads().getMain().setBackground(true)
/**
* Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
* 全局变量: $storages
*/
$console.log("🚀 开始测试 Storage 存储模块...");
// ==========================================
// 1. 初始化与 Storages 管理测试
// ==========================================
const storeName = "test_config_pref";
// 确保测试环境干净:先尝试移除该名称的存储
// remove 返回 boolean
$storages.remove(storeName);
// 获取存储实例
// 如果不存在会自动创建/打开
const store = $storages.get(storeName);
if (store != null) {
$console.log("✅ 获取 Storage 实例成功: " + storeName);
} else {
$console.error("❌ 获取 Storage 实例失败");
throw new Error("获取 Storage 实例失败,测试终止");
}
// 确保是一个空的或干净的存储
store.clear();
// ==========================================
// 2. 基础增删改查 (CRUD)
// ==========================================
$console.log("\n--- 测试 Put & Get ---");
// Put
const putRes1 = store.put("username", "M8Tester");
const putRes2 = store.put("api_token", "abcdef123456");
const putRes3 = store.put("login_count", "10"); // 接口定义 value 必须是 String
assertLog("put('username')", putRes1, true);
assertLog("put('api_token')", putRes2, true);
// Get (存在的键)
const username = store.get("username", "default_user");
assertLog("get('username')", username, "M8Tester");
// Get (不存在的键,测试默认值)
const missingVal = store.get("not_exist_key", "DEFAULT_VAL");
assertLog("get(不存在的键)", missingVal, "DEFAULT_VAL");
// ==========================================
// 3. 状态判断 (Contains)
// ==========================================
$console.log("\n--- 测试 Contains ---");
assertLog("contains('api_token')", store.contains("api_token"), true);
assertLog("contains('ghost_key')", store.contains("ghost_key"), false);
// ==========================================
// 4. 遍历 (ForEach)
// ==========================================
$console.log("\n--- 测试 ForEach ---");
let count = 0;
let keysFound = [];
// forEach 接收一个 (key, value) => {}
store.forEach((key, value) => {
$console.log(" Iterating -> Key: " + key + ", Value: " + value);
keysFound.push(key);
count++;
});
// 验证遍历的数量和内容是否正确
// 我们插入了 3 个: username, api_token, login_count
assertLog("forEach 数量统计", count, 3);
if (keysFound.includes("username") && keysFound.includes("login_count")) {
$console.log("✅ forEach 内容验证通过");
} else {
$console.error("❌ forEach 内容验证失败: " + keysFound);
}
// ==========================================
// 5. 移除与清空 (Remove & Clear)
// ==========================================
$console.log("\n--- 测试 Remove & Clear ---");
// Remove 单个 Key
const removeRes = store.remove("username");
assertLog("remove('username')", removeRes, true);
assertLog("contains('username') after remove", store.contains("username"), false);
// Clear 全部
const clearRes = store.clear();
assertLog("clear()", clearRes, true);
// 验证是否为空
// 通过再次遍历或检查 contains 验证
const isEmpty = store.contains("api_token") == false && store.contains("login_count") == false;
assertLog("验证 clear 后数据为空", isEmpty, true);
// ==========================================
// 6. 销毁存储实例 (Storages.remove)
// ==========================================
$console.log("\n--- 测试 Storages.remove ---");
// 移除整个存储实例(通常意味着删除底层的 XML 文件或数据库文件)
const storageRemoveRes = $storages.remove(storeName);
assertLog("storages.remove", storageRemoveRes, true);
// 再次获取该名称的 storage,应该是全新的(空的)
// 此时 get 不会返回 null,而是返回一个新的空实例
const newStore = $storages.get(storeName);
// 验证旧数据确实没了(虽然我们在步骤 5 已经 clear 了,但为了测试 remove 的逻辑,这里假设其重置了状态)
assertLog("新实例不包含旧数据", newStore.contains("api_token"), false);
$console.log("🎉 Storage 接口测试完毕。");
// ==========================================
// 辅助函数
// ==========================================
/**
* @param {string} name
* @param {any} actual
* @param {any} expected
*/
function assertLog(name, actual, expected) {
if (actual == expected) {
$console.log("✅ [" + name + "] Passed. Result: " + actual);
} else {
$console.error("❌ [" + name + "] Failed.\n Expected: " + expected + "\n Actual : " + actual);
}
}
$script.getThreads().getMain().setBackground(true);
-- ==========================================
-- 辅助函数
-- ==========================================
local function assertLog(name, actual, expected)
if tostring(actual) == tostring(expected) then
_console:log("✅ [" .. name .. "] Passed. Result: " .. tostring(actual))
else
_console:error("❌ [" .. name .. "] Failed.\n Expected: " .. tostring(expected) .. "\n Actual : " .. tostring(actual))
end
end
-- 辅助函数:检查 table (作为list) 中是否包含某个值
local function list_contains(list, value)
for _, v in ipairs(list) do
if v == value then
return true
end
end
return false
end
---
-- Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
-- 全局变量: _storages
---
_console:log("🚀 开始测试 Storage 存储模块...")
-- ==========================================
-- 1. 初始化与 Storages 管理测试
-- ==========================================
local storeName = "test_config_pref"
-- 确保测试环境干净:先尝试移除该名称的存储
-- remove 返回 boolean
_storages:remove(storeName)
-- 获取存储实例
-- 如果不存在会自动创建/打开
local store = _storages:get(storeName)
if store ~= nil then
_console:log("✅ 获取 Storage 实例成功: " .. storeName)
else
_console:error("❌ 获取 Storage 实例失败")
return
end
-- 确保是一个空的或干净的存储
store:clear()
-- ==========================================
-- 2. 基础增删改查 (CRUD)
-- ==========================================
_console:log("\n--- 测试 Put & Get ---")
-- Put
local putRes1 = store:put("username", "M8Tester")
local putRes2 = store:put("api_token", "abcdef123456")
local putRes3 = store:put("login_count", "10") -- 接口定义 value 必须是 String
assertLog("put('username')", putRes1, true)
assertLog("put('api_token')", putRes2, true)
-- Get (存在的键)
local username = store:get("username", "default_user")
assertLog("get('username')", username, "M8Tester")
-- Get (不存在的键,测试默认值)
local missingVal = store:get("not_exist_key", "DEFAULT_VAL")
assertLog("get(不存在的键)", missingVal, "DEFAULT_VAL")
-- ==========================================
-- 3. 状态判断 (Contains)
-- ==========================================
_console:log("\n--- 测试 Contains ---")
assertLog("contains('api_token')", store:contains("api_token"), true)
assertLog("contains('ghost_key')", store:contains("ghost_key"), false)
-- ==========================================
-- 4. 遍历 (ForEach)
-- ==========================================
_console:log("\n--- 测试 ForEach ---")
local count = 0
local keysFound = {}
-- forEach 接收一个 function (key, value)
store:forEach(function(key, value)
_console:log(" Iterating -> Key: " .. tostring(key) .. ", Value: " .. tostring(value))
table.insert(keysFound, key)
count = count + 1
end)
-- 验证遍历的数量和内容是否正确
-- 我们插入了 3 个: username, api_token, login_count
assertLog("forEach 数量统计", count, 3)
if list_contains(keysFound, "username") and list_contains(keysFound, "login_count") then
_console:log("✅ forEach 内容验证通过")
else
_console:error("❌ forEach 内容验证失败: " .. tostring(keysFound))
end
-- ==========================================
-- 5. 移除与清空 (Remove & Clear)
-- ==========================================
_console:log("\n--- 测试 Remove & Clear ---")
-- Remove 单个 Key
local removeRes = store:remove("username")
assertLog("remove('username')", removeRes, true)
assertLog("contains('username') after remove", store:contains("username"), false)
-- Clear 全部
local clearRes = store:clear()
assertLog("clear()", clearRes, true)
-- 验证是否为空
-- 通过再次遍历或检查 contains 验证
local isEmpty = not store:contains("api_token") and not store:contains("login_count")
assertLog("验证 clear 后数据为空", isEmpty, true)
-- ==========================================
-- 6. 销毁存储实例 (Storages.remove)
-- ==========================================
_console:log("\n--- 测试 Storages.remove ---")
-- 移除整个存储实例(通常意味着删除底层的 XML 文件或数据库文件)
local storageRemoveRes = _storages:remove(storeName)
assertLog("storages.remove", storageRemoveRes, true)
-- 再次获取该名称的 storage,应该是全新的(空的)
-- 此时 get 不会返回 nil,而是返回一个新的空实例
local newStore = _storages:get(storeName)
-- 验证旧数据确实没了(虽然我们在步骤 5 已经 clear 了,但为了测试 remove 的逻辑,这里假设其重置了状态)
assertLog("新实例不包含旧数据", newStore:contains("api_token"), false)
_console:log("🎉 Storage 接口测试完毕。")
_script:getThreads():getMain():setBackground(true)
<?php
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
/** @var m8test_java\com\m8test\script\core\api\storage\Storages $storages */
global $storages;
/** @var m8test_java\com\m8test\script\core\api\engine\Script $script */
global $script;
// ==========================================
// 辅助函数
// ==========================================
function assertLog($name, $actual, $expected)
{
global $console;
if ($actual === $expected) { // 使用严格比较
$console->log(javaString("✅ [{$name}] Passed. Result: " . var_export($actual, true)));
} else {
$console->error(javaString("❌ [{$name}] Failed.\n Expected: " . var_export($expected, true) . "\n Actual : " . var_export($actual, true)));
}
}
/**
* Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
* 全局变量: $storages
*/
$console->log(javaString("🚀 开始测试 Storage 存储模块..."));
// ==========================================
// 1. 初始化与 Storages 管理测试
// ==========================================
$storeName = javaString("test_config_pref");
// 确保测试环境干净:先尝试移除该名称的存储
// remove 返回 boolean
$storages->remove($storeName);
// 获取存储实例
// 如果不存在会自动创建/打开
$store = $storages->get($storeName);
if ($store != null) {
$console->log(javaString("✅ 获取 Storage 实例成功: {$storeName}"));
} else {
$console->error(javaString("❌ 获取 Storage 实例失败"));
return;
}
// 确保是一个空的或干净的存储
$store->clear();
// ==========================================
// 2. 基础增删改查 (CRUD)
// ==========================================
$console->log(javaString("\n--- 测试 Put & Get ---"));
// Put
$putRes1 = $store->put(javaString("username"), javaString("M8Tester"));
$putRes2 = $store->put(javaString("api_token"), javaString("abcdef123456"));
$putRes3 = $store->put(javaString("login_count"), javaString("10")); // 接口定义 value 必须是 String
assertLog(javaString("put('username')"), $putRes1, true);
assertLog(javaString("put('api_token')"), $putRes2, true);
// Get (存在的键)
$username = $store->get(javaString("username"), javaString("default_user"));
assertLog(javaString("get('username')"), $username, javaString("M8Tester"));
// Get (不存在的键,测试默认值)
$missingVal = $store->get(javaString("not_exist_key"), javaString("DEFAULT_VAL"));
assertLog(javaString("get(不存在的键)"), $missingVal, javaString("DEFAULT_VAL"));
// ==========================================
// 3. 状态判断 (Contains)
// ==========================================
$console->log(javaString("\n--- 测试 Contains ---"));
assertLog(javaString("contains('api_token')"), $store->contains(javaString("api_token")), true);
assertLog(javaString("contains('ghost_key')"), $store->contains(javaString("ghost_key")), false);
// ==========================================
// 4. 遍历 (ForEach)
// ==========================================
$console->log(javaString("\n--- 测试 ForEach ---"));
$count = 0;
$keysFound = [];
// forEach 接收一个 BiConsumer (String, String) -> Unit
// 在 PHP 中,我们需要将外部变量通过 `use` 传入,并使用引用 `&` 来修改它们
$store->forEach(function ($key, $value) use (&$count, &$keysFound) {
global $console;
$console->log(javaString(" Iterating -> Key: {$key}, Value: {$value}"));
$keysFound[] = $key;
$count++;
});
// 验证遍历的数量和内容是否正确
// 我们插入了 3 个: username, api_token, login_count
assertLog(javaString("forEach 数量统计"), $count, 3);
//if (in_array(javaString("username"), $keysFound) && in_array(javaString("login_count"), $keysFound)) {
// $console->log(javaString("✅ forEach 内容验证通过"));
//} else {
// $console->error(javaString("❌ forEach 内容验证失败: ") . implode(", ", $keysFound));
//}
// ==========================================
// 5. 移除与清空 (Remove & Clear)
// ==========================================
$console->log(javaString("\n--- 测试 Remove & Clear ---"));
// Remove 单个 Key
$removeRes = $store->remove(javaString("username"));
assertLog(javaString("remove('username')"), $removeRes, true);
assertLog(javaString("contains('username') after remove"), $store->contains(javaString("username")), false);
// Clear 全部
$clearRes = $store->clear();
assertLog(javaString("clear()"), $clearRes, true);
// 验证是否为空
// 通过再次遍历或检查 contains 验证
$isEmpty = !$store->contains(javaString("api_token")) && !$store->contains(javaString("login_count"));
assertLog(javaString("验证 clear 后数据为空"), $isEmpty, true);
// ==========================================
// 6. 销毁存储实例 (Storages.remove)
// ==========================================
$console->log(javaString("\n--- 测试 Storages.remove ---"));
// 移除整个存储实例(通常意味着删除底层的 XML 文件或数据库文件)
$storageRemoveRes = $storages->remove($storeName);
assertLog(javaString("storages.remove"), $storageRemoveRes, true);
// 再次获取该名称的 storage,应该是全新的(空的)
// 此时 get 不会返回 null,而是返回一个新的空实例
$newStore = $storages->get($storeName);
// 验证旧数据确实没了(虽然我们在步骤 5 已经 clear 了,但为了测试 remove 的逻辑,这里假设其重置了状态)
assertLog(javaString("新实例不包含旧数据"), $newStore->contains(javaString("api_token")), false);
$console->log(javaString("🎉 Storage 接口测试完毕。"));
# 导入所需的全局变量
from m8test_java.com.m8test.script.GlobalVariables import _console
from m8test_java.com.m8test.script.GlobalVariables import _storages
from m8test_java.com.m8test.script.GlobalVariables import _script
# ==========================================
# 辅助函数
# ==========================================
def assertLog(name, actual, expected):
# Java boolean is returned as string 'true'/'false'
actual_str = str(actual).lower() if isinstance(actual, str) and actual.lower() in ['true', 'false'] else str(actual)
expected_str = str(expected).lower() if isinstance(expected, bool) else str(expected)
if actual_str == expected_str:
_console.log(f"✅ [{name}] Passed. Result: {actual}")
else:
_console.error(f"❌ [{name}] Failed.\n Expected: {expected}\n Actual : {actual}")
"""
Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
全局变量: $storages
"""
_console.log("🚀 开始测试 Storage 存储模块...")
# ==========================================
# 1. 初始化与 Storages 管理测试
# ==========================================
storeName = "test_config_pref"
# 确保测试环境干净:先尝试移除该名称的存储
_storages.remove(storeName)
# 获取存储实例
store = _storages.get(storeName)
if store is not None:
_console.log(f"✅ 获取 Storage 实例成功: {storeName}")
else:
_console.error("❌ 获取 Storage 实例失败")
store = None # Ensure store is None to avoid further errors
if store:
# 确保是一个空的或干净的存储
store.clear()
# ==========================================
# 2. 基础增删改查 (CRUD)
# ==========================================
_console.log("\n--- 测试 Put & Get ---")
putRes1 = store.put("username", "M8Tester")
putRes2 = store.put("api_token", "abcdef123456")
putRes3 = store.put("login_count", "10")
assertLog("put('username')", putRes1, "True")
assertLog("put('api_token')", putRes2, "True")
username = store.get("username", "default_user")
assertLog("get('username')", username, "M8Tester")
missingVal = store.get("not_exist_key", "DEFAULT_VAL")
assertLog("get(不存在的键)", missingVal, "DEFAULT_VAL")
# ==========================================
# 3. 状态判断 (Contains)
# ==========================================
_console.log("\n--- 测试 Contains ---")
assertLog("contains('api_token')", store.contains("api_token"), "True")
assertLog("contains('ghost_key')", store.contains("ghost_key"), "False")
# ==========================================
# 4. 遍历 (ForEach)
# ==========================================
_console.log("\n--- 测试 ForEach ---")
count = [0] # Use a mutable list to be modified inside lambda
keysFound = []
# forEach takes a BiConsumer, which translates to a two-argument lambda
store.forEach(lambda key, value: (
_console.log(f" Iterating -> Key: {key}, Value: {value}"),
keysFound.append(key),
count.__setitem__(0, count[0] + 1)
))
assertLog("forEach 数量统计", count[0], 3)
if "username" in keysFound and "login_count" in keysFound:
_console.log("✅ forEach 内容验证通过")
else:
_console.error(f"❌ forEach 内容验证失败: {keysFound}")
# ==========================================
# 5. 移除与清空 (Remove & Clear)
# ==========================================
_console.log("\n--- 测试 Remove & Clear ---")
removeRes = store.remove("username")
assertLog("remove('username')", removeRes, "True")
assertLog("contains('username') after remove", store.contains("username"), "False")
clearRes = store.clear()
assertLog("clear()", clearRes, "True")
# Use 'false' for comparison as `contains` returns string from Java
isEmpty = store.contains("api_token") == 'false' and store.contains("login_count") == 'false'
assertLog("验证 clear 后数据为空", isEmpty, "True")
# ==========================================
# 6. 销毁存储实例 (Storages.remove)
# ==========================================
_console.log("\n--- 测试 Storages.remove ---")
storageRemoveRes = _storages.remove(storeName)
assertLog("storages.remove", storageRemoveRes, "True")
newStore = _storages.get(storeName)
assertLog("新实例不包含旧数据", newStore.contains("api_token"), "False")
_console.log("🎉 Storage 接口测试完毕。")
_script.getThreads().getMain().setBackground(True)
# encoding: utf-8
# Storage (键值对存储) 与 Storages (存储管理) 接口测试脚本
# 全局变量: $storages
$console.log("🚀 开始测试 Storage 存储模块...")
# ==========================================
# 辅助函数
# ==========================================
def assertLog(name, actual, expected)
if actual == expected
$console.log("✅ [#{name}] Passed. Result: #{actual}")
else
$console.error("❌ [#{name}] Failed.\n Expected: #{expected}\n Actual : #{actual}")
end
end
# ==========================================
# 1. 初始化与 Storages 管理测试
# ==========================================
storeName = "test_config_pref"
# 确保测试环境干净:先尝试移除该名称的存储
# remove 返回 boolean
$storages.remove(storeName)
# 获取存储实例
# 如果不存在会自动创建/打开
store = $storages.get(storeName)
if store != nil
$console.log("✅ 获取 Storage 实例成功: #{storeName}")
else
$console.error("❌ 获取 Storage 实例失败")
return
end
# 确保是一个空的或干净的存储
store.clear()
# ==========================================
# 2. 基础增删改查 (CRUD)
# ==========================================
$console.log("\n--- 测试 Put & Get ---")
# Put
putRes1 = store.put("username", "M8Tester")
putRes2 = store.put("api_token", "abcdef123456")
putRes3 = store.put("login_count", "10") # 接口定义 value 必须是 String
assertLog("put('username')", putRes1, true)
assertLog("put('api_token')", putRes2, true)
# Get (存在的键)
username = store.get("username", "default_user")
assertLog("get('username')", username, "M8Tester")
# Get (不存在的键,测试默认值)
missingVal = store.get("not_exist_key", "DEFAULT_VAL")
assertLog("get(不存在的键)", missingVal, "DEFAULT_VAL")
# ==========================================
# 3. 状态判断 (Contains)
# ==========================================
$console.log("\n--- 测试 Contains ---")
assertLog("contains('api_token')", store.contains("api_token"), true)
assertLog("contains('ghost_key')", store.contains("ghost_key"), false)
# ==========================================
# 4. 遍历 (ForEach)
# ==========================================
$console.log("\n--- 测试 ForEach ---")
count = 0
keysFound = []
# forEach 接收一个 BiConsumer (String, String) -> Unit
# Ruby 的 block 参数,这里直接挂在 forEach 后面
store.forEach do |key, value|
$console.log(" Iterating -> Key: #{key}, Value: #{value}")
keysFound << key
count += 1
end
# 验证遍历的数量和内容是否正确
# 我们插入了 3 个: username, api_token, login_count
assertLog("forEach 数量统计", count, 3)
if keysFound.include?("username") && keysFound.include?("login_count")
$console.log("✅ forEach 内容验证通过")
else
$console.error("❌ forEach 内容验证失败: " + keysFound.to_s)
end
# ==========================================
# 5. 移除与清空 (Remove & Clear)
# ==========================================
$console.log("\n--- 测试 Remove & Clear ---")
# Remove 单个 Key
removeRes = store.remove("username")
assertLog("remove('username')", removeRes, true)
assertLog("contains('username') after remove", store.contains("username"), false)
# Clear 全部
clearRes = store.clear()
assertLog("clear()", clearRes, true)
# 验证是否为空
# 通过再次遍历或检查 contains 验证
isEmpty = !store.contains("api_token") && !store.contains("login_count")
assertLog("验证 clear 后数据为空", isEmpty, true)
# ==========================================
# 6. 销毁存储实例 (Storages.remove)
# ==========================================
$console.log("\n--- 测试 Storages.remove ---")
# 移除整个存储实例(通常意味着删除底层的 XML 文件或数据库文件)
storageRemoveRes = $storages.remove(storeName)
assertLog("storages.remove", storageRemoveRes, true)
# 再次获取该名称的 storage,应该是全新的(空的)
# 此时 get 不会返回 nil,而是返回一个新的空实例
newStore = $storages.get(storeName)
# 验证旧数据确实没了(虽然我们在步骤 5 已经 clear 了,但为了测试 remove 的逻辑,这里假设其重置了状态)
assertLog("新实例不包含旧数据", newStore.contains("api_token"), false)
$console.log("🎉 Storage 接口测试完毕。")
$script.getThreads().getMain().setBackground(true)
09 December 2025