Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 53 additions & 29 deletions src/ability_manager/ability_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,35 +63,24 @@ void AbilityManager::updateAbilities()

// 遍历所有 Abilities
for (auto ability_iter = _ability_list.begin(); ability_iter != _ability_list.end();) {
/* ----------------------------------- 状态机 ---------------------------------- */
switch (ability_iter->state) {
case StateGoCreate: {
// 触发创建回调
ability_iter->ability->baseCreate();
// 切到正常刷新状态
ability_iter->state = StateUpdating;
ability_iter->ability->baseUpdate();
ability_iter++;
break;
}
case StateUpdating: {
ability_iter->ability->baseUpdate();
ability_iter++;
break;
}
case StateGoDestroy: {
// 触发销毁回调
ability_iter->ability->baseDestroy();
// 把 ID 存到可用 ID 列表,防止反复创建销毁导致的 ID 溢出
_available_ability_id_list.push_back(ability_iter->id);
// 销毁 Ability
ability_iter = _ability_list.erase(ability_iter);
break;
}
default: {
ability_iter++;
break;
}
update_ability(ability_iter);
}
}

void AbilityManager::updateAbility(int abilityID)
{
// 如果有新添加的 ability
if (!_new_ability_list.empty()) {
// 合并到 ability list
std::move(_new_ability_list.begin(), _new_ability_list.end(), std::back_inserter(_ability_list));
_new_ability_list.clear();
}

// 遍历所有 Abilities
for (auto ability_iter = _ability_list.begin(); ability_iter != _ability_list.end(); ability_iter++) {
if (ability_iter->id == abilityID) {
update_ability(ability_iter);
break;
}
}
}
Expand Down Expand Up @@ -166,3 +155,38 @@ int AbilityManager::get_next_ability_id()

return next_ability_id;
}

void AbilityManager::update_ability(std::vector<mooncake::AbilityManager::AbilityInfo_t>::iterator& abilityIter)
{
/* ----------------------------------- 状态机 ---------------------------------- */
// 更新状态,触发原始回调
switch (abilityIter->state) {
case StateGoCreate: {
// 触发创建回调
abilityIter->ability->baseCreate();
// 切到正常刷新状态
abilityIter->state = StateUpdating;
abilityIter->ability->baseUpdate();
abilityIter++;
break;
}
case StateUpdating: {
abilityIter->ability->baseUpdate();
abilityIter++;
break;
}
case StateGoDestroy: {
// 触发销毁回调
abilityIter->ability->baseDestroy();
// 把 ID 存到可用 ID 列表,防止反复创建销毁导致的 ID 溢出
_available_ability_id_list.push_back(abilityIter->id);
// 销毁 Ability
abilityIter = _ability_list.erase(abilityIter);
break;
}
default: {
abilityIter++;
break;
}
}
}
10 changes: 9 additions & 1 deletion src/ability_manager/ability_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,18 @@ class AbilityManager {
bool destroyAbility(int abilityID);

/**
* @brief 刷新 Ability 状态,触发回调
* @brief 刷新所有 Ability 状态,触发回调
*
*/
void updateAbilities();

/**
* @brief 刷新指定 ID 的 Ability 状态,触发回调
*
* @param abilityID
*/
void updateAbility(int abilityID);

/**
* @brief 获取当前的 Ability 数量
*
Expand Down Expand Up @@ -117,6 +124,7 @@ class AbilityManager {
std::vector<int> _available_ability_id_list;

int get_next_ability_id();
void update_ability(std::vector<mooncake::AbilityManager::AbilityInfo_t>::iterator& abilityIter);
};

} // namespace mooncake
56 changes: 56 additions & 0 deletions test/example_output_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import json
import subprocess
import os

# 从 JSON 文件加载测试用例


def load_test_cases(json_file):
with open(json_file, "r", encoding="utf-8") as file:
data = json.load(file)
return data["example_output"]


def run_test_case(case, base_path):
print(f"正在测试: {case['name']}...")
executable_path = os.path.join(base_path, case["path"])
try:
# 执行可执行文件并捕获输出
result = subprocess.run(
executable_path,
text=True,
capture_output=True,
check=True
)
output_lines = result.stdout.strip().split("\n")

# 比对输出
if output_lines == case["expected_output"]:
print(f"✅ {case['name']} 测试通过")
else:
print(f"❌ {case['name']} 测试失败:输出与期望不一致")
print("实际输出:")
for line in output_lines:
print(line)
print("\n期望输出:")
for line in case["expected_output"]:
print(line)

except subprocess.CalledProcessError as e:
print(f"❌ {case['name']} 执行失败:{e}")
except FileNotFoundError:
print(f"❌ 找不到可执行文件:{executable_path}")


def main():
# 当前脚本的目录
base_path = os.path.dirname(os.path.abspath(__file__))
json_file = os.path.join(base_path, "test_cases.json")

test_cases = load_test_cases(json_file)
for case in test_cases:
run_test_case(case, base_path)


if __name__ == "__main__":
main()
59 changes: 59 additions & 0 deletions test/test_cases.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"example_output": [
{
"name": "extension_test",
"path": "../build/example/extension_test",
"expected_output": [
">> install app",
"[app] on construct",
">> install extensions",
"[worker] on construct",
"[ui] on construct",
">> update mooncake",
"[worker] on running",
"[ui] on foreground",
"[app] on running",
"[worker] on running",
"[ui] on foreground",
"[app] on running",
"[worker] on running",
"[ui] on foreground",
">> test over",
"[worker] on deconstruct",
"[ui] on deconstruct",
"[app] on deconstruct"
]
},
{
"name": "ability_manager_test",
"path": "../build/example/ability_manager_test",
"expected_output": [
">> create ability",
"[basic] on construct",
">> update ability for 3 times",
"[basic] on create",
"[basic] on running",
"[basic] on running",
"[basic] on running",
">> destroy basic ability",
"[basic] on ondestory",
"[basic] on deconstruct",
">> test over",
"[basic] on construct",
"[basic] on deconstruct"
]
},
{
"name": "basic_demo",
"path": "../build/example/basic_demo",
"expected_output": [
">> install app",
"[凤爪] on construct",
">> update mooncake",
"[凤爪] on open",
"[凤爪] on running",
"[凤爪] on running"
]
}
]
}
Loading