#ifndef	ACL_TEST_STRUCT_INCLUDE_H
#define	ACL_TEST_STRUCT_INCLUDE_H

# ifdef	__cplusplus
extern "C" {
# endif

#include "stdlib/acl_array.h"

typedef struct AUT_LINE {
	char  cmd_name[128];	/* 命令函数名称 */
	int   result;		/* 执行结果 */
	int   argc;		/* 参数个数 */
	ACL_ARRAY *argv;	/* 参数列表 */
	char *args_str;		/* 参数列表的备份 */
	int   valid_line_idx;	/* 该有效配置行在所有有效配置行中的行号 */
	int   line_number;	/* 该有效配置行在配置文件中的行号 */
	void *arg_inner;	/* 内部注册自己的参数到该结构中 */
	void (*free_arg_inner)(void*);
	void *arg_outer;	/* 外部应用注册自己的参数到该结构中 */
	int   obj_type;		/* 是内部命令对象还是外部命令对象标志位,
				 * defined as: AUT_OBJ_
				 */
} AUT_LINE;

typedef int (*AUT_FN) (AUT_LINE *test_line, void *arg);

/**
 * 说明: 单元测试所采用的一致的数据结构
 */
typedef struct AUT_FN_ITEM {
	const char *cmd_name;		/* 命令字名称 */
	const char *fn_name;		/* 函数名称 */
	AUT_FN fn_callback;		/* 测试用回调函数 */
	void *arg;			/* 测试回调函数所用的参数 */
	int   inner;			/* 是否是内部的命令 */
} AUT_FN_ITEM;

/* 内部数据结构定义 */
typedef struct {
	char *name;
	char *value;
} AUT_ARG_ITEM;

typedef struct {
	int match_number;		/* 成对命令中相互间的匹配号,
					 * 例如: loop_begin 与 loop_end 之间
					 * 对非成对的命令项无效, 如对:
					 * stop 命令项.
					 */
	AUT_LINE *peer;			/* 与该有效配置行成对的另一个对象 */
	int flag;			/* define as: AUT_FLAG_ */
	int status;			/* define as: AUT_STAT_ */
	int valid_line_idx;		/* 在所有有效配置行中的下标位置 */

	/* 私有类型定义如下 */
	/* 针对循环执行命令序列 */
	int nloop_max;			/* 最大循环次数, 由配置文件中获得 */
	int nloop_cur;			/* 当前循环的次数 */
	int offset_valid_line_idx;	/* 相对有效配置行下标索引 */
	int loop_sleep;			/* 循环执行时的休息 */
} AUT_CMD_TOKEN;

#define	AUT_OBJ_OUTER		0	/* 默认为外部命令对象 */
#define	AUT_OBJ_INNER		1	/* 为内部对象 */

#define	AUT_FLAG_LOOP_BEGIN	1
#define	AUT_FLAG_LOOP_BREAK	2
#define	AUT_FLAG_LOOP_CONTINUE	3
#define	AUT_FLAG_LOOP_END	4

#define	AUT_FLAG_IF		5
#define	AUT_FLAG_ELSE		6
#define	AUT_FLAG_ELIF		7
#define	AUT_FLAG_ENDIF		8

#define	AUT_FLAG_STOP		9

#define	AUT_STAT_FREE		0
#define	AUT_STAT_BUSY		1


#define	AUT_LOOP_BREAK			-100

#define	VAR_AUT_LOG_PRINT	0x0001
#define	VAR_AUT_LOG_FPRINT	0x0010

/* 配置文件中的关键字 */
/* 日志记录级别 */
#define	VAR_AUT_LOG			"LOG"

/* 执行停止标志位 */
#define	VAR_AUT_STOP			"STOP"

/* 休息标志位 */
#define	VAR_AUT_SLEEP			"SLEEP"

/* 暂停标志位 */
#define	VAR_AUT_PAUSE			"PAUSE"

/* 循环执行开始标志位 */
#define	VAR_AUT_LOOP_BEGIN		"LOOP_BEGIN"

/* 循环执行停止标志位 */
#define	VAR_AUT_LOOP_END		"LOOP_END"

/* 跳出循环执行 */
#define	VAR_AUT_LOOP_BREAK		"LOOP_BREAK"

/* 循环继续 */
#define	VAR_AUT_LOOP_CONTINUE		"LOOP_CONTINUE"

/* 条件判断开始语句 */
#define	VAR_AUT_IF			"IF"

/* 条件判断 else 语句 */
#define	VAR_AUT_ELSE			"ELSE"

/* 条件判断结束语句 */
#define	VAR_AUT_ENDIF			"ENDIF"

/* 跳转执行语句 */
#define	VAR_AUT_GOTO			"GOTO"

/*----------------- 内部保留的一些配置文件参数 -----------------------------*/
/**
 * 通用的整数值参数名变量:
 *
 * 对于 VAR_AUT_SLEEP 则表示为休息的秒数值;
 * 对于 VAR_AUT_LOOP_BEGIN 则表示循环的次数
 */

#define	VAR_AUT_ITEM_COUNT		"COUNT"


# ifdef	__cplusplus
}
# endif

#endif

