1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci
16f6603c60Sopenharmony_ci#include <stdarg.h>
17f6603c60Sopenharmony_ci
18f6603c60Sopenharmony_ci#include <wchar.h>
19f6603c60Sopenharmony_ci
20f6603c60Sopenharmony_ci#include "IoTest.h"
21f6603c60Sopenharmony_ci#include <securec.h>
22f6603c60Sopenharmony_ci
23f6603c60Sopenharmony_ciusing namespace testing::ext;
24f6603c60Sopenharmony_ci
25f6603c60Sopenharmony_ci
26f6603c60Sopenharmony_ciint FormatVfwscanf(FILE *fp, const wchar_t *format, ...)
27f6603c60Sopenharmony_ci{
28f6603c60Sopenharmony_ci    va_list args;
29f6603c60Sopenharmony_ci    va_start(args, format);
30f6603c60Sopenharmony_ci    int ret = vfwscanf(fp, format, args);
31f6603c60Sopenharmony_ci    va_end(args);
32f6603c60Sopenharmony_ci    return ret;
33f6603c60Sopenharmony_ci}
34f6603c60Sopenharmony_ci
35f6603c60Sopenharmony_ciint FormatVfwprintf(FILE *fp, const wchar_t *format, ...)
36f6603c60Sopenharmony_ci{
37f6603c60Sopenharmony_ci    va_list args;
38f6603c60Sopenharmony_ci    va_start(args, format);
39f6603c60Sopenharmony_ci    int ret = vfwprintf(fp, format, args);
40f6603c60Sopenharmony_ci    va_end(args);
41f6603c60Sopenharmony_ci    return ret;
42f6603c60Sopenharmony_ci}
43f6603c60Sopenharmony_ci
44f6603c60Sopenharmony_ci/**
45f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0100
46f6603c60Sopenharmony_ci * @tc.name   vfwprintf basic function test
47f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
48f6603c60Sopenharmony_ci */
49f6603c60Sopenharmony_ciHWTEST_F(IoTest, testVfwprintf, Function | MediumTest | Level1)
50f6603c60Sopenharmony_ci{
51f6603c60Sopenharmony_ci    FILE *fp = nullptr;
52f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
53f6603c60Sopenharmony_ci    int ret = FormatVfwprintf(fp, L"%s has %d words ", "helloworld", 10);
54f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 24);
55f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
56f6603c60Sopenharmony_ci
57f6603c60Sopenharmony_ci    FOPEN_READ(fp);
58f6603c60Sopenharmony_ci    wchar_t wStr[50] = {0};
59f6603c60Sopenharmony_ci    int i;
60f6603c60Sopenharmony_ci    ret = FormatVfwscanf(fp, L"%ls has %d words ", wStr, &i);
61f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 2) << "> vfwscanf return fail, errno = " << errno;
62f6603c60Sopenharmony_ci    EXPECT_STREQ(wStr, L"helloworld");
63f6603c60Sopenharmony_ci    EXPECT_EQ(i, 10);
64f6603c60Sopenharmony_ci
65f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
66f6603c60Sopenharmony_ci}
67f6603c60Sopenharmony_ci
68f6603c60Sopenharmony_ci/**
69f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0200
70f6603c60Sopenharmony_ci * @tc.name   fwprintf basic function test
71f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
72f6603c60Sopenharmony_ci */
73f6603c60Sopenharmony_ciHWTEST_F(IoTest, testFwprintf, Function | MediumTest | Level1)
74f6603c60Sopenharmony_ci{
75f6603c60Sopenharmony_ci    FILE *fp = nullptr;
76f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
77f6603c60Sopenharmony_ci    int ret = fwprintf(fp, L"%s has %d words ", "helloworld", 10);
78f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 24);
79f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
80f6603c60Sopenharmony_ci
81f6603c60Sopenharmony_ci    FOPEN_READ(fp);
82f6603c60Sopenharmony_ci    wchar_t wStr[50] = {0};
83f6603c60Sopenharmony_ci    int i;
84f6603c60Sopenharmony_ci    ret = fwscanf(fp, L"%ls has %d words ", wStr, &i);
85f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 2) << "> vfwscanf return fail, errno = " << errno;
86f6603c60Sopenharmony_ci    EXPECT_STREQ(wStr, L"helloworld");
87f6603c60Sopenharmony_ci    EXPECT_EQ(i, 10);
88f6603c60Sopenharmony_ci
89f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
90f6603c60Sopenharmony_ci}
91f6603c60Sopenharmony_ci
92f6603c60Sopenharmony_ci/**
93f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0300
94f6603c60Sopenharmony_ci * @tc.name   fwide basic function test
95f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
96f6603c60Sopenharmony_ci */
97f6603c60Sopenharmony_ciHWTEST_F(IoTest, testFwide, Function | MediumTest | Level1)
98f6603c60Sopenharmony_ci{
99f6603c60Sopenharmony_ci    FILE *fp = nullptr;
100f6603c60Sopenharmony_ci    INIT_TEST_FILE(fp);
101f6603c60Sopenharmony_ci    FOPEN_READ(fp);
102f6603c60Sopenharmony_ci    int ret = fwide(fp, -6);
103f6603c60Sopenharmony_ci    EXPECT_EQ(ret, -1);
104f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
105f6603c60Sopenharmony_ci
106f6603c60Sopenharmony_ci    FOPEN_READ(fp);
107f6603c60Sopenharmony_ci    ret = fwide(fp, 0);
108f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0);
109f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
110f6603c60Sopenharmony_ci
111f6603c60Sopenharmony_ci    FOPEN_READ(fp);
112f6603c60Sopenharmony_ci    ret = fwide(fp, 8);
113f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 1);
114f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
115f6603c60Sopenharmony_ci}
116f6603c60Sopenharmony_ci
117f6603c60Sopenharmony_ci/**
118f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0400
119f6603c60Sopenharmony_ci * @tc.name   fgetws basic function test
120f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
121f6603c60Sopenharmony_ci */
122f6603c60Sopenharmony_ciHWTEST_F(IoTest, testFgetws, Function | MediumTest | Level1)
123f6603c60Sopenharmony_ci{
124f6603c60Sopenharmony_ci    FILE *fp = nullptr;
125f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
126f6603c60Sopenharmony_ci    wchar_t wStr[50] = {0};
127f6603c60Sopenharmony_ci    wchar_t wStrT[50] = L"hello world";
128f6603c60Sopenharmony_ci    int ret = fputws(wStrT, fp);
129f6603c60Sopenharmony_ci    ASSERT_NE(ret, -1) << "> fputws fail, errno = " << errno;
130f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
131f6603c60Sopenharmony_ci
132f6603c60Sopenharmony_ci    FOPEN_READ(fp);
133f6603c60Sopenharmony_ci    wchar_t *retW = fgetws(wStr, sizeof(wStr)/sizeof(wStr[0]), fp);
134f6603c60Sopenharmony_ci    EXPECT_STREQ(retW, wStrT);
135f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
136f6603c60Sopenharmony_ci}
137f6603c60Sopenharmony_ci
138f6603c60Sopenharmony_ci/**
139f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0500
140f6603c60Sopenharmony_ci * @tc.name   putwc basic function test
141f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
142f6603c60Sopenharmony_ci */
143f6603c60Sopenharmony_ciHWTEST_F(IoTest, testPutwc, Function | MediumTest | Level1)
144f6603c60Sopenharmony_ci{
145f6603c60Sopenharmony_ci    FILE *fp = nullptr;
146f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
147f6603c60Sopenharmony_ci    wint_t ret = putwc(L'A', fp);
148f6603c60Sopenharmony_ci    EXPECT_EQ(ret, L'A');
149f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
150f6603c60Sopenharmony_ci
151f6603c60Sopenharmony_ci    FOPEN_READ(fp);
152f6603c60Sopenharmony_ci    ret = getwc(fp);
153f6603c60Sopenharmony_ci    EXPECT_EQ(ret, L'A');
154f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
155f6603c60Sopenharmony_ci}
156f6603c60Sopenharmony_ci
157f6603c60Sopenharmony_ci/**
158f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0600
159f6603c60Sopenharmony_ci * @tc.name   ungetwc basic function test
160f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWAret -0200]
161f6603c60Sopenharmony_ci */
162f6603c60Sopenharmony_ciHWTEST_F(IoTest, testUngetwc, Function | MediumTest | Level1)
163f6603c60Sopenharmony_ci{
164f6603c60Sopenharmony_ci    FILE *fp = nullptr;
165f6603c60Sopenharmony_ci    INIT_TEST_FILE(fp);
166f6603c60Sopenharmony_ci    FOPEN_READ(fp);
167f6603c60Sopenharmony_ci    wint_t ret = getwc(fp);
168f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 104U);
169f6603c60Sopenharmony_ci    ret = ungetc(ret, fp);
170f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 104U);
171f6603c60Sopenharmony_ci    wchar_t str[50] = {0};
172f6603c60Sopenharmony_ci    wchar_t *retS = fgetws(str, sizeof(str)/sizeof(str[0]), fp);
173f6603c60Sopenharmony_ci    EXPECT_STREQ(retS, str);
174f6603c60Sopenharmony_ci    EXPECT_STREQ(str, L"hello world");
175f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
176f6603c60Sopenharmony_ci}
177f6603c60Sopenharmony_ci
178f6603c60Sopenharmony_ci/**
179f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0700
180f6603c60Sopenharmony_ci * @tc.name   fputwc basic function test
181f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
182f6603c60Sopenharmony_ci */
183f6603c60Sopenharmony_ciHWTEST_F(IoTest, testFputwc, Function | MediumTest | Level1)
184f6603c60Sopenharmony_ci{
185f6603c60Sopenharmony_ci    FILE *fp = nullptr;
186f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
187f6603c60Sopenharmony_ci    wint_t ret = fputwc(L'A', fp);
188f6603c60Sopenharmony_ci    EXPECT_EQ(ret, L'A');
189f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
190f6603c60Sopenharmony_ci
191f6603c60Sopenharmony_ci    FOPEN_READ(fp);
192f6603c60Sopenharmony_ci    ret = fgetwc(fp);
193f6603c60Sopenharmony_ci    EXPECT_EQ(ret, L'A');
194f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
195f6603c60Sopenharmony_ci}
196f6603c60Sopenharmony_ci
197f6603c60Sopenharmony_ci/**
198f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0800
199f6603c60Sopenharmony_ci * @tc.name   fwscanf basic function test
200f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
201f6603c60Sopenharmony_ci */
202f6603c60Sopenharmony_ciHWTEST_F(IoTest, testFwscanf, Function | MediumTest | Level1)
203f6603c60Sopenharmony_ci{
204f6603c60Sopenharmony_ci    FILE *fp = nullptr;
205f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
206f6603c60Sopenharmony_ci    int ret = fwprintf(fp, L"%ls has %d words", L"helloworld", 10);
207f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 23);
208f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
209f6603c60Sopenharmony_ci
210f6603c60Sopenharmony_ci    FOPEN_READ(fp);
211f6603c60Sopenharmony_ci    wchar_t wStr[50] = {0};
212f6603c60Sopenharmony_ci    int i;
213f6603c60Sopenharmony_ci    ret = fwscanf(fp, L"%ls has %d words", wStr, &i);
214f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 2);
215f6603c60Sopenharmony_ci    EXPECT_EQ(i, 10);
216f6603c60Sopenharmony_ci    EXPECT_STREQ(wStr, L"helloworld");
217f6603c60Sopenharmony_ci    ASSERT_NE(fclose(fp), -1) << "> fclose fail, errno = "<< errno;
218f6603c60Sopenharmony_ci}
219f6603c60Sopenharmony_ci
220f6603c60Sopenharmony_ci/**
221f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_0900
222f6603c60Sopenharmony_ci * @tc.name   wmemset  basic function test
223f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
224f6603c60Sopenharmony_ci */
225f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWmemset, Function | MediumTest | Level1)
226f6603c60Sopenharmony_ci{
227f6603c60Sopenharmony_ci    wchar_t dest[50] = {0};
228f6603c60Sopenharmony_ci    wchar_t *ret = wmemset(dest, L'=', 8);
229f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, dest);
230f6603c60Sopenharmony_ci    EXPECT_STREQ(dest, L"========");
231f6603c60Sopenharmony_ci
232f6603c60Sopenharmony_ci    ret = wmemset(dest, L' ', 8);
233f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, dest);
234f6603c60Sopenharmony_ci    EXPECT_STREQ(dest, L"        ");
235f6603c60Sopenharmony_ci
236f6603c60Sopenharmony_ci    ret = wmemset(dest, L'!', 0);
237f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, dest);
238f6603c60Sopenharmony_ci    EXPECT_STREQ(dest, L"        ");
239f6603c60Sopenharmony_ci}
240f6603c60Sopenharmony_ci
241f6603c60Sopenharmony_ci/**
242f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1000
243f6603c60Sopenharmony_ci * @tc.name   wmemchr basic function test
244f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
245f6603c60Sopenharmony_ci */
246f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWmemchr, Function | MediumTest | Level1)
247f6603c60Sopenharmony_ci{
248f6603c60Sopenharmony_ci    wchar_t src[] = L"hello world";
249f6603c60Sopenharmony_ci    wchar_t *ret = wmemchr(src, L' ', sizeof(src)/sizeof(src[0]) - 1);
250f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, L" world");
251f6603c60Sopenharmony_ci
252f6603c60Sopenharmony_ci    wchar_t srcT[] = L"this is string";
253f6603c60Sopenharmony_ci    ret = wmemchr(srcT, L'?', sizeof(srcT)/sizeof(srcT[0]) - 1);
254f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, nullptr);
255f6603c60Sopenharmony_ci}
256f6603c60Sopenharmony_ci
257f6603c60Sopenharmony_ci/**
258f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1100
259f6603c60Sopenharmony_ci * @tc.name   wmemcpy basic function test
260f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
261f6603c60Sopenharmony_ci */
262f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWmemcpy, Function | MediumTest | Level1)
263f6603c60Sopenharmony_ci{
264f6603c60Sopenharmony_ci    wchar_t src[] = L"hello";
265f6603c60Sopenharmony_ci    wchar_t dest[] = L"world ! ! !";
266f6603c60Sopenharmony_ci    wchar_t *ret = wmemcpy(dest, src, 5);
267f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, L"hello ! ! !");
268f6603c60Sopenharmony_ci
269f6603c60Sopenharmony_ci    wchar_t srcT[] = L"this is";
270f6603c60Sopenharmony_ci    wchar_t destT[] = L"string";
271f6603c60Sopenharmony_ci    ret = wmemcpy(destT, srcT, 0);
272f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, destT);
273f6603c60Sopenharmony_ci}
274f6603c60Sopenharmony_ci
275f6603c60Sopenharmony_ci/**
276f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1200
277f6603c60Sopenharmony_ci * @tc.name   wmemmove basic function test
278f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
279f6603c60Sopenharmony_ci */
280f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWmemmove, Function | MediumTest | Level1)
281f6603c60Sopenharmony_ci{
282f6603c60Sopenharmony_ci    wchar_t src[] = L"hello";
283f6603c60Sopenharmony_ci    wchar_t dest[] = L"world ! ! !";
284f6603c60Sopenharmony_ci    wchar_t *ret = wmemmove(dest, src, 5);
285f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, L"hello ! ! !");
286f6603c60Sopenharmony_ci
287f6603c60Sopenharmony_ci    wchar_t srcT[] = L"this is";
288f6603c60Sopenharmony_ci    wchar_t destT[] = L"string";
289f6603c60Sopenharmony_ci    ret = wmemmove(destT, srcT, 0);
290f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, destT);
291f6603c60Sopenharmony_ci}
292f6603c60Sopenharmony_ci
293f6603c60Sopenharmony_ci/**
294f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1300
295f6603c60Sopenharmony_ci * @tc.name   putwchar basic function test
296f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
297f6603c60Sopenharmony_ci */
298f6603c60Sopenharmony_ciHWTEST_F(IoTest, testPutwchar, Function | MediumTest | Level1)
299f6603c60Sopenharmony_ci{
300f6603c60Sopenharmony_ci    for (wchar_t wc = L'A'; wc <= L'Z'; ++wc) {
301f6603c60Sopenharmony_ci        wint_t ret = putwchar(wc);
302f6603c60Sopenharmony_ci        EXPECT_EQ(ret, wc);
303f6603c60Sopenharmony_ci    }
304f6603c60Sopenharmony_ci}
305f6603c60Sopenharmony_ci
306f6603c60Sopenharmony_ci/**
307f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1400
308f6603c60Sopenharmony_ci * @tc.name   wmemcmp basic function test
309f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
310f6603c60Sopenharmony_ci */
311f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWmemcmp, Function | MediumTest | Level1)
312f6603c60Sopenharmony_ci{
313f6603c60Sopenharmony_ci    wchar_t dest[] = L"BBCDEFG";
314f6603c60Sopenharmony_ci    wchar_t src[] = L"CBCDEFF";
315f6603c60Sopenharmony_ci    int ret = wmemcmp(dest, src, 7);
316f6603c60Sopenharmony_ci    EXPECT_LT(ret, 0);
317f6603c60Sopenharmony_ci
318f6603c60Sopenharmony_ci    ret = wmemcmp(L"abcdefg", L"ABCDEFG", 2);
319f6603c60Sopenharmony_ci    EXPECT_GT(ret, 0);
320f6603c60Sopenharmony_ci
321f6603c60Sopenharmony_ci    ret = wmemcmp(L"ABCDEFG", L"ABCDEFG", 6);
322f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0);
323f6603c60Sopenharmony_ci}
324f6603c60Sopenharmony_ci
325f6603c60Sopenharmony_ci/**
326f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1500
327f6603c60Sopenharmony_ci * @tc.name   mbsinit basic function test
328f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
329f6603c60Sopenharmony_ci */
330f6603c60Sopenharmony_ciHWTEST_F(IoTest, testMbsinit, Function | MediumTest | Level1)
331f6603c60Sopenharmony_ci{
332f6603c60Sopenharmony_ci    mbstate_t *ps = nullptr;
333f6603c60Sopenharmony_ci    int ret = mbsinit(ps);
334f6603c60Sopenharmony_ci    int memRet = -1;
335f6603c60Sopenharmony_ci    EXPECT_NE(ret, 0);
336f6603c60Sopenharmony_ci
337f6603c60Sopenharmony_ci    mbstate_t psF;
338f6603c60Sopenharmony_ci    memRet = memset_s(&psF, sizeof(psF), 0, sizeof(psF));
339f6603c60Sopenharmony_ci    EXPECT_EQ(0, memRet);
340f6603c60Sopenharmony_ci    ret = mbsinit(&psF);
341f6603c60Sopenharmony_ci    EXPECT_NE(ret, 0);
342f6603c60Sopenharmony_ci}
343f6603c60Sopenharmony_ci
344f6603c60Sopenharmony_ciint FormatVswscanf(const wchar_t *str, const wchar_t *format, ...)
345f6603c60Sopenharmony_ci{
346f6603c60Sopenharmony_ci    va_list args;
347f6603c60Sopenharmony_ci    va_start(args, format);
348f6603c60Sopenharmony_ci    int ret = vswscanf(str, format, args);
349f6603c60Sopenharmony_ci    va_end(args);
350f6603c60Sopenharmony_ci    return ret;
351f6603c60Sopenharmony_ci}
352f6603c60Sopenharmony_ci
353f6603c60Sopenharmony_ciint FormatVswprintf(const wchar_t *format, ...)
354f6603c60Sopenharmony_ci{
355f6603c60Sopenharmony_ci    va_list args;
356f6603c60Sopenharmony_ci    va_start(args, format);
357f6603c60Sopenharmony_ci    wchar_t str[50] = {0};
358f6603c60Sopenharmony_ci    int ret = vswprintf(str, sizeof(str)/sizeof(str[0]), format, args);
359f6603c60Sopenharmony_ci    fputws(str, stdout);
360f6603c60Sopenharmony_ci    va_end(args);
361f6603c60Sopenharmony_ci    return ret;
362f6603c60Sopenharmony_ci}
363f6603c60Sopenharmony_ci
364f6603c60Sopenharmony_ci/**
365f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1600
366f6603c60Sopenharmony_ci * @tc.name   vswprintf basic function test
367f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
368f6603c60Sopenharmony_ci */
369f6603c60Sopenharmony_ciHWTEST_F(IoTest, testVswprintf, Function | MediumTest | Level1)
370f6603c60Sopenharmony_ci{
371f6603c60Sopenharmony_ci    int ret = FormatVswprintf(L"%ls has %d words", L"helloworld", 10);
372f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 23);
373f6603c60Sopenharmony_ci
374f6603c60Sopenharmony_ci    int i;
375f6603c60Sopenharmony_ci    wchar_t wBuf[50] = {0};
376f6603c60Sopenharmony_ci    wchar_t str[] = L"helloworld has 10 words";
377f6603c60Sopenharmony_ci    ret = FormatVswscanf(str, L"%ls has %d words", wBuf, &i);
378f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 2) << "> vswcanf return fail, errno = " << errno;
379f6603c60Sopenharmony_ci    EXPECT_STREQ(wBuf, L"helloworld");
380f6603c60Sopenharmony_ci    EXPECT_EQ(i, 10);
381f6603c60Sopenharmony_ci}
382f6603c60Sopenharmony_ci
383f6603c60Sopenharmony_ci/**
384f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1700
385f6603c60Sopenharmony_ci * @tc.name   swprintf basic function test
386f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
387f6603c60Sopenharmony_ci */
388f6603c60Sopenharmony_ciHWTEST_F(IoTest, testSwprintf, Function | MediumTest | Level1)
389f6603c60Sopenharmony_ci{
390f6603c60Sopenharmony_ci    wchar_t wBuf[50] = {0};
391f6603c60Sopenharmony_ci    int ret = swprintf(wBuf, sizeof(wBuf)/sizeof(wBuf[0]), L"%ls has %d words", L"helloworld", 10);
392f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 23);
393f6603c60Sopenharmony_ci    EXPECT_STREQ(wBuf, L"helloworld has 10 words");
394f6603c60Sopenharmony_ci
395f6603c60Sopenharmony_ci    wchar_t wStr[50] = {0};
396f6603c60Sopenharmony_ci    int i;
397f6603c60Sopenharmony_ci    ret = swscanf(wBuf, L"%ls has %d words", wStr, &i);
398f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 2) << "> swscanf return fail, errno = " << errno;
399f6603c60Sopenharmony_ci    EXPECT_EQ(i, 10);
400f6603c60Sopenharmony_ci    EXPECT_STREQ(wStr, L"helloworld");
401f6603c60Sopenharmony_ci}
402f6603c60Sopenharmony_ci
403f6603c60Sopenharmony_ci/**
404f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1800
405f6603c60Sopenharmony_ci * @tc.name   wprintf basic function test
406f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
407f6603c60Sopenharmony_ci */
408f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWprintf, Function | MediumTest | Level1)
409f6603c60Sopenharmony_ci{
410f6603c60Sopenharmony_ci    pid_t pid = fork();
411f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
412f6603c60Sopenharmony_ci    if (pid == 0) { // child
413f6603c60Sopenharmony_ci        int rt = 0;
414f6603c60Sopenharmony_ci        FILE *fp = freopen(IOTEST_TEMPFILE, "w", stdout);
415f6603c60Sopenharmony_ci        if (fp == nullptr) {
416f6603c60Sopenharmony_ci            LOG("freopen fail, errno = %d", errno);
417f6603c60Sopenharmony_ci            rt = 1;
418f6603c60Sopenharmony_ci        }
419f6603c60Sopenharmony_ci        if (wprintf(L"%ls %d", L"helloworld", 10) != 13) {
420f6603c60Sopenharmony_ci            LOG("wprintf fail, errno = %d", errno);
421f6603c60Sopenharmony_ci            rt = 1;
422f6603c60Sopenharmony_ci        }
423f6603c60Sopenharmony_ci        if (fclose(fp) == -1) {
424f6603c60Sopenharmony_ci            LOG("fclose fail, errno = %d", errno);
425f6603c60Sopenharmony_ci            rt = 1;
426f6603c60Sopenharmony_ci        }
427f6603c60Sopenharmony_ci        exit(rt);
428f6603c60Sopenharmony_ci    } else { // parent
429f6603c60Sopenharmony_ci        WaitProcExitedOK(pid);
430f6603c60Sopenharmony_ci
431f6603c60Sopenharmony_ci        FILE *fp1 = fopen(IOTEST_TEMPFILE, "r");
432f6603c60Sopenharmony_ci        ASSERT_NE(fp1, nullptr) << "fopen fail, errno = " << errno;
433f6603c60Sopenharmony_ci        wchar_t str[50] = {0};
434f6603c60Sopenharmony_ci        wchar_t *gStr = fgetws(str, sizeof(str)/sizeof(str[0]), fp1);
435f6603c60Sopenharmony_ci        EXPECT_STREQ(gStr, str) << "fgetws fail, errno = " << errno;
436f6603c60Sopenharmony_ci        EXPECT_STREQ(str, L"helloworld 10") << "fgetws fail, errno = " << errno;
437f6603c60Sopenharmony_ci        EXPECT_NE(fclose(fp1), -1) << "> fclose fail, errno = " << errno;
438f6603c60Sopenharmony_ci    }
439f6603c60Sopenharmony_ci}
440f6603c60Sopenharmony_ci
441f6603c60Sopenharmony_ci/**
442f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_1900
443f6603c60Sopenharmony_ci * @tc.name   wscanf basic function test
444f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
445f6603c60Sopenharmony_ci */
446f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWscanf, Function | MediumTest | Level1)
447f6603c60Sopenharmony_ci{
448f6603c60Sopenharmony_ci    FILE  *fp = nullptr;
449f6603c60Sopenharmony_ci    INIT_TEST_FILE(fp);
450f6603c60Sopenharmony_ci    pid_t pid = fork();
451f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
452f6603c60Sopenharmony_ci    if (pid == 0) { // child
453f6603c60Sopenharmony_ci        int rt = 0;
454f6603c60Sopenharmony_ci        FILE *fp1 = freopen(IOTEST_TEMPFILE, "r", stdin);
455f6603c60Sopenharmony_ci        if (fp1 == nullptr) {
456f6603c60Sopenharmony_ci            LOG("freopen fail, errno = %d", errno);
457f6603c60Sopenharmony_ci            rt = 1;
458f6603c60Sopenharmony_ci        }
459f6603c60Sopenharmony_ci        wchar_t str[50] = {0};
460f6603c60Sopenharmony_ci        if (wscanf(L"%ls", str) != 1) {
461f6603c60Sopenharmony_ci            LOG("wscanf fail, errno = %d", errno);
462f6603c60Sopenharmony_ci            rt = 1;
463f6603c60Sopenharmony_ci            if (wcscmp(str, L"hello world") != 0) {
464f6603c60Sopenharmony_ci                LOG("wscanf fail, errno = %d", errno);
465f6603c60Sopenharmony_ci                rt = 1;
466f6603c60Sopenharmony_ci            }
467f6603c60Sopenharmony_ci        }
468f6603c60Sopenharmony_ci        if (fclose(fp1) == -1) {
469f6603c60Sopenharmony_ci            LOG("fclose  fail, errno = %d", errno);
470f6603c60Sopenharmony_ci        }
471f6603c60Sopenharmony_ci        exit(rt);
472f6603c60Sopenharmony_ci    } else { // parent
473f6603c60Sopenharmony_ci        WaitProcExitedOK(pid);
474f6603c60Sopenharmony_ci    }
475f6603c60Sopenharmony_ci}
476f6603c60Sopenharmony_ci
477f6603c60Sopenharmony_ciint FormatVwprintf(const wchar_t *format, ...)
478f6603c60Sopenharmony_ci{
479f6603c60Sopenharmony_ci    va_list argPtr;
480f6603c60Sopenharmony_ci    va_start(argPtr, format);
481f6603c60Sopenharmony_ci    int ret = vwprintf(format, argPtr);
482f6603c60Sopenharmony_ci    va_end(argPtr);
483f6603c60Sopenharmony_ci    return ret;
484f6603c60Sopenharmony_ci}
485f6603c60Sopenharmony_ci
486f6603c60Sopenharmony_ci/**
487f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_2000
488f6603c60Sopenharmony_ci * @tc.name   vwprintf basic function test
489f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
490f6603c60Sopenharmony_ci */
491f6603c60Sopenharmony_ciHWTEST_F(IoTest, testVwprintf, Function | MediumTest | Level1)
492f6603c60Sopenharmony_ci{
493f6603c60Sopenharmony_ci    pid_t pid = fork();
494f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
495f6603c60Sopenharmony_ci    if (pid == 0) { // child
496f6603c60Sopenharmony_ci        int rt = 0;
497f6603c60Sopenharmony_ci        FILE *fp = freopen(IOTEST_TEMPFILE, "w", stdout);
498f6603c60Sopenharmony_ci        if (fp == nullptr) {
499f6603c60Sopenharmony_ci            LOG("freopen fail, errno = %d", errno);
500f6603c60Sopenharmony_ci            rt = 1;
501f6603c60Sopenharmony_ci        }
502f6603c60Sopenharmony_ci        if (FormatVwprintf(L"%ls %d", L"helloworld", 10) != 13) {
503f6603c60Sopenharmony_ci            LOG("vwprintf fail, errno = %d", errno);
504f6603c60Sopenharmony_ci            rt = 1;
505f6603c60Sopenharmony_ci        }
506f6603c60Sopenharmony_ci        if (fclose(fp) == -1) {
507f6603c60Sopenharmony_ci            LOG("fclose fail, errno = %d", errno);
508f6603c60Sopenharmony_ci            rt = 1;
509f6603c60Sopenharmony_ci        }
510f6603c60Sopenharmony_ci        exit(rt);
511f6603c60Sopenharmony_ci    } else { // parent
512f6603c60Sopenharmony_ci        WaitProcExitedOK(pid);
513f6603c60Sopenharmony_ci
514f6603c60Sopenharmony_ci        FILE *fp1 = fopen(IOTEST_TEMPFILE, "r");
515f6603c60Sopenharmony_ci        ASSERT_NE(fp1, nullptr) << "fopen fail, errno = " << errno;
516f6603c60Sopenharmony_ci        wchar_t str[50] = {0};
517f6603c60Sopenharmony_ci        wchar_t *gStr = fgetws(str, sizeof(str)/sizeof(str[0]), fp1);
518f6603c60Sopenharmony_ci        EXPECT_STREQ(gStr, str) << "fgetws fail, errno = " << errno;
519f6603c60Sopenharmony_ci        EXPECT_STREQ(str, L"helloworld 10") << "fgetws fail, errno = " << errno;
520f6603c60Sopenharmony_ci        EXPECT_NE(fclose(fp1), -1) << "> fclose fail, errno = " << errno;
521f6603c60Sopenharmony_ci    }
522f6603c60Sopenharmony_ci}
523f6603c60Sopenharmony_ci
524f6603c60Sopenharmony_ciint FormatVwscanf(const wchar_t *format, ...)
525f6603c60Sopenharmony_ci{
526f6603c60Sopenharmony_ci    va_list argPtr;
527f6603c60Sopenharmony_ci    va_start(argPtr, format);
528f6603c60Sopenharmony_ci    int ret = vwscanf(format, argPtr);
529f6603c60Sopenharmony_ci    va_end(argPtr);
530f6603c60Sopenharmony_ci    return ret;
531f6603c60Sopenharmony_ci}
532f6603c60Sopenharmony_ci
533f6603c60Sopenharmony_ci/**
534f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_2100
535f6603c60Sopenharmony_ci * @tc.name   vwscanf basic function test
536f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
537f6603c60Sopenharmony_ci */
538f6603c60Sopenharmony_ciHWTEST_F(IoTest, testVwscanf, Function | MediumTest | Level1)
539f6603c60Sopenharmony_ci{
540f6603c60Sopenharmony_ci    FILE *fp = nullptr;
541f6603c60Sopenharmony_ci    INIT_TEST_FILE(fp);
542f6603c60Sopenharmony_ci    pid_t pid = fork();
543f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
544f6603c60Sopenharmony_ci    if (pid == 0) { // child
545f6603c60Sopenharmony_ci        int rt = 0;
546f6603c60Sopenharmony_ci        FILE *fp1 = freopen(IOTEST_TEMPFILE, "r", stdin);
547f6603c60Sopenharmony_ci        if (fp1 == nullptr) {
548f6603c60Sopenharmony_ci            LOG("freopen fail, errno = %d", errno);
549f6603c60Sopenharmony_ci            rt = 1;
550f6603c60Sopenharmony_ci        }
551f6603c60Sopenharmony_ci        wchar_t str[50] = {0};
552f6603c60Sopenharmony_ci        if (FormatVwscanf(L"%ls", str) != 1) {
553f6603c60Sopenharmony_ci            LOG("vwscanf fail, errno = %d", errno);
554f6603c60Sopenharmony_ci            rt = 1;
555f6603c60Sopenharmony_ci            if (wcscmp(str, L"hello world") != 0) {
556f6603c60Sopenharmony_ci                LOG("vwscanf fail, errno = %d", errno);
557f6603c60Sopenharmony_ci                rt = 1;
558f6603c60Sopenharmony_ci            }
559f6603c60Sopenharmony_ci        }
560f6603c60Sopenharmony_ci        if (fclose(fp1) == -1) {
561f6603c60Sopenharmony_ci            LOG("fclose fail, errno = %d", errno);
562f6603c60Sopenharmony_ci        }
563f6603c60Sopenharmony_ci        exit(rt);
564f6603c60Sopenharmony_ci    } else { // parent
565f6603c60Sopenharmony_ci        WaitProcExitedOK(pid);
566f6603c60Sopenharmony_ci    }
567f6603c60Sopenharmony_ci}
568f6603c60Sopenharmony_ci
569f6603c60Sopenharmony_ci/**
570f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_2200
571f6603c60Sopenharmony_ci * @tc.name   getwchar basic function test
572f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
573f6603c60Sopenharmony_ci */
574f6603c60Sopenharmony_ciHWTEST_F(IoTest, testGetwchar, Function | MediumTest | Level1)
575f6603c60Sopenharmony_ci{
576f6603c60Sopenharmony_ci    FILE *fp = nullptr;
577f6603c60Sopenharmony_ci    INIT_TEST_FILE(fp);
578f6603c60Sopenharmony_ci    pid_t pid = fork();
579f6603c60Sopenharmony_ci    ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
580f6603c60Sopenharmony_ci    if (pid == 0) { // child
581f6603c60Sopenharmony_ci        int rt = 0;
582f6603c60Sopenharmony_ci        FILE *fp1 = freopen(IOTEST_TEMPFILE, "r", stdin);
583f6603c60Sopenharmony_ci        if (fp1 == nullptr) {
584f6603c60Sopenharmony_ci            LOG("freopen fail, errno = %d", errno);
585f6603c60Sopenharmony_ci            rt = 1;
586f6603c60Sopenharmony_ci        }
587f6603c60Sopenharmony_ci        if (getwchar() != 104) {
588f6603c60Sopenharmony_ci            LOG("getwchar fail, errno = %d", errno);
589f6603c60Sopenharmony_ci            rt = 1;
590f6603c60Sopenharmony_ci        }
591f6603c60Sopenharmony_ci        if (fclose(fp1) == -1) {
592f6603c60Sopenharmony_ci            LOG("fclose fail, errno = %d", errno);
593f6603c60Sopenharmony_ci            rt = 1;
594f6603c60Sopenharmony_ci        }
595f6603c60Sopenharmony_ci        exit(rt);
596f6603c60Sopenharmony_ci    } else { // parent
597f6603c60Sopenharmony_ci        WaitProcExitedOK(pid);
598f6603c60Sopenharmony_ci    }
599f6603c60Sopenharmony_ci}
600f6603c60Sopenharmony_ci
601f6603c60Sopenharmony_ci/**
602f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_WCHAR_2300
603f6603c60Sopenharmony_ci * @tc.name   btowc basic function test
604f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
605f6603c60Sopenharmony_ci */
606f6603c60Sopenharmony_ciHWTEST_F(IoTest, testBtowc, Function | MediumTest | Level1)
607f6603c60Sopenharmony_ci{
608f6603c60Sopenharmony_ci    EXPECT_EQ(btowc('6'), L'6');
609f6603c60Sopenharmony_ci
610f6603c60Sopenharmony_ci    EXPECT_EQ(btowc('A'), L'A');
611f6603c60Sopenharmony_ci
612f6603c60Sopenharmony_ci    EXPECT_EQ(btowc('&'), L'&');
613f6603c60Sopenharmony_ci
614f6603c60Sopenharmony_ci    EXPECT_EQ(btowc(EOF), WEOF);
615f6603c60Sopenharmony_ci}