1570af302Sopenharmony_ci/*
2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4570af302Sopenharmony_ci * you may not use this file except in compliance with the License.
5570af302Sopenharmony_ci * You may obtain a copy of the License at
6570af302Sopenharmony_ci *
7570af302Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8570af302Sopenharmony_ci *
9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12570af302Sopenharmony_ci * See the License for the specific language governing permissions and
13570af302Sopenharmony_ci * limitations under the License.
14570af302Sopenharmony_ci */
15570af302Sopenharmony_ci
16570af302Sopenharmony_ci#include <stdarg.h>
17570af302Sopenharmony_ci#include <stdio.h>
18570af302Sopenharmony_ci#include <string.h>
19570af302Sopenharmony_ci#include <stdlib.h>
20570af302Sopenharmony_ci#include <signal.h>
21570af302Sopenharmony_ci#include <fcntl.h>
22570af302Sopenharmony_ci#include <locale.h>
23570af302Sopenharmony_ci#include <wchar.h>
24570af302Sopenharmony_ci#include "test.h"
25570af302Sopenharmony_ci
26570af302Sopenharmony_civoid deal_aberrant(int code)
27570af302Sopenharmony_ci{
28570af302Sopenharmony_ci    if (code != SIGSEGV) {
29570af302Sopenharmony_ci        t_error("vfwscanf_0200 code is %d are not SIGSEGV", __func__, code);
30570af302Sopenharmony_ci    }
31570af302Sopenharmony_ci    exit(t_status);
32570af302Sopenharmony_ci}
33570af302Sopenharmony_ci
34570af302Sopenharmony_ciint read_from_file(FILE *fp, const wchar_t *format, ...)
35570af302Sopenharmony_ci{
36570af302Sopenharmony_ci    va_list args;
37570af302Sopenharmony_ci    va_start(args, format);
38570af302Sopenharmony_ci    int result = vfwscanf(fp, format, args);
39570af302Sopenharmony_ci    va_end(args);
40570af302Sopenharmony_ci    return result;
41570af302Sopenharmony_ci}
42570af302Sopenharmony_ci
43570af302Sopenharmony_ci/**
44570af302Sopenharmony_ci * @tc.name      : vfwscanf_0100
45570af302Sopenharmony_ci * @tc.desc      : Test vfwscanf method to read wide string from file
46570af302Sopenharmony_ci * @tc.level     : Level 0
47570af302Sopenharmony_ci */
48570af302Sopenharmony_civoid vfwscanf_0100(void)
49570af302Sopenharmony_ci{
50570af302Sopenharmony_ci    setlocale(LC_ALL, "en_US.UTF-8");
51570af302Sopenharmony_ci
52570af302Sopenharmony_ci    wchar_t symbol[] = L"\u0915\u0916\u0917\u0918\u0919";
53570af302Sopenharmony_ci    wchar_t names[5][5] = {L"Ka", L"Kha", L"Ga", L"Gha", L"Nga"};
54570af302Sopenharmony_ci    FILE *fp = fopen("example.txt", "w+");
55570af302Sopenharmony_ci
56570af302Sopenharmony_ci    for (int i = 0; i < 5; i++)
57570af302Sopenharmony_ci        fwprintf(fp, L"%lc %ls ", symbol[i], names[i]);
58570af302Sopenharmony_ci    rewind(fp);
59570af302Sopenharmony_ci
60570af302Sopenharmony_ci    wchar_t ch, str[5];
61570af302Sopenharmony_ci    for (int i = 0; i < 5; i++) {
62570af302Sopenharmony_ci        read_from_file(fp, L"%lc %ls ", &ch, str);
63570af302Sopenharmony_ci        if (wcscmp(str, names[i]) != 0) {
64570af302Sopenharmony_ci            t_error("%s vfwscanf in %d get result is %ls are not want %ls\n", __func__, i, str, names[i]);
65570af302Sopenharmony_ci        }
66570af302Sopenharmony_ci    }
67570af302Sopenharmony_ci
68570af302Sopenharmony_ci    fclose(fp);
69570af302Sopenharmony_ci    unlink("example.txt");
70570af302Sopenharmony_ci}
71570af302Sopenharmony_ci
72570af302Sopenharmony_ci/**
73570af302Sopenharmony_ci * @tc.name      : vfwscanf_0200
74570af302Sopenharmony_ci * @tc.desc      : Test the result of the vfwscanf function when the incoming file is empty
75570af302Sopenharmony_ci * @tc.level     : Level 2
76570af302Sopenharmony_ci */
77570af302Sopenharmony_civoid vfwscanf_0200(void)
78570af302Sopenharmony_ci{
79570af302Sopenharmony_ci    wchar_t symbol[] = L"\u0915\u0916\u0917\u0918\u0919";
80570af302Sopenharmony_ci    wchar_t names[5][5] = {L"Ka", L"Kha", L"Ga", L"Gha", L"Nga"};
81570af302Sopenharmony_ci    signal(SIGSEGV, deal_aberrant);
82570af302Sopenharmony_ci    read_from_file(NULL, symbol, names);
83570af302Sopenharmony_ci}
84570af302Sopenharmony_ci
85570af302Sopenharmony_ciint main(int argc, char *argv[])
86570af302Sopenharmony_ci{
87570af302Sopenharmony_ci    vfwscanf_0100();
88570af302Sopenharmony_ci    vfwscanf_0200();
89570af302Sopenharmony_ci    return t_status;
90570af302Sopenharmony_ci}