157718be8SEnji Cooper# $NetBSD: t_expr.sh,v 1.3 2012/03/27 07:23:06 jruoho Exp $ 257718be8SEnji Cooper# 357718be8SEnji Cooper# Copyright (c) 2007 The NetBSD Foundation, Inc. 457718be8SEnji Cooper# All rights reserved. 557718be8SEnji Cooper# 657718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without 757718be8SEnji Cooper# modification, are permitted provided that the following conditions 857718be8SEnji Cooper# are met: 957718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright 1057718be8SEnji Cooper# notice, this list of conditions and the following disclaimer. 1157718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 1257718be8SEnji Cooper# notice, this list of conditions and the following disclaimer in the 1357718be8SEnji Cooper# documentation and/or other materials provided with the distribution. 1457718be8SEnji Cooper# 1557718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1657718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1757718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1857718be8SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 1957718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2057718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2157718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2257718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2357718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2457718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2557718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 2657718be8SEnji Cooper# 2757718be8SEnji Cooper 2857718be8SEnji Cooper# The first arg will get eval'd so escape any meta characters 2957718be8SEnji Cooper# The 2nd arg is an expected string/response from expr for that op. 3057718be8SEnji Coopertest_expr() { 3157718be8SEnji Cooper echo "Expression '${1}', expecting '${2}'" 3257718be8SEnji Cooper res=`eval expr $1 2>&1` 3357718be8SEnji Cooper if [ "$res" != "$2" ]; then 3457718be8SEnji Cooper atf_fail "Expected $2, got $res from expression: " \ 3557718be8SEnji Cooper "`eval echo $1`" 3657718be8SEnji Cooper fi 3757718be8SEnji Cooper} 3857718be8SEnji Cooper 3957718be8SEnji Cooperatf_test_case lang 4057718be8SEnji Cooperlang_ops_head() { 4157718be8SEnji Cooper atf_set "descr" "Test that expr(1) works with non-C LANG (PR bin/2486)" 4257718be8SEnji Cooper} 4357718be8SEnji Cooperlang_body() { 4457718be8SEnji Cooper 4557718be8SEnji Cooper export LANG=nonexistent 4657718be8SEnji Cooper atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11" 4757718be8SEnji Cooper 4857718be8SEnji Cooper export LANG=ru_RU.KOI8-R 4957718be8SEnji Cooper atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11" 5057718be8SEnji Cooper} 5157718be8SEnji Cooper 5257718be8SEnji Cooperatf_test_case overflow 5357718be8SEnji Cooperoverflow_head() { 5457718be8SEnji Cooper atf_set "descr" "Test overflow cases" 5557718be8SEnji Cooper} 5657718be8SEnji Cooperoverflow_body() { 5757718be8SEnji Cooper test_expr '4611686018427387904 + 4611686018427387903' \ 5857718be8SEnji Cooper '9223372036854775807' 5957718be8SEnji Cooper test_expr '4611686018427387904 + 4611686018427387904' \ 6057718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '4611686018427387904 + 4611686018427387904'" 6157718be8SEnji Cooper test_expr '4611686018427387904 - -4611686018427387904' \ 6257718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '4611686018427387904 - -4611686018427387904'" 6357718be8SEnji Cooper test_expr '-4611686018427387904 - 4611686018427387903' \ 6457718be8SEnji Cooper '-9223372036854775807' 6557718be8SEnji Cooper test_expr '-4611686018427387904 - 4611686018427387905' \ 6657718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '-4611686018427387904 - 4611686018427387905'" 6757718be8SEnji Cooper test_expr '-4611686018427387904 \* 1' '-4611686018427387904' 6857718be8SEnji Cooper test_expr '-4611686018427387904 \* -1' '4611686018427387904' 6957718be8SEnji Cooper test_expr '-4611686018427387904 \* 2' '-9223372036854775808' 7057718be8SEnji Cooper test_expr '-4611686018427387904 \* 3' \ 7157718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '-4611686018427387904 * 3'" 7257718be8SEnji Cooper test_expr '-4611686018427387904 \* -2' \ 7357718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -2'" 7457718be8SEnji Cooper test_expr '4611686018427387904 \* 1' '4611686018427387904' 7557718be8SEnji Cooper test_expr '4611686018427387904 \* 2' \ 7657718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '4611686018427387904 * 2'" 7757718be8SEnji Cooper test_expr '4611686018427387904 \* 3' \ 7857718be8SEnji Cooper "expr: integer overflow or underflow occurred for operation '4611686018427387904 * 3'" 7957718be8SEnji Cooper} 8057718be8SEnji Cooper 8157718be8SEnji Cooperatf_test_case gtkmm 8257718be8SEnji Coopergtkmm_head() { 8357718be8SEnji Cooper atf_set "descr" "Test from gtk-- configure that cause problems on old expr" 8457718be8SEnji Cooper} 8557718be8SEnji Coopergtkmm_body() { 8657718be8SEnji Cooper test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1' 8757718be8SEnji Cooper test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '0' 8857718be8SEnji Cooper test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 3 \& 5 \>= 5' '0' 8957718be8SEnji Cooper test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 2 \& 4 = 4 \& 5 \>= 5' '0' 9057718be8SEnji Cooper test_expr '3 \> 2 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '1' 9157718be8SEnji Cooper test_expr '3 \> 3 \| 3 = 3 \& 4 \> 3 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1' 9257718be8SEnji Cooper} 9357718be8SEnji Cooper 9457718be8SEnji Cooperatf_test_case colon_vs_math 9557718be8SEnji Coopercolon_vs_math_head() { 9657718be8SEnji Cooper atf_set "descr" "Basic precendence test with the : operator vs. math" 9757718be8SEnji Cooper} 9857718be8SEnji Coopercolon_vs_math_body() { 9957718be8SEnji Cooper test_expr '2 : 4 / 2' '0' 10057718be8SEnji Cooper test_expr '4 : 4 % 3' '1' 10157718be8SEnji Cooper} 10257718be8SEnji Cooper 10357718be8SEnji Cooperatf_test_case arithmetic_ops 10457718be8SEnji Cooperarithmetic_ops_head() { 10557718be8SEnji Cooper atf_set "descr" "Dangling arithemtic operator" 10657718be8SEnji Cooper} 10757718be8SEnji Cooperarithmetic_ops_body() { 108*a8123922SEnji Cooper # Begin FreeBSD 109*a8123922SEnji Cooper atf_expect_fail "the following testcases fail with syntax errors on FreeBSD" 110*a8123922SEnji Cooper # End FreeBSD 11157718be8SEnji Cooper test_expr '.java_wrapper : /' '0' 11257718be8SEnji Cooper test_expr '4 : \*' '0' 11357718be8SEnji Cooper test_expr '4 : +' '0' 11457718be8SEnji Cooper test_expr '4 : -' '0' 11557718be8SEnji Cooper test_expr '4 : /' '0' 11657718be8SEnji Cooper test_expr '4 : %' '0' 11757718be8SEnji Cooper} 11857718be8SEnji Cooper 11957718be8SEnji Cooperatf_test_case basic_math 12057718be8SEnji Cooperbasic_math_head() { 12157718be8SEnji Cooper atf_set "descr" "Basic math test" 12257718be8SEnji Cooper} 12357718be8SEnji Cooperbasic_math_body() { 12457718be8SEnji Cooper test_expr '2 + 4 \* 5' '22' 12557718be8SEnji Cooper} 12657718be8SEnji Cooper 12757718be8SEnji Cooperatf_test_case basic_functional 12857718be8SEnji Cooperbasic_functional_head() { 12957718be8SEnji Cooper atf_set "descr" "Basic functional tests" 13057718be8SEnji Cooper} 13157718be8SEnji Cooperbasic_functional_body() { 13257718be8SEnji Cooper test_expr '2' '2' 13357718be8SEnji Cooper test_expr '-4' '-4' 13457718be8SEnji Cooper test_expr 'hello' 'hello' 13557718be8SEnji Cooper} 13657718be8SEnji Cooper 13757718be8SEnji Cooperatf_test_case compare_ops_precedence 13857718be8SEnji Coopercompare_ops_precedence_head() { 13957718be8SEnji Cooper atf_set "descr" "Compare operator precendence test" 14057718be8SEnji Cooper} 14157718be8SEnji Coopercompare_ops_precedence_body() { 14257718be8SEnji Cooper test_expr '2 \> 1 \* 17' '0' 14357718be8SEnji Cooper} 14457718be8SEnji Cooper 14557718be8SEnji Cooperatf_test_case compare_ops 14657718be8SEnji Coopercompare_ops_head() { 14757718be8SEnji Cooper atf_set "descr" "Compare operator tests" 14857718be8SEnji Cooper} 14957718be8SEnji Coopercompare_ops_body() { 15057718be8SEnji Cooper test_expr '2 \!= 5' '1' 15157718be8SEnji Cooper test_expr '2 \!= 2' '0' 15257718be8SEnji Cooper test_expr '2 \<= 3' '1' 15357718be8SEnji Cooper test_expr '2 \<= 2' '1' 15457718be8SEnji Cooper test_expr '2 \<= 1' '0' 15557718be8SEnji Cooper test_expr '2 \< 3' '1' 15657718be8SEnji Cooper test_expr '2 \< 2' '0' 15757718be8SEnji Cooper test_expr '2 = 2' '1' 15857718be8SEnji Cooper test_expr '2 = 4' '0' 15957718be8SEnji Cooper test_expr '2 \>= 1' '1' 16057718be8SEnji Cooper test_expr '2 \>= 2' '1' 16157718be8SEnji Cooper test_expr '2 \>= 3' '0' 16257718be8SEnji Cooper test_expr '2 \> 1' '1' 16357718be8SEnji Cooper test_expr '2 \> 2' '0' 16457718be8SEnji Cooper} 16557718be8SEnji Cooper 16657718be8SEnji Cooperatf_test_case multiply 16757718be8SEnji Coopermultiply_head() { 16857718be8SEnji Cooper atf_set "descr" "Test the multiply operator (PR bin/12838)" 16957718be8SEnji Cooper} 17057718be8SEnji Coopermultiply_body() { 17157718be8SEnji Cooper test_expr '1 \* -1' '-1' 17257718be8SEnji Cooper test_expr '2 \> 1 \* 17' '0' 17357718be8SEnji Cooper} 17457718be8SEnji Cooper 17557718be8SEnji Cooperatf_test_case negative 17657718be8SEnji Coopernegative_head() { 17757718be8SEnji Cooper atf_set "descr" "Test the additive inverse" 17857718be8SEnji Cooper} 17957718be8SEnji Coopernegative_body() { 18057718be8SEnji Cooper test_expr '-1 + 5' '4' 18157718be8SEnji Cooper test_expr '- 1 + 5' 'expr: syntax error' 18257718be8SEnji Cooper 18357718be8SEnji Cooper test_expr '5 + -1' '4' 18457718be8SEnji Cooper test_expr '5 + - 1' 'expr: syntax error' 18557718be8SEnji Cooper 18657718be8SEnji Cooper test_expr '1 - -5' '6' 18757718be8SEnji Cooper} 18857718be8SEnji Cooper 18957718be8SEnji Cooperatf_test_case math_precedence 19057718be8SEnji Coopermath_precedence_head() { 19157718be8SEnji Cooper atf_set "descr" "More complex math test for precedence" 19257718be8SEnji Cooper} 19357718be8SEnji Coopermath_precedence_body() { 19457718be8SEnji Cooper test_expr '-3 + -1 \* 4 + 3 / -6' '-7' 19557718be8SEnji Cooper} 19657718be8SEnji Cooper 19757718be8SEnji Cooperatf_test_case precedence 19857718be8SEnji Cooperprecedence_head() { 19957718be8SEnji Cooper atf_set "descr" "Test precedence" 20057718be8SEnji Cooper} 20157718be8SEnji Cooperprecedence_body() { 20257718be8SEnji Cooper # This is messy but the shell escapes cause that 20357718be8SEnji Cooper test_expr 'X1/2/3 : X\\\(.\*[^/]\\\)//\*[^/][^/]\*/\*$ \| . : \\\(.\\\)' '1/2' 20457718be8SEnji Cooper} 20557718be8SEnji Cooper 20657718be8SEnji Cooperatf_test_case regex 20757718be8SEnji Cooperregex_head() { 20857718be8SEnji Cooper atf_set "descr" "Test proper () returning \1 from a regex" 20957718be8SEnji Cooper} 21057718be8SEnji Cooperregex_body() { 21157718be8SEnji Cooper # This is messy but the shell escapes cause that 21257718be8SEnji Cooper test_expr '1/2 : .\*/\\\(.\*\\\)' '2' 21357718be8SEnji Cooper} 21457718be8SEnji Cooper 21557718be8SEnji Cooperatf_init_test_cases() 21657718be8SEnji Cooper{ 21757718be8SEnji Cooper atf_add_test_case lang 21857718be8SEnji Cooper atf_add_test_case overflow 21957718be8SEnji Cooper atf_add_test_case gtkmm 22057718be8SEnji Cooper atf_add_test_case colon_vs_math 22157718be8SEnji Cooper atf_add_test_case arithmetic_ops 22257718be8SEnji Cooper atf_add_test_case basic_math 22357718be8SEnji Cooper atf_add_test_case basic_functional 22457718be8SEnji Cooper atf_add_test_case compare_ops_precedence 22557718be8SEnji Cooper atf_add_test_case compare_ops 22657718be8SEnji Cooper atf_add_test_case multiply 22757718be8SEnji Cooper atf_add_test_case negative 22857718be8SEnji Cooper atf_add_test_case math_precedence 22957718be8SEnji Cooper atf_add_test_case precedence 23057718be8SEnji Cooper atf_add_test_case regex 23157718be8SEnji Cooper} 232