aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/doc/snippets/qml/integrating-javascript/scarceresources/avatarExample.cpp
blob: 48f2beeef0da277e0176721afa63acbdc0dc9e1c (plain)
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
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

#include "avatarExample.h"
#include <QQmlEngine>
#include <QQmlComponent>
#include <QGuiApplication>

struct Expectations
{
    QQmlEngine engine;

    void expectOne()
    {
//![1]
        QQmlComponent component(&engine, "qrc:/exampleOne.qml");
        QObject *object = component.create();
        // The scarce resource will have been released automatically
        // by this point, after the binding expression was evaluated.
        bool expectedResult = (object->property("avatarWidth").toInt() == 100);
        delete object;
//![1]
        Q_ASSERT(expectedResult);
    }

    void expectTwo()
    {
//![2]
        QQmlComponent component(&engine, "qrc:/exampleTwo.qml");
        QObject *object = component.create();
        // The scarce resource will not have been released automatically
        // after the binding expression was evaluated.
        // Since the scarce resource was not released explicitly prior
        // to the binding expression being evaluated, we get:
        bool expectedResult = (object->property("avatar").isValid() == true);
        delete object;
//![2]
        Q_ASSERT(expectedResult);
    }

    void expectThree()
    {
//![3]
        QQmlComponent component(&engine, "qrc:/exampleThree.qml");
        QObject *object = component.create();
        // The resource was preserved explicitly during evaluation of the
        // JavaScript expression.  Thus, during property assignment, the
        // scarce resource was still valid, and so we get:
        bool expectedResult = (object->property("avatar").isValid() == true);
        // The scarce resource will not be released until all references to
        // the resource are released, and the JavaScript garbage collector runs.
        delete object;
//![3]
        Q_ASSERT(expectedResult);
    }

    void expectFour()
    {
//![4]
        QQmlComponent component(&engine, "qrc:/exampleFour.qml");
        QObject *object = component.create();
        // The scarce resource was explicitly preserved by the client during
        // the importAvatar() function, and so the scarce resource
        // remains valid until the explicit call to releaseAvatar().  As such,
        // we get the expected results:
        bool expectedResultOne = (object->property("avatarOne").isValid() == true);
        bool expectedResultTwo = (object->property("avatarTwo").isValid() == false);
        // Because the scarce resource referenced by avatarTwo was released explicitly,
        // it will no longer be consuming any system resources (beyond what a normal
        // JS Object would; that small overhead will exist until the JS GC runs, as per
        // any other JavaScript object).
        delete object;
//![4]
        Q_ASSERT(expectedResultOne);
        Q_ASSERT(expectedResultTwo);
    }

    void expectFive()
    {
//![5]
        QQmlComponent component(&engine, "qrc:/exampleFive.qml");
        QObject *object = component.create();
        // We have the expected results:
        bool expectedResultOne = (object->property("avatarOne").isValid() == false);
        bool expectedResultTwo = (object->property("avatarTwo").isValid() == false);
        // Because although only avatarTwo was explicitly released,
        // avatarOne and avatarTwo were referencing the same
        // scarce resource.
        delete object;
//![5]
        Q_ASSERT(expectedResultOne);
        Q_ASSERT(expectedResultTwo);
    }
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    Expectations expectations;
    expectations.expectOne();
    expectations.expectTwo();
    expectations.expectThree();
    expectations.expectFour();
    expectations.expectFive();
}