1  /* Contributed by Nicola Pero on Tue Mar  6 23:05:53 CET 2001 */
       2  
       3  #include <stdio.h>
       4  #include <stdlib.h>
       5  #include "../../objc-obj-c++-shared/runtime.h"
       6  
       7  extern int strcmp(const char *, const char *);
       8  
       9  /*
      10   * Standard Tests For Classes and Objects - abort upon failing; return
      11   * normally if all is well.
      12   */
      13  
      14  /* Test that `class' is a Class */
      15  static void test_is_class (Class class)
      16  {
      17    if (class_isMetaClass (object_getClass (class)) == NO)
      18      {
      19        printf ("test_is_class failed\n");
      20        abort ();
      21      }
      22  }
      23  
      24  /* Test that the superclass of `class' is `superclass' */
      25  static void test_superclass (Class class, Class superclass)
      26  {
      27    if (class_getSuperclass (class) != superclass)
      28      {
      29        printf ("test_superclass failed\n");
      30        abort ();
      31      }
      32  }
      33  
      34  /* Test that the classname of `class' is `classname' */
      35  static void test_class_name (Class class, const char *classname)
      36  {
      37    if (strcmp (class_getName (class), classname))
      38      {
      39        printf ("test_class_name failed\n");
      40        abort ();
      41      }
      42  }
      43  
      44  /* Test that we can allocate instances of `class' */
      45  static void test_allocate (Class class)
      46  {
      47    /* The object we create is leaked but who cares, this is only a test */
      48    id object = class_createInstance (class, 0);
      49  
      50    if (object == nil)
      51      {
      52        printf ("test_allocate failed\n");
      53        abort ();
      54      }
      55  }
      56  
      57  /* Test that instances of `class' are instances and not classes */
      58  static void test_instances (Class class)
      59  {
      60    id object = class_createInstance (class, 0);
      61  
      62    if (class_isMetaClass (object_getClass (object)) == YES)
      63      {
      64        printf ("test_instances failed\n");
      65        abort ();
      66      }
      67  }
      68  
      69  /* Test that we can deallocate instances of `class' */
      70  static void test_deallocate (Class class)
      71  {
      72    id object = class_createInstance (class, 0);
      73  
      74    object_dispose (object);
      75  }
      76  
      77  /* Test that the object and the class agree on what the class is */
      78  static void test_object_class (Class class)
      79  {
      80    id object = class_createInstance (class, 0);
      81  
      82    if (object_getClass (object) != class)
      83      {
      84        printf ("test_object_class failed\n");
      85        abort ();
      86      }
      87  }
      88  
      89  /* 
      90   *  Runs all the tests in this file for the specified class 
      91   */
      92  void test_class_with_superclass (const char *class_name, 
      93  				 const char *superclass_name)
      94  {
      95    Class class; 
      96    Class superclass; 
      97  
      98    /* class_name must be an existing class */
      99    class = objc_getClass (class_name);
     100    test_is_class (class);
     101  
     102    /* But superclass_name can be "", which means `Nil' */
     103    superclass = objc_getClass (superclass_name);  
     104    if (superclass != Nil)
     105      {
     106        test_is_class (superclass);
     107      }
     108  
     109    /* Now the tests */
     110    test_superclass (class, superclass);
     111    test_class_name (class, class_name);
     112    test_allocate (class);
     113    test_instances (class);
     114    test_deallocate (class);
     115    test_object_class (class);
     116  }