/
testdriver.go
133 lines (108 loc) · 3.16 KB
/
testdriver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package test
import (
"image"
"sync"
"github.com/danielbaenabird/fyne/v2"
"github.com/danielbaenabird/fyne/v2/internal/driver"
"github.com/danielbaenabird/fyne/v2/internal/painter"
"github.com/danielbaenabird/fyne/v2/internal/painter/software"
intRepo "github.com/danielbaenabird/fyne/v2/internal/repository"
"github.com/danielbaenabird/fyne/v2/storage/repository"
)
// SoftwarePainter describes a simple type that can render canvases
type SoftwarePainter interface {
Paint(fyne.Canvas) image.Image
}
type testDriver struct {
device *device
painter SoftwarePainter
windows []fyne.Window
windowsMutex sync.RWMutex
}
// Declare conformity with Driver
var _ fyne.Driver = (*testDriver)(nil)
// NewDriver sets up and registers a new dummy driver for test purpose
func NewDriver() fyne.Driver {
drv := new(testDriver)
drv.windowsMutex = sync.RWMutex{}
repository.Register("file", intRepo.NewFileRepository())
// make a single dummy window for rendering tests
drv.CreateWindow("")
return drv
}
// NewDriverWithPainter creates a new dummy driver that will pass the given
// painter to all canvases created
func NewDriverWithPainter(painter SoftwarePainter) fyne.Driver {
drv := new(testDriver)
drv.painter = painter
drv.windowsMutex = sync.RWMutex{}
return drv
}
func (d *testDriver) AbsolutePositionForObject(co fyne.CanvasObject) fyne.Position {
c := d.CanvasForObject(co)
if c == nil {
return fyne.NewPos(0, 0)
}
tc := c.(*testCanvas)
return driver.AbsolutePositionForObject(co, tc.objectTrees())
}
func (d *testDriver) AllWindows() []fyne.Window {
d.windowsMutex.RLock()
defer d.windowsMutex.RUnlock()
return d.windows
}
func (d *testDriver) CanvasForObject(fyne.CanvasObject) fyne.Canvas {
d.windowsMutex.RLock()
defer d.windowsMutex.RUnlock()
// cheating: probably the last created window is meant
return d.windows[len(d.windows)-1].Canvas()
}
func (d *testDriver) CreateWindow(string) fyne.Window {
canvas := NewCanvas().(*testCanvas)
if d.painter != nil {
canvas.painter = d.painter
} else {
canvas.painter = software.NewPainter()
}
window := &testWindow{canvas: canvas, driver: d}
window.clipboard = &testClipboard{}
d.windowsMutex.Lock()
d.windows = append(d.windows, window)
d.windowsMutex.Unlock()
return window
}
func (d *testDriver) Device() fyne.Device {
if d.device == nil {
d.device = &device{}
}
return d.device
}
// RenderedTextSize looks up how bit a string would be if drawn on screen
func (d *testDriver) RenderedTextSize(text string, size float32, style fyne.TextStyle) (fyne.Size, float32) {
return painter.RenderedTextSize(text, size, style)
}
func (d *testDriver) Run() {
// no-op
}
func (d *testDriver) StartAnimation(a *fyne.Animation) {
// currently no animations in test app, we just initialise it and leave
a.Tick(1.0)
}
func (d *testDriver) StopAnimation(a *fyne.Animation) {
// currently no animations in test app, do nothing
}
func (d *testDriver) Quit() {
// no-op
}
func (d *testDriver) removeWindow(w *testWindow) {
d.windowsMutex.Lock()
i := 0
for _, window := range d.windows {
if window == w {
break
}
i++
}
d.windows = append(d.windows[:i], d.windows[i+1:]...)
d.windowsMutex.Unlock()
}