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