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
|
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtTest 1.2
import QtQuick 6.0
TestCase {
id: testCase
width: 800
height: 600
visible: true
when: windowShown
property var items: []
property int items_count: 1000
property int itemWidth : 50
property int itemHeight: 50
// A reference point (added upon request)
function benchmark_do_nothing_with_palettes() {}
// This test passes through all items in tree to resolve a color. No extra palettes created.
// Should be blazingly fast (approx. 0.01 msecs for 999 items).
function benchmark_color_lookup() {
// Make last item "visible" and create its palette
items[items_count - 1].color = items[items_count - 1].palette.button
compare(items[0].palette.button, items[items_count - 1].palette.button,
"Color is not propagated to the last element.")
}
// This test creates palettes for all elements in the tree.
function benchmark_create_all_palettes(data) {
populate_palettes()
check_palettes()
}
// This test creates and resolves palettes for all elements in the tree.
function benchmark_create_and_resolve_all_palettes() {
populate_palettes()
resolve_palettes()
check_palettes()
}
function init() {
// Re-create all items on each iteration of the benchmark.
var componentStr = "import QtQuick 6.0;
Rectangle {
x: mapFromItem(testCase, testCase.randomX(), testCase.randomY()).x
y: mapFromItem(testCase, testCase.randomX(), testCase.randomY()).y
color: \"#7F696969\"
width: testCase.itemWidth
height: testCase.itemHeight
}";
items.push(createTemporaryQmlObject(componentStr, testCase))
for (var i = 1; i < items_count; ++i) {
items.push(createTemporaryQmlObject(componentStr, items[i - 1]))
}
// Create a pallet for item 0
items[0].palette.button = randomRgba()
// Make item "visible" (can be overlapped by children)
items[0].color = items[0].palette.button
}
function cleanup() {
// Explicitly remove all "temporary" items to make sure that a memory
// will be released after each iteration of the benchmark.
for (var i = 0; i < items_count; ++i) {
items[i].destroy();
}
items = [];
}
function randomColorComponent() {
return Math.floor(Math.random() * 256) / 255.0;
}
function randomRgba() {
return Qt.rgba(randomColorComponent(),
randomColorComponent(),
randomColorComponent(),
randomColorComponent());
}
function randomCoordinate(len, itemLen) { return Math.floor(Math.random() * (len - itemLen + 1)); }
function randomX() { return randomCoordinate(width, itemWidth); }
function randomY() { return randomCoordinate(height, itemHeight); }
function populate_palettes() {
for (var i = 1; i < items_count; ++i) {
items[i].color = items[i].palette.button
}
}
function check_palettes() {
for (var j = 1; j < items_count; ++j) {
compare(items[j - 1].palette.button, items[j].palette.button,
"Color is not propagated to the next child element.")
}
}
function resolve_palettes() {
// The loop is just in case. Doesn't affect the benchmark
do {
var randomColor = randomRgba()
} while (items[0].palette.button === randomColor)
items[0].palette.button = randomColor
}
}
|