# -*- coding: utf-8 -*-
"""Test support for managed arrays."""
import clr
import Python.Test as Test
import System
import pytest
from collections import UserList
from System import Single as float32
def test_public_array():
"""Test public arrays."""
ob = Test.PublicArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
items[0] = 8
assert items[0] == 8
items[4] = 9
assert items[4] == 9
items[-4] = 0
assert items[-4] == 0
items[-1] = 4
assert items[-1] == 4
def test_protected_array():
"""Test protected arrays."""
ob = Test.ProtectedArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
items[0] = 8
assert items[0] == 8
items[4] = 9
assert items[4] == 9
items[-4] = 0
assert items[-4] == 0
items[-1] = 4
assert items[-1] == 4
def test_internal_array():
"""Test internal arrays."""
with pytest.raises(AttributeError):
ob = Test.InternalArrayTest()
_ = ob.items
def test_private_array():
"""Test private arrays."""
with pytest.raises(AttributeError):
ob = Test.PrivateArrayTest()
_ = ob.items
def test_array_bounds_checking():
"""Test array bounds checking."""
ob = Test.Int32ArrayTest()
items = ob.items
assert items[0] == 0
assert items[1] == 1
assert items[2] == 2
assert items[3] == 3
assert items[4] == 4
assert items[-5] == 0
assert items[-4] == 1
assert items[-3] == 2
assert items[-2] == 3
assert items[-1] == 4
with pytest.raises(IndexError):
ob = Test.Int32ArrayTest()
_ = ob.items[5]
with pytest.raises(IndexError):
ob = Test.Int32ArrayTest()
ob.items[5] = 0
with pytest.raises(IndexError):
ob = Test.Int32ArrayTest()
items[-6]
with pytest.raises(IndexError):
ob = Test.Int32ArrayTest()
items[-6] = 0
def test_array_contains():
"""Test array support for __contains__."""
ob = Test.Int32ArrayTest()
items = ob.items
assert 0 in items
assert 1 in items
assert 2 in items
assert 3 in items
assert 4 in items
assert not (5 in items) # "H:\Python27\Lib\unittest\case.py", line 592, in deprecated_func,
assert not (-1 in items) # TypeError: int() argument must be a string or a number, not 'NoneType'
assert not (None in items) # which threw ^ here which is a little odd.
# But when run from runtests.py. Not when this module ran by itself.
def test_boolean_array():
"""Test boolean arrays."""
ob = Test.BooleanArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] is True
assert items[1] is False
assert items[2] is True
assert items[3] is False
assert items[4] is True
items[0] = False
assert items[0] is False
items[0] = True
assert items[0] is True
with pytest.raises(TypeError):
ob = Test.ByteArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.ByteArrayTest()
ob[0] = "wrong"
def test_byte_array():
"""Test byte arrays."""
ob = Test.ByteArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 255
min_ = 0
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.ByteArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.ByteArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.ByteArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.ByteArrayTest()
ob[0] = "wrong"
def test_sbyte_array():
"""Test sbyte arrays."""
ob = Test.SByteArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 127
min_ = -128
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.SByteArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.SByteArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.SByteArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.SByteArrayTest()
ob[0] = "wrong"
def test_char_array():
"""Test char arrays."""
ob = Test.CharArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 'a'
assert items[4] == 'e'
max_ = chr(65535)
min_ = chr(0)
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(TypeError):
ob = Test.CharArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.CharArrayTest()
ob[0] = "wrong"
def test_int16_array():
"""Test Int16 arrays."""
ob = Test.Int16ArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 32767
min_ = -32768
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.Int16ArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.Int16ArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.Int16ArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.Int16ArrayTest()
ob[0] = "wrong"
def test_int32_array():
"""Test Int32 arrays."""
ob = Test.Int32ArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 2147483647
min_ = -2147483648
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.Int32ArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.Int32ArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.Int32ArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.Int32ArrayTest()
ob[0] = "wrong"
def test_int64_array():
"""Test Int64 arrays."""
ob = Test.Int64ArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 9223372036854775807
min_ = -9223372036854775808
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.Int64ArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.Int64ArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.Int64ArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.Int64ArrayTest()
ob[0] = "wrong"
def test_uint16_array():
"""Test UInt16 arrays."""
ob = Test.UInt16ArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 65535
min_ = 0
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.UInt16ArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.UInt16ArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.UInt16ArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.UInt16ArrayTest()
ob[0] = "wrong"
def test_uint32_array():
"""Test UInt32 arrays."""
ob = Test.UInt32ArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 4294967295
min_ = 0
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.UInt32ArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.UInt32ArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.UInt32ArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.UInt32ArrayTest()
ob[0] = "wrong"
def test_uint64_array():
"""Test UInt64 arrays."""
ob = Test.UInt64ArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0
assert items[4] == 4
max_ = 18446744073709551615
min_ = 0
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(OverflowError):
ob = Test.UInt64ArrayTest()
ob.items[0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.UInt64ArrayTest()
ob.items[0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.UInt64ArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.UInt64ArrayTest()
ob[0] = "wrong"
def test_single_array():
"""Test Single arrays."""
ob = Test.SingleArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0.0
assert items[4] == 4.0
max_ = float32(3.402823e38)
min_ = float32(-3.402823e38)
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(TypeError):
ob = Test.SingleArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.SingleArrayTest()
ob[0] = "wrong"
def test_double_array():
"""Test Double arrays."""
ob = Test.DoubleArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == 0.0
assert items[4] == 4.0
max_ = 1.7976931348623157e308
min_ = -1.7976931348623157e308
items[0] = max_
assert items[0] == max_
items[0] = min_
assert items[0] == min_
items[-4] = max_
assert items[-4] == max_
items[-1] = min_
assert items[-1] == min_
with pytest.raises(TypeError):
ob = Test.DoubleArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.DoubleArrayTest()
ob[0] = "wrong"
def test_decimal_array():
"""Test Decimal arrays."""
ob = Test.DecimalArrayTest()
items = ob.items
from System import Decimal
max_d = Decimal.Parse("79228162514264337593543950335")
min_d = Decimal.Parse("-79228162514264337593543950335")
assert len(items) == 5
assert items[0] == Decimal(0)
assert items[4] == Decimal(4)
items[0] = max_d
assert items[0] == max_d
items[0] = min_d
assert items[0] == min_d
items[-4] = max_d
assert items[-4] == max_d
items[-1] = min_d
assert items[-1] == min_d
with pytest.raises(TypeError):
ob = Test.DecimalArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.DecimalArrayTest()
ob[0] = "wrong"
def test_string_array():
"""Test String arrays."""
ob = Test.StringArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == '0'
assert items[4] == '4'
items[0] = "spam"
assert items[0] == "spam"
items[0] = "eggs"
assert items[0] == "eggs"
items[-4] = "spam"
assert items[-4] == "spam"
items[-1] = "eggs"
assert items[-1] == "eggs"
with pytest.raises(TypeError):
ob = Test.StringArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.Int64ArrayTest()
ob[0] = 0
def test_enum_array():
"""Test enum arrays."""
from Python.Test import ShortEnum
ob = Test.EnumArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] == ShortEnum.Zero
assert items[4] == ShortEnum.Four
items[0] = ShortEnum.Four
assert items[0] == ShortEnum.Four
items[0] = ShortEnum.Zero
assert items[0] == ShortEnum.Zero
items[-4] = ShortEnum.Four
assert items[-4] == ShortEnum.Four
items[-1] = ShortEnum.Zero
assert items[-1] == ShortEnum.Zero
with pytest.raises(TypeError):
ob = Test.EnumArrayTest()
ob.items[0] = 99
with pytest.raises(TypeError):
ob = Test.EnumArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.EnumArrayTest()
ob[0] = "wrong"
def test_object_array():
"""Test ob arrays."""
from Python.Test import Spam
ob = Test.ObjectArrayTest()
items = ob.items
assert len(items) == 5
assert items[0].GetValue() == "0"
assert items[4].GetValue() == "4"
items[0] = Spam("4")
assert items[0].GetValue() == "4"
items[0] = Spam("0")
assert items[0].GetValue() == "0"
items[-4] = Spam("4")
assert items[-4].GetValue() == "4"
items[-1] = Spam("0")
assert items[-1].GetValue() == "0"
items[0] = 99
assert items[0] == 99
items[0] = None
assert items[0] is None
with pytest.raises(TypeError):
ob = Test.ObjectArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.ObjectArrayTest()
ob.items["wrong"] = "wrong"
def test_null_array():
"""Test null arrays."""
ob = Test.NullArrayTest()
items = ob.items
assert len(items) == 5
assert items[0] is None
assert items[4] is None
items[0] = "spam"
assert items[0] == "spam"
items[0] = None
assert items[0] is None
items[-4] = "spam"
assert items[-4] == "spam"
items[-1] = None
assert items[-1] is None
empty = ob.empty
assert len(empty) == 0
with pytest.raises(TypeError):
ob = Test.NullArrayTest()
_ = ob.items["wrong"]
def test_interface_array():
"""Test interface arrays."""
from Python.Test import Spam
ob = Test.InterfaceArrayTest()
items = ob.items
assert len(items) == 5
assert items[0].GetValue() == "0"
assert items[4].GetValue() == "4"
items[0] = Spam("4")
assert items[0].GetValue() == "4"
items[0] = Spam("0")
assert items[0].GetValue() == "0"
items[-4] = Spam("4")
assert items[-4].GetValue() == "4"
items[-1] = Spam("0")
assert items[-1].GetValue() == "0"
items[0] = None
assert items[0] is None
with pytest.raises(TypeError):
ob = Test.InterfaceArrayTest()
ob.items[0] = 99
with pytest.raises(TypeError):
ob = Test.InterfaceArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.InterfaceArrayTest()
ob.items["wrong"] = "wrong"
def test_typed_array():
"""Test typed arrays."""
from Python.Test import Spam
ob = Test.TypedArrayTest()
items = ob.items
assert len(items) == 5
assert items[0].GetValue() == "0"
assert items[4].GetValue() == "4"
items[0] = Spam("4")
assert items[0].GetValue() == "4"
items[0] = Spam("0")
assert items[0].GetValue() == "0"
items[-4] = Spam("4")
assert items[-4].GetValue() == "4"
items[-1] = Spam("0")
assert items[-1].GetValue() == "0"
items[0] = None
assert items[0] is None
with pytest.raises(TypeError):
ob = Test.TypedArrayTest()
ob.items[0] = 99
with pytest.raises(TypeError):
ob = Test.TypedArrayTest()
_ = ob.items["wrong"]
with pytest.raises(TypeError):
ob = Test.TypedArrayTest()
ob.items["wrong"] = Spam("0")
with pytest.raises(TypeError):
ob = Test.TypedArrayTest()
_ = ob.items[0.5]
with pytest.raises(TypeError):
ob = Test.TypedArrayTest()
ob.items[0.5] = Spam("0")
def test_multi_dimensional_array():
"""Test multi-dimensional arrays."""
ob = Test.MultiDimensionalArrayTest()
items = ob.items
assert len(items) == 25
assert items[0, 0] == 0
assert items[0, 1] == 1
assert items[0, 2] == 2
assert items[0, 3] == 3
assert items[0, 4] == 4
assert items[1, 0] == 5
assert items[1, 1] == 6
assert items[1, 2] == 7
assert items[1, 3] == 8
assert items[1, 4] == 9
assert items[2, 0] == 10
assert items[2, 1] == 11
assert items[2, 2] == 12
assert items[2, 3] == 13
assert items[2, 4] == 14
assert items[3, 0] == 15
assert items[3, 1] == 16
assert items[3, 2] == 17
assert items[3, 3] == 18
assert items[3, 4] == 19
assert items[4, 0] == 20
assert items[4, 1] == 21
assert items[4, 2] == 22
assert items[4, 3] == 23
assert items[4, 4] == 24
max_ = 2147483647
min_ = -2147483648
items[0, 0] = max_
assert items[0, 0] == max_
items[0, 0] = min_
assert items[0, 0] == min_
items[-4, 0] = max_
assert items[-4, 0] == max_
items[-1, -1] = min_
assert items[-1, -1] == min_
with pytest.raises(OverflowError):
ob = Test.MultiDimensionalArrayTest()
ob.items[0, 0] = max_ + 1
with pytest.raises(OverflowError):
ob = Test.MultiDimensionalArrayTest()
ob.items[0, 0] = min_ - 1
with pytest.raises(TypeError):
ob = Test.MultiDimensionalArrayTest()
_ = ob.items["wrong", 0]
with pytest.raises(TypeError):
ob = Test.MultiDimensionalArrayTest()
ob.items[0, 0] = "wrong"
with pytest.raises(TypeError):
ob = Test.MultiDimensionalArrayTest()
ob["0", 0] = 0
with pytest.raises(TypeError):
ob = Test.MultiDimensionalArrayTest()
ob.items["0", 0] = 0
with pytest.raises(TypeError):
ob = Test.MultiDimensionalArrayTest()
_ = ob.items[0.5, 0]
with pytest.raises(TypeError):
ob = Test.MultiDimensionalArrayTest()
ob.items[0.5, 0] = 0
def test_array_iteration():
"""Test array iteration."""
items = Test.Int32ArrayTest().items
for i in items:
assert (i > -1) and (i < 5)
items = Test.NullArrayTest().items
for i in items:
assert i is None
empty = Test.NullArrayTest().empty
for i in empty:
raise TypeError('iteration over empty array')
def test_tuple_array_conversion():
"""Test conversion of tuples to array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
items = []
for i in range(10):
items.append(Spam(str(i)))
items = tuple(items)
result = ArrayConversionTest.EchoRange(items)
assert result[0].__class__ == Spam
assert len(result) == 10
def test_tuple_nested_array_conversion():
"""Test conversion of tuples to array-of-array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
items = []
for i in range(10):
subs = []
for _ in range(10):
subs.append(Spam(str(i)))
items.append(tuple(subs))
items = tuple(items)
result = ArrayConversionTest.EchoRangeAA(items)
assert len(result) == 10
assert len(result[0]) == 10
assert result[0][0].__class__ == Spam
def test_list_array_conversion():
"""Test conversion of lists to array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
items = []
for i in range(10):
items.append(Spam(str(i)))
result = ArrayConversionTest.EchoRange(items)
assert result[0].__class__ == Spam
assert len(result) == 10
def test_list_nested_array_conversion():
"""Test conversion of lists to array-of-array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
items = []
for i in range(10):
subs = []
for _ in range(10):
subs.append(Spam(str(i)))
items.append(subs)
result = ArrayConversionTest.EchoRangeAA(items)
assert len(result) == 10
assert len(result[0]) == 10
assert result[0][0].__class__ == Spam
def test_sequence_array_conversion():
"""Test conversion of sequence-like obs to array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
items = UserList()
for i in range(10):
items.append(Spam(str(i)))
result = ArrayConversionTest.EchoRange(items)
assert result[0].__class__ == Spam
assert len(result) == 10
def test_sequence_nested_array_conversion():
"""Test conversion of sequences to array-of-array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
items = UserList()
for i in range(10):
subs = UserList()
for _ in range(10):
subs.append(Spam(str(i)))
items.append(subs)
result = ArrayConversionTest.EchoRangeAA(items)
assert len(result) == 10
assert len(result[0]) == 10
assert result[0][0].__class__ == Spam
def test_tuple_array_conversion_type_checking():
"""Test error handling for tuple conversion to array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
# This should work, because null / None is a valid value in an
# array of reference types.
items = []
for i in range(10):
items.append(Spam(str(i)))
items[1] = None
items = tuple(items)
result = ArrayConversionTest.EchoRange(items)
assert result[0].__class__ == Spam
assert result[1] is None
assert len(result) == 10
with pytest.raises(TypeError):
temp = list(items)
temp[1] = 1
_ = ArrayConversionTest.EchoRange(tuple(temp))
with pytest.raises(TypeError):
temp = list(items)
temp[1] = "spam"
_ = ArrayConversionTest.EchoRange(tuple(temp))
def test_list_array_conversion_type_checking():
"""Test error handling for list conversion to array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
# This should work, because null / None is a valid value in an
# array of reference types.
items = []
for i in range(10):
items.append(Spam(str(i)))
items[1] = None
result = ArrayConversionTest.EchoRange(items)
assert result[0].__class__ == Spam
assert result[1] is None
assert len(result) == 10
with pytest.raises(TypeError):
items[1] = 1
_ = ArrayConversionTest.EchoRange(items)
with pytest.raises(TypeError):
items[1] = "spam"
_ = ArrayConversionTest.EchoRange(items)
def test_sequence_array_conversion_type_checking():
"""Test error handling for sequence conversion to array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
# This should work, because null / None is a valid value in an
# array of reference types.
items = UserList()
for i in range(10):
items.append(Spam(str(i)))
items[1] = None
result = ArrayConversionTest.EchoRange(items)
assert result[0].__class__ == Spam
assert result[1] is None
assert len(result) == 10
with pytest.raises(TypeError):
items[1] = 1
_ = ArrayConversionTest.EchoRange(items)
with pytest.raises(TypeError):
items[1] = "spam"
_ = ArrayConversionTest.EchoRange(items)
def test_md_array_conversion():
"""Test passing of multi-dimensional array arguments."""
from Python.Test import ArrayConversionTest
from Python.Test import Spam
from System import Array
# Currently, the runtime does not support automagic conversion of
# Python sequences to true multi-dimensional arrays (though it
# does support arrays-of-arrays). This test exists mostly as an
# example of how a multi-dimensional array can be created and used
# with managed code from Python.
items = Array.CreateInstance(Spam, 5, 5)
for i in range(5):
for n in range(5):
items.SetValue(Spam(str((i, n))), (i, n))
result = ArrayConversionTest.EchoRangeMD(items)
assert len(result) == 25
assert result[0, 0].__class__ == Spam
assert result[0, 0].__class__ == Spam
def test_boxed_value_type_mutation_result():
"""Test behavior of boxed value types."""
# This test actually exists mostly as documentation of an important
# concern when dealing with value types. Python does not have any
# value type semantics that can be mapped to the CLR, so it is easy
# to accidentally write code like the following which is not really
# mutating value types in-place but changing boxed copies.
from System import Array
from Python.Test import Point
items = Array.CreateInstance(Point, 5)
for i in range(5):
items[i] = Point(i, i)
for i in range(5):
# Boxed items, so set_attr will not change the array member.
assert items[i].X == i
assert items[i].Y == i
items[i].X = i + 1
items[i].Y = i + 1
assert items[i].X == i
assert items[i].Y == i
for i in range(5):
# Demonstrates the workaround that will change the members.
assert items[i].X == i
assert items[i].Y == i
item = items[i]
item.X = i + 1
item.Y = i + 1
items[i] = item
assert items[i].X == i + 1
assert items[i].Y == i + 1
def test_create_array_from_shape():
from System import Array
value = Array[int](3)
assert value[1] == 0
assert value.Length == 3
value = Array[int](3, 4)
assert value[1, 1] == 0
assert value.GetLength(0) == 3
assert value.GetLength(1) == 4
with pytest.raises(ValueError):
Array[int](-1)
with pytest.raises(TypeError):
Array[int]('1')
with pytest.raises(ValueError):
Array[int](-1, -1)
with pytest.raises(TypeError):
Array[int]('1', '1')
def test_special_array_creation():
"""Test using the Array[] syntax for creating arrays."""
from Python.Test import ISayHello1, InterfaceTest, ShortEnum
from System import Array
inst = InterfaceTest()
value = Array[System.Boolean]([True, True])
assert value[0] is True
assert value[1] is True
assert value.Length == 2
value = Array[bool]([True, True])
assert value[0] is True
assert value[1] is True
assert value.Length == 2
value = Array[System.Byte]([0, 255])
assert value[0] == 0
assert value[1] == 255
assert value.Length == 2
value = Array[System.SByte]([0, 127])
assert value[0] == 0
assert value[1] == 127
assert value.Length == 2
value = Array[System.Char]([u'A', u'Z'])
assert value[0] == u'A'
assert value[1] == u'Z'
assert value.Length == 2
value = Array[System.Char]([0, 65535])
assert value[0] == chr(0)
assert value[1] == chr(65535)
assert value.Length == 2
value = Array[System.Int16]([0, 32767])
assert value[0] == 0
assert value[1] == 32767
assert value.Length == 2
value = Array[System.Int32]([0, 2147483647])
assert value[0] == 0
assert value[1] == 2147483647
assert value.Length == 2
value = Array[int]([0, 2147483647])
assert value[0] == 0
assert value[1] == 2147483647
assert value.Length == 2
value = Array[System.Int64]([0, 9223372036854775807])
assert value[0] == 0
assert value[1] == 9223372036854775807
assert value.Length == 2
value = Array[System.UInt16]([0, 65000])
assert value[0] == 0
assert value[1] == 65000
assert value.Length == 2
value = Array[System.UInt32]([0, 4294967295])
assert value[0] == 0
assert value[1] == 4294967295
assert value.Length == 2
value = Array[System.UInt64]([0, 18446744073709551615])
assert value[0] == 0
assert value[1] == 18446744073709551615
assert value.Length == 2
value = Array[System.Single]([0.0, 3.402823e38])
assert value[0] == 0.0
assert value[1] == System.Single(3.402823e38)
assert value.Length == 2
value = Array[System.Double]([0.0, 1.7976931348623157e308])
assert value[0] == 0.0
assert value[1] == 1.7976931348623157e308
assert value.Length == 2
value = Array[float]([0.0, 1.7976931348623157e308])
assert value[0] == 0.0
assert value[1] == 1.7976931348623157e308
assert value.Length == 2
value = Array[System.Decimal]([System.Decimal.Zero, System.Decimal.One])
assert value[0] == System.Decimal.Zero
assert value[1] == System.Decimal.One
assert value.Length == 2
value = Array[System.String](["one", "two"])
assert value[0] == "one"
assert value[1] == "two"
assert value.Length == 2
value = Array[str](["one", "two"])
assert value[0] == "one"
assert value[1] == "two"
assert value.Length == 2
value = Array[ShortEnum]([ShortEnum.Zero, ShortEnum.One])
assert value[0] == ShortEnum.Zero
assert value[1] == ShortEnum.One
assert value.Length == 2
value = Array[System.Object]([inst, inst])
assert value[0].__class__ == inst.__class__
assert value[1].__class__ == inst.__class__
assert value.Length == 2
value = Array[InterfaceTest]([inst, inst])
assert value[0].__class__ == inst.__class__
assert value[1].__class__ == inst.__class__
assert value.Length == 2
iface_class = ISayHello1(inst).__class__
value = Array[ISayHello1]([inst, inst])
assert value[0].__class__ == iface_class
assert value[1].__class__ == iface_class
assert value.Length == 2
inst = System.Exception("badness")
value = Array[System.Exception]([inst, inst])
assert value[0].__class__ == inst.__class__
assert value[1].__class__ == inst.__class__
assert value.Length == 2
def test_array_abuse():
"""Test array abuse."""
_class = Test.PublicArrayTest
ob = Test.PublicArrayTest()
with pytest.raises(AttributeError):
del _class.__getitem__
with pytest.raises(AttributeError):
del ob.__getitem__
with pytest.raises(AttributeError):
del _class.__setitem__
with pytest.raises(AttributeError):
del ob.__setitem__
with pytest.raises(TypeError):
Test.PublicArrayTest.__getitem__(0, 0)
with pytest.raises(AttributeError):
Test.PublicArrayTest.__setitem__(0, 0, 0)
with pytest.raises(KeyError):
Test.PublicArrayTest.__dict__['__getitem__']
with pytest.raises(KeyError):
Test.PublicArrayTest.__dict__['__setitem__']
def test_iterator_to_array():
from System import Array, String
d = {"a": 1, "b": 2, "c": 3}
keys_iterator = iter(d.keys())
arr = Array[String](keys_iterator)
Array.Sort(arr)
assert arr[0] == "a"
assert arr[1] == "b"
assert arr[2] == "c"
def test_dict_keys_to_array():
from System import Array, String
d = {"a": 1, "b": 2, "c": 3}
d_keys = d.keys()
arr = Array[String](d_keys)
Array.Sort(arr)
assert arr[0] == "a"
assert arr[1] == "b"
assert arr[2] == "c"