using System;
using System.Globalization;
using System.Linq;
using System.Numerics;
using NUnit.Framework;
using Python.Runtime;
namespace Python.EmbeddingTest
{
public class TestPyInt
{
[Test]
public void TestCtorInt()
{
const int i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorUInt()
{
const uint i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorLong()
{
const long i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorULong()
{
const ulong i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorShort()
{
const short i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorUShort()
{
const ushort i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorByte()
{
const byte i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorSByte()
{
const sbyte i = 5;
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(i));
}
[Test]
public void TestCtorPyObject()
{
var i = new PyInt(5);
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(5));
}
[Test]
public void TestCtorBadPyObject()
{
var i = new PyString("Foo");
PyInt a = null;
var ex = Assert.Throws(() => a = new PyInt(i));
StringAssert.StartsWith("object is not an int", ex.Message);
Assert.IsNull(a);
}
[Test]
public void TestCtorString()
{
const string i = "5";
var a = new PyInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(5));
}
[Test]
public void TestCtorBadString()
{
const string i = "Foo";
PyInt a = null;
var ex = Assert.Throws(() => a = new PyInt(i));
StringAssert.StartsWith("invalid literal for int", ex.Message);
Assert.IsNull(a);
}
[Test]
public void TestIsIntTypeTrue()
{
var i = new PyInt(5);
Assert.True(PyInt.IsIntType(i));
}
[Test]
public void TestIsIntTypeFalse()
{
var s = new PyString("Foo");
Assert.False(PyInt.IsIntType(s));
}
[Test]
public void TestAsIntGood()
{
var i = new PyInt(5);
var a = PyInt.AsInt(i);
Assert.That(a.ToInt32(), Is.EqualTo(5));
}
[Test]
public void TestAsIntBad()
{
var s = new PyString("Foo");
PyInt a = null;
var ex = Assert.Throws(() => a = PyInt.AsInt(s));
StringAssert.StartsWith("invalid literal for int", ex.Message);
Assert.IsNull(a);
}
[Test]
public void TestConvertToInt32()
{
var a = new PyInt(5);
Assert.IsInstanceOf(typeof(int), a.ToInt32());
Assert.That(a.ToInt32(), Is.EqualTo(5));
}
[Test]
public void TestConvertToInt16()
{
var a = new PyInt(5);
Assert.IsInstanceOf(typeof(short), a.ToInt16());
Assert.That(a.ToInt16(), Is.EqualTo(5));
}
[Test]
public void TestConvertToInt64()
{
long val = 5 + (long)int.MaxValue;
var a = new PyInt(val);
Assert.IsInstanceOf(typeof(long), a.ToInt64());
Assert.That(a.ToInt64(), Is.EqualTo(val));
}
[Test]
public void ToBigInteger()
{
int[] simpleValues =
{
0, 1, 2,
0x10,
0x79,
0x80,
0x81,
0xFF,
0x123,
0x8000,
0x1234,
0x8001,
0x4000,
0xFF,
};
simpleValues = simpleValues.Concat(simpleValues.Select(v => -v)).ToArray();
var expected = simpleValues.Select(v => new BigInteger(v)).ToArray();
var actual = simpleValues.Select(v => new PyInt(v).ToBigInteger()).ToArray();
Assert.That(actual, Is.EqualTo(expected));
}
[Test]
public void CompareTo()
{
var v = new PyInt(42);
#region Signed
Assert.That(v.CompareTo(42L), Is.EqualTo(0));
Assert.That(v.CompareTo(42), Is.EqualTo(0));
Assert.That(v.CompareTo((short)42), Is.EqualTo(0));
Assert.That(v.CompareTo((sbyte)42), Is.EqualTo(0));
Assert.That(v.CompareTo(41L), Is.EqualTo(1));
Assert.That(v.CompareTo(41), Is.EqualTo(1));
Assert.That(v.CompareTo((short)41), Is.EqualTo(1));
Assert.That(v.CompareTo((sbyte)41), Is.EqualTo(1));
Assert.That(v.CompareTo(43L), Is.EqualTo(-1));
Assert.That(v.CompareTo(43), Is.EqualTo(-1));
Assert.That(v.CompareTo((short)43), Is.EqualTo(-1));
Assert.That(v.CompareTo((sbyte)43), Is.EqualTo(-1));
#endregion Signed
#region Unsigned
Assert.That(v.CompareTo(42UL), Is.EqualTo(0));
Assert.That(v.CompareTo(42U), Is.EqualTo(0));
Assert.That(v.CompareTo((ushort)42), Is.EqualTo(0));
Assert.That(v.CompareTo((byte)42), Is.EqualTo(0));
Assert.That(v.CompareTo(41UL), Is.EqualTo(1));
Assert.That(v.CompareTo(41U), Is.EqualTo(1));
Assert.That(v.CompareTo((ushort)41), Is.EqualTo(1));
Assert.That(v.CompareTo((byte)41), Is.EqualTo(1));
Assert.That(v.CompareTo(43UL), Is.EqualTo(-1));
Assert.That(v.CompareTo(43U), Is.EqualTo(-1));
Assert.That(v.CompareTo((ushort)43), Is.EqualTo(-1));
Assert.That(v.CompareTo((byte)43), Is.EqualTo(-1));
#endregion Unsigned
}
[Test]
public void Equals()
{
var v = new PyInt(42);
#region Signed
Assert.True(v.Equals(42L));
Assert.True(v.Equals(42));
Assert.True(v.Equals((short)42));
Assert.True(v.Equals((sbyte)42));
Assert.False(v.Equals(41L));
Assert.False(v.Equals(41));
Assert.False(v.Equals((short)41));
Assert.False(v.Equals((sbyte)41));
#endregion Signed
#region Unsigned
Assert.True(v.Equals(42UL));
Assert.True(v.Equals(42U));
Assert.True(v.Equals((ushort)42));
Assert.True(v.Equals((byte)42));
Assert.False(v.Equals(41UL));
Assert.False(v.Equals(41U));
Assert.False(v.Equals((ushort)41));
Assert.False(v.Equals((byte)41));
#endregion Unsigned
}
[Test]
public void ToBigIntegerLarge()
{
BigInteger val = BigInteger.Pow(2, 1024) + 3;
var pyInt = new PyInt(val);
Assert.That(pyInt.ToBigInteger(), Is.EqualTo(val));
val = -val;
pyInt = new PyInt(val);
Assert.That(pyInt.ToBigInteger(), Is.EqualTo(val));
}
}
}