1#! /usr/bin/python
2
3from PyObjCTools.TestSupport import *
4import objc
5
6import Foundation
7import CoreData
8
9class CoreDataTestObject (CoreData.NSManagedObject):
10    def __getattr__(self, k):
11        raise AttributeError(k)
12
13    def __setattr__(self, k, v):
14        super(CoreDataTestObject, self).__setattr__(k, v)
15
16    pass
17
18class Test (TestCase):
19    def setUp(self):
20        self.entity = CoreData.NSEntityDescription.new()
21        self.entity.setName_('TestEntity')
22
23        self.attribute = CoreData.NSAttributeDescription.new()
24        self.attribute.setName_('testAttribute')
25        self.attribute.setAttributeType_(CoreData.NSStringAttributeType)
26
27        self.entity.setProperties_([self.attribute])
28
29        self.managedObjectModel = CoreData.NSManagedObjectModel.new()
30        self.managedObjectModel.setEntities_([self.entity])
31
32        self.persistentStoreCoordinator = CoreData.NSPersistentStoreCoordinator.alloc().initWithManagedObjectModel_(self.managedObjectModel)
33        self.persistentStoreCoordinator.addPersistentStoreWithType_configuration_URL_options_error_(CoreData.NSInMemoryStoreType, None, None, None, None)
34
35        self.managedObjectContext = CoreData.NSManagedObjectContext.new()
36        self.managedObjectContext.setPersistentStoreCoordinator_(self.persistentStoreCoordinator)
37
38    def testModeledAttribute(self):
39        managedObject = CoreData.NSManagedObject.alloc().initWithEntity_insertIntoManagedObjectContext_(self.entity, self.managedObjectContext)
40
41        testValue = u'FooBarBaz'
42
43        managedObject.setValue_forKey_(testValue, u'testAttribute')
44
45        self.assertEquals(testValue, managedObject.valueForKey_(u'testAttribute'))
46        self.assertEquals(testValue, managedObject._.testAttribute)
47
48        testValue = u'BobFred'
49        managedObject.setValue_forKey_(testValue, u'testAttribute')
50
51        self.assertEquals(testValue, managedObject.valueForKey_(u'testAttribute'))
52        self.assertEquals(testValue, managedObject._.testAttribute)
53
54        testValue = u'Zebras have long legs.'
55        managedObject.testAttribute = testValue
56
57        self.assertEquals(testValue, managedObject.valueForKey_(u'testAttribute'))
58        self.assertEquals(testValue, managedObject._.testAttribute)
59
60    def testPythonicAttribute(self):
61        managedObject = CoreData.NSManagedObject.alloc().initWithEntity_insertIntoManagedObjectContext_(self.entity, self.managedObjectContext)
62
63        testValue = u'Ducks have webbed feet'
64        self.assertRaises(AttributeError, setattr, managedObject, 'attributeWithoutModel', testValue)
65        return
66
67        # XXX: this test is invalid, you cannot add arbitrary attributes
68        # to an object that is fully implemented in ObjC.
69        managedObject.attributeWithoutModel = testValue
70
71        self.assertEquals(testValue, managedObject.attributeWithoutModel)
72
73        self.assertRaises(Foundation.NSUnknownKeyException, managedObject.valueForKey_(u'attributeWithoutModel'))
74
75class TestSubclass (TestCase):
76    def setUp(self):
77        self.entity = CoreData.NSEntityDescription.new()
78        self.entity.setName_('TestObject')
79        self.entity.setManagedObjectClassName_('CoreDataTestObject')
80
81        self.attribute = CoreData.NSAttributeDescription.new()
82        self.attribute.setName_('testAttribute')
83        self.attribute.setAttributeType_(CoreData.NSStringAttributeType)
84
85        self.entity.setProperties_([self.attribute])
86
87        self.managedObjectModel = CoreData.NSManagedObjectModel.new()
88        self.managedObjectModel.setEntities_([self.entity])
89
90        self.persistentStoreCoordinator = CoreData.NSPersistentStoreCoordinator.alloc().initWithManagedObjectModel_(self.managedObjectModel)
91        self.persistentStoreCoordinator.addPersistentStoreWithType_configuration_URL_options_error_(CoreData.NSInMemoryStoreType, None, None, None, None)
92
93        self.managedObjectContext = CoreData.NSManagedObjectContext.new()
94        self.managedObjectContext.setPersistentStoreCoordinator_(self.persistentStoreCoordinator)
95
96    def testModeledAttribute(self):
97        managedObject = CoreDataTestObject.alloc().initWithEntity_insertIntoManagedObjectContext_(self.entity, self.managedObjectContext)
98        self.assert_(isinstance(managedObject, CoreDataTestObject))
99
100        testValue = u'FooBarBaz'
101
102        managedObject.setValue_forKey_(testValue, u'testAttribute')
103
104        self.assertEquals(testValue, managedObject.valueForKey_(u'testAttribute'))
105        self.assertEquals(testValue, managedObject._.testAttribute)
106
107        testValue = u'BobFred'
108        managedObject.setValue_forKey_(testValue, u'testAttribute')
109
110        self.assertEquals(testValue, managedObject.valueForKey_(u'testAttribute'))
111        self.assertEquals(testValue, managedObject._.testAttribute)
112
113        self.assert_('testAttribute' not in managedObject.__dict__)
114
115        testValue = u'Zebras have long legs.'
116        managedObject._.testAttribute = testValue
117
118        self.assertEquals(testValue, managedObject.valueForKey_(u'testAttribute'))
119        self.assertEquals(testValue, managedObject._.testAttribute)
120
121    def testPythonicAttribute(self):
122        #self.fail("research recursion problem")
123        managedObject = CoreDataTestObject.alloc().initWithEntity_insertIntoManagedObjectContext_(self.entity, self.managedObjectContext)
124        self.assert_(isinstance(managedObject, CoreDataTestObject))
125
126        testValue = u'Ducks have webbed feet'
127        managedObject.attributeWithoutModel = testValue
128
129        self.assertEquals(testValue, managedObject.attributeWithoutModel)
130        self.assert_('attributeWithoutModel' in managedObject.__dict__)
131
132
133if __name__ == "__main__":
134    main()
135