From 09a85995bb4440d2060d478eab89b7e714386ef9 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: ćšć, 10 9æ 2015 07:31:18 +0800 Subject: [PATCH] mend --- libscpi/src/expression.c | 12 +++-- libscpi/inc/scpi/scpi.h | 2 libscpi/test/test_parser.c | 84 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/libscpi/inc/scpi/scpi.h b/libscpi/inc/scpi/scpi.h index f511213..e7fe50f 100644 --- a/libscpi/inc/scpi/scpi.h +++ b/libscpi/inc/scpi/scpi.h @@ -44,7 +44,7 @@ #include "scpi/minimal.h" #include "scpi/units.h" #include "scpi/utils.h" - +#include "scpi/expression.h" #endif /* SCPI_H */ diff --git a/libscpi/src/expression.c b/libscpi/src/expression.c index e0cae6c..9625f03 100644 --- a/libscpi/src/expression.c +++ b/libscpi/src/expression.c @@ -62,7 +62,7 @@ { lex_state_t lex; int i; - scpi_expr_result_t res; + scpi_expr_result_t res = SCPI_EXPR_OK; if (!isRange || !valueFrom || !valueTo || !param) { SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR); @@ -77,7 +77,7 @@ lex.buffer = param->ptr + 1; lex.pos = lex.buffer; lex.len = param->len - 2; - + for (i = 0; i <= index; i++) { res = numericRange(&lex, isRange, valueFrom, valueTo); if (res != SCPI_EXPR_OK) { @@ -85,7 +85,7 @@ } if (i != index) { if (!scpiLex_Comma(&lex, valueFrom)) { - res = SCPI_EXPR_ERROR; + res = scpiLex_IsEos(&lex) ? SCPI_EXPR_NO_MORE : SCPI_EXPR_ERROR; break; } } @@ -106,9 +106,10 @@ res = SCPI_ExprNumericListEntry(context, param, index, &range, ¶mFrom, ¶mTo); if (res == SCPI_EXPR_OK) { + *isRange = range; SCPI_ParamToInt(context, ¶mFrom, valueFrom); if (range) { - SCPI_ParamToInt(context, ¶mTo, valueFrom); + SCPI_ParamToInt(context, ¶mTo, valueTo); } } @@ -124,9 +125,10 @@ res = SCPI_ExprNumericListEntry(context, param, index, &range, ¶mFrom, ¶mTo); if (res == SCPI_EXPR_OK) { + *isRange = range; SCPI_ParamToDouble(context, ¶mFrom, valueFrom); if (range) { - SCPI_ParamToDouble(context, ¶mTo, valueFrom); + SCPI_ParamToDouble(context, ¶mTo, valueTo); } } diff --git a/libscpi/test/test_parser.c b/libscpi/test/test_parser.c index ed403d7..b80790f 100644 --- a/libscpi/test/test_parser.c +++ b/libscpi/test/test_parser.c @@ -444,6 +444,89 @@ } +#define TEST_NumericListInt(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_parameter_t param; \ + int32_t val_from, val_to; \ + scpi_bool_t val_range; \ + \ + 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_Parameter(&scpi_context, ¶m, TRUE); \ + result2 = SCPI_ExprNumericListEntryInt(&scpi_context, ¶m, index, &val_range, &val_from, &val_to);\ + errCode = SCPI_ErrorPop(&scpi_context); \ + CU_ASSERT_EQUAL(result2, expected_result); \ + if (expected_result == SCPI_EXPR_OK) { \ + CU_ASSERT_EQUAL(val_range, expected_range); \ + CU_ASSERT_EQUAL(val_from, expected_from); \ + if (expected_range) { \ + CU_ASSERT_EQUAL(val_to, expected_to); \ + } \ + } \ + CU_ASSERT_EQUAL(errCode, 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_parameter_t param; \ + double val_from, val_to; \ + scpi_bool_t val_range; \ + \ + 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_Parameter(&scpi_context, ¶m, TRUE); \ + result2 = SCPI_ExprNumericListEntryDouble(&scpi_context, ¶m, index, &val_range, &val_from, &val_to);\ + errCode = SCPI_ErrorPop(&scpi_context); \ + CU_ASSERT_EQUAL(result2, expected_result); \ + if (expected_result == SCPI_EXPR_OK) { \ + CU_ASSERT_EQUAL(val_range, expected_range); \ + CU_ASSERT_DOUBLE_EQUAL(val_from, expected_from, 0.0001); \ + if (expected_range) { \ + CU_ASSERT_DOUBLE_EQUAL(val_to, expected_to, 0.0001); \ + } \ + } \ + CU_ASSERT_EQUAL(errCode, expected_error_code); \ +} + +static void testNumericList(void) { + TEST_NumericListInt("(1:2,5:6)", 0, TRUE, 1, 2, SCPI_EXPR_OK, 0); + TEST_NumericListInt("(1:2,5:6)", 1, TRUE, 5, 6, SCPI_EXPR_OK, 0); + TEST_NumericListInt("(1:2,5:6)", 2, FALSE, 0, 0, SCPI_EXPR_NO_MORE, 0); + + TEST_NumericListInt("(12,5:6)", 0, FALSE, 12, 0, SCPI_EXPR_OK, 0); + TEST_NumericListInt("(12,5:6)", 1, TRUE, 5, 6, SCPI_EXPR_OK, 0); + TEST_NumericListInt("(12,5:6)", 2, FALSE, 0, 0, SCPI_EXPR_NO_MORE, 0); + + TEST_NumericListInt("(12,5:6:3)", 0, FALSE, 12, 0, SCPI_EXPR_OK, 0); + TEST_NumericListInt("(12,5:6:3)", 1, TRUE, 5, 6, SCPI_EXPR_OK, 0); + TEST_NumericListInt("(12,5:6:3)", 2, FALSE, 0, 0, SCPI_EXPR_ERROR, SCPI_ERROR_EXPRESSION_PARSING_ERROR); + + TEST_NumericListDouble("(1:2,5:6)", 0, TRUE, 1, 2, SCPI_EXPR_OK, 0); + TEST_NumericListDouble("(1:2,5:6)", 1, TRUE, 5, 6, SCPI_EXPR_OK, 0); + TEST_NumericListDouble("(1:2,5:6)", 2, FALSE, 0, 0, SCPI_EXPR_NO_MORE, 0); + + TEST_NumericListDouble("(12,5:6)", 0, FALSE, 12, 0, SCPI_EXPR_OK, 0); + TEST_NumericListDouble("(12,5:6)", 1, TRUE, 5, 6, SCPI_EXPR_OK, 0); + TEST_NumericListDouble("(12,5:6)", 2, FALSE, 0, 0, SCPI_EXPR_NO_MORE, 0); + + TEST_NumericListDouble("(12,5:6:3)", 0, FALSE, 12, 0, SCPI_EXPR_OK, 0); + TEST_NumericListDouble("(12,5:6:3)", 1, TRUE, 5, 6, SCPI_EXPR_OK, 0); + TEST_NumericListDouble("(12,5:6:3)", 2, FALSE, 0, 0, SCPI_EXPR_ERROR, SCPI_ERROR_EXPRESSION_PARSING_ERROR); +} + + int main() { unsigned int result; CU_pSuite pSuite = NULL; @@ -467,6 +550,7 @@ || (NULL == CU_add_test(pSuite, "Commands handling", testCommandsHandling)) || (NULL == CU_add_test(pSuite, "Error handling", testErrorHandling)) || (NULL == CU_add_test(pSuite, "IEEE 488.2 Mandatory commands", testIEEE4882)) + || (NULL == CU_add_test(pSuite, "Numeric list", testNumericList)) ) { CU_cleanup_registry(); return CU_get_error(); -- Gitblit v1.9.1