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
42static void err(BclError e) {
43	if (e != BCL_ERROR_NONE) abort();
44}
45
46int 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