// RUN: %empty-directory(%t)

// RUN: %target-build-swift-dylib(%t/%target-library-name(resilient_struct)) -enable-library-evolution %S/../../test/Inputs/resilient_struct.swift -emit-module -emit-module-path %t/resilient_struct.swiftmodule -module-name resilient_struct
// RUN: %target-codesign %t/%target-library-name(resilient_struct)

// RUN: %target-build-swift %s -L %t -I %t -lresilient_struct -o %t/main %target-rpath(%t) -target x86_64-apple-macosx10.14.4
// RUN: %target-codesign %t/main

// RUN: %target-run %t/main %t/%target-library-name(resilient_struct) %t/libresilient_class%{target-shared-library-suffix}


// REQUIRES: executable_test
// REQUIRES: objc_interop
// REQUIRES: OS=macosx
// REQUIRES: CPU=x86_64

// Test that on an old Objective-C runtime we crash if attempting to use a
// class that requires the update callback and does not have a fragile layout.

import StdlibUnittest
import resilient_struct

var ClassTestSuite = TestSuite("Update callback")

public class ClassWithResilientField {
  var x = ResilientInt(i: 0)
}

@_optimize(none) func blackHole<T>(_: T) {}

@_optimize(none) func forceMetadata() {
  blackHole(ClassWithResilientField())
}

if #available(macOS 10.14.4, iOS 12.2, tvOS 12.2, watchOS 5.2, *) {
  ClassTestSuite.test("RealizeResilientClass") {  
    print("Nothing to test. We have the new Objective-C runtime.")
    forceMetadata()
  }
} else {
  ClassTestSuite.test("RealizeResilientClass")
    .crashOutputMatches("class ClassWithResilientField does not have a fragile layout")
    .code {
      expectCrashLater()
      print("About to crash...")
      forceMetadata()
    }
}

runAllTests()
