refactor: complete ActionOptions unification and pointer type optimization

This commit is contained in:
lilong.129
2025-05-27 13:34:12 +08:00
parent 7fb966b7ba
commit 404865ba6b
17 changed files with 838 additions and 1188 deletions
+175
View File
@@ -0,0 +1,175 @@
package option
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestUnifiedActionRequest_Options(t *testing.T) {
// Test TapXY request conversion
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
X: 0.5,
Y: 0.7,
Duration: 1.0,
MaxRetryTimes: 3,
ScreenOptions: ScreenOptions{
ScreenFilterOptions: ScreenFilterOptions{
Regex: true,
},
},
}
actionOpts := unifiedReq.Options()
assert.Equal(t, 1.0, unifiedReq.Duration)
assert.Equal(t, 3, unifiedReq.MaxRetryTimes)
assert.True(t, unifiedReq.Regex)
assert.NotEmpty(t, actionOpts)
}
func TestUnifiedActionRequest_GetMCPOptions(t *testing.T) {
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
}
// Test TapXY options
tapOptions := unifiedReq.GetMCPOptions(ACTION_TapXY)
assert.NotEmpty(t, tapOptions)
// Test TapByOCR options
ocrOptions := unifiedReq.GetMCPOptions(ACTION_TapByOCR)
assert.NotEmpty(t, ocrOptions)
// Test unknown action (should return empty options)
unknownOptions := unifiedReq.GetMCPOptions("unknown_action")
assert.Empty(t, unknownOptions)
}
func TestUnifiedActionRequest_SwipeDirection(t *testing.T) {
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
Direction: "up",
Duration: 2.0,
PressDuration: 0.5,
}
opts := unifiedReq.Options()
assert.Equal(t, "up", unifiedReq.Direction)
assert.Equal(t, 2.0, unifiedReq.Duration)
assert.Equal(t, 0.5, unifiedReq.PressDuration)
assert.NotEmpty(t, opts)
}
func TestUnifiedActionRequest_SwipeCoordinate(t *testing.T) {
params := []float64{0.2, 0.8, 0.2, 0.2}
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
Direction: params,
}
opts := unifiedReq.Options()
assert.Equal(t, params, unifiedReq.Direction)
assert.NotEmpty(t, opts)
}
func TestUnifiedActionRequest_ScreenOptions(t *testing.T) {
uiTypes := []string{"button", "text"}
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
ScreenOptions: ScreenOptions{
ScreenShotOptions: ScreenShotOptions{
ScreenShotWithOCR: true,
ScreenShotWithUpload: true,
ScreenShotWithUITypes: uiTypes,
},
},
}
opts := unifiedReq.Options()
assert.True(t, unifiedReq.ScreenShotWithOCR)
assert.True(t, unifiedReq.ScreenShotWithUpload)
assert.Equal(t, uiTypes, unifiedReq.ScreenShotWithUITypes)
assert.NotEmpty(t, opts)
}
func TestUnifiedActionRequest_NilPointerSafety(t *testing.T) {
// Test with nil pointers
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
// All pointer fields are nil
}
opts := unifiedReq.Options()
assert.Equal(t, 0, unifiedReq.MaxRetryTimes)
assert.Equal(t, 0.0, unifiedReq.Duration)
assert.Equal(t, 0.0, unifiedReq.PressDuration)
assert.False(t, unifiedReq.Regex)
assert.False(t, unifiedReq.TapRandomRect)
// When all fields are default values, Options() may return empty slice
// This is expected behavior
assert.NotNil(t, opts)
}
func TestUnifiedActionRequest_CustomOptions(t *testing.T) {
customData := map[string]interface{}{
"custom_key": "custom_value",
"number": 42,
}
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
Custom: customData,
}
opts := unifiedReq.Options()
assert.Equal(t, customData, unifiedReq.Custom)
assert.NotEmpty(t, opts)
}
func TestUnifiedActionRequest_BasicTypeFields(t *testing.T) {
// Test basic type fields (no longer pointers)
unifiedReq := &ActionOptions{
Platform: "android",
Serial: "device123",
Count: 5,
Keycode: 123,
Delta: 10,
Width: 800,
Height: 600,
Seconds: 2.5,
Milliseconds: 1500,
TabIndex: 3,
}
// Test direct field access (no need for Getter methods)
assert.Equal(t, 5, unifiedReq.Count)
assert.Equal(t, 123, unifiedReq.Keycode)
assert.Equal(t, 10, unifiedReq.Delta)
assert.Equal(t, 800, unifiedReq.Width)
assert.Equal(t, 600, unifiedReq.Height)
assert.Equal(t, 2.5, unifiedReq.Seconds)
assert.Equal(t, int64(1500), unifiedReq.Milliseconds)
assert.Equal(t, 3, unifiedReq.TabIndex)
// Test zero value detection
emptyReq := &ActionOptions{}
assert.Equal(t, 0, emptyReq.Count)
assert.Equal(t, 0, emptyReq.Keycode)
assert.Equal(t, 0, emptyReq.Delta)
assert.Equal(t, 0, emptyReq.Width)
assert.Equal(t, 0, emptyReq.Height)
assert.Equal(t, 0.0, emptyReq.Seconds)
assert.Equal(t, int64(0), emptyReq.Milliseconds)
assert.Equal(t, 0, emptyReq.TabIndex)
}