// Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // SPDX-License-Identifier: GPL-3.0-or-later package atspi import ( "image" "math" "testing" "git.stormux.org/storm/cthulhu/internal/platform/xorg" ) func TestOCRProviderCoordinateConversion(t *testing.T) { for _, test := range []struct { name string window, object Rectangle client xorg.Foreground want image.Rectangle fail bool }{ {name: "physical", window: Rectangle{40, 30, 300, 200}, object: Rectangle{50, 45, 80, 50}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 30, Width: 300, Height: 200}, want: image.Rect(50, 45, 130, 95)}, {name: "scaled provider", window: Rectangle{40, 30, 150, 100}, object: Rectangle{45, 35, 40, 25}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 30, Width: 300, Height: 200}, want: image.Rect(50, 40, 130, 90)}, {name: "round outward", window: Rectangle{40, 30, 200, 100}, object: Rectangle{41, 31, 1, 1}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 30, Width: 301, Height: 151}, want: image.Rect(41, 31, 44, 34)}, {name: "negative clip", window: Rectangle{-200, -100, 300, 200}, object: Rectangle{-220, -110, 50, 40}, client: xorg.Foreground{Known: true, Window: 1, X: -200, Y: -100, Width: 300, Height: 200}, want: image.Rect(-200, -100, -170, -70)}, {name: "decorations", window: Rectangle{40, 30, 300, 220}, object: Rectangle{50, 55, 80, 50}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 50, Width: 300, Height: 200, OuterX: 40, OuterY: 30, OuterWidth: 300, OuterHeight: 220}, want: image.Rect(50, 55, 130, 105)}, {name: "large window small object", window: Rectangle{0, 0, 7680, 4320}, object: Rectangle{20, 20, 40, 30}, client: xorg.Foreground{Known: true, Window: 1, Width: 7680, Height: 4320}, want: image.Rect(20, 20, 60, 50)}, {name: "unknown origin", window: Rectangle{math.MinInt32, 0, 300, 200}, object: Rectangle{0, 0, 10, 10}, fail: true}, {name: "disjoint", window: Rectangle{40, 30, 300, 200}, object: Rectangle{400, 0, 10, 10}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 30, Width: 300, Height: 200}, fail: true}, {name: "nonuniform scale", window: Rectangle{40, 30, 300, 200}, object: Rectangle{50, 45, 80, 50}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 30, Width: 600, Height: 200}, fail: true}, {name: "scaled root origin", window: Rectangle{20, 15, 150, 100}, object: Rectangle{25, 20, 40, 25}, client: xorg.Foreground{Known: true, Window: 1, X: 40, Y: 30, Width: 300, Height: 200}, want: image.Rect(50, 40, 130, 90)}, {name: "ambiguous decoration scale", window: Rectangle{0, 0, 100, 100}, object: Rectangle{0, 0, 20, 20}, client: xorg.Foreground{Known: true, Window: 1, Width: 200, Height: 200, OuterWidth: 202, OuterHeight: 202}, fail: true}, } { t.Run(test.name, func(t *testing.T) { got, err := ocr_screen_bounds(test.object, test.window, test.client) if test.fail { if err == nil { t.Fatalf("accepted ambiguous bounds: %v", got) } return } if err != nil || got != test.want { t.Fatalf("got %v %v, want %v", got, err, test.want) } }) } }