/* 
 *  @OPENGROUP_COPYRIGHT@
 *  COPYRIGHT NOTICE
 *  Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
 *  Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group
 *  ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
 *  the full copyright text.
 *  
 *  This software is subject to an open license. It may only be
 *  used on, with or for operating systems which are themselves open
 *  source systems. You must contact The Open Group for a license
 *  allowing distribution and sublicensing of this software on, with,
 *  or for operating systems which are not Open Source programs.
 *  
 *  See http://www.opengroup.org/openmotif/license for full
 *  details of the license agreement. Any use, reproduction, or
 *  distribution of the program constitutes recipient's acceptance of
 *  this agreement.
 *  
 *  EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
 *  PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
 *  WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
 *  OR FITNESS FOR A PARTICULAR PURPOSE
 *  
 *  EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
 *  NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 *  DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
 *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *  ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
 *  EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGES.
*/ 
/* 
 * HISTORY
*/ 
#ifdef REV_INFO
#ifndef lint
static char rcsid[] = "$TOG: RepType1.c /main/8 1999/02/12 17:15:05 jff $"
#endif
#endif
/*
*  (c) Copyright 1989, HEWLETT-PACKARD COMPANY */

/*
 *  This test tests the Representation Type Management facility in terms
 *  of its static registering capabilities.
 *
 *  Select approximately 25+ resources from various widgets
 *  (at least one in each, several in complicated widgets like
 *  RowColumn) (which fits the criteria of being a string-to-
 *  enumerated value) and attempt to convert them.  The idea is to 
 *  verify that the developers have put in the necessary hooks for 
 *  each of the widgets to allow the conversions.
 */


#include <testlib.h>

#ifndef MOTIF1_1

#include <Xm/RepType.h>

typedef struct
{
  char *rep_type;
  unsigned char num_of_tests;
} RepTypeVal;

static RepTypeVal reptypedata[] =
{ 
  {XmRAlignment, 3},
  {XmRArrowDirection, 4},
  {XmRAttachment, 7},
  {XmRAudibleWarning, 2},
  {XmRChildHorizontalAlignment, 3},
  {XmRChildPlacement, 3},
  {XmRChildType, 3},
  {XmRChildVerticalAlignment, 7},
  {XmRCommandWindowLocation, 2},
  {XmRDefaultButtonType, 4},
  {XmRDialogStyle, 6},
  {XmRDialogType, 7},
  {XmREditMode, 2},
  {XmRFileTypeMask, 3},
  {XmRIndicatorType, 4},
  {XmRLabelType, 2},
  {XmRListSizePolicy, 3},
  {XmRMultiClick, 2},
  {XmRNavigationType, 4},
  {XmROrientation, 2},
  {XmRPacking, 3},
  {XmRProcessingDirection, 4},
  {XmRResizePolicy, 3},
  {XmRRowColumnType, 5},
  {XmRScrollBarDisplayPolicy, 2},
  {XmRScrollBarPlacement, 4},
  {XmRScrollingPolicy, 2},
  {XmRSelectionPolicy, 4},
  {XmRSelectionType, 5},
  {XmRSeparatorType, 9},
  {XmRShadowType, 4},
  {XmRStringDirection, 2},
  {XmRTearOffModel, 2},
  {XmRUnpostBehavior, 2},
  {XmRVerticalAlignment, 5},
  {XmRVisualPolicy, 2},
  {0,0}
};

typedef struct
{
  char *from_string;
  unsigned char correct_value;
} ConvertVal;

