| /* | |
| * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. | |
| * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. | |
| */ | |
| @file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) | |
| // UIView is available on iOS & tvOS: https://developer.apple.com/documentation/uikit/uiview?language=objc | |
| // DISABLE_NATIVE: isAppleTarget=false | |
| // DISABLE_NATIVE: targetFamily=OSX | |
| // DISABLE_NATIVE: targetFamily=WATCHOS | |
| // WITH_PLATFORM_LIBS | |
| import kotlinx.cinterop.* | |
| import platform.UIKit.* | |
| import platform.CoreGraphics.* | |
| import platform.Foundation.NSString | |
| var drawRectInvoked = false | |
| var layoutSubviewsInvoked = false | |
| class SmileView(frame: CValue<CGRect>): UIView(frame = frame) { | |
| override fun drawRect(rect: CValue<CGRect>) { | |
| super.drawRect(rect) | |
| val smile = ":)" as NSString | |
| smile.drawInRect(rect, withAttributes = null) | |
| drawRectInvoked = true | |
| } | |
| override fun layoutSubviews() { | |
| super.layoutSubviews() | |
| layoutSubviewsInvoked = true | |
| } | |
| } | |
| fun box(): String { | |
| return memScoped { | |
| val frame = alloc<CGRect>() | |
| val x = SmileView(frame.readValue()) | |
| x.drawRect(frame.readValue()) | |
| if (!drawRectInvoked) return@memScoped "FAIL: SmileView::drawRect() was not invoked" | |
| x.layoutSubviews() | |
| if (!layoutSubviewsInvoked) return@memScoped "FAIL: SmileView::layoutSubviews() was not invoked" | |
| "OK" | |
| } | |
| } |