win32api/user32_test.go
starainrt 0f82ba044b
修正 Win32 封装语义并补齐关键结构体/进程测试覆盖
- 修正 WTS 会话相关类型、枚举与活动会话选择逻辑
- 对齐 FILE_ID_DESCRIPTOR 布局与 FILE_ID_TYPE 语义,修复 OpenFileById 调用前提
- 修正 user32/shell32/kernel32 部分 API 的返回值、参数个数与错误处理
- 完善剪贴板更新格式读取的缓冲区重试逻辑
- 补充常用进程、线程、调试、桌面与会话 helper
- 增加结构体布局、会话查询、剪贴板、CreateProcess 等回归测试
- 将默认 CreateProcess 相关测试切到 helper 进程,并保留显式开启的 cmd.exe 集成覆盖
2026-06-06 17:46:02 +08:00

119 lines
2.7 KiB
Go

package win32api
import (
"fmt"
"reflect"
"syscall"
"testing"
"unsafe"
)
func TestClipboardReadText(t *testing.T) {
if err := OpenClipboard(0); err != nil {
t.Error(err)
}
formats, err := EnumAllClipboardFormats()
if err != nil {
t.Error(err)
}
tp := CF_UNICODETEXT
fmt.Println("lenghth", len(formats))
for _, f := range formats {
fmt.Println("Clipboard Format:", f)
d, e := GetClipboardFormatName(f)
fmt.Println("Clipboard Format Name:", d, e)
if d == "HTML Format" {
tp = RegisterClipboardFormat("HTML Format")
fmt.Println("HTML Format:", tp)
}
if d == "DataObject" {
tp = f
fmt.Println("DataObject:", tp)
}
if f > 20000 {
tp = f
}
}
mem, err := GetClipboardData(tp)
if err != nil {
t.Error(err)
}
p, err := GlobalLock(mem)
if err != nil {
t.Error(err)
}
defer GlobalUnlock(mem)
//n := 0
if tp == 13 {
var buf []uint16
for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*((*uint16)(unsafe.Pointer(p))))) {
buf = append(buf, *(*uint16)(ptr))
}
str := syscall.UTF16ToString(buf)
fmt.Println("\n\nClipboard Data:", str)
if err := CloseClipboard(); err != nil {
t.Error(err)
}
return
}
size, err := GlobalSize(mem)
if err != nil {
t.Error(err)
}
fmt.Println("Size:", size)
var buf []byte
for i := 0; i < int(size); i++ {
buf = append(buf, *(*byte)(unsafe.Pointer(uintptr(p) + uintptr(i))))
}
fmt.Println("\n\nClipboard Data:", "ok")
fmt.Println("Clipboard Test Done")
}
func TestGetUpdatedClipboardFormatsAll(t *testing.T) {
d, e := GetUpdatedClipboardFormatsAll()
if e != nil {
t.Error(e)
}
fmt.Println(d)
}
func TestGetUpdatedClipboardFormatsAllRetriesOnInsufficientBuffer(t *testing.T) {
calls := 0
got, err := getUpdatedClipboardFormatsAll(func(lpuiFormats unsafe.Pointer, cFormats int, pcFormats unsafe.Pointer) (int, error) {
calls++
count := (*uint32)(pcFormats)
switch calls {
case 1:
if cFormats != 32 {
t.Fatalf("first call cFormats = %d, want 32", cFormats)
}
*count = 40
return 0, syscall.ERROR_INSUFFICIENT_BUFFER
case 2:
if cFormats != 40 {
t.Fatalf("second call cFormats = %d, want 40", cFormats)
}
*count = 3
formats := (*[1 << 12]uint32)(lpuiFormats)[:cFormats:cFormats]
formats[0] = uint32(CF_TEXT)
formats[1] = uint32(CF_UNICODETEXT)
formats[2] = 0xC000
return 1, nil
default:
t.Fatalf("unexpected call count %d", calls)
return 0, nil
}
})
if err != nil {
t.Fatalf("getUpdatedClipboardFormatsAll failed: %v", err)
}
want := []DWORD{CF_TEXT, CF_UNICODETEXT, 0xC000}
if !reflect.DeepEqual(got, want) {
t.Fatalf("formats = %v, want %v", got, want)
}
if calls != 2 {
t.Fatalf("calls = %d, want 2", calls)
}
}