.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

159 lines
3.8 KiB

// Copyright (c) 2016 Daniel Grunwald
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// #include "../../../ICSharpCode.Decompiler/Util/CSharpPrimitiveCast.cs"
using System;
using ICSharpCode.Decompiler.Util;
namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
{
public class Conversions
{
static readonly TypeCode[] targetTypes = {
TypeCode.Char,
TypeCode.SByte,
TypeCode.Byte,
TypeCode.Int16,
TypeCode.UInt16,
TypeCode.Int32,
TypeCode.UInt32,
TypeCode.Int64,
TypeCode.UInt64,
TypeCode.Single,
TypeCode.Double,
//TypeCode.Decimal
};
static object[] inputValues = {
'\0',
'a',
'\uFFFE',
sbyte.MinValue,
sbyte.MaxValue,
(sbyte)-1,
(sbyte)1,
byte.MinValue,
byte.MaxValue,
(byte)1,
short.MinValue,
short.MaxValue,
(short)-1,
(short)1,
ushort.MinValue,
ushort.MaxValue,
(ushort)1,
int.MinValue,
int.MaxValue,
(int)-1,
(int)1,
uint.MinValue,
uint.MaxValue,
(uint)1,
long.MinValue,
long.MaxValue,
(long)-1,
(long)1,
ulong.MinValue,
ulong.MaxValue,
(ulong)1,
-1.1f,
1.1f,
float.MinValue,
float.MaxValue,
float.NegativeInfinity,
float.PositiveInfinity,
float.NaN,
-1.1,
1.1,
double.MinValue,
double.MaxValue,
double.NegativeInfinity,
double.PositiveInfinity,
double.NaN,
decimal.MinValue,
decimal.MaxValue,
decimal.MinusOne,
decimal.One
};
static void Main(string[] args)
{
RunTest(checkForOverflow: false);
RunTest(checkForOverflow: true);
Console.WriteLine(ReadZeroTerminatedString("Hello World!".Length));
}
static void RunTest(bool checkForOverflow)
{
string mode = checkForOverflow ? "checked" : "unchecked";
foreach (object input in inputValues) {
string inputType = input.GetType().Name;
foreach (var targetType in targetTypes) {
try {
object result = CSharpPrimitiveCast.Cast(targetType, input, checkForOverflow);
Console.WriteLine("{0} ({1})({2}){3} = ({4}){5}", mode, targetType, inputType, input,
result.GetType().Name, result);
} catch (Exception ex) {
Console.WriteLine("{0} ({1})({2}){3} = {4}", mode, targetType, inputType, input,
ex.GetType().Name);
}
}
}
}
static object MM(sbyte c)
{
checked {
return (UInt64)c;
}
}
static string ReadZeroTerminatedString (int length)
{
int read = 0;
var buffer = new char [length];
var bytes = ReadBytes (length);
while (read < length) {
var current = bytes [read];
if (current == 0)
break;
buffer [read++] = (char) current;
}
return new string (buffer, 0, read);
}
static byte[] ReadBytes(int length) {
return System.Text.Encoding.ASCII.GetBytes("Hello World!");
}
}
}