X-Git-Url: https://git.saurik.com/apple/objc4.git/blobdiff_plain/7c0e6487d7b67b6bf6c632300ee4b74e8950b051..7af964d1562d70f51a8e9aca24215ac3d83d0624:/test/protocol_copyPropertyList.m diff --git a/test/protocol_copyPropertyList.m b/test/protocol_copyPropertyList.m new file mode 100644 index 0000000..af03d9a --- /dev/null +++ b/test/protocol_copyPropertyList.m @@ -0,0 +1,105 @@ +#include "test.h" +#include +#include +#include + +@protocol SuperProps +@property int prop1; +@property int prop2; +@end + +@protocol SubProps +@property int prop3; +@property int prop4; +@end + + +@protocol FourProps +@property int prop1; +@property int prop2; +@property int prop3; +@property int prop4; +@end + +@protocol NoProps @end + +static int isNamed(objc_property_t p, const char *name) +{ + return (0 == strcmp(name, property_getName(p))); +} + +int main() +{ + objc_property_t *props; + unsigned int count; + Protocol *proto; + + proto = @protocol(SubProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(props); + testassert(count == 2); + testassert(isNamed(props[0], "prop4")); + testassert(isNamed(props[1], "prop3")); + // props[] should be null-terminated + testassert(props[2] == NULL); + free(props); + + proto = @protocol(SuperProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(props); + testassert(count == 2); + testassert(isNamed(props[0], "prop2")); + testassert(isNamed(props[1], "prop1")); + // props[] should be null-terminated + testassert(props[2] == NULL); + free(props); + + // Check null-termination - this property list block would be 16 bytes + // if it weren't for the terminator + proto = @protocol(FourProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(props); + testassert(count == 4); + testassert(malloc_size(props) >= 5 * sizeof(objc_property_t)); + testassert(props[3] != NULL); + testassert(props[4] == NULL); + free(props); + + // Check NULL count parameter + props = protocol_copyPropertyList(proto, NULL); + testassert(props); + testassert(props[4] == NULL); + testassert(props[3] != NULL); + free(props); + + // Check NULL protocol parameter + count = 100; + props = protocol_copyPropertyList(NULL, &count); + testassert(!props); + testassert(count == 0); + + // Check NULL protocol and count + props = protocol_copyPropertyList(NULL, NULL); + testassert(!props); + + // Check protocol with no properties + proto = @protocol(NoProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(!props); + testassert(count == 0); + + succeed(__FILE__); + return 0; +}