mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-05 16:55:25 +08:00
qt 6.5.1 original
This commit is contained in:
14
tests/auto/corelib/tools/qmacautoreleasepool/CMakeLists.txt
Normal file
14
tests/auto/corelib/tools/qmacautoreleasepool/CMakeLists.txt
Normal file
@ -0,0 +1,14 @@
|
||||
# Copyright (C) 2022 The Qt Company Ltd.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
#####################################################################
|
||||
## tst_qmacautoreleasepool Test:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_add_test(tst_qmacautoreleasepool
|
||||
SOURCES
|
||||
tst_qmacautoreleasepool.mm
|
||||
LIBRARIES
|
||||
Qt::CorePrivate
|
||||
${FWFoundation}
|
||||
)
|
@ -0,0 +1,88 @@
|
||||
// Copyright (C) 2017 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include <QTest>
|
||||
|
||||
#include <QtCore/private/qcore_mac_p.h>
|
||||
|
||||
#include <Foundation/Foundation.h>
|
||||
|
||||
class tst_QMacAutoreleasePool : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
private slots:
|
||||
void noPool();
|
||||
void rootLevelPool();
|
||||
void stackAllocatedPool();
|
||||
void heapAllocatedPool();
|
||||
};
|
||||
|
||||
static id lastDeallocedObject = nil;
|
||||
|
||||
@interface DeallocTracker : NSObject @end
|
||||
@implementation DeallocTracker
|
||||
-(void)dealloc
|
||||
{
|
||||
lastDeallocedObject = self;
|
||||
[super dealloc];
|
||||
}
|
||||
@end
|
||||
|
||||
void tst_QMacAutoreleasePool::noPool()
|
||||
{
|
||||
// No pool, will not be released, but should not crash
|
||||
|
||||
[[[DeallocTracker alloc] init] autorelease];
|
||||
}
|
||||
|
||||
void tst_QMacAutoreleasePool::rootLevelPool()
|
||||
{
|
||||
// The root level case, no NSAutoreleasePool since we're not in the main
|
||||
// runloop, and objects autoreleased as part of main.
|
||||
|
||||
NSObject *allocedObject = nil;
|
||||
{
|
||||
QMacAutoReleasePool qtPool;
|
||||
allocedObject = [[[DeallocTracker alloc] init] autorelease];
|
||||
}
|
||||
QCOMPARE(lastDeallocedObject, allocedObject);
|
||||
}
|
||||
|
||||
void tst_QMacAutoreleasePool::stackAllocatedPool()
|
||||
{
|
||||
// The normal case, other pools surrounding our pool, draining
|
||||
// our pool before any other pool.
|
||||
|
||||
NSObject *allocedObject = nil;
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
{
|
||||
QMacAutoReleasePool qtPool;
|
||||
allocedObject = [[[DeallocTracker alloc] init] autorelease];
|
||||
}
|
||||
QCOMPARE(lastDeallocedObject, allocedObject);
|
||||
[pool drain];
|
||||
}
|
||||
|
||||
void tst_QMacAutoreleasePool::heapAllocatedPool()
|
||||
{
|
||||
// The special case, a pool allocated on the heap, or as a member of a
|
||||
// heap allocated object. This is not a supported use of QMacAutoReleasePool,
|
||||
// and will result in warnings if the pool is prematurely drained.
|
||||
|
||||
NSObject *allocedObject = nil;
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
QMacAutoReleasePool *qtPool = nullptr;
|
||||
{
|
||||
qtPool = new QMacAutoReleasePool;
|
||||
allocedObject = [[[DeallocTracker alloc] init] autorelease];
|
||||
}
|
||||
[pool drain];
|
||||
delete qtPool;
|
||||
}
|
||||
QCOMPARE(lastDeallocedObject, allocedObject);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QMacAutoreleasePool)
|
||||
|
||||
#include "tst_qmacautoreleasepool.moc"
|
Reference in New Issue
Block a user