xref: /freebsd/usr.bin/dc/tests/bcode.sh (revision dd41de95a84d979615a2ef11df6850622bf6184e)
1# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
2#
3# Copyright (c) 2017 Alan Somers
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26# $FreeBSD$
27
28atf_test_case bmod
29bmod_head()
30{
31	atf_set "descr" "Tests the remainder % operator"
32}
33bmod_body()
34{
35	cat > input.dc << EOF
360 3 % p		# basic usage
371 3 % p
382 3 % p
393 3 % p
404 3 % p
41_1 3 % p	# negative dividends work like a remainder, not a modulo
421 _3 % p	# negative divisors use the divisor's absolute value
431k		# fractional remainders
445 3 % p
456 5 % p
465.4 3 % p
47_.1 3 % p
481.1 _3 % p
491 .3 % p
50EOF
51	dc input.dc > output.txt
52	cat > expect.txt << EOF
530
541
552
560
571
58-1
591
602
611
622.4
63-.1
641.1
65.1
66EOF
67	atf_check cmp expect.txt output.txt
68}
69
70atf_test_case bmod_by_zero
71bmod_by_zero_head()
72{
73	atf_set "descr" "remaindering by zero should print a warning"
74}
75bmod_by_zero_body()
76{
77	atf_check -e match:"remainder by zero" dc -e '1 0 %'
78}
79
80atf_test_case bdivmod
81bdivmod_head()
82{
83	atf_set "descr" "Tests the divide and modulo ~ operator"
84}
85bdivmod_body()
86{
87	cat > input.dc << EOF
880 3 ~ n32Pp	# basic usage
891 3 ~ n32Pp
902 3 ~ n32Pp
913 3 ~ n32Pp
924 3 ~ n32Pp
93_1 3 ~ n32Pp	# negative dividends work like a remainder, not a modulo
94_4 3 ~ n32Pp	# sign of quotient and divisor must agree
951 _3 ~ n32Pp	# negative divisors use the divisor's absolute value
961k		# fractional remainders
975 3 ~ n32Pp
986 5 ~ n32Pp
995.4 3 ~ n32Pp
100_.1 3 ~ n32Pp
1011.1 _3 ~ n32Pp
1021 .3 ~ n32Pp
1034k
104.01 .003 ~ n32Pp	# divmod quotient always has scale=0
105EOF
106	dc input.dc > output.txt
107	cat > expect.txt << EOF
1080 0
1091 0
1102 0
1110 1
1121 1
113-1 0
114-1 -1
1151 0
1162 1.6
1171 1.2
1182.4 1.8
119-.1 0.0
1201.1 -.3
121.1 3.3
122.001 3.3333
123EOF
124	atf_check cmp expect.txt output.txt
125}
126
127atf_test_case bdivmod_by_zero
128bdivmod_by_zero_head()
129{
130	atf_set "descr" "divmodding by zero should print a warning"
131}
132bdivmod_by_zero_body()
133{
134	atf_check -e match:"divide by zero" dc -e '1 0 ~'
135}
136
137atf_init_test_cases()
138{
139	atf_add_test_case bmod
140	atf_add_test_case bmod_by_zero
141	atf_add_test_case bdivmod
142	atf_add_test_case bdivmod_by_zero
143}
144