static ConvertVal convert_set[] =
{
  /* XmRAlignment */
  { "alignment_beginning", XmALIGNMENT_BEGINNING},
  { "alignment_center", XmALIGNMENT_CENTER},
  { "alignment_end", XmALIGNMENT_END},

  /* XmRArrowDirection */
  { "arrow_up", XmARROW_UP},
  { "arrow_down", XmARROW_DOWN},
  { "arrow_left", XmARROW_LEFT},
  { "arrow_right", XmARROW_RIGHT},

  /* XmRAttachment */
  { "attach_none", XmATTACH_NONE},
  { "attach_form", XmATTACH_FORM},
  { "attach_opposite_form", XmATTACH_OPPOSITE_FORM},
  { "attach_widget", XmATTACH_WIDGET},
  { "attach_opposite_widget", XmATTACH_OPPOSITE_WIDGET},
  { "attach_position", XmATTACH_POSITION},
  { "attach_self", XmATTACH_SELF},

  /* XmRAudibleWarning */
  { "none", XmNONE},
  { "bell", XmBELL},

  /* XmRChildHorizontalAlignment */
  { "alignment_beginning", XmALIGNMENT_BEGINNING},
  { "alignment_center", XmALIGNMENT_CENTER},
  { "alignment_end", XmALIGNMENT_END},

  /* XmRChildPlacement */
  { "place_top", XmPLACE_TOP},
  { "place_above_selection", XmPLACE_ABOVE_SELECTION},
  { "place_below_selection", XmPLACE_BELOW_SELECTION},

  /* XmRChildType */
  { "frame_generic_child", XmFRAME_GENERIC_CHILD},
  { "frame_workarea_child", XmFRAME_WORKAREA_CHILD},
  { "frame_title_child", XmFRAME_TITLE_CHILD},

  /* XmRChildVerticalAlignment */
  { "alignment_baseline_top", XmALIGNMENT_BASELINE_TOP},
  { "alignment_center", XmALIGNMENT_CENTER},
  { "alignment_baseline_bottom", XmALIGNMENT_BASELINE_BOTTOM},
  { "alignment_widget_top", XmALIGNMENT_WIDGET_TOP},
  { "alignment_widget_bottom", XmALIGNMENT_WIDGET_BOTTOM},
  { "alignment_child_top", XmALIGNMENT_CHILD_TOP},
  { "alignment_child_bottom", XmALIGNMENT_CHILD_BOTTOM},
  
  /* XmRCommandWindowLocation */
  { "command_above_workspace", XmCOMMAND_ABOVE_WORKSPACE},
  { "command_below_workspace", XmCOMMAND_BELOW_WORKSPACE},
  
  /* XmRDefaultButtonType */
  { "dialog_none", XmDIALOG_NONE},
  { "dialog_cancel_button", XmDIALOG_CANCEL_BUTTON},
  { "dialog_ok_button", XmDIALOG_OK_BUTTON},
  { "dialog_help_button", XmDIALOG_HELP_BUTTON},

  /* XmRDialogStyle */
  { "dialog_modeless", XmDIALOG_MODELESS},
  { "dialog_work_area", XmDIALOG_WORK_AREA},
  { "dialog_primary_application_modal", XmDIALOG_PRIMARY_APPLICATION_MODAL},
  { "dialog_application_modal", XmDIALOG_APPLICATION_MODAL},
  { "dialog_full_application_modal", XmDIALOG_FULL_APPLICATION_MODAL},
  { "dialog_system_modal", XmDIALOG_SYSTEM_MODAL},
  
  /* XmRDialogType */
  { "dialog_template", XmDIALOG_TEMPLATE},
  { "dialog_error", XmDIALOG_ERROR},
  { "dialog_information", XmDIALOG_INFORMATION},
  { "dialog_message", XmDIALOG_MESSAGE},
  { "dialog_question", XmDIALOG_QUESTION},
  { "dialog_warning", XmDIALOG_WARNING},
  { "dialog_working", XmDIALOG_WORKING},
  
  /* XmREditMode */
  { "multi_line_edit", XmMULTI_LINE_EDIT},
  { "single_line_edit", XmSINGLE_LINE_EDIT},

  /* XmRFileTypeMask */
  { "file_directory", XmFILE_DIRECTORY},
  { "file_regular", XmFILE_REGULAR},
  { "file_any_type", XmFILE_ANY_TYPE},

  /* XmRIndicatorType */
  { "n_of_many", XmN_OF_MANY},
  { "one_of_many", XmONE_OF_MANY},
  { "one_of_many_round", XmONE_OF_MANY_ROUND},
  { "one_of_many_diamond", XmONE_OF_MANY_DIAMOND},

  /* XmRLabelType */
  { "pixmap", XmPIXMAP},
  { "string", XmSTRING},

  /* XmRListSizePolicy */
  { "variable", XmVARIABLE},
  { "constant", XmCONSTANT},
  { "resize_if_possible", XmRESIZE_IF_POSSIBLE},

  /* XmRMultiClick */
  { "multiclick_discard", XmMULTICLICK_DISCARD},
  { "multiclick_keep", XmMULTICLICK_KEEP},

  /* XmRNavigationType */
  { "none", XmNONE},
  { "tab_group", XmTAB_GROUP},
  { "sticky_tab_group", XmSTICKY_TAB_GROUP},
  { "exclusive_tab_group", XmEXCLUSIVE_TAB_GROUP},

  /* XmROrientation */
  { "vertical", XmVERTICAL},
  { "horizontal", XmHORIZONTAL},

  /* XmRPacking */
  { "pack_tight", XmPACK_TIGHT},
  { "pack_column", XmPACK_COLUMN},
  { "pack_none", XmPACK_NONE},

  /* XmRProcessingDirection */
  { "max_on_top", XmMAX_ON_TOP},
  { "max_on_bottom", XmMAX_ON_BOTTOM},
  { "max_on_left", XmMAX_ON_LEFT},
  { "max_on_right", XmMAX_ON_RIGHT},

  /* XmRResizePolicy */
  { "resize_none", XmRESIZE_NONE},
  { "resize_grow", XmRESIZE_GROW},
  { "resize_any", XmRESIZE_ANY},

  /* XmRRowColumnType */
  { "work_area", XmWORK_AREA},
  { "menu_bar", XmMENU_BAR},
  { "menu_pulldown", XmMENU_PULLDOWN},
  { "menu_popup", XmMENU_POPUP},
  { "menu_option", XmMENU_OPTION},
  
  /* XmRScrollBarDisplayPolicy */
  { "static", XmSTATIC},
  { "as_needed", XmAS_NEEDED},

  /* XmRScrollBarPlacement */
  { "bottom_right", XmBOTTOM_RIGHT},
  { "top_right", XmTOP_RIGHT},
  { "bottom_left", XmBOTTOM_LEFT},
  { "top_left", XmTOP_LEFT},

  /* XmRScrollingPolicy */
  { "automatic", XmAUTOMATIC},
  { "application_defined", XmAPPLICATION_DEFINED},

  /* XmRSelectionPolicy */
  { "single_select", XmSINGLE_SELECT},
  { "multiple_select", XmMULTIPLE_SELECT},
  { "extended_select", XmEXTENDED_SELECT},
  { "browse_select", XmBROWSE_SELECT},

  /* XmRSelectionType */
  { "dialog_work_area", XmDIALOG_WORK_AREA},
  { "dialog_prompt", XmDIALOG_PROMPT},
  { "dialog_selection", XmDIALOG_SELECTION},
  { "dialog_command", XmDIALOG_COMMAND},
  { "dialog_file_selection", XmDIALOG_FILE_SELECTION},

  /* XmRSeparatorType */
  { "no_line", XmNO_LINE},
  { "single_line", XmSINGLE_LINE},
  { "double_line", XmDOUBLE_LINE},
  { "single_dashed_line", XmSINGLE_DASHED_LINE},
  { "double_dashed_line", XmDOUBLE_DASHED_LINE},
  { "shadow_etched_in", XmSHADOW_ETCHED_IN},
  { "shadow_etched_out", XmSHADOW_ETCHED_OUT},
  { "shadow_etched_in_dash", XmSHADOW_ETCHED_IN_DASH},
  { "shadow_etched_out_dash", XmSHADOW_ETCHED_OUT_DASH},

  /* XmRShadowType */
  { "shadow_etched_in", XmSHADOW_ETCHED_IN},
  { "shadow_etched_out", XmSHADOW_ETCHED_OUT},
  { "shadow_in", XmSHADOW_IN},
  { "shadow_out", XmSHADOW_OUT},

  /* XmRStringDirection */
  { "string_direction_l_to_r", XmSTRING_DIRECTION_L_TO_R},
  { "string_direction_r_to_l", XmSTRING_DIRECTION_R_TO_L},

  /* XmRTearOffModel */
  { "tear_off_enabled", XmTEAR_OFF_ENABLED},
  { "tear_off_disabled", XmTEAR_OFF_DISABLED},
  
  /* XmRUnpostBehavior */
  { "unpost", XmUNPOST},
  { "unpost_and_replay", XmUNPOST_AND_REPLAY},

  /* XmRVerticalAlignment */
  { "alignment_baseline_top", XmALIGNMENT_BASELINE_TOP},
  { "alignment_center", XmALIGNMENT_CENTER},
  { "alignment_baseline_bottom", XmALIGNMENT_BASELINE_BOTTOM},
  { "alignment_contents_top", XmALIGNMENT_CONTENTS_TOP},
  { "alignment_contents_bottom", XmALIGNMENT_CONTENTS_BOTTOM},

  /* XmRVisualPolicy */
  { "variable", XmVARIABLE},
  { "constant", XmCONSTANT},

  /*  End of test */
  { NULL, 0}
};

