* feat(server,ui): 悬浮工具栏图片模式与装饰图叠加候选词 在 #1046 的基础上按最新 develop 重做。 悬浮工具栏 [toolbar] mode = "image":一整张背景图,按钮按 [toolbar.buttons.<按钮>] 的 x_dip / y_dip / width_dip / height_dip 摆放, 可按状态换图([images]),没图时画矢量图标。窗口按背景图的透明区域裁成 异形,透明处点得穿;图上除按钮外都能拖动。v2 皮肤的动图会播放,工具栏 隐藏或淡出后停帧。 候选窗装饰图可用 candidate_overlay_* 叠加一个候选词,太宽时缩字号; 设置页的皮肤预览一并显示。 ui 新增 OverlayPanel(绝对定位)与 ImageMask(按 alpha 生成区域)。 * fix(ui): 动图工具栏的窗口形状取所有帧的并集 窗口区域连画面一起裁,只按首帧裁形状时,动画里伸出首帧轮廓的部分 (抬头、飞出的纸)会被裁掉。改为把所有帧的 alpha 合起来再生成区域。 * fix(server): 工具栏按钮框始终算在异形窗口里 窗口形状只取背景图不透明的部分时,摆在图片透明处的按钮会被一起裁掉、 点不到。形状改为背景图轮廓并上每个按钮的框,按钮可以放在人物旁边的空白处, 不必在背景图里垫底。 * feat(server): 工具栏按钮可单独设内置图标的字号 [toolbar.buttons.<按钮>] 新增 icon_size_dip,内置 Segoe Fluent Icons 图标的 字号不再只能跟着按钮框走:按钮框铺满背景图里的圆底、图标单独调大小。 不写时仍是按钮框短边的 0.82 倍。 * feat(server): 设置页按图片模式预览悬浮工具栏 皮肤页的卡片与悬浮工具栏页的预览原来只会画矩形条。皮肤是图片模式时, 改按工具栏的画法预览:背景图(v2 皮肤的动图会播放)、按皮肤坐标摆放的 按钮、按钮贴图或内置图标(含 icon_size_dip),设置页关掉的按钮不画, 缩放与图标尺寸设置一并生效。 --------- Co-authored-by: fanlusky <1730976608@qq.com>
204 lines
11 KiB
CMake
204 lines
11 KiB
CMake
set(TEST_EXECUTABLE_NAME "MetasequoiaImeServerTests")
|
|
|
|
add_executable(test_voice_control_dispatch src/test_voice_control_dispatch.cpp
|
|
../src/ipc/voice_control_dispatch.cpp)
|
|
target_include_directories(test_voice_control_dispatch PRIVATE ../src "${MSIME_ENGINE_DIR}")
|
|
target_compile_features(test_voice_control_dispatch PRIVATE cxx_std_17)
|
|
add_test(NAME voice_control_dispatch COMMAND test_voice_control_dispatch)
|
|
|
|
set(TEST_SOURCE_FILES
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/benchmark_model_path.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_date_time_query.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_v_mode_query.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_emoji_query.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_kaomoji_query.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_jianpin_query.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/clipboard/clipboard_history.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_kaomoji_sql.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_shuangpin_scheme.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_custom_shuangpin.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_quanpin_scheme.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_wubi.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_japanese_romaji.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_shuangpin_query.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_engine_shuangpin_session.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_caret_prefix_input_session.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_english_dictionary.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_mixed_english_placement.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_translation_gloss.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_default_config_credentials.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/cloud/translation_gloss.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_custom_translation.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/cloud/custom_translation.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_translation.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/cloud/ai_translation.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/ai/chat_completions.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/ai/jev_client.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_jev_candidates.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_niutrans_translation.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/cloud/niutrans_translation.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_active_client_state.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_outbound_session_state.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_pipe_write_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_input_key_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_ui_owner.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_async_request_origin.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_assistant_cache_key.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/ai/ai_assistant_cache_key.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_assistant_cache.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/ai/ai_assistant_cache.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_assistant_request.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/ai/ai_assistant_request.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_ui_action_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_translation_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_context_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_ui_state.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_expansion_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_composition_selection_history.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_render_sync.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_selection_replay_guard.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_serial_task_runner.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/serial_task_runner.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_shuangpin_preedit_display.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/shuangpin_preedit_display.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_wheel_paging.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_view_model.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_text_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_settings_performance.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_size_estimator.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/candidate_size_estimator.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ipc_protocol_constants.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_voice_composition_pipe.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_voice_providers.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_vendor.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_ai_provider_store.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_reasoning_strip.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_voice_batch_protocol.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/voice-input/voice_batch_protocol.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/voice-input/voice_providers.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_floating_toolbar_visibility_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_caret_state_indicator_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_tray_menu_placement.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_terminal_deactivation_policy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_user_dictionary_journal.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_config_template_merge.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_config_non_ascii_path.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_collocation_model.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_neural_model.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_network_proxy.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_dictionary_replay_non_ascii_path.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_non_ascii_path.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_colors.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_bases.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_images.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_page_arrows.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_supports.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_catalog_toolbar_image.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_palette.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_non_ascii_path_contract.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/skin/candidate_skin_catalog.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/window/candidate_skin_palette.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_tokens.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/window/candidate_skin_tokens.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_candidate_skin_layers.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/window/candidate_skin_layers.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_floating_toolbar_skin.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/window/floating_toolbar_skin.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_system_font_family.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_dictionary_validation.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_stats_frame_decode.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_stats_aggregate.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_stats_overview.cpp"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/test_stats_store.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/statistics/stats_frames.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/statistics/stats_aggregate.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/statistics/stats_overview.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/statistics/stats_store.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/credential_protection.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/ai/ai_provider_store.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_credentials.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_appearance.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_fonts.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_general.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_input.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_keys.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_services.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_shuangpin.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_template.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_theme.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_toml.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_toolbar.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/config/ime_config_write.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/session/engine_input_session.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/common_utils.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/hanzi_pinyin.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/ime_paths.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/utils/network_proxy.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/settings/dictionary_validation.cpp"
|
|
# The catalog/download/delete behaviors under test live in collocation_model.cpp, so the
|
|
# activation-fallback and id-guard cases link the real translation unit.
|
|
"${CMAKE_SOURCE_DIR}/src/settings/collocation_model.cpp"
|
|
"${CMAKE_SOURCE_DIR}/src/settings/neural_model.cpp"
|
|
# Routing lives in dictionary_manager.cpp's HandleRequest, so the importHans dispatch test has
|
|
# to link the real translation unit rather than restate the branch order.
|
|
"${CMAKE_SOURCE_DIR}/src/settings/dictionary_manager.cpp"
|
|
)
|
|
|
|
add_executable(${TEST_EXECUTABLE_NAME} ${TEST_SOURCE_FILES})
|
|
|
|
target_include_directories(${TEST_EXECUTABLE_NAME}
|
|
PRIVATE
|
|
"${CMAKE_SOURCE_DIR}"
|
|
"${CMAKE_SOURCE_DIR}/src"
|
|
"${MSIME_VENDOR_DIR}"
|
|
"${MSIME_ENGINE_DIR}/utfcpp/source"
|
|
)
|
|
|
|
# test_default_config_credentials reads the config the installer actually ships, so the check is
|
|
# against the shipped file rather than a restatement of today's placeholder spellings.
|
|
# test_custom_shuangpin parses the example users are told to copy, so the documentation cannot drift
|
|
# from what the parser accepts.
|
|
# test_dictionary_replay_non_ascii_path launches the real replay tool, because the path handling it
|
|
# guards lives in that executable's main() and cannot be linked into the test binary.
|
|
target_compile_definitions(${TEST_EXECUTABLE_NAME}
|
|
PRIVATE
|
|
"MSIME_DEFAULT_CONFIG_PATH=\"${CMAKE_SOURCE_DIR}/../installer/default_config/config.default.toml\""
|
|
"MSIME_CUSTOM_SHUANGPIN_EXAMPLE_PATH=\"${CMAKE_SOURCE_DIR}/../docs/custom-shuangpin.example.toml\""
|
|
"MSIME_DICTIONARY_REPLAY_EXE=\"$<TARGET_FILE:${DICTIONARY_REPLAY_EXECUTABLE_NAME}>\""
|
|
)
|
|
|
|
add_dependencies(${TEST_EXECUTABLE_NAME} ${DICTIONARY_REPLAY_EXECUTABLE_NAME})
|
|
|
|
target_link_libraries(${TEST_EXECUTABLE_NAME}
|
|
PRIVATE
|
|
MetasequoiaIme::Engine
|
|
MetasequoiaIme::Voice
|
|
nlohmann_json::nlohmann_json
|
|
fmt::fmt
|
|
spdlog::spdlog
|
|
Boost::locale
|
|
Boost::json
|
|
CURL::libcurl
|
|
unofficial::sqlite3::sqlite3
|
|
# dictionary_manager.cpp annotates pure-Chinese imports with cpp-pinyin and clears the
|
|
# candidate cache through user32 window messages.
|
|
cpp-pinyin::cpp-pinyin
|
|
dwrite
|
|
user32
|
|
shell32
|
|
advapi32
|
|
ole32
|
|
)
|
|
|
|
add_test(NAME ${TEST_EXECUTABLE_NAME} COMMAND ${TEST_EXECUTABLE_NAME})
|
|
|
|
# The identical fixture file also runs in Engine's JavaScript contract CI.
|
|
add_executable(test_webview_contract "${MSIME_ENGINE_DIR}/contracts/webview/test.cpp")
|
|
target_link_libraries(test_webview_contract PRIVATE Boost::json)
|
|
add_test(NAME webview_contract COMMAND test_webview_contract
|
|
"${MSIME_ENGINE_DIR}/contracts/webview/fixtures.json")
|
|
|
|
|