xref: /freebsd/contrib/bc/tests/bcl.c (revision 6be3386466ab79a84b48429ae66244f21526d3df)
1 /*
2  * *****************************************************************************
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  *
6  * Copyright (c) 2018-2021 Gavin D. Howard and contributors.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * * Redistributions of source code must retain the above copyright notice, this
12  *   list of conditions and the following disclaimer.
13  *
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  *   this list of conditions and the following disclaimer in the documentation
16  *   and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * *****************************************************************************
31  *
32  * Tests for bcl(3).
33  *
34  */
35 
36 #include <stdlib.h>
37 #include <stdbool.h>
38 #include <string.h>
39 
40 #include <bcl.h>
41 
42 static void err(BclError e) {
43 	if (e != BCL_ERROR_NONE) abort();
44 }
45 
46 int main(void) {
47 
48 	BclError e;
49 	BclContext ctxt;
50 	size_t scale;
51 	BclNumber n, n2, n3, n4, n5, n6;
52 	char* res;
53 	BclBigDig b = 0;
54 
55 	e = bcl_init();
56 	err(e);
57 
58 	e = bcl_init();
59 	err(e);
60 
61 	if (bcl_abortOnFatalError()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
62 
63 	bcl_setAbortOnFatalError(true);
64 
65 	if (!bcl_abortOnFatalError()) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
66 
67 	ctxt = bcl_ctxt_create();
68 
69 	bcl_pushContext(ctxt);
70 
71 	ctxt = bcl_ctxt_create();
72 
73 	bcl_pushContext(ctxt);
74 
75 	scale = 10;
76 
77 	bcl_ctxt_setScale(ctxt, scale);
78 
79 	scale = bcl_ctxt_scale(ctxt);
80 	if (scale != 10) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
81 
82 	scale = 16;
83 
84 	bcl_ctxt_setIbase(ctxt, scale);
85 
86 	scale = bcl_ctxt_ibase(ctxt);
87 	if (scale != 16) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
88 
89 	bcl_ctxt_setObase(ctxt, scale);
90 
91 	scale = bcl_ctxt_obase(ctxt);
92 	if (scale != 16) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
93 
94 	bcl_ctxt_setIbase(ctxt, 10);
95 	bcl_ctxt_setObase(ctxt, 10);
96 
97 	n = bcl_num_create();
98 
99 	n2 = bcl_dup(n);
100 	bcl_copy(n, n2);
101 
102 	n3 = bcl_parse("2938");
103 	err(bcl_err(n3));
104 
105 	n4 = bcl_parse("-28390.9108273");
106 	err(bcl_err(n4));
107 
108 	if (!bcl_num_neg(n4)) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
109 
110 	n3 = bcl_add(n3, n4);
111 	err(bcl_err(n3));
112 
113 	res = bcl_string(bcl_dup(n3));
114 	if (strcmp(res, "-25452.9108273")) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
115 
116 	free(res);
117 
118 	n4 = bcl_parse("8937458902.2890347");
119 	err(bcl_err(n4));
120 
121 	e = bcl_divmod(bcl_dup(n4), n3, &n5, &n6);
122 	err(e);
123 
124 	res = bcl_string(n5);
125 
126 	if (strcmp(res, "-351137.0060159482"))
127 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
128 
129 	free(res);
130 
131 	res = bcl_string(n6);
132 
133 	if (strcmp(res, ".00000152374405414"))
134 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
135 
136 	free(res);
137 
138 	n4 = bcl_sqrt(n4);
139 	err(bcl_err(n4));
140 
141 	res = bcl_string(bcl_dup(n4));
142 
143 	if (strcmp(res, "94538.1346457028"))
144 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
145 
146 	free(res);
147 
148 	e = bcl_num_setScale(n4, 20);
149 	err(e);
150 
151 	res = bcl_string(bcl_dup(n4));
152 
153 	if (strcmp(res, "94538.13464570280000000000"))
154 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
155 
156 	free(res);
157 
158 	e = bcl_num_setScale(n4, 0);
159 	err(e);
160 
161 	res = bcl_string(bcl_dup(n4));
162 
163 	if (strcmp(res, "94538"))
164 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
165 
166 	free(res);
167 
168 	e = bcl_bigdig(n4, &b);
169 	err(e);
170 
171 	if (b != 94538) err(BCL_ERROR_FATAL_UNKNOWN_ERR);
172 
173 	n4 = bcl_bigdig2num(b);
174 	err(bcl_err(n4));
175 
176 	res = bcl_string(bcl_dup(n4));
177 
178 	if (strcmp(res, "94538"))
179 		err(BCL_ERROR_FATAL_UNKNOWN_ERR);
180 
181 	free(res);
182 
183 	n4 = bcl_frand(10);
184 	err(bcl_err(n4));
185 
186 	n4 = bcl_lshift(n4, bcl_bigdig2num(10));
187 	err(bcl_err(n4));
188 
189 	n3 = bcl_irand(n4);
190 	err(bcl_err(n3));
191 
192 	n2 = bcl_ifrand(bcl_dup(n3), 10);
193 	err(bcl_err(n2));
194 
195 	e = bcl_rand_seedWithNum(n3);
196 	err(e);
197 
198 	n4 = bcl_rand_seed2num();
199 	err(bcl_err(n4));
200 
201 	n5 = bcl_parse("10");
202 	err(bcl_err(n5));
203 
204 	n6 = bcl_modexp(bcl_dup(n5), bcl_dup(n5), bcl_dup(n5));
205 	err(bcl_err(n6));
206 
207 	bcl_num_free(n);
208 
209 	bcl_ctxt_freeNums(ctxt);
210 
211 	bcl_gc();
212 
213 	bcl_popContext();
214 
215 	bcl_ctxt_free(ctxt);
216 
217 	ctxt = bcl_context();
218 
219 	bcl_popContext();
220 
221 	bcl_ctxt_free(ctxt);
222 
223 	bcl_free();
224 
225 	bcl_free();
226 
227 	return 0;
228 }
229