// RUN: rm -rf %t  &&  mkdir %t
//
// RUN: %gyb %s -o %t/AnyHashableCasts.swift
// RUN: %target-build-swift -g -module-name a %t/AnyHashableCasts.swift -o %t.out
// RUN: %target-run %t.out
// RUN: %target-build-swift -g -O -module-name a %t/AnyHashableCasts.swift -o %t.out.optimized
// RUN: %target-run %t.out.optimized
// REQUIRES: executable_test

import StdlibUnittest

var AnyHashableCasts = TestSuite("AnyHashableCasts")

protocol Implemented {}
protocol Unimplemented {}
extension Int : Implemented {}

func opaqueCast<T, U>(_ lhs: T, _ rhs: U.Type) -> U? {
  return lhs as? U
}

func matches<T: Equatable>(_ lhs: T, _ rhs: T) -> Bool {
  return lhs == rhs
}

func matches<T: Equatable, U>(_ lhs: U, _ rhs: T) -> Bool {
  if let x = lhs as? T {
    return x == rhs
  } else {
    return false
  }
}

%{
testCases = [
  ("5", "AnyHashable", "Int", "5"),
  ("5", "AnyHashable", "Any", "5"),
  ("5", "AnyHashable", "Implemented", "5"),
  ("5", "AnyHashable", "Unimplemented", False),
  ("5", "Int", "AnyHashable", "5"),
  ("5", "Any", "AnyHashable", "5"),
  ("AnyHashable(5)", "Any", "Int", "5")
]
}%

% for valueExpr, coercedType, castType, expected in testCases:
AnyHashableCasts.test("${valueExpr} as ${coercedType} as? ${castType}") {
  do {
    let x = ${valueExpr}
    let y : ${coercedType} = x
    if let z = y as? ${castType} {
%if expected:
      expectTrue(matches(z, ${expected}))
%else:
      expectUnreachable()
%end
    } else {
%if expected:
      expectUnreachable()
%end
    }

    if let z = opaqueCast(y, (${castType}).self) {
%if expected:
      expectTrue(matches(z, ${expected}))
%else:
      expectUnreachable()
%end
    } else {
%if expected:
      expectUnreachable()
%end    
    }
  }
}
% end

runAllTests()
