| | |
| | | static char scpi_input_buffer[SCPI_INPUT_BUFFER_LENGTH]; |
| | | |
| | | #define SCPI_ERROR_QUEUE_SIZE 4 |
| | | static int16_t scpi_error_queue_data[SCPI_ERROR_QUEUE_SIZE]; |
| | | static scpi_error_t scpi_error_queue_data[SCPI_ERROR_QUEUE_SIZE]; |
| | | |
| | | static int init_suite(void) { |
| | | SCPI_Init(&scpi_context, |
| | |
| | | scpi_units_def, |
| | | "MA", "IN", NULL, "VER", |
| | | scpi_input_buffer, SCPI_INPUT_BUFFER_LENGTH, |
| | | scpi_error_queue_data, SCPI_ERROR_QUEUE_SIZE); |
| | | scpi_error_queue_data, SCPI_ERROR_QUEUE_SIZE, |
| | | NULL, 0); |
| | | |
| | | return 0; |
| | | } |
| | |
| | | { \ |
| | | int32_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamInt32(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value, expected_value); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamInt32(void) { |
| | |
| | | { \ |
| | | uint32_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamUInt32(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value, expected_value); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamUInt32(void) { |
| | |
| | | { \ |
| | | int64_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamInt64(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value, expected_value); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamInt64(void) { |
| | |
| | | { \ |
| | | uint64_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamUInt64(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value, expected_value); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamUInt64(void) { |
| | |
| | | { \ |
| | | float value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamFloat(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_DOUBLE_EQUAL(value, expected_value, 0.000001); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamFloat(void) { |
| | |
| | | { \ |
| | | double value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamDouble(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_DOUBLE_EQUAL(value, expected_value, 0.000001); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamDouble(void) { |
| | |
| | | const char * value; \ |
| | | size_t value_len; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamCharacters(&scpi_context, &value, &value_len, mandatory); \ |
| | | /*printf("%.*s\r\n", (int)value_len, value);*/ \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_NSTRING_EQUAL(value, expected_value, value_len); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamCharacters(void) { |
| | |
| | | char value[100]; \ |
| | | size_t value_len; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamCopyText(&scpi_context, value, sizeof(value), &value_len, mandatory);\ |
| | | /*printf("%.*s\r\n", (int)value_len, value);*/ \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_STRING_EQUAL(value, expected_value); \ |
| | | CU_ASSERT_EQUAL(value_len, expected_len); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testSCPI_ParamCopyText(void) { |
| | |
| | | const char * value; \ |
| | | size_t value_len; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | | scpi_context.param_list.lex_state.buffer = data; \ |
| | | scpi_context.param_list.lex_state.len = strlen(scpi_context.param_list.lex_state.buffer);\ |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamArbitraryBlock(&scpi_context, &value, &value_len, mandatory); \ |
| | | result = SCPI_ParamArbitraryBlock(&scpi_context, &value, &value_len, mandatory); \ |
| | | /*printf("%.*s\r\n", (int)value_len, value);*/ \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_NSTRING_EQUAL(value, expected_value, value_len); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | static void testSCPI_ParamArbitraryBlock(void) { |
| | | TEST_ParamArbitraryBlock("#204ABCD", TRUE, "ABCD", TRUE, 0); |
| | |
| | | { \ |
| | | scpi_bool_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | | scpi_context.param_list.lex_state.buffer = data; \ |
| | | scpi_context.param_list.lex_state.len = strlen(scpi_context.param_list.lex_state.buffer);\ |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamBool(&scpi_context, &value, mandatory); \ |
| | | result = SCPI_ParamBool(&scpi_context, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value, expected_value); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | static void testSCPI_ParamBool(void) { |
| | | TEST_ParamBool("ON", TRUE, TRUE, TRUE, 0); |
| | |
| | | { \ |
| | | int32_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamChoice(&scpi_context, test_options, &value, mandatory); \ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value, expected_value); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | static void testSCPI_ParamChoice(void) { |
| | | scpi_choice_def_t test_options[] = { |
| | |
| | | { \ |
| | | scpi_bool_t result; \ |
| | | scpi_expr_result_t result2; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | scpi_parameter_t param; \ |
| | | int32_t val_from, val_to; \ |
| | | scpi_bool_t val_range; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_Parameter(&scpi_context, ¶m, TRUE); \ |
| | | result2 = SCPI_ExprNumericListEntryInt(&scpi_context, ¶m, index, &val_range, &val_from, &val_to);\ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result2, expected_result); \ |
| | | if (expected_result == SCPI_EXPR_OK) { \ |
| | | CU_ASSERT_EQUAL(val_range, expected_range); \ |
| | |
| | | CU_ASSERT_EQUAL(val_to, expected_to); \ |
| | | } \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | #define TEST_NumericListDouble(data, index, expected_range, expected_from, expected_to, expected_result, expected_error_code) \ |
| | | { \ |
| | | scpi_bool_t result; \ |
| | | scpi_expr_result_t result2; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | scpi_parameter_t param; \ |
| | | double val_from, val_to; \ |
| | | scpi_bool_t val_range; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_Parameter(&scpi_context, ¶m, TRUE); \ |
| | | result2 = SCPI_ExprNumericListEntryDouble(&scpi_context, ¶m, index, &val_range, &val_from, &val_to);\ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result2, expected_result); \ |
| | | if (expected_result == SCPI_EXPR_OK) { \ |
| | | CU_ASSERT_EQUAL(val_range, expected_range); \ |
| | |
| | | CU_ASSERT_DOUBLE_EQUAL(val_to, expected_to, 0.0001); \ |
| | | } \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testNumericList(void) { |
| | |
| | | { \ |
| | | scpi_bool_t result; \ |
| | | scpi_expr_result_t result2; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | scpi_parameter_t param; \ |
| | | int32_t val_from[val_len], val_to[val_len]; \ |
| | | scpi_bool_t val_range; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_Parameter(&scpi_context, ¶m, TRUE); \ |
| | | result2 = SCPI_ExprChannelListEntry(&scpi_context, ¶m, index, &val_range, val_from, val_to, val_len, &val_dimensions);\ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result2, expected_result); \ |
| | | if (expected_result == SCPI_EXPR_OK) { \ |
| | | CU_ASSERT_EQUAL(val_dimensions, expected_dimensions); \ |
| | |
| | | }} \ |
| | | } \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testChannelList(void) { |
| | |
| | | { \ |
| | | scpi_number_t value; \ |
| | | scpi_bool_t result; \ |
| | | int16_t errCode; \ |
| | | scpi_error_t errCode; \ |
| | | \ |
| | | SCPI_CoreCls(&scpi_context); \ |
| | | scpi_context.input_count = 0; \ |
| | |
| | | scpi_context.param_list.lex_state.pos = scpi_context.param_list.lex_state.buffer; \ |
| | | result = SCPI_ParamNumber(&scpi_context, scpi_special_numbers_def, &value, mandatory);\ |
| | | \ |
| | | errCode = SCPI_ErrorPop(&scpi_context); \ |
| | | SCPI_ErrorPop(&scpi_context, &errCode); \ |
| | | CU_ASSERT_EQUAL(result, expected_result); \ |
| | | if (expected_result) { \ |
| | | CU_ASSERT_EQUAL(value.special, expected_special); \ |
| | |
| | | CU_ASSERT_EQUAL(value.unit, expected_unit); \ |
| | | CU_ASSERT_EQUAL(value.base, expected_base); \ |
| | | } \ |
| | | CU_ASSERT_EQUAL(errCode, expected_error_code); \ |
| | | CU_ASSERT_EQUAL(errCode.error_code, expected_error_code); \ |
| | | } |
| | | |
| | | static void testParamNumber(void) { |
| | |
| | | } |
| | | |
| | | static void testErrorQueue(void) { |
| | | scpi_error_t val; |
| | | SCPI_ErrorClear(&scpi_context); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 0); |
| | | SCPI_ErrorPush(&scpi_context, -1); |
| | |
| | | SCPI_ErrorPush(&scpi_context, -6); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 4); |
| | | |
| | | CU_ASSERT_EQUAL(SCPI_ErrorPop(&scpi_context), -1); |
| | | SCPI_ErrorPop(&scpi_context, &val); |
| | | CU_ASSERT_EQUAL(val.error_code, -1); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 3); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorPop(&scpi_context), -2); |
| | | SCPI_ErrorPop(&scpi_context, &val); |
| | | CU_ASSERT_EQUAL(val.error_code, -2); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 2); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorPop(&scpi_context), -3); |
| | | SCPI_ErrorPop(&scpi_context, &val); |
| | | CU_ASSERT_EQUAL(val.error_code, -3); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 1); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorPop(&scpi_context), SCPI_ERROR_QUEUE_OVERFLOW); |
| | | SCPI_ErrorPop(&scpi_context, &val); |
| | | CU_ASSERT_EQUAL(val.error_code, SCPI_ERROR_QUEUE_OVERFLOW); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 0); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorPop(&scpi_context), 0); |
| | | SCPI_ErrorPop(&scpi_context, &val); |
| | | CU_ASSERT_EQUAL(val.error_code, 0); |
| | | CU_ASSERT_EQUAL(SCPI_ErrorCount(&scpi_context), 0); |
| | | |
| | | SCPI_ErrorClear(&scpi_context); |