1 /*===========================================================================
2  *  Filename : test-array2list.c
3  *  About    : test for C array <-> Scheme list conversion functions
4  *
5  *  Copyright (c) 2007-2008 SigScheme Project <uim-en AT googlegroups.com>
6  *
7  *  All rights reserved.
8  *
9  *  Redistribution and use in source and binary forms, with or without
10  *  modification, are permitted provided that the following conditions
11  *  are met:
12  *
13  *  1. Redistributions of source code must retain the above copyright
14  *     notice, this list of conditions and the following disclaimer.
15  *  2. Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in the
17  *     documentation and/or other materials provided with the distribution.
18  *  3. Neither the name of authors nor the names of its contributors
19  *     may be used to endorse or promote products derived from this software
20  *     without specific prior written permission.
21  *
22  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
23  *  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25  *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
26  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32  *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 ===========================================================================*/
34 
35 #include <assert.h>
36 
37 #include "sscm-test.h"
38 #include "sigschemeinternal.h"
39 
40 
41 static char *char_ary[] = {
42     "abc",
43     "def",
44     "gh",
45     NULL
46 };
47 
48 static ScmObj
make_str(void * str)49 make_str(void *str)
50 {
51     return MAKE_STRING_COPYING((char *)str, SCM_STRLEN_UNKNOWN);
52 }
53 
54 static void *
refer_c_str(ScmObj str)55 refer_c_str(ScmObj str)
56 {
57     return SCM_STRING_STR(str);
58 }
59 
60 TST_CASE("scm_array2list()")
61 {
62     void **ary;
63 
64     ary = (void **)char_ary;
65 
66     TST_TN_EQ_INT(0, scm_length(scm_array2list(ary, 0, make_str)));
67     TST_TN_TRUE  (        NULLP(scm_array2list(ary, 0, make_str)));
68 
69     TST_TN_EQ_INT(1, scm_length(scm_array2list(ary, 1, make_str)));
70     TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\")"),
71                          scm_array2list(ary, 1, make_str)));
72 
73     TST_TN_EQ_INT(2, scm_length(scm_array2list(ary, 2, make_str)));
74     TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\" \"def\")"),
75                          scm_array2list(ary, 2, make_str)));
76 
77     TST_TN_EQ_INT(3, scm_length(scm_array2list(ary, 3, make_str)));
78     TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\" \"def\" \"gh\")"),
79                          scm_array2list(ary, 3, make_str)));
80 }
81 
82 TST_CASE("scm_array2list() without conversion")
83 {
84     ScmObj obj_ary[4];
85     void **ary;
86 
87     obj_ary[0] = make_str(char_ary[0]);
88     obj_ary[1] = make_str(char_ary[1]);
89     obj_ary[2] = make_str(char_ary[2]);
90     obj_ary[3] = SCM_EOF;
91     ary = (void **)obj_ary;
92 
93     TST_TN_EQ_INT(0, scm_length(scm_array2list(ary, 0, NULL)));
94     TST_TN_TRUE  (        NULLP(scm_array2list(ary, 0, NULL)));
95 
96     TST_TN_EQ_INT(1, scm_length(scm_array2list(ary, 1, NULL)));
97     TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\")"),
98                          scm_array2list(ary, 1, NULL)));
99 
100     TST_TN_EQ_INT(2, scm_length(scm_array2list(ary, 2, NULL)));
101     TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\" \"def\")"),
102                          scm_array2list(ary, 2, NULL)));
103 
104     TST_TN_EQ_INT(3, scm_length(scm_array2list(ary, 3, NULL)));
105     TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\" \"def\" \"gh\")"),
106                          scm_array2list(ary, 3, NULL)));
107 }
108 
109 TST_CASE("scm_list2array()")
110 {
111     const char *list1 = "'(\"abc\")";
112     const char *list3 = "'(\"abc\" \"def\" \"gh\")";
113     void **ary;
114     size_t len;
115 
116     ary = scm_list2array(SCM_NULL, &len, refer_c_str);
117     TST_TN_EQ_INT(0, len);
118 
119     ary = scm_list2array(scm_eval_c_string(list1), &len, refer_c_str);
120     TST_TN_EQ_INT(1, len);
121     TST_TN_EQ_STR("abc", ary[0]);
122 
123     ary = scm_list2array(scm_eval_c_string(list3), &len, refer_c_str);
124     TST_TN_EQ_INT(3, len);
125     TST_TN_EQ_STR("abc", ary[0]);
126     TST_TN_EQ_STR("def", ary[1]);
127     TST_TN_EQ_STR("gh",  ary[2]);
128 }
129 
130 TST_CASE("scm_list2array() without conversion")
131 {
132     const char *list1 = "'(\"abc\")";
133     const char *list3 = "'(\"abc\" \"def\" \"gh\")";
134     void **ary;
135     size_t len;
136 
137     ary = scm_list2array(SCM_NULL, &len, NULL);
138     TST_TN_EQ_INT(0, len);
139 
140     ary = scm_list2array(scm_eval_c_string(list1), &len, NULL);
141     TST_TN_EQ_INT(1, len);
142     TST_TN_TRUE(EQUALP(CONST_STRING("abc"), (ScmObj)ary[0]));
143 
144     ary = scm_list2array(scm_eval_c_string(list3), &len, NULL);
145     TST_TN_EQ_INT(3, len);
146     TST_TN_TRUE(EQUALP(CONST_STRING("abc"), (ScmObj)ary[0]));
147     TST_TN_TRUE(EQUALP(CONST_STRING("def"), (ScmObj)ary[1]));
148     TST_TN_TRUE(EQUALP(CONST_STRING("gh"),  (ScmObj)ary[2]));
149 }
150