#endif

void main(argc, argv)
unsigned int argc;
char *argv[];
{
  Widget bulletin;
  XrmValue from;
  XrmValue to_return;
  register int i, value_counter,k;
  unsigned short rep_id, error_counter;

#ifndef MOTIF1_1
  XmRepTypeEntry rep_type;
#endif

  /*
   * Initialize toolkit
   */

  CommonTestInit(argc,argv);

  CommonPause();

#ifndef MOTIF1_1
  /*
   * Need to create a widget to get the converters registered
   */

  bulletin = XmCreateBulletinBoard(Shell1,	/* parent	*/
				   "bulletin",	/* name		*/
				   NULL, 0);	/* arguments	*/
  XtManageChild (bulletin);

  XtRealizeWidget(Shell1);

  /*
   * First test to see if it can detect an invalid rep type
   *  It should return XmREP_TYPE_INVALID
   */

  printf("Testing detection of invalid representation type : ");
  rep_id = XmRepTypeGetId("bogus");

  if (rep_id != XmREP_TYPE_INVALID)
    printf("   FAILED\n");
  else
    printf("   PASSED\n");

  /*
   * Query each legal static representation type
   */

  value_counter = 0;
  for (i=0; reptypedata[i].rep_type != NULL; i++)
    {
      error_counter = 0;

      printf("Representation Type = %s,", reptypedata[i].rep_type);

      rep_id = XmRepTypeGetId(reptypedata[i].rep_type);
      if (rep_id == XmREP_TYPE_INVALID)
	{
	  printf("\n   FAILED:  Detected invalid rep type\n");
	  value_counter += reptypedata[i].num_of_tests;
	  continue;
	}

      rep_type = XmRepTypeGetRecord(rep_id);

      /*
       * Diagnose the answers
       */
      
      if (reptypedata[i].num_of_tests != rep_type->num_values)
	{
	  printf("\n   FAILED: Discrepancy in returned number of values\n");
	  printf("\n   expected %d received %d\n",
		reptypedata[i].num_of_tests,rep_type->num_values);
	  value_counter += reptypedata[i].num_of_tests;
	  continue;
	}

      /* Look at each to see if they match */

      for (k=0; k < rep_type->num_values; k++)
	{
	  if (convert_set[value_counter].correct_value !=
	      rep_type->values[k])
	    {
	      printf("\n   Error: Discrepancy in value returned \n");
	      error_counter++;
	    }

	  if (strcmp(rep_type->value_names[k], 
		     convert_set[value_counter].from_string) != 0)
	    {
	      printf("\n   Error: Discrepancy in name returned \n");
	      error_counter++;
	    }

	  value_counter++;
	}

      if (error_counter > 0)
	printf("\n   Test FAILED\n");
      else
	printf("   Test PASSED\n");

      /* Free the structure since we're done with it */
      XtFree((char *)rep_type);
    }
  CommonPause();

#endif
}
