/* Contributed by Nicola Pero on Tue Mar  6 23:05:53 CET 2001 */
#include <objc/objc.h>
#include <objc/objc-api.h>
#include <stdlib.h>

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

/* Test that `class' has an instance method for the selector `selector' */
void test_that_class_has_instance_method (const char *class_name, 
					  SEL selector)
{
  Class class = objc_lookup_class (class_name);

  if (class_get_instance_method (class, selector) == NULL)
    {
      printf ("test_class_has_instance_method failed\n");
      abort ();
    }
}

/* Test that `class' has a class method for the selector `selector' */
void test_that_class_has_class_method (const char *class_name, 
				       SEL selector)
{
  Class meta_class = objc_get_meta_class (class_name);

  if (class_get_class_method (meta_class, selector) == NULL)
    {
      printf ("test_class_has_class_method failed\n");
      abort ();
    }
}

/* Test the accessor methods (called -state and -setState:) on the
   object `object'. */
#ifdef TYPE_OF_OBJECT_WITH_ACCESSOR_METHOD
void test_accessor_method (TYPE_OF_OBJECT_WITH_ACCESSOR_METHOD object, 
			   int initial_state,
			   int new_state_0, int expected_result_0,
			   int new_state_1, int expected_result_1)
{
  if ([object state] != initial_state)
    {
      printf ("test_accessor_method (initial state) failed\n");
      abort ();
    }
  
  [object setState: new_state_0];
  if ([object state] != expected_result_0)
    {
      printf ("test_accessor_method (new_state_0) failed\n");
      abort ();
    }  
  
  [object setState: new_state_1];
  if ([object state] != expected_result_1)
    {
      printf ("test_accessor_method (new_state_1) failed\n");
      abort ();
    }  
}
#endif /* CLASS_WITH_ACCESSOR_METHOD */


