1/*
2    load-3.m
3
4    Author: Ovidiu Predescu <ovidiu@cup.hp.com>
5    Date: June  3, 2001
6
7    Test if the +load methods are invoked, and are invoked in the
8    proper order.
9 */
10
11#include <objc/objc.h>
12#include <objc/Object.h>
13
14@interface A : Object
15@end
16
17@interface B : A
18@end
19
20static a_load = 0;
21static b_load = 0;
22static a_category_load = 0;
23static b_category_load = 0;
24
25@implementation A (Category)
26+ (void)load
27{
28  a_category_load = 1;
29  printf("+[A(Category) load]\n");
30
31  if (a_load != 1)
32    {
33      printf("+load for A(Category) invoked before A's!\n");
34      abort();
35    }
36}
37@end
38
39@implementation B(Category)
40+ (void)load
41{
42  b_category_load = 1;
43  printf("+[B(Category) load]\n");
44
45  if (b_load != 1)
46    {
47      printf ("+load for B(Category) invoked before B!\n");
48      abort();
49    }
50}
51@end
52
53@implementation B
54+ (void)load
55{
56  b_load = 1;
57  printf("+[B load]\n");
58
59  if (a_load != 1)
60    {
61      printf("+load for B invoked before A's!\n");
62      abort();
63    }
64
65  if (b_category_load != 0)
66    {
67      printf("+load for B invoked after B(Category)!\n");
68      abort();
69    }
70}
71@end
72
73@implementation A
74+ (void)load
75{
76  a_load = 1;
77  printf("+[A load]\n");
78
79  if (a_category_load != 0)
80    {
81      printf("+load for A(Category) invoked before A!\n");
82      abort();
83    }
84
85  if (b_load != 0)
86    {
87      printf("+load for A invoked after B!\n");
88      abort();
89    }
90
91  if (b_category_load != 0)
92    {
93      printf("+load for B(Category) invoked before A and B!\n");
94      abort();
95    }
96}
97@end
98
99int main (void)
100{
101  if (a_load + b_load + a_category_load + b_category_load != 4)
102    {
103      printf("Not all +load methods invoked!\n");
104      abort();
105    }
106
107  return 0;
108}
109