1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <stdio.h>
17#include <stdlib.h>
18#include <unistd.h>
19#include <math.h>
20#include "log.h"
21#include "gtest/gtest.h"
22#include "inttypes.h"
23
24using namespace testing::ext;
25
26class MathStdApiTest : public testing::Test {
27};
28
29/**
30* @tc.number     SUB_KERNEL_MATH_STD_STDLIB_0100
31* @tc.name       test abs api
32* @tc.desc       [C- SOFTWARE -0100]
33*/
34HWTEST_F(MathStdApiTest, testAbs, Function | MediumTest | Level1) {
35
36    const int testCount = 3;
37    int testValues[] = {-3, 0, 3};
38    int expected[] = {3, 0, 3};
39    int ret;
40    for (int i = 0; i < testCount; ++i) {
41        ret = abs(testValues[i]);
42        EXPECT_EQ(ret, expected[i]) << "abs failed";
43    }
44}
45
46/**
47* @tc.number     SUB_KERNEL_MATH_STD_DIV_0100
48* @tc.name       test div api
49* @tc.desc       [C- SOFTWARE -0100]
50*/
51HWTEST_F(MathStdApiTest, testDiv, Function | MediumTest | Level1) {
52
53    const int testCount = 3;
54    int numer[]={11, -11, 0};
55    int denom[]={2, 2, -1};
56    int aquot[] = {5, -5, 0};
57    int arem[] = {1, -1, 0};
58
59    div_t ret;
60    for (int i = 0; i < testCount; ++i) {
61        ret = div(numer[i], denom[i]);
62        ASSERT_TRUE(ret.quot == aquot[i] && ret.rem == arem[i]) << " div failed";
63    }
64}
65
66/**
67* @tc.number SUB_KERNEL_MATH_STD_IMAXABS_0100
68* @tc.name test imaxabs api
69* @tc.desc [C- SOFTWARE -0100]
70**/
71HWTEST_F(MathStdApiTest, testimaxabs, Function | MediumTest | Level1) {
72
73    const int testCount = 3;
74    intmax_t testValues[] = {3765, -1234, 0};
75    intmax_t expected[] = {3765, 1234, 0};
76
77    intmax_t ret;
78    for (int i = 0; i < testCount; ++i) {
79        ret = imaxabs(testValues[i]);
80        EXPECT_EQ(ret, expected[i]) << " imaxabs failed";
81    }
82}
83
84/**
85* @tc.number SUB_KERNEL_MATH_STD_IMAXDIV_0100
86* @tc.name test imaxdiv api
87* @tc.desc [C- SOFTWARE -0100]
88**/
89HWTEST_F(MathStdApiTest, testimaxdiv, Function | MediumTest | Level1) {
90
91    const int testCount = 4;
92    intmax_t numerator[] = {2000000000, 2000000000, -2000000001, -2000000001};
93    intmax_t denominator[] = {2, -2, 2, -2};
94    intmax_t expected[] = {1000000000, -1000000000, -1000000000, 1000000000};
95
96    imaxdiv_t ret;
97    for (int i = 0; i < testCount; ++i) {
98        ret = imaxdiv(numerator[i], denominator[i]);
99        ASSERT_TRUE(ret.quot == expected[i]) << " imaxdiv failed";
100    }
101}
102
103/**
104* @tc.number SUB_KERNEL_MATH_STD_LABS_0100
105* @tc.name test labs api
106* @tc.desc [C- SOFTWARE -0100]
107**/
108HWTEST_F(MathStdApiTest, testlabs, Function | MediumTest | Level1) {
109
110    const int testCount = 3;
111    long testValues[] = {214748364, -214748364, 0};
112    long expected[] = {214748364, 214748364, 0};
113
114    long ret;
115    for (int i = 0; i < testCount; ++i) {
116        ret = labs(testValues[i]);
117        EXPECT_EQ(ret, expected[i]) << " labs failed";
118    }
119}
120
121/**
122* @tc.number SUB_KERNEL_MATH_STD_LDIV_0100
123* @tc.name test ldiv api
124* @tc.desc [C- SOFTWARE -0100]
125**/
126HWTEST_F(MathStdApiTest, testldiv, Function | MediumTest | Level1) {
127
128    const int testCount = 4;
129    long numer[] = {20000000, 20000000, -20000001, -20000001};
130    long denom[] = {2, -2, 2, -2};
131    long aquot[] = {10000000, -10000000, -10000000, 10000000};
132    long arem[] = {0, 0, -1, -1};
133
134    ldiv_t ret;
135    for (int i = 0; i < testCount; ++i) {
136        ret = ldiv(numer[i], denom[i]);
137        ASSERT_TRUE(ret.quot == aquot[i] && ret.rem == arem[i]) << " ldiv failed";
138    }
139}
140
141/**
142* @tc.number SUB_KERNEL_MATH_STD_LLABS_0100
143* @tc.name test llabs api
144* @tc.desc [C- SOFTWARE -0100]
145**/
146HWTEST_F(MathStdApiTest, testllabs, Function | MediumTest | Level1) {
147
148    const int testCount = 3;
149    intmax_t testValues[] = {2147483649, -2147483649, 0};
150    intmax_t expected[] = {2147483649, 2147483649, 0};
151
152    float ret;
153    for (int i = 0; i < testCount; ++i) {
154        ret = llabs(testValues[i]);
155        EXPECT_EQ(ret, expected[i]) << " llabs failed";
156    }
157}
158
159/**
160* @tc.number SUB_KERNEL_MATH_STD_LLDIV_0100
161* @tc.name test lldiv api
162* @tc.desc [C- SOFTWARE -0100]
163**/
164HWTEST_F(MathStdApiTest, testlldiv, Function | MediumTest | Level1) {
165
166    const int testCount = 4;
167    long long numer[] = {20000000000, 20000000000, -20000000001, -20000000001};
168    long long denom[] = {2, -2, 2, -2};
169    long long aquot[] = {10000000000, -10000000000, -10000000000, 10000000000};
170    long long arem[] = {0, 0, -1, -1};
171
172    lldiv_t ret;
173    for (int i = 0; i < testCount; ++i) {
174        ret = lldiv(numer[i], denom[i]);
175        ASSERT_TRUE(ret.quot == aquot[i] && ret.rem == arem[i]) << " lldiv failed";
176    }
177}
178