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