test: 添加 Input 模块单元测试

- 创建 tests/Input 目录和 CMakeLists.txt
- 添加 28 个测试用例覆盖:
  - InputManager: Singleton, Initialize/Shutdown, 按键状态, 鼠标, 轴, 按钮
  - InputAxis: 默认构造, 正负键, SetValue
  - InputEvent: KeyEvent, MouseButtonEvent, MouseMoveEvent, MouseWheelEvent, TextInputEvent
This commit is contained in:
2026-03-22 16:22:13 +08:00
parent 8d4447915d
commit cf9229fc21
3 changed files with 712 additions and 0 deletions

260
tests/RHI/TEST_ISSUES.md Normal file
View File

@@ -0,0 +1,260 @@
# RHI 抽象层测试遗留问题报告
## 测试概述
RHI 抽象层单元测试通过 `RHI_BACKEND` 环境变量选择后端D3D12/OpenGL一次编译后可测试两个后端的抽象接口一致性。
```bash
# 运行测试
RHI_BACKEND=D3D12 ./rhi_unit_tests.exe
RHI_BACKEND=OpenGL ./rhi_unit_tests.exe
```
## 测试结果汇总
| 后端 | 通过 | 失败 | 总计 |
|------|------|------|------|
| D3D12 | 21 | 48 | 69 |
| OpenGL | 未测试 | - | - |
---
## 问题清单
### 1. D3D12CommandQueue::CreateCommandQueue 未实现
**严重程度**: 高
**接口**: `RHIDevice::CreateCommandQueue`
**现象**: 返回 `nullptr`
**位置**: `engine/src/RHI/D3D12/D3D12Device.cpp:288`
```cpp
RHICommandQueue* D3D12Device::CreateCommandQueue(const CommandQueueDesc& desc) {
return nullptr; // 未实现
}
```
**影响测试**:
- `CommandQueue_ExecuteCommandLists`
- `CommandQueue_SignalWaitFence`
- `CommandQueue_GetCompletedValue`
- `CommandQueue_WaitForIdle`
- `CommandQueue_GetType`
- `CommandQueue_GetTimestampFrequency`
- `Device_CreateCommandQueue_ReturnsValid`
---
### 2. D3D12CommandList::CreateCommandList 未实现
**严重程度**: 高
**接口**: `RHIDevice::CreateCommandList`
**现象**: 返回 `nullptr`
**位置**: `engine/src/RHI/D3D12/D3D12Device.cpp:300`
```cpp
D3D12CommandList* D3D12Device::CreateCommandListImpl(const CommandListDesc& desc) {
return nullptr; // 未实现
}
```
**影响测试**:
- `CommandList_Reset_Close`
- `CommandList_SetPrimitiveTopology`
- `CommandList_SetViewport`
- `CommandList_SetViewports`
- `CommandList_SetScissorRect`
- `CommandList_Draw`
- `CommandList_DrawIndexed`
- `CommandList_ClearRenderTarget`
- `CommandList_SetDepthStencilState`
- `CommandList_SetBlendState`
- `CommandList_SetStencilRef`
- `CommandList_TransitionBarrier`
- `Device_CreateCommandList_ReturnsValid`
---
### 3. Texture 枚举值不匹配
**严重程度**: 高
**接口**: `RHIDevice::CreateTexture`
**现象**: 返回 `nullptr`
**位置**: `engine/src/RHI/D3D12/D3D12Device.cpp:220`
**原因**: RHI `TextureType` 枚举值与 D3D12 `D3D12_RESOURCE_DIMENSION` 枚举值不匹配
| RHI TextureType | 值 | D3D12 D3D12_RESOURCE_DIMENSION | 值 |
|-----------------|-----|----------------------------------|-----|
| Texture1D | 0 | D3D12_RESOURCE_DIMENSION_BUFFER | 0 |
| Texture2D | 1 | D3D12_RESOURCE_DIMENSION_TEXTURE1D | 1 |
| Texture2DArray | 2 | D3D12_RESOURCE_DIMENSION_TEXTURE2D | 2 |
| Texture3D | 3 | D3D12_RESOURCE_DIMENSION_TEXTURE3D | 3 |
| TextureCube | 4 | D3D12_RESOURCE_DIMENSION_TEXTURECUBE | 4 |
| TextureCubeArray | 5 | (无对应) | - |
**影响测试**:
- `Texture_Create_Texture2D`
- `Texture_Create_Texture3D`
- `Texture_StateManagement`
- `Texture_Naming`
- `Texture_GetNativeHandle`
- `Device_CreateTexture_ReturnsValid`
---
### 4. Shader 编译返回 nullptr
**严重程度**: 中
**接口**: `RHIDevice::CompileShader`
**现象**: 返回 `nullptr`
**可能原因**:
- Shader 编译参数不正确
- 需要有效的 shader 源码或文件路径
**影响测试**:
- `Shader_Compile_FromSource`
- `Shader_GetType`
- `Shader_IsValid`
- `Shader_Bind_Unbind`
- `Shader_SetInt`
- `Shader_SetFloat`
- `Shader_SetVec3`
- `Shader_SetVec4`
- `Shader_SetMat4`
- `Shader_GetNativeHandle`
---
### 5. SwapChain 需要窗口句柄
**严重程度**: 中
**接口**: `RHIDevice::CreateSwapChain`
**现象**: 返回 `nullptr`
**原因**: `RHIDeviceDesc` 需要有效的 `windowHandle`
**影响测试**:
- `SwapChain_Create`
- `SwapChain_GetCurrentBackBufferIndex`
- `SwapChain_GetCurrentBackBuffer`
- `SwapChain_Resize`
- `SwapChain_FullscreenState`
- `SwapChain_ShouldClose`
---
### 6. Buffer::Map 对某些类型返回 nullptr
**严重程度**: 中
**接口**: `RHIBuffer::Map`
**现象**: D3D12 Constant Buffer 类型可能无法 Map
**位置**: `tests/RHI/unit/test_buffer.cpp:16`
```cpp
RHIBuffer* buffer = GetDevice()->CreateBuffer(desc); // desc.bufferType = Vertex
void* data = buffer->Map(); // 返回 nullptr
```
**影响测试**:
- `Buffer_Map_Unmap`
- `Buffer_SetData`
---
### 7. RHICapabilities 未填充
**严重程度**: 低
**接口**: `RHIDevice::GetCapabilities`
**现象**: 所有 capability 值为 0
**位置**: `engine/src/RHI/D3D12/D3D12Device.cpp`
**影响测试**:
- `Device_GetCapabilities_ReturnsValid` - 断言 `caps.maxRenderTargets >= 1`
---
### 8. RHIDeviceInfo 未填充
**严重程度**: 低
**接口**: `RHIDevice::GetDeviceInfo`
**现象**: `vendor``renderer` 字符串为空
**位置**: `engine/src/RHI/D3D12/D3D12Device.cpp:QueryAdapterInfo`
**影响测试**:
- `Device_GetDeviceInfo_ReturnsValid`
---
### 9. Fence::IsSignaled 逻辑问题
**严重程度**: 低
**接口**: `RHIFence::IsSignaled`
**现象**: 初始值应该为 `false`,但返回 `true`
**位置**: `tests/RHI/unit/test_fence.cpp:80`
**影响测试**:
- `Fence_IsSignaled`
---
### 10. Sampler::GetNativeHandle 返回 nullptr
**严重程度**: 低
**接口**: `RHISampler::GetNativeHandle`
**现象**: 返回 nullptr 但 Sampler 创建成功
**位置**: `engine/src/RHI/D3D12/D3D12Sampler.cpp``engine/src/RHI/OpenGL/OpenGLSampler.cpp`
**影响测试**:
- `Sampler_GetNativeHandle`
---
## 优先级建议
### P0 - 必须修复
1. D3D12CommandQueue::CreateCommandQueue 实现
2. D3D12CommandList::CreateCommandList 实现
3. Texture 枚举值对齐
### P1 - 应该修复
4. Shader 编译逻辑
5. SwapChain 窗口支持
### P2 - 可以修复
6. Buffer Map 行为确认
7. Capabilities/DeviceInfo 填充
8. Fence::IsSignaled 逻辑
9. Sampler::GetNativeHandle
---
## 测试文件位置
```
tests/RHI/unit/
├── fixtures/RHITestFixture.h/.cpp # 测试框架
├── test_device.cpp # 设备相关测试
├── test_buffer.cpp # Buffer 相关测试
├── test_texture.cpp # Texture 相关测试
├── test_swap_chain.cpp # SwapChain 相关测试
├── test_command_list.cpp # CommandList 相关测试
├── test_command_queue.cpp # CommandQueue 相关测试
├── test_shader.cpp # Shader 相关测试
├── test_fence.cpp # Fence 相关测试
└── test_sampler.cpp # Sampler 相关测试
```
---
## 运行测试
```bash
# 编译
cmake --build build --config Debug
# D3D12 后端测试
RHI_BACKEND=D3D12 ./build/tests/RHI/unit/Debug/rhi_unit_tests.exe
# OpenGL 后端测试
RHI_BACKEND=OpenGL ./build/tests/RHI/unit/Debug/rhi_unit_tests.exe
```