// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; public class Base {} public class Sub : Base {} public class GBase {} public class GSubT : GBase {} public struct GTU : IPlusT, IMinusT, IPlusTMinusU {} public struct GTArrUArr : IPlusT, IMinusT, IPlusTMinusU {} public struct GRefTRefU : IPlusT>, IPlusT>, IPlusTMinusU, IPlusT> {} public struct GRefTArrRefUArr : IPlusT>, IPlusT>, IPlusTMinusU,IPlusT> {} public struct GArrRefTArrRefU : IPlusT[]>, IPlusT[]>, IPlusTMinusU[],IPlusT[]> {} public class TestClass { static int iTestCount= 0; static int iErrorCount= 0; static int iExitCode = 101; public static void Eval(string location, bool exp) { ++iTestCount; if ( !(exp)) { iErrorCount++; Console.WriteLine("Test Failed at location: {0} @ count {1} ", location, iTestCount); } } private static void CastClassUToTInternalIPlusT(U u) { IPlusT t = (IPlusT) u; } private static void CastClassUToTInternalIMinusT(U u) { IMinusT t = (IMinusT) u; } private static void CastClassVToITUInternalIPlusTMinusU(V v) { IPlusTMinusU t = (IPlusTMinusU) v; } private static void CastClassUToTWrapperIPlusT() { CastClassUToTInternalIPlusT((U)Activator.CreateInstance(typeof(U))); } private static void CastClassUToTWrapperIMinusT() { CastClassUToTInternalIMinusT((U)Activator.CreateInstance(typeof(U))); } private static void CastClassUToTWrapper() { CastClassVToITUInternalIPlusTMinusU((V)Activator.CreateInstance(typeof(V))); } public static bool CastClassUToTIPlusT(bool expected) { try { CastClassUToTWrapperIPlusT(); if (expected) { return true; } else { return false; } } catch (InvalidCastException) { if (expected) { Console.WriteLine("Unexpected Exception InvalidCastException"); return false; } else { return true; } } catch(Exception E) { Console.WriteLine("Unexpected Exception {0}, with T = {1} and U = {2}", E, typeof(T), typeof(U)); return false; } } public static bool CastClassUToTIMinusT(bool expected) { try { CastClassUToTWrapperIMinusT(); if (expected) { return true; } else { return false; } } catch (InvalidCastException) { if (expected) { Console.WriteLine("Unexpected Exception InvalidCastException"); return false; } else { return true; } } catch(Exception E) { Console.WriteLine("Unexpected Exception {0}, with T = {1} and U = {2}", E, typeof(T), typeof(U)); return false; } } public static bool CastClassUToT(bool expected) { try { CastClassUToTWrapper(); if (expected) { return true; } else { return false; } } catch (InvalidCastException) { if (expected) { Console.WriteLine("Unexpected Exception InvalidCastException"); return false; } else { return true; } } catch(Exception E) { Console.WriteLine("Unexpected Exception {0}, with T = {1} and U = {2}", E, typeof(T), typeof(U)); return false; } } private static bool RunTests() { Eval("Test001", CastClassUToTIPlusT>(true)); Eval("Test002", CastClassUToTIMinusT>(true)); Eval("Test003", CastClassUToT>(true)); Eval("Test004", CastClassUToTIPlusT>(true)); Eval("Test005", CastClassUToTIMinusT>(true)); Eval("Test006", CastClassUToT>(true)); Eval("Test007", CastClassUToTIPlusT, GTU,GBase>>(true)); Eval("Test008", CastClassUToTIMinusT, GTU,GBase>>(true)); Eval("Test009", CastClassUToT,GSubT, GTU,GBase>>(true)); Eval("Test010", CastClassUToTIPlusT[], GTU[],GBase[]>>(true)); Eval("Test011", CastClassUToTIMinusT[], GTU[],GBase[]>>(true)); Eval("Test012", CastClassUToT[],GSubT[], GTU[],GBase[]>>(true)); Eval("Test101", CastClassUToTIPlusT>(true)); Eval("Test102", CastClassUToTIMinusT>(true)); Eval("Test103", CastClassUToT>(true)); Eval("Test104", CastClassUToTIPlusT>(true)); Eval("Test105", CastClassUToTIMinusT>(true)); Eval("Test106", CastClassUToT>(true)); Eval("Test107", CastClassUToTIPlusT[], GTArrUArr,GBase>>(true)); Eval("Test108", CastClassUToTIMinusT[], GTArrUArr,GBase>>(true)); Eval("Test109", CastClassUToT[],GSubT[], GTArrUArr,GBase>>(true)); Eval("Test110", CastClassUToTIPlusT[][], GTArrUArr[],GBase[]>>(true)); Eval("Test111", CastClassUToTIMinusT[][], GTArrUArr[],GBase[]>>(true)); Eval("Test112", CastClassUToT[][],GSubT[][], GTArrUArr[],GBase[]>>(true)); Eval("Test201", CastClassUToTIPlusT, GRefTRefU>(true)); Eval("Test202", CastClassUToTIPlusT, GRefTRefU>(true)); Eval("Test203", CastClassUToT,IPlusT, GRefTRefU>(true)); Eval("Test204", CastClassUToTIPlusT, GRefTRefU>(true)); Eval("Test205", CastClassUToTIPlusT, GRefTRefU>(true)); Eval("Test206", CastClassUToT,IPlusT, GRefTRefU>(true)); Eval("Test207", CastClassUToTIPlusT>, GRefTRefU,GBase>>(true)); Eval("Test208", CastClassUToTIPlusT>, GRefTRefU,GBase>>(true)); Eval("Test209", CastClassUToT>,IPlusT>, GRefTRefU,GBase>>(true)); Eval("Test210", CastClassUToTIPlusT[]>, GRefTRefU[],GBase[]>>(true)); Eval("Test211", CastClassUToTIPlusT[]>, GRefTRefU[],GBase[]>>(true)); Eval("Test212", CastClassUToT[]>,IPlusT[]>, GRefTRefU[],GBase[]>>(true)); Eval("Test301", CastClassUToTIPlusT, GRefTArrRefUArr>(true)); Eval("Test302", CastClassUToTIPlusT, GRefTArrRefUArr>(true)); Eval("Test303", CastClassUToT,IPlusT, GRefTArrRefUArr>(true)); Eval("Test304", CastClassUToTIPlusT, GRefTArrRefUArr>(true)); Eval("Test305", CastClassUToTIPlusT, GRefTArrRefUArr>(true)); Eval("Test306", CastClassUToT,IPlusT, GRefTArrRefUArr>(true)); Eval("Test307", CastClassUToTIPlusT[]>, GRefTArrRefUArr,GBase>>(true)); Eval("Test308", CastClassUToTIPlusT[]>, GRefTArrRefUArr,GBase>>(true)); Eval("Test309", CastClassUToT[]>,IPlusT[]>, GRefTArrRefUArr,GBase>>(true)); Eval("Test310", CastClassUToTIPlusT[][]>, GRefTArrRefUArr[],GBase[]>>(true)); Eval("Test311", CastClassUToTIPlusT[][]>, GRefTArrRefUArr[],GBase[]>>(true)); Eval("Test312", CastClassUToT[][]>,IPlusT[][]>, GRefTArrRefUArr[],GBase[]>>(true)); Eval("Test401", CastClassUToTIPlusT[], GArrRefTArrRefU>(true)); Eval("Test402", CastClassUToTIPlusT[], GArrRefTArrRefU>(true)); Eval("Test403", CastClassUToT[],IPlusT[], GArrRefTArrRefU>(true)); Eval("Test404", CastClassUToTIPlusT[], GArrRefTArrRefU>(true)); Eval("Test405", CastClassUToTIPlusT[], GArrRefTArrRefU>(true)); Eval("Test406", CastClassUToT[],IPlusT[], GArrRefTArrRefU>(true)); Eval("Test407", CastClassUToTIPlusT>[], GArrRefTArrRefU,GBase>>(true)); Eval("Test408", CastClassUToTIPlusT>[], GArrRefTArrRefU,GBase>>(true)); Eval("Test409", CastClassUToT>[],IPlusT>[], GArrRefTArrRefU,GBase>>(true)); Eval("Test410", CastClassUToTIPlusT[]>[], GArrRefTArrRefU[],GBase[]>>(true)); Eval("Test411", CastClassUToTIPlusT[]>[], GArrRefTArrRefU[],GBase[]>>(true)); Eval("Test412", CastClassUToT[]>[],IPlusT[]>[], GArrRefTArrRefU[],GBase[]>>(true)); if( iErrorCount > 0 ) { Console.WriteLine( "Total test cases: " + iTestCount + " Failed test cases: " + iErrorCount ); return false; } else { Console.WriteLine( "Total test cases: " + iTestCount ); return true; } } public static int Main(String [] args) { if( RunTests() ) { iExitCode = 100; Console.WriteLine( "All test cases passed" ); } else { iExitCode = 101; Console.WriteLine( "Test failed" ); } return iExitCode; } }