Files
swift-mirror/test/Interpreter/structs.swift
Slava Pestov c3cf4acbbf DI: For value types, handle self.init like an assignment instead of vice versa
This allows, for example, an initializer to conditionally assign
to self or call self.init, along different control flow paths.

It also means that it is legal to call self.init() multiple times
in a value type initializer, but this... is fine. The old 'self'
is destroyed.

Fixes <rdar://problem/33137910>.
2017-10-13 23:51:14 -07:00

224 lines
3.8 KiB
Swift

// RUN: %target-run-simple-swift
// REQUIRES: executable_test
import StdlibUnittest
var StructTestSuite = TestSuite("Struct")
struct Interval {
var lo, hi : Int
init(_ lo: Int, _ hi: Int) {
self.lo = lo
self.hi = hi
}
}
func +(a: Interval, b: Interval) -> Interval {
return Interval(a.lo + b.lo, a.hi + b.hi)
}
func -(a: Interval, b: Interval) -> Interval {
return Interval(a.lo - b.hi, a.hi - b.lo)
}
prefix func -(a: Interval) -> Interval {
return Interval(-a.hi, -a.lo)
}
func print(_ a: Interval) {
print("[\(a.lo), \(a.hi)]")
}
StructTestSuite.test("Interval") {
do {
let i = -Interval(1, 2)
expectEqual(-2, i.lo)
expectEqual(-1, i.hi)
}
do {
let i = Interval(1, 2) + Interval(3, 4)
expectEqual(4, i.lo)
expectEqual(6, i.hi)
}
do {
let i = Interval(3, 4) - Interval(1, 2)
expectEqual(1, i.lo)
expectEqual(3, i.hi)
}
}
struct BigStruct {
var a,b,c,d,e,f,g,h : Int
}
func returnBigStruct() -> BigStruct {
return BigStruct(a: 1, b: 6, c: 1, d: 8, e: 0, f: 3, g: 4, h: 0)
}
StructTestSuite.test("Big") {
let bs = returnBigStruct()
expectEqual(1, bs.a)
expectEqual(6, bs.b)
expectEqual(1, bs.c)
expectEqual(8, bs.d)
expectEqual(0, bs.e)
expectEqual(3, bs.f)
expectEqual(4, bs.g)
expectEqual(0, bs.h)
}
struct GenStruct<T> {
var a, b: Int
init(_ a: Int, _ b: Int) {
self.a = a
self.b = b
}
}
StructTestSuite.test("Generic") {
let gs = GenStruct<String>(19, 84)
expectEqual(19, gs.a)
expectEqual(84, gs.b)
}
struct InitStruct {
var x: Int
var y: Int
var l = LifetimeTracked(0)
init() {
x = 10
y = 20
}
init(x: Int, y: Int) {
self.x = x
self.y = y
}
init(b: Bool) {
if b {
self = InitStruct(x: 5, y: 7)
} else {
self.init(x: 6, y: 8)
}
}
init(initThenAssign: ()) {
self.init(x: 5, y: 7)
self = InitStruct(x: 6, y: 8)
}
init(assignThenInit: ()) {
self = InitStruct(x: 5, y: 7)
self.init(x: 6, y: 8)
}
init(initThenInit: ()) {
self.init(x: 5, y: 7)
self.init(x: 6, y: 8)
}
}
StructTestSuite.test("InitStruct") {
do {
let s = InitStruct()
expectEqual(10, s.x)
expectEqual(20, s.y)
}
do {
let s = InitStruct(x: 69, y: 420)
expectEqual(69, s.x)
expectEqual(420, s.y)
}
do {
let s = InitStruct(initThenAssign: ())
expectEqual(6, s.x)
expectEqual(8, s.y)
}
do {
let s = InitStruct(assignThenInit: ())
expectEqual(6, s.x)
expectEqual(8, s.y)
}
do {
let s = InitStruct(initThenInit: ())
expectEqual(6, s.x)
expectEqual(8, s.y)
}
}
struct InitStructAddrOnly {
var x: Int
var y: Int
var a: Any = "hi"
var l = LifetimeTracked(0)
init() {
x = 10
y = 20
}
init(x: Int, y: Int) {
self.x = x
self.y = y
}
init(b: Bool) {
if b {
self = InitStructAddrOnly(x: 5, y: 7)
} else {
self.init(x: 6, y: 8)
}
}
init(initThenAssign: ()) {
self.init(x: 5, y: 7)
self = InitStructAddrOnly(x: 6, y: 8)
}
init(assignThenInit: ()) {
self = InitStructAddrOnly(x: 5, y: 7)
self.init(x: 6, y: 8)
}
init(initThenInit: ()) {
self.init(x: 5, y: 7)
self.init(x: 6, y: 8)
}
}
StructTestSuite.test("InitStructAddrOnly") {
do {
let s = InitStructAddrOnly()
expectEqual(10, s.x)
expectEqual(20, s.y)
}
do {
let s = InitStructAddrOnly(x: 69, y: 420)
expectEqual(69, s.x)
expectEqual(420, s.y)
}
do {
let s = InitStructAddrOnly(initThenAssign: ())
expectEqual(6, s.x)
expectEqual(8, s.y)
}
do {
let s = InitStructAddrOnly(assignThenInit: ())
expectEqual(6, s.x)
expectEqual(8, s.y)
}
do {
let s = InitStructAddrOnly(initThenInit: ())
expectEqual(6, s.x)
expectEqual(8, s.y)
}
}
runAllTests()