summaryrefslogtreecommitdiff
path: root/gcc/testsuite/objc/execute/class-tests-1.h
blob: 54a77d247f76c4b46b77197a8bfcc7b8133f1f22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* Contributed by Nicola Pero on Tue Mar  6 23:05:53 CET 2001 */

#include <stdio.h>
#include <stdlib.h>
#include "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
#include <objc/objc-api.h>

/*
 * Standard Tests For Classes and Objects - abort upon failing; return
 * normally if all is well.
 */

/* Test that `class' is a Class */
static void test_is_class (Class class)
{
  if (object_is_class (class) == NO)
    {
      printf ("test_is_class failed\n");
      abort ();
    }

  if (class_is_class (class) == NO)
    {
      printf ("test_is_class failed\n");
      abort ();
    }
}

/* Test that the superclass of `class' is `superclass' */
static void test_superclass (Class class, Class superclass)
{
  if (class_get_super_class (class) != superclass) 
    {
      printf ("test_superclass failed\n");
      abort ();
    }
}

/* Test that the classname of `class' is `classname' */
static void test_class_name (Class class, const char *classname)
{
  if (strcmp (class_get_class_name (class), classname))
    {
      printf ("test_class_name failed\n");
      abort ();
    }
}

/* Test that we can allocate instances of `class' */
static void test_allocate (Class class)
{
  /* The object we create is leaked but who cares, this is only a test */
  id object = class_create_instance (class);

  if (object == nil)
    {
      printf ("test_allocate failed\n");
      abort ();
    }
}

/* Test that instances of `class' are instances and not classes */
static void test_instances (Class class)
{
  id object = class_create_instance (class);

  if (object_is_class (object) == YES)
    {
      printf ("test_instances failed\n");
      abort ();
    }
}

/* Test that we can deallocate instances of `class' */
static void test_deallocate (Class class)
{
  id object = class_create_instance (class);

  object_dispose (object);
}

/* Test that the object and the class agree on what the class is */
static void test_object_class (Class class)
{
  id object = class_create_instance (class);

  if (object_get_class (object) != class)
    {
      printf ("test_object_class failed\n");
      abort ();
    }
}

/* Test that the object and the class agree on what the superclass is */
static void test_object_super_class (Class class)
{
  id object = class_create_instance (class);

  if (object_get_super_class (object) != class_get_super_class (class))
    {
      printf ("test_object_super_class failed\n");
      abort ();
    }
}

/* 
 *  Runs all the tests in this file for the specified class 
 */
void test_class_with_superclass (const char *class_name, 
				 const char *superclass_name)
{
  Class class; 
  Class superclass; 

  /* We need at least a method call before playing with the internals, 
     so that the runtime will call __objc_resolve_class_links () */
  [Object class];

  /* class_name must be an existing class */
  class = objc_lookup_class (class_name);
  test_is_class (class);

  /* But superclass_name can be "", which means `Nil' */
  superclass = objc_lookup_class (superclass_name);  
  if (superclass != Nil)
    {
      test_is_class (superclass);
    }

  /* Now the tests */
  test_superclass (class, superclass);
  test_class_name (class, class_name);
  test_allocate (class);
  test_instances (class);
  test_deallocate (class);
  test_object_class (class);
  test_object_super_class (class);
}