star-hitran

Load line-by-line data from the HITRAN database
git clone git://git.meso-star.fr/star-hitran.git
Log | Files | Refs | README | LICENSE

commit 2751f0b5d60e3d864e93ccc9246708978348d3a8
parent 7b169fe717398678476f6a2057518a1b7a003a76
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 11 Feb 2026 12:36:05 +0100

Test the deserialization of a subset of lines

Diffstat:
Msrc/test_shtr_lines.c | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+), 0 deletions(-)

diff --git a/src/test_shtr_lines.c b/src/test_shtr_lines.c @@ -390,6 +390,88 @@ test_serialization(struct shtr* shtr) } static void +test_deserialization_of_a_subset(struct shtr* shtr) +{ + const struct shtr_line l[] = { + {0.000134, 2.672E-38, 0.0533, 0.410, 608.4727, 0.79, 0.000060, 1, 4}, + {0.000379, 1.055E-39, 0.0418, 0.329,1747.9686, 0.79, 0.000110, 1, 5}, + {0.000448, 5.560E-38, 0.0490, 0.364,1093.0269, 0.79, 0.000060, 1, 4}, + {0.000686, 1.633E-36, 0.0578, 0.394, 701.1162, 0.79, 0.000180, 1, 4}, + {0.000726, 6.613E-33, 0.0695, 0.428, 402.3295, 0.79, 0.000240, 1, 3} + }; + const size_t nlines = sizeof(l) / sizeof(struct shtr_line); + + struct shtr_line_list_load_args load_args = SHTR_LINE_LIST_LOAD_ARGS_NULL__; + struct shtr_line_list_read_args read_args = SHTR_LINE_LIST_READ_ARGS_NULL__; + struct shtr_line_list_write_args write_args = SHTR_LINE_LIST_WRITE_ARGS_NULL__; + struct shtr_line_list* list1 = NULL; + struct shtr_line_list* list2 = NULL; + + FILE* fp = NULL; + size_t i = 0; + size_t n = 0; + + CHK(fp = tmpfile()); + print_lines(fp, l, nlines); + rewind(fp); + + load_args.file = fp; + CHK(shtr_line_list_load(shtr, &load_args, &list1) == RES_OK); + CHK(fclose(fp) == 0); + + CHK(fp = tmpfile()); + write_args.file = fp; + CHK(shtr_line_list_write(list1, &write_args) == RES_OK); + + rewind(fp); + read_args.file = fp; + read_args.range[0] = nlines; + CHK(shtr_line_list_read(shtr, &read_args, &list2) == RES_OK); + + CHK(shtr_line_list_get_size(list2, &n) == RES_OK); + CHK(n == 0); + CHK(shtr_line_list_ref_put(list2) == RES_OK); + + rewind(fp); + read_args.range[0] = 0; + read_args.range[1] = nlines-1; /*inclusive bound*/ + CHK(shtr_line_list_read(shtr, &read_args, &list2) == RES_OK); + check_line_list_equality(list1, list2); + CHK(shtr_line_list_ref_put(list2) == RES_OK); + + rewind(fp); + read_args.range[0] = 0; + read_args.range[1] = 2; + CHK(shtr_line_list_read(shtr, &read_args, &list2) == RES_OK); + CHK(shtr_line_list_get_size(list2, &n) == RES_OK); + CHK(n == read_args.range[1] - read_args.range[0] + 1/*inclusive bounds*/); + FOR_EACH(i, 0, n) { + struct shtr_line line1, line2; + CHK(shtr_line_list_at(list1, i, &line1) == RES_OK); + CHK(shtr_line_list_at(list2, i, &line2) == RES_OK); + CHK(shtr_line_eq(&line1, &line2)); + } + CHK(shtr_line_list_ref_put(list2) == RES_OK); + + rewind(fp); + read_args.range[0] = nlines-3; + read_args.range[1] = SIZE_MAX; /* Upper bound will be fit */ + CHK(shtr_line_list_read(shtr, &read_args, &list2) == RES_OK); + CHK(shtr_line_list_get_size(list2, &n) == RES_OK); + CHK(n == 3); + FOR_EACH(i, 0, n) { + struct shtr_line line1, line2; + CHK(shtr_line_list_at(list1, i+read_args.range[0], &line1) == RES_OK); + CHK(shtr_line_list_at(list2, i, &line2) == RES_OK); + CHK(shtr_line_eq(&line1, &line2)); + } + CHK(shtr_line_list_ref_put(list2) == RES_OK); + + CHK(fclose(fp) == 0); + CHK(shtr_line_list_ref_put(list1) == RES_OK); +} + +static void check_line(const struct shtr_line* ln) { /* Check NaN */ @@ -447,6 +529,7 @@ main(int argc, char** argv) test_load(shtr); test_load_failures(shtr); test_serialization(shtr); + test_deserialization_of_a_subset(shtr); FOR_EACH(i, 1, argc) { char buf[64];