// -*- swift -*-
// RUN: %target-run-simple-swiftgyb
// REQUIRES: executable_test

// FIXME: Casting.cpp has dozens of places to fail a cast. This test does not 
// attempt to enumerate them all.

// XFAIL: linux

import StdlibUnittest


import Foundation


% types = []
% objectTypes = []
% protocolTypes = []

% types.append(['main.Class1', 'main.Class2'])
% objectTypes.append(['main.Class1', 'main.Class2'])
class Class1 { }
class Class2 { }

% types.append(['main.Struct1', 'main.Struct2'])
struct Struct1 { }
struct Struct2 { }

% types.append(['main.ObjCClass1', 'main.ObjCClass2'])
% objectTypes.append(['main.ObjCClass1', 'main.ObjCClass2'])
class ObjCClass1 : NSObject { }
class ObjCClass2 : NSObject { }

% types.append(['DateFormatter', 'NumberFormatter'])
% objectTypes.append(['DateFormatter', 'NumberFormatter'])
// non-Swift Objective-C class

% protocolTypes.append('main.Proto1')
% protocolTypes.append('main.Proto2')
protocol Proto1 { }
protocol Proto2 { }
% protocolTypes.append('URLSessionDelegate')
// non-Swift Objective-C protocol


var CastTrapsTestSuite = TestSuite("CastTraps")

// Test `(T1() as Any) as T2` cast failure 
// for all type pairs.

% for (t1, _) in types:
%   for (_, t2) in types:

CastTrapsTestSuite.test("${t1}__${t2}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches("Could not cast value of type '")
  .crashOutputMatches("${t1}' ")
  .crashOutputMatches(" to '")
  .crashOutputMatches("${t2}'")
  .code
{
  let o = ${t1}() as Any
  expectCrashLater()
  let r = o as! ${t2}
  _blackHole(r)
}

%   end
% end

// Test `(T1() as AnyObject) as T2` cast failure 
// for object type to protocol type pairs

% for (t1, _) in objectTypes:
%   for (t2) in protocolTypes:

CastTrapsTestSuite.test("${t1}__${t2}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches("Could not cast value of type '")
  .crashOutputMatches("${t1}' ")
  .crashOutputMatches(" to '")
  .crashOutputMatches("${t2}'")
  .code
{
  let o = ${t1}() as AnyObject
  expectCrashLater()
  let r = o as! ${t2}
  _blackHole(r)
}

%   end
% end

runAllTests()
