/* $Id: cpl_frameset-test.c,v 1.17 2007/12/11 10:36:20 llundin Exp $ * * This file is part of the ESO Common Pipeline Library * Copyright (C) 2001-2005 European Southern Observatory * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: llundin $ * $Date: 2007/12/11 10:36:20 $ * $Revision: 1.17 $ * $Name: $ */ #undef CX_DISABLE_ASSERT #undef CX_LOG_DOMAIN #include #include #include #include #include #include #include #include "cpl_frameset.h" static int nframe = 0; static int frame_equal(const cpl_frame * frame1, const cpl_frame * frame2) { if (frame1 == NULL) return -1; if (frame2 == NULL) return -1; return 1; } static int frame_differ(const cpl_frame * frame1, const cpl_frame * frame2) { if (frame1 == NULL) return -1; if (frame2 == NULL) return -1; return frame1 == frame2 ? 1 : 0; } static int frame_oddeven(const cpl_frame * frame1, const cpl_frame * frame2) { if (frame1 == NULL) return -1; if (frame2 == NULL) return -1; if (frame1 == frame2) return 1; return (nframe++ & 1); } int main(void) { const cxchar *names[] = { "flat1.fits", "flat2.fits", "flat3.fits", "bias1.fits", "bias2.fits", "bias3.fits", "mbias.fits", "mflat.fits", "science.fits", "product.fits" }; const cxchar *tags[] = { "FLAT", "FLAT", "FLAT", "BIAS", "BIAS", "BIAS", "MASTER_BIAS", "MASTER_FLAT", "SCIENCE", "SCIENCE,CALIBRATED" }; cpl_frame_group groups[] = { CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_CALIB, CPL_FRAME_GROUP_CALIB, CPL_FRAME_GROUP_RAW, CPL_FRAME_GROUP_PRODUCT }; cpl_frame_level levels[] = { CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_NONE, CPL_FRAME_LEVEL_FINAL }; cxlong i; cpl_frame *frame, *_frame; cpl_frameset *frameset, *_frameset; cpl_frameset *allframes; cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING); /* Insert tests below */ /* * Test 1: Create a frameset and check its validity. */ frameset = cpl_frameset_new(); cx_assert(frameset != NULL); cx_assert(cpl_frameset_is_empty(frameset)); cx_assert(cpl_frameset_get_size(frameset) == 0); /* * Test 2: Add frames to the frame set created in the previous test * and verify the data. */ for (i = 0; (cxsize)i < CX_N_ELEMENTS(names); i++) { _frame = cpl_frame_new(); cpl_frame_set_filename(_frame, names[i]); cpl_frame_set_tag(_frame, tags[i]); cpl_frame_set_type(_frame, CPL_FRAME_TYPE_IMAGE); cpl_frame_set_group(_frame, groups[i]); cpl_frame_set_level(_frame, levels[i]); cpl_frameset_insert(frameset, _frame); } cx_assert(!cpl_frameset_is_empty(frameset)); cx_assert(cpl_frameset_get_size(frameset) == CX_N_ELEMENTS(names)); cx_assert(cpl_frameset_count_tags(frameset, tags[0]) == 3); cx_assert(cpl_frameset_count_tags(frameset, tags[3]) == 3); cx_assert(cpl_frameset_count_tags(frameset, tags[6]) == 1); cx_assert(cpl_frameset_count_tags(frameset, tags[7]) == 1); cx_assert(cpl_frameset_count_tags(frameset, tags[8]) == 1); cx_assert(cpl_frameset_count_tags(frameset, tags[9]) == 1); allframes = cpl_frameset_duplicate(frameset); /* * Test 3: Lookup frames in the set and verify that the right frames * are found. */ frame = cpl_frameset_find(frameset, tags[0]); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[0])); frame = cpl_frameset_find(frameset, NULL); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[1])); frame = cpl_frameset_find(frameset, NULL); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[2])); cx_assert(cpl_frameset_find(frameset, NULL) == NULL); /* * Test 4: Verify that the internal cache is reset correctly. */ cpl_frameset_find(frameset, tags[0]); frame = cpl_frameset_find(frameset, NULL); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[1])); cpl_frameset_find(frameset, tags[3]); frame = cpl_frameset_find(frameset, NULL); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[4])); /* * Test 5: Check side effects when mixing calls to * cpl_frameset_find/begin/next() */ cpl_frameset_find(frameset, tags[3]); frame = cpl_frameset_find(frameset, NULL); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[4])); cpl_frameset_get_first(frameset); frame = cpl_frameset_find(frameset, NULL); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[5])); frame = cpl_frameset_get_next(frameset); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[1])); /* Skip to flat1.fits */ frame = cpl_frameset_get_first(frameset); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[0])); cpl_frameset_find(frameset, tags[8]); frame = cpl_frameset_get_next(frameset); cx_assert(!strcmp(cpl_frame_get_filename(frame), names[1])); /* >>> Add test 6 & 7 here <<< */ /* * Test 6: Erase frames by tag from the frame set and verify the set * structure and its contents. */ cx_assert(cpl_frameset_erase(frameset, tags[0]) == 3); cx_assert(cpl_frameset_get_size(frameset) == (CX_N_ELEMENTS(tags) - 3)); cx_assert(cpl_frameset_count_tags(frameset, tags[0]) == 0); /* * Test 7: Erase frames from the frame set and verify the set * structure and its contents. */ frame = cpl_frameset_find(frameset, tags[3]); while (frame) { cpl_frame *f = frame; frame = cpl_frameset_find(frameset, NULL); cpl_frameset_erase_frame(frameset, f); }; cx_assert(cpl_frameset_get_size(frameset) == (CX_N_ELEMENTS(tags) - 6)); cx_assert(cpl_frameset_count_tags(frameset, tags[3]) == 0); i = 6; frame = cpl_frameset_get_first(frameset); while (frame) { cx_assert(!strcmp(cpl_frame_get_filename(frame), names[i++])); frame = cpl_frameset_get_next(frameset); } /* * Test 8: Create a copy of the frame set and verify that original and * copy are identical but do not share any resources. */ _frameset = cpl_frameset_duplicate(frameset); cx_assert(_frameset != NULL); cx_assert(_frameset != frameset); cx_assert(cpl_frameset_get_size(_frameset) == cpl_frameset_get_size(frameset)); frame = cpl_frameset_get_first(frameset); _frame = cpl_frameset_get_first(_frameset); while (frame) { cx_assert(cpl_frame_get_filename(_frame) != cpl_frame_get_filename(frame)); cx_assert(!strcmp(cpl_frame_get_filename(_frame), cpl_frame_get_filename(frame))); cx_assert(cpl_frame_get_tag(_frame) != cpl_frame_get_tag(frame)); cx_assert(!strcmp(cpl_frame_get_tag(_frame), cpl_frame_get_tag(frame))); frame = cpl_frameset_get_next(frameset); _frame = cpl_frameset_get_next(_frameset); } /* * Test 9: Tests of cpl_frameset_labelise() and cpl_frameset_extract(). */ { int nlabs; const int *labnull = cpl_frameset_labelise(allframes, NULL, &nlabs); int *labels; const cpl_frameset * setnull; cx_assert(labnull == NULL); cpl_test_error(CPL_ERROR_NULL_INPUT); setnull = cpl_frameset_extract(allframes, labnull, 0); cx_assert(setnull == NULL); cpl_test_error(CPL_ERROR_NULL_INPUT); /* All frames are equal */ labels = cpl_frameset_labelise(allframes, frame_equal, &nlabs); cx_assert(labels != NULL); cpl_test_error(CPL_ERROR_NONE); cx_assert(nlabs == 1); while (nlabs-- > 0) { cx_assert(labels[nlabs] == nlabs); } cx_free(labels); /* All frames differ */ labels = cpl_frameset_labelise(allframes, frame_differ, &nlabs); cx_assert(labels != NULL); cpl_test_error(CPL_ERROR_NONE); cx_assert(nlabs == cpl_frameset_get_size(allframes)); while (nlabs-- > 0) { cx_assert(labels[nlabs] == nlabs); } cx_free(labels); /* Two labels */ labels = cpl_frameset_labelise(allframes, frame_oddeven, &nlabs); cx_assert(labels != NULL); cpl_test_error(CPL_ERROR_NONE); cx_assert(nlabs == 2); cx_free(labels); } cpl_frameset_delete(_frameset); cpl_frameset_delete(frameset); cpl_frameset_delete(allframes); /* End of tests */ return cpl_test_end(0); }