# -*- coding: utf-8 -*-
# TODO: Add tests for ClassicClass, NewStyleClass?
"""Test CLR class support."""
import Python.Test as Test
import System
import pytest
from ._compat import DictProxyType, range
def test_basic_reference_type():
"""Test usage of CLR defined reference types."""
assert System.String.Empty == ""
def test_basic_value_type():
"""Test usage of CLR defined value types."""
assert System.Int32.MaxValue == 2147483647
def test_class_standard_attrs():
"""Test standard class attributes."""
from Python.Test import ClassTest
assert ClassTest.__name__ == 'ClassTest'
assert ClassTest.__module__ == 'Python.Test'
assert isinstance(ClassTest.__dict__, DictProxyType)
assert len(ClassTest.__doc__) > 0
def test_class_docstrings():
"""Test standard class docstring generation"""
from Python.Test import ClassTest
value = 'Void .ctor()'
assert ClassTest.__doc__ == value
def test_class_default_str():
"""Test the default __str__ implementation for managed objects."""
s = System.String("this is a test")
assert str(s) == "this is a test"
def test_class_default_repr():
"""Test the default __repr__ implementation for managed objects."""
s = System.String("this is a test")
assert repr(s).startswith(" -1) and (item < 10)
dict_ = ClassTest.GetHashtable()
for item in dict_:
cname = item.__class__.__name__
assert cname.endswith('DictionaryEntry')
def test_ienumerator_iteration():
"""Test iteration over objects supporting IEnumerator."""
from Python.Test import ClassTest
chars = ClassTest.GetEnumerator()
for item in chars:
assert item in 'test string'
def test_override_get_item():
"""Test managed subclass overriding __getitem__."""
from System.Collections import Hashtable
class MyTable(Hashtable):
def __getitem__(self, key):
value = Hashtable.__getitem__(self, key)
return 'my ' + str(value)
table = MyTable()
table['one'] = 'one'
table['two'] = 'two'
table['three'] = 'three'
assert table['one'] == 'my one'
assert table['two'] == 'my two'
assert table['three'] == 'my three'
assert table.Count == 3
def test_override_set_item():
"""Test managed subclass overriding __setitem__."""
from System.Collections import Hashtable
class MyTable(Hashtable):
def __setitem__(self, key, value):
value = 'my ' + str(value)
Hashtable.__setitem__(self, key, value)
table = MyTable()
table['one'] = 'one'
table['two'] = 'two'
table['three'] = 'three'
assert table['one'] == 'my one'
assert table['two'] == 'my two'
assert table['three'] == 'my three'
assert table.Count == 3
def test_add_and_remove_class_attribute():
from System import TimeSpan
for _ in range(100):
TimeSpan.new_method = lambda self_: self_.TotalMinutes
ts = TimeSpan.FromHours(1)
assert ts.new_method() == 60
del TimeSpan.new_method
assert not hasattr(ts, "new_method")
def test_comparisons():
from System import DateTimeOffset
from Python.Test import ClassTest
d1 = DateTimeOffset.Parse("2016-11-14")
d2 = DateTimeOffset.Parse("2016-11-15")
assert (d1 == d2) == False
assert (d1 != d2) == True
assert (d1 < d2) == True
assert (d1 <= d2) == True
assert (d1 >= d2) == False
assert (d1 > d2) == False
assert (d1 == d1) == True
assert (d1 != d1) == False
assert (d1 < d1) == False
assert (d1 <= d1) == True
assert (d1 >= d1) == True
assert (d1 > d1) == False
assert (d2 == d1) == False
assert (d2 != d1) == True
assert (d2 < d1) == False
assert (d2 <= d1) == False
assert (d2 >= d1) == True
assert (d2 > d1) == True
with pytest.raises(TypeError):
d1 < None
with pytest.raises(TypeError):
d1 < System.Guid()
# ClassTest does not implement IComparable
c1 = ClassTest()
c2 = ClassTest()
with pytest.raises(TypeError):
c1 < c2
def test_self_callback():
"""Test calling back and forth between this and a c# baseclass."""
class CallbackUser(Test.SelfCallbackTest):
def DoCallback(self):
self.PyCallbackWasCalled = False
self.SameReference = False
return self.Callback(self)
def PyCallback(self, self2):
self.PyCallbackWasCalled = True
self.SameReference = self == self2
testobj = CallbackUser()
testobj.DoCallback()
assert testobj.PyCallbackWasCalled
assert testobj.SameReference
def test_method_inheritance():
"""Ensure that we call the overridden method instead of the one provided in
the base class."""
base = Test.BaseClass()
derived = Test.DerivedClass()
assert base.IsBase() == True
assert derived.IsBase() == False