/* Test the Modern GNU Objective-C Runtime API.

  This is test 'property', covering all functions starting with 'property'.  */

/* { dg-do run } */
/* { dg-skip-if "No API#2 pre-Darwin9" { *-*-darwin[5-8]* } { "-fnext-runtime" } { "" } } */
// { dg-additional-options "-Wno-objc-root-class" }

/* To get the modern GNU Objective-C Runtime API, you include
   objc/runtime.h.  */
#include <objc/runtime.h>
#include <stdlib.h>
#include <iostream>
#include <cstring>

@interface MyRootClass
{ Class isa; }
+ alloc;
- init;
+ initialize;
@end

@implementation MyRootClass
+ alloc { return class_createInstance (self, 0); }
- init  { return self; }
+ initialize { return self; }
@end

@interface MySubClass : MyRootClass
{
  id propertyA;
  id propertyB;
}
@property (assign, getter=getP, setter=setP:) id propertyA;
@property (assign, nonatomic) id propertyB;
@end

@implementation MySubClass
@synthesize propertyA;
@synthesize propertyB;
@end


int main ()
{
  /* Functions are tested in alphabetical order.  */

  std::cout << "Testing property_getAttributes () ...\n";
  {
    /* The Apple/NeXT runtime seems to crash on the following.  */
#ifdef __GNU_LIBOBJC__
    if (property_getAttributes (NULL) != NULL)
      abort ();
#endif

    /* The GNU runtime doesn't support looking up properties at
       runtime yet.  */
#ifdef __OBJC2__
    {
      objc_property_t property;
      
      property = class_getProperty (objc_getClass ("MySubClass"), "propertyA");
      if (std::strcmp (property_getAttributes (property),
		  "T@,GgetP,SsetP:,VpropertyA") != 0)
	abort ();

      property = class_getProperty (objc_getClass ("MySubClass"), "propertyB");
      if (std::strcmp (property_getAttributes (property),
		  "T@,N,VpropertyB") != 0)
	abort ();
    }
#endif    
  }

  std::cout << "Testing property_getName () ...\n";
  {
    /* The Apple/NeXT runtime seems to crash on the following.  */
#ifdef __GNU_LIBOBJC__

    if (property_getName (NULL) != NULL)
      abort ();
#endif

    /* The GNU runtime doesn't support looking up properties at
       runtime yet.  */
#ifdef __OBJC2__
    {
      objc_property_t property;
      
      property = class_getProperty (objc_getClass ("MySubClass"), "propertyA");
      if (std::strcmp (property_getName (property), "propertyA") != 0)
	abort ();

      property = class_getProperty (objc_getClass ("MySubClass"), "propertyB");
      if (std::strcmp (property_getName (property), "propertyB") != 0)
	abort ();
    }
#endif
  }

  return (0);
}
