def test_040_registered_attribute_simple_class(self, clean_Date): Date.register_new_calendar("test_1", ExampleTestCalendar) # Date attribute type and metaclass are correct assert Date.test_1.__name__ == "ExampleTestCalendarInDate" assert type(Date.test_1).__name__ == "ModifiedClass" assert issubclass(Date.test_1, ExampleTestCalendar) # constructed date type and value are is correct d1a = Date.test_1(100, 4) assert type(d1a) == Date assert d1a.day_count == 697 # new attribute on date instance, type and value are correct d1b = Date(1000) assert isinstance(d1b.test_1, ExampleTestCalendar) assert type(d1b.test_1).__name__ == "ExampleTestCalendarInDate" assert type(d1b.test_1.__class__).__name__ == "ModifiedClass" assert d1b.test_1.week == 143 assert d1b.test_1.day == 6 # new attribute on date instance build by another calendar, type and value are correct d1c = Date.gregorian(100, 2, 3) assert isinstance(d1c.test_1, ExampleTestCalendar) assert type(d1c.test_1).__name__ == "ExampleTestCalendarInDate" assert type(d1c.test_1.__class__).__name__ == "ModifiedClass" assert d1c.test_1.week == 5171 assert d1c.test_1.day == 3
def test_040_registered_attribute_simple_class(self, clean_Date): Date.register_new_calendar('test_1', ExampleTestCalendar) # Date attribute type and metaclass are correct assert Date.test_1.__name__ == 'ExampleTestCalendarInDate' assert type(Date.test_1).__name__ == 'ModifiedClass' assert issubclass(Date.test_1, ExampleTestCalendar) # constructed date type and value are is correct d1a = Date.test_1(100, 4) assert type(d1a) == Date assert d1a.day_count == 697 # new attribute on date instance, type and value are correct d1b = Date(1000) assert isinstance(d1b.test_1, ExampleTestCalendar) assert type(d1b.test_1).__name__ == 'ExampleTestCalendarInDate' assert type(d1b.test_1.__class__).__name__ == 'ModifiedClass' assert d1b.test_1.week == 143 assert d1b.test_1.day == 6 # new attribute on date instance build by another calendar, type and value are correct d1c = Date.gregorian(100, 2, 3) assert isinstance(d1c.test_1, ExampleTestCalendar) assert type(d1c.test_1).__name__ == 'ExampleTestCalendarInDate' assert type(d1c.test_1.__class__).__name__ == 'ModifiedClass' assert d1c.test_1.week == 5171 assert d1c.test_1.day == 3
def test_900_avoid_date_override(self): d = Date.gregorian(1, 1, 1) # I do not want an instance of Date created through a Gregorian to have its static methods # One of the implementation I used had this error and I want to avoid it with pytest.raises(AttributeError): getattr(d, "is_leap_year") with pytest.raises(AttributeError): d.is_leap_year
def test_900_avoid_date_override(self): d = Date.gregorian(1, 1, 1) # I do not want an instance of Date created through a Gregorian to have its static methods # One of the implementation I used had this error and I want to avoid it with pytest.raises(AttributeError): getattr(d, 'is_leap_year') with pytest.raises(AttributeError): d.is_leap_year
def test_046_registered_attribute_class_with_static_methods( self, clean_Date): class ExampleTestCalendar3(ExampleTestCalendar): @staticmethod def is_odd(number): return (number % 2) == 1 Date.register_new_calendar("test_3", ExampleTestCalendar3) # Date attribute type and metaclass are correct assert Date.test_3.__name__ == "ExampleTestCalendar3InDate" assert type(Date.test_3).__name__ == "ModifiedClass" assert issubclass(Date.test_3, ExampleTestCalendar) # constructed date type and value are is correct d3a = Date.test_3(100, 4) assert type(d3a) == Date assert d3a.day_count == 697 # new attribute on date instance, type and value are correct d3b = Date(1000) assert isinstance(d3b.test_3, ExampleTestCalendar3) assert type(d3b.test_3).__name__ == "ExampleTestCalendar3InDate" assert type(d3b.test_3.__class__).__name__ == "ModifiedClass" assert d3b.test_3.week == 143 assert d3b.test_3.day == 6 # new attribute on date instance build by another calendar, type and value are correct d3c = Date.gregorian(100, 2, 3) assert isinstance(d3c.test_3, ExampleTestCalendar3) assert type(d3c.test_3).__name__ == "ExampleTestCalendar3InDate" assert type(d3c.test_3.__class__).__name__ == "ModifiedClass" assert d3c.test_3.week == 5171 assert d3c.test_3.day == 3 # static method can be reached on the class and on all types of instance assert Date.test_3.is_odd(3) assert not Date.test_3.is_odd(4) assert d3a.test_3.is_odd(3) assert not d3a.test_3.is_odd(4) assert d3b.test_3.is_odd(3) assert not d3b.test_3.is_odd(4) assert d3c.test_3.is_odd(3) assert not d3c.test_3.is_odd(4)
def test_046_registered_attribute_class_with_static_methods(self, clean_Date): class ExampleTestCalendar3(ExampleTestCalendar): @staticmethod def is_odd(number): return (number % 2) == 1 Date.register_new_calendar('test_3', ExampleTestCalendar3) # Date attribute type and metaclass are correct assert Date.test_3.__name__ == 'ExampleTestCalendar3InDate' assert type(Date.test_3).__name__ == 'ModifiedClass' assert issubclass(Date.test_3, ExampleTestCalendar) # constructed date type and value are is correct d3a = Date.test_3(100, 4) assert type(d3a) == Date assert d3a.day_count == 697 # new attribute on date instance, type and value are correct d3b = Date(1000) assert isinstance(d3b.test_3, ExampleTestCalendar3) assert type(d3b.test_3).__name__ == 'ExampleTestCalendar3InDate' assert type(d3b.test_3.__class__).__name__ == 'ModifiedClass' assert d3b.test_3.week == 143 assert d3b.test_3.day == 6 # new attribute on date instance build by another calendar, type and value are correct d3c = Date.gregorian(100, 2, 3) assert isinstance(d3c.test_3, ExampleTestCalendar3) assert type(d3c.test_3).__name__ == 'ExampleTestCalendar3InDate' assert type(d3c.test_3.__class__).__name__ == 'ModifiedClass' assert d3c.test_3.week == 5171 assert d3c.test_3.day == 3 # static method can be reached on the class and on all types of instance assert Date.test_3.is_odd(3) assert not Date.test_3.is_odd(4) assert d3a.test_3.is_odd(3) assert not d3a.test_3.is_odd(4) assert d3b.test_3.is_odd(3) assert not d3b.test_3.is_odd(4) assert d3c.test_3.is_odd(3) assert not d3c.test_3.is_odd(4)
def test_100_date_has_attributes_but_instance_not(self): # the date class aways has a registered attribute assert hasattr(Date, "gregorian") assert Date.gregorian # an instance created with another calendar or by Date does not have # the attribute; it is instead is reachable via the Date class d1 = Date(4) with pytest.raises(KeyError): d1.__dict__["gregorian"] assert hasattr(d1, "gregorian") d1.gregorian d2 = Date.iso(3, 4, 5) with pytest.raises(KeyError): d2.__dict__["gregorian"] assert hasattr(d2, "gregorian") d2.gregorian # a Date instance created via the calendar does have the same attribute d3 = Date.gregorian(3, 4, 5) assert hasattr(d3, "gregorian") d3.gregorian
def test_100_date_has_attributes_but_instance_not(self): # the date class aways has a registered attribute assert hasattr(Date, 'gregorian') assert Date.gregorian # an instance created with another calendar or by Date does not have # the attribute; it is instead is reachable via the Date class d1 = Date(4) with pytest.raises(KeyError): d1.__dict__['gregorian'] assert hasattr(d1, 'gregorian') d1.gregorian d2 = Date.iso(3, 4, 5) with pytest.raises(KeyError): d2.__dict__['gregorian'] assert hasattr(d2, 'gregorian') d2.gregorian # a Date instance created via the calendar does have the same attribute d3 = Date.gregorian(3, 4, 5) assert hasattr(d3, 'gregorian') d3.gregorian
def test_043_registered_attribute_class_with_other_constructors( self, clean_Date): class ExampleTestCalendar2(ExampleTestCalendar): @classmethod def with_thousands(cls, thousands, week, day): return cls(1000 * thousands + week, day) Date.register_new_calendar("test_2", ExampleTestCalendar2) # Date attribute type and metaclass are correct assert Date.test_2.__name__ == "ExampleTestCalendar2InDate" assert type(Date.test_2).__name__ == "ModifiedClass" assert issubclass(Date.test_2, ExampleTestCalendar) # constructed date type and value are is correct d2a = Date.test_2(100, 4) assert type(d2a) == Date assert d2a.day_count == 697 d2d = Date.test_2.with_thousands(2, 3, 4) assert type(d2d) == Date assert d2d.day_count == 14018 # new attribute on date instance, type and value are correct d2b = Date(1000) assert isinstance(d2b.test_2, ExampleTestCalendar2) assert type(d2b.test_2).__name__ == "ExampleTestCalendar2InDate" assert type(d2b.test_2.__class__).__name__ == "ModifiedClass" assert d2b.test_2.week == 143 assert d2b.test_2.day == 6 # new attribute on date instance build by another calendar, type and value are correct d2c = Date.gregorian(100, 2, 3) assert isinstance(d2c.test_2, ExampleTestCalendar2) assert type(d2c.test_2).__name__ == "ExampleTestCalendar2InDate" assert type(d2c.test_2.__class__).__name__ == "ModifiedClass" assert d2c.test_2.week == 5171 assert d2c.test_2.day == 3
def test_043_registered_attribute_class_with_other_constructors(self, clean_Date): class ExampleTestCalendar2(ExampleTestCalendar): @classmethod def with_thousands(cls, thousands, week, day): return cls(1000 * thousands + week, day) Date.register_new_calendar('test_2', ExampleTestCalendar2) # Date attribute type and metaclass are correct assert Date.test_2.__name__ == 'ExampleTestCalendar2InDate' assert type(Date.test_2).__name__ == 'ModifiedClass' assert issubclass(Date.test_2, ExampleTestCalendar) # constructed date type and value are is correct d2a = Date.test_2(100, 4) assert type(d2a) == Date assert d2a.day_count == 697 d2d = Date.test_2.with_thousands(2, 3, 4) assert type(d2d) == Date assert d2d.day_count == 14018 # new attribute on date instance, type and value are correct d2b = Date(1000) assert isinstance(d2b.test_2, ExampleTestCalendar2) assert type(d2b.test_2).__name__ == 'ExampleTestCalendar2InDate' assert type(d2b.test_2.__class__).__name__ == 'ModifiedClass' assert d2b.test_2.week == 143 assert d2b.test_2.day == 6 # new attribute on date instance build by another calendar, type and value are correct d2c = Date.gregorian(100, 2, 3) assert isinstance(d2c.test_2, ExampleTestCalendar2) assert type(d2c.test_2).__name__ == 'ExampleTestCalendar2InDate' assert type(d2c.test_2.__class__).__name__ == 'ModifiedClass' assert d2c.test_2.week == 5171 assert d2c.test_2.day == 3