---
 Tests/base/Functions/propertyAttrs.m | 147 ++++++++++++++++++++++++++++-------
 1 file changed, 120 insertions(+), 27 deletions(-)

diff --git a/Tests/base/Functions/propertyAttrs.m b/Tests/base/Functions/propertyAttrs.m
index 80b4346..0588db7 100644
--- a/Tests/base/Functions/propertyAttrs.m
+++ b/Tests/base/Functions/propertyAttrs.m
@@ -39,11 +39,15 @@ union MoneyUnion { float alone; double down; };
 	int intReadonlyGetter;
 	int intReadwrite;
 	int intAssign;
+	id idDefault;
 	id idRetain;
 	id idCopy;
+	id idWeak;
+	id idStrong;
 	int intNonatomic;
 	id idReadonlyCopyNonatomic;
 	id idReadonlyRetainNonatomic;
+	id idReadonlyWeakNonatomic;
 }
 @property char charDefault;
 @property double doubleDefault;
@@ -65,11 +69,16 @@ union MoneyUnion { float alone; double down; };
 @property(getter=isIntReadOnlyGetter, readonly) int intReadonlyGetter;
 @property(readwrite) int intReadwrite;
 @property(assign) int intAssign;
+@property id idDefault;
 @property(retain) id idRetain;
 @property(copy) id idCopy;
+@property(weak) id idWeak;
+@property(strong) id idStrong;
 @property(nonatomic) int intNonatomic;
 @property(nonatomic, readonly, copy) id idReadonlyCopyNonatomic;
 @property(nonatomic, readonly, retain) id idReadonlyRetainNonatomic;
+@property(nonatomic, readonly, weak) id idReadonlyWeakNonatomic;
+@property(retain) id idDynamic;
 @end
 
 @implementation PropertyTest
@@ -93,15 +102,24 @@ union MoneyUnion { float alone; double down; };
 @synthesize intReadonlyGetter;
 @synthesize intReadwrite;
 @synthesize intAssign;
+@synthesize idDefault;
 @synthesize idRetain;
 @synthesize idCopy;
+@synthesize idWeak;
+@synthesize idStrong;
 @synthesize intNonatomic;
 @synthesize idReadonlyCopyNonatomic;
 @synthesize idReadonlyRetainNonatomic;
+@synthesize idReadonlyWeakNonatomic;
+@dynamic idDynamic;
 @end
 
 
-void testProperty(const char *name, const char *types)
+#define ATTR(n, v)  (objc_property_attribute_t){(n), (v)}
+#define ATTRS(...)  (objc_property_attribute_t[]){ __VA_ARGS__ }, \
+						sizeof((objc_property_attribute_t[]){ __VA_ARGS__ }) / sizeof(objc_property_attribute_t)
+
+void testProperty(const char *name, const char *types, objc_property_attribute_t* list, unsigned int size)
 {
 	objc_property_t p = class_getProperty(objc_getClass("PropertyTest"), name);
 	if (0 == p )
@@ -115,42 +133,117 @@ void testProperty(const char *name, const char *types)
 		"Proprety name should be '%s' was '%s'", name, property_getName(p));
 	pass((strcmp(types, attrs) == 0),
 		"Property attributes for %s should be '%s' was '%s'", name, types, attrs);
