Files
swift-mirror/test/Interpreter/SDK/GLKit.swift
Alexis Laferrière ddb13d1cf3 Tests: Update tests importing AppKit from the SDK to use a local cache
Tests importing AppKit have a tendency to be flaky when they share a
module cache with other builds using a different set of framework search
flags. Make sure they use a local cache, otherwise the compiler can
reuse incompatible cached modules.

Alternatively, we could align all builds using the same cache to have
exactly the same framework search paths or enable explicit module
builds. I picked the module cache as it's the most reliable solution in
the short and long term.

rdar://142949965
2025-08-11 13:57:28 -07:00

126 lines
4.0 KiB
Swift

// RUN: %empty-directory(%t/cache)
// RUN: %target-run-simple-swift(-module-cache-path %t/cache) | %FileCheck %s
// REQUIRES: executable_test
// NOTE: Clang used to miscompile GLKit functions on i386. rdar://problem/19184403
// On i386, it seems to work optimized mode, but fails in non-optimized.
// rdar://problem/26392402
// UNSUPPORTED: CPU=i386
// REQUIRES: objc_interop
// GLKit is not available on watchOS.
// UNSUPPORTED: OS=watchos
// UNSUPPORTED: OS=xros
import GLKit
func printV4(_ v: GLKVector4) {
print("<\(v.x) \(v.y) \(v.z) \(v.w)>")
}
let x = GLKVector4Make(1, 0, 0, 0)
let y = GLKVector4Make(0, 1, 0, 0)
let z = GLKVector4Make(0, 0, 1, 0)
printV4(x) // CHECK: <1.0 0.0 0.0 0.0>
printV4(y) // CHECK-NEXT: <0.0 1.0 0.0 0.0>
printV4(z) // CHECK-NEXT: <0.0 0.0 1.0 0.0>
print(GLKVector4DotProduct(x, y)) // CHECK-NEXT: 0.0
let z2 = GLKVector4CrossProduct(x, y)
print(GLKVector4AllEqualToVector4(z, z2)) // CHECK-NEXT: true
infix operator : MultiplicationPrecedence
infix operator : MultiplicationPrecedence
func (x: GLKVector4, y: GLKVector4) -> Float {
return GLKVector4DotProduct(x, y)
}
func (x: GLKVector4, y: GLKVector4) -> GLKVector4 {
return GLKVector4CrossProduct(x, y)
}
func ==(x: GLKVector4, y: GLKVector4) -> Bool {
return GLKVector4AllEqualToVector4(x, y)
}
print(x y) // CHECK-NEXT: 0.0
print(x y == z) // CHECK-NEXT: true
func printM4(_ m: GLKMatrix4) {
print("\(m.m00) \(m.m01) \(m.m02) \(m.m03)")
print("\(m.m10) \(m.m11) \(m.m12) \(m.m13)")
print("\(m.m20) \(m.m21) \(m.m22) \(m.m23)")
print("\(m.m30) \(m.m31) \(m.m32) \(m.m33)")
}
let flipXY = GLKMatrix4Make(0, 1, 0, 0,
1, 0, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1)
// CHECK-NEXT: 0.0 1.0 0.0 0.0
// CHECK-NEXT: 1.0 0.0 0.0 0.0
// CHECK-NEXT: 0.0 0.0 1.0 0.0
// CHECK-NEXT: 0.0 0.0 0.0 1.0
printM4(flipXY)
// FIXME: GLKMatrix4MakeWithArray takes mutable pointer arguments for no
// good reason. rdar://problem/19124355
var flipYZElements: [Float] = [1, 0, 0, 0,
0, 0, 1, 0,
0, 1, 0, 0,
0, 0, 0, 1]
let flipYZ = GLKMatrix4MakeWithArray(&flipYZElements)
// CHECK-NEXT: 1.0 0.0 0.0 0.0
// CHECK-NEXT: 0.0 0.0 1.0 0.0
// CHECK-NEXT: 0.0 1.0 0.0 0.0
// CHECK-NEXT: 0.0 0.0 0.0 1.0
printM4(flipYZ)
let rotateXYZ = GLKMatrix4Multiply(flipYZ, flipXY)
// CHECK-NEXT: 0.0 0.0 1.0 0.0
// CHECK-NEXT: 1.0 0.0 0.0 0.0
// CHECK-NEXT: 0.0 1.0 0.0 0.0
// CHECK-NEXT: 0.0 0.0 0.0 1.0
printM4(rotateXYZ)
let y3 = GLKMatrix4MultiplyVector4(flipXY, x)
print(y == y3) // CHECK-NEXT: true
let y4 = GLKMatrix4MultiplyVector4(flipYZ, z)
print(y == y4) // CHECK-NEXT: true
let z3 = GLKMatrix4MultiplyVector4(rotateXYZ, x)
print(z == z3) // CHECK-NEXT: true
func (x: GLKMatrix4, y: GLKMatrix4) -> GLKMatrix4 {
return GLKMatrix4Multiply(x, y)
}
func (x: GLKMatrix4, y: GLKVector4) -> GLKVector4 {
return GLKMatrix4MultiplyVector4(x, y)
}
print(y == flipXY x) // CHECK-NEXT: true
print(x == flipXY y) // CHECK-NEXT: true
print(z == flipXY z) // CHECK-NEXT: true
print(x == flipYZ x) // CHECK-NEXT: true
print(z == flipYZ y) // CHECK-NEXT: true
print(y == flipYZ z) // CHECK-NEXT: true
print(z == rotateXYZ x) // CHECK-NEXT: true
print(x == rotateXYZ y) // CHECK-NEXT: true
print(y == rotateXYZ z) // CHECK-NEXT: true
print(z == flipYZ flipXY x) // CHECK-NEXT: true
print(x == flipYZ flipXY y) // CHECK-NEXT: true
print(y == flipYZ flipXY z) // CHECK-NEXT: true
let xxx = GLKVector3Make(1, 0, 0)
let yyy = GLKVector3Make(0, 1, 0)
let zzz = GLKVector3Make(0, 0, 1)
print(GLKVector3DotProduct(xxx, yyy)) // CHECK-NEXT: 0.0
print(GLKVector3AllEqualToVector3(GLKVector3CrossProduct(xxx, yyy), zzz)) // CHECK-NEXT: true
let xx = GLKVector2Make(1, 0)
let yy = GLKVector2Make(0, 1)
print(GLKVector2DotProduct(xx, yy)) // CHECK-NEXT: 0.0