mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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
126 lines
4.0 KiB
Swift
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
|
|
|