+	unsigned int attrsCount = 0;
+	objc_property_attribute_t* attrsList = property_copyAttributeList(p, &attrsCount);
+	if (attrsList != NULL)
+	{
+		pass((attrsCount == size),
+			"Property attributes list size for %s should be %u was %u", name, size, attrsCount);
+		for (unsigned int index=0; index<size; index++)
+		{
+			int found = 0;
+			for (unsigned int attrsIndex=0; attrsIndex<attrsCount; attrsIndex++)
+			{
+				if (strcmp(attrsList[attrsIndex].name, list[index].name) == 0)
+				{
+					pass((strcmp(attrsList[attrsIndex].value, list[index].value) == 0),
+						"Property attribute '%s' for %s should be '%s' was '%s'", list[index].name, name, list[index].value, attrsList[attrsIndex].value);
+					found = 1;
+				}
+			}
+			if (!found)
+			{
+				pass(0, "Missing attribute '%s' for %s", list[index].name, name);
+			}
+		}
+	}
+	else
+	{
+		pass(0, "Failed to get attributes list for %s", name);
+	}
+	for (unsigned int index=0; index<size; index++)
+	{
+		const char* value = property_copyAttributeValue(p, list[index].name);
+		if (value == NULL)
+		{
+			pass(0, "Failed to get value for attribute '%s' for %s", list[index].name, name);
+			continue;
+		}
+		pass((strcmp(value, list[index].value) == 0),
+			"Property attribute '%s' for %s should be '%s' was '%s'", list[index].name, name, list[index].value, value);
+	}
 }
 
 int main(void)
 {
-	testProperty("charDefault", "Tc,VcharDefault");
-	testProperty("doubleDefault", "Td,VdoubleDefault");
-	testProperty("enumDefault", "Ti,VenumDefault");
-	testProperty("floatDefault", "Tf,VfloatDefault");
-	testProperty("intDefault", "Ti,VintDefault");
+	testProperty("charDefault", "Tc,VcharDefault", ATTRS(ATTR("T", "c"), ATTR("V", "charDefault")));
+	testProperty("doubleDefault", "Td,VdoubleDefault", ATTRS(ATTR("T", "d"), ATTR("V", "doubleDefault")));
+	testProperty("enumDefault", "Ti,VenumDefault", ATTRS(ATTR("T", "i"), ATTR("V", "enumDefault")));
+	testProperty("floatDefault", "Tf,VfloatDefault", ATTRS(ATTR("T", "f"), ATTR("V", "floatDefault")));
+	testProperty("intDefault", "Ti,VintDefault", ATTRS(ATTR("T", "i"), ATTR("V", "intDefault")));
 	if (sizeof(long) == 4)
 	{
-		testProperty("longDefault", "Tl,VlongDefault");
+		testProperty("longDefault", "Tl,VlongDefault", ATTRS(ATTR("T", "l"), ATTR("V", "longDefault")));
 	}
 	else
 	{
-		testProperty("longDefault", "Tq,VlongDefault");
+		testProperty("longDefault", "Tq,VlongDefault", ATTRS(ATTR("T", "q"), ATTR("V", "longDefault")));
 	}
-	testProperty("shortDefault", "Ts,VshortDefault");
-	testProperty("signedDefault", "Ti,VsignedDefault");
-	testProperty("structDefault", "T{YorkshireTeaStruct=ic},VstructDefault");
-	testProperty("typedefDefault", "T{YorkshireTeaStruct=ic},VtypedefDefault");
-	testProperty("unionDefault", "T(MoneyUnion=fd),VunionDefault");
-	testProperty("unsignedDefault", "TI,VunsignedDefault");
-	testProperty("functionPointerDefault", "T^?,VfunctionPointerDefault");
-	testProperty("intPointer", "T^i,VintPointer");
-	testProperty("voidPointerDefault", "T^v,VvoidPointerDefault");
-	testProperty("intSetterGetter", "Ti,GintGetFoo,SintSetFoo:,VintSetterGetter");
-	testProperty("intReadonly", "Ti,R,VintReadonly");
-	testProperty("intReadonlyGetter", "Ti,R,GisIntReadOnlyGetter,VintReadonlyGetter");
-	testProperty("intReadwrite", "Ti,VintReadwrite");
-	testProperty("intAssign", "Ti,VintAssign");
-	testProperty("idRetain", "T@,&,VidRetain");
-	testProperty("idCopy", "T@,C,VidCopy");
-	testProperty("intNonatomic", "Ti,N,VintNonatomic");
-	testProperty("idReadonlyCopyNonatomic", "T@,R,C,N,VidReadonlyCopyNonatomic");
-	testProperty("idReadonlyRetainNonatomic", "T@,R,&,N,VidReadonlyRetainNonatomic");
+	testProperty("shortDefault", "Ts,VshortDefault", ATTRS(ATTR("T", "s"), ATTR("V", "shortDefault")));
+	testProperty("signedDefault", "Ti,VsignedDefault", ATTRS(ATTR("T", "i"), ATTR("V", "signedDefault")));
+	testProperty("structDefault", "T{YorkshireTeaStruct=ic},VstructDefault", ATTRS(ATTR("T", "{YorkshireTeaStruct=ic}"),
+                                                                                   ATTR("V", "structDefault")));
+	testProperty("typedefDefault", "T{YorkshireTeaStruct=ic},VtypedefDefault", ATTRS(ATTR("T", "{YorkshireTeaStruct=ic}"),
+                                                                                     ATTR("V", "typedefDefault")));
+	testProperty("unionDefault", "T(MoneyUnion=fd),VunionDefault", ATTRS(ATTR("T", "(MoneyUnion=fd)"),
+                                                                         ATTR("V", "unionDefault")));
+	testProperty("unsignedDefault", "TI,VunsignedDefault", ATTRS(ATTR("T", "I"), ATTR("V", "unsignedDefault")));
+	testProperty("functionPointerDefault", "T^?,VfunctionPointerDefault", ATTRS(ATTR("T", "^?"), ATTR("V", "functionPointerDefault")));
+	testProperty("intPointer", "T^i,VintPointer", ATTRS(ATTR("T", "^i"), ATTR("V", "intPointer")));
+	testProperty("voidPointerDefault", "T^v,VvoidPointerDefault", ATTRS(ATTR("T", "^v"), ATTR("V", "voidPointerDefault")));
+	testProperty("intSetterGetter", "Ti,GintGetFoo,SintSetFoo:,VintSetterGetter", ATTRS(ATTR("T", "i"),
+                                                                                        ATTR("G", "intGetFoo"),
+                                                                                        ATTR("S", "intSetFoo:"),
+                                                                                        ATTR("V", "intSetterGetter")));
+	testProperty("intReadonly", "Ti,R,VintReadonly", ATTRS(ATTR("T", "i"),
+                                                           ATTR("R", ""),
+                                                           ATTR("V", "intReadonly")));
+	testProperty("intReadonlyGetter", "Ti,R,GisIntReadOnlyGetter,VintReadonlyGetter", ATTRS(ATTR("T", "i"),
+                                                                                            ATTR("R", ""),
+                                                                                            ATTR("G", "isIntReadOnlyGetter"),
+                                                                                            ATTR("V", "intReadonlyGetter")));
+	testProperty("intReadwrite", "Ti,VintReadwrite", ATTRS(ATTR("T", "i"), ATTR("V", "intReadwrite")));
+	testProperty("intAssign", "Ti,VintAssign", ATTRS(ATTR("T", "i"), ATTR("V", "intAssign")));
+	testProperty("idDefault", "T@,VidDefault", ATTRS(ATTR("T", "@"),
+                                                       ATTR("V", "idDefault")));
+	testProperty("idRetain", "T@,&,VidRetain", ATTRS(ATTR("T", "@"),
+                                                     ATTR("&", ""),
+                                                     ATTR("V", "idRetain")));
+	testProperty("idCopy", "T@,C,VidCopy", ATTRS(ATTR("T", "@"),
+                                                 ATTR("C", ""),
+                                                 ATTR("V", "idCopy")));
+	testProperty("idWeak", "T@,W,VidWeak", ATTRS(ATTR("T", "@"),
+                                                 ATTR("W", ""),
+                                                 ATTR("V", "idWeak")));
+	testProperty("idStrong", "T@,&,VidStrong", ATTRS(ATTR("T", "@"),
+                                                     ATTR("&", ""),
+                                                     ATTR("V", "idStrong")));
+	testProperty("intNonatomic", "Ti,N,VintNonatomic", ATTRS(ATTR("T", "i"),
+                                                             ATTR("N", ""),
+                                                             ATTR("V", "intNonatomic")));
+	testProperty("idReadonlyCopyNonatomic", "T@,R,N,VidReadonlyCopyNonatomic", ATTRS(ATTR("T", "@"),
+                                                                                     ATTR("R", ""),
+                                                                                     ATTR("N", ""),
+                                                                                     ATTR("V", "idReadonlyCopyNonatomic")));
+	testProperty("idReadonlyRetainNonatomic", "T@,R,N,VidReadonlyRetainNonatomic", ATTRS(ATTR("T", "@"),
+                                                                                         ATTR("R", ""),
+                                                                                         ATTR("N", ""),
+                                                                                         ATTR("V", "idReadonlyRetainNonatomic")));
+	testProperty("idReadonlyWeakNonatomic", "T@,R,N,VidReadonlyWeakNonatomic", ATTRS(ATTR("T", "@"),
+                                                                                     ATTR("R", ""),
+                                                                                     ATTR("N", ""),
+                                                                                     ATTR("V", "idReadonlyWeakNonatomic")));
+	testProperty("idDynamic", "T@,&,D", ATTRS(ATTR("T", "@"), ATTR("&", ""), ATTR("D", "")));
 	return 0;
 }
 #else
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to