blob: da1a4eb7bbe10dcab36dc41c8d9f18889d67ca61 [file] [log] [blame]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
import SwiftExperimental
import StdlibUnittest
var ExperimentalTestSuite = TestSuite("Experimental")
ExperimentalTestSuite.test("ComposeOperator/SmokeTest") {
func incr(_ x: Int) -> Int { return x + 1 }
func twice(_ x: Int) -> Int { return x * 2 }
expectEqual(7, (incr twice)(3))
}
/*
FIXME: this test crashes SILGen.
<rdar://problem/19150374> Unimplemented: abstraction difference in l-value
ExperimentalTestSuite.test("ComposeOperator/Types") {
struct A {}
struct B {}
struct C {}
func a(_: A) -> B { return B() }
func b(_: B) -> C { return C() }
var result = b ∘ a
typealias Expected = A -> C
expectType(Expected.self, &result)
}
*/
ExperimentalTestSuite.test("ComposeOperator/CountCalls") {
struct A {}
struct B {}
struct C {}
var aCalled = 0
var bCalled = 0
func a(_: A) -> B { aCalled += 1; return B() }
func b(_: B) -> C { bCalled += 1; return C() }
var result = b a
expectEqual(0, aCalled)
expectEqual(0, bCalled)
result(A())
expectEqual(1, aCalled)
expectEqual(1, bCalled)
}
// A modified variant of the test above.
struct A {}
struct B {}
struct C {}
var aCalled = 0
var bCalled = 0
func a(_: A) -> B { aCalled += 1; return B() }
func b(_: B) -> C { bCalled += 1; return C() }
ExperimentalTestSuite.test("ComposeOperator/CountCalls/Workaround") {
var result = b a
expectEqual(0, aCalled)
expectEqual(0, bCalled)
result(A())
expectEqual(1, aCalled)
expectEqual(1, bCalled)
}
runAllTests()