// RUN: %target-resilience-test
// REQUIRES: executable_test

// Use swift-version 4.
// UNSUPPORTED: swift_test_mode_optimize_none_with_implicit_dynamic

import StdlibUnittest
import class_change_size


var ClassChangeSizeTest = TestSuite("ClassChangeSize")

func increment(_ c: inout ChangeSize) {
  c.version += 1
}

// Change field offsets and size of a class from a different
// resilience domain

ClassChangeSizeTest.test("ChangeFieldOffsetsOfFixedLayout") {
  let t = ChangeFieldOffsetsOfFixedLayout(major: 7, minor: 5, patch: 3)

  do {
    expectEqual(t.getVersion(), "7.5.3")
  }

  do {
    t.minor.version = 1
    t.patch.version = 2
    expectEqual(t.getVersion(), "7.1.2")
  }

  do {
    increment(&t.patch)
    expectEqual(t.getVersion(), "7.1.3")
  }
}

// Superclass and subclass are in a different resilience domain

ClassChangeSizeTest.test("ChangeSizeOfSuperclass") {
  let t = ChangeSizeOfSuperclass()

  do {
    expectEqual(t.getVersion(), "7.0.0 (Big Bang)")
  }

  do {
    t.major.version = 6
    t.minor.version = 0
    t.patch.version = 5
    t.codename = "Big Deal"
    expectEqual(t.getVersion(), "6.0.5 (Big Deal)")
  }

  do {
    increment(&t.patch)
    t.codename = "Six Pack"
    expectEqual(t.getVersion(), "6.0.6 (Six Pack)")
  }
}

// Change field offsets and size of a class from the current
// resilience domain

class ChangeFieldOffsetsOfMyFixedLayout {
  init(major: Int32, minor: Int32, patch: Int32) {
    self.major = ChangeSize(version: major)
    self.minor = ChangeSize(version: minor)
    self.patch = ChangeSize(version: patch)
  }

  var major: ChangeSize
  var minor: ChangeSize
  var patch: ChangeSize

  func getVersion() -> String {
    return "\(major.version).\(minor.version).\(patch.version)"
  }
}

ClassChangeSizeTest.test("ChangeFieldOffsetsOfMyFixedLayout") {
  let t = ChangeFieldOffsetsOfMyFixedLayout(major: 9, minor: 2, patch: 1)

  do {
    expectEqual(t.getVersion(), "9.2.1")
  }

  do {
    t.major.version = 7
    t.minor.version = 6
    t.patch.version = 1
    expectEqual(t.getVersion(), "7.6.1")
  }

  do {
    increment(&t.patch)
    expectEqual(t.getVersion(), "7.6.2")
  }
}

// Subclass is in our resilience domain, superclass is in a
// different resilience domain

class MyChangeSizeOfSuperclass : ChangeFieldOffsetsOfFixedLayout {
  init() {
    self.codename = "Road Warrior"

    super.init(major: 7, minor: 0, patch: 1)
  }

  var codename: String

  override func getVersion() -> String {
    return "\(super.getVersion()) (\(codename))";
  }
}

ClassChangeSizeTest.test("MyChangeSizeOfSuperclass") {
  let t = MyChangeSizeOfSuperclass()

  do {
    expectEqual(t.getVersion(), "7.0.1 (Road Warrior)")
  }

  do {
    t.minor.version = 5
    t.patch.version = 2
    t.codename = "Marconi"
    expectEqual(t.getVersion(), "7.5.2 (Marconi)")
  }

  do {
    increment(&t.patch)
    t.codename = "Unity"
    expectEqual(t.getVersion(), "7.5.3 (Unity)")
  }
}

// Subclass and superclass are both in our resilience domain

class ChangeSizeOfMySuperclass : ChangeFieldOffsetsOfFixedLayout {
  init() {
    self.codename = "Big Bang"

    super.init(major: 7, minor: 0, patch: 0)
  }

  var codename: String

  override func getVersion() -> String {
    return "\(super.getVersion()) (\(codename))";
  }
}

ClassChangeSizeTest.test("ChangeSizeOfMySuperclass") {
  let t = ChangeSizeOfMySuperclass()

  do {
    expectEqual(t.getVersion(), "7.0.0 (Big Bang)")
  }

  do {
    t.major.version = 6
    t.minor.version = 0
    t.patch.version = 5
    t.codename = "Big Deal"
    expectEqual(t.getVersion(), "6.0.5 (Big Deal)")
  }

  do {
    increment(&t.patch)
    t.codename = "Six Pack"
    expectEqual(t.getVersion(), "6.0.6 (Six Pack)")
  }
}

runAllTests()
