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