diff --git a/src/util b/src/util new file mode 100644 index 0000000..333eb38 --- /dev/null +++ b/src/util @@ -0,0 +1,48 @@ +#!/bin/bash +# Utility functions/procedures +# +# Copyright (C) 2014 Mike Gewitz +# +# This file is part of shspec. +# +# shspec is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# These algorithms will often use looping constructs in favor of recursion +# for performance reasons. +## + +[ -z $__INC_UTIL ] || return +__INC_UTIL=1 + + +## +# Array functions/procedures ("a" prefix) +# + +## +# Asserts that all given values are zero +# +# This is perhaps mose useful for PIPESTATUS evaluation (the pipefail option +# may not be available). If any value is non-zero, it will immediately +# terminate with a non-zero status. +aok() +{ + local -ar arr=("$@") + local -i i="${#arr[@]}" + + while ((i--)); do + test "${arr[i]}" -eq 0 || return 1 + done +} + diff --git a/test/test-util b/test/test-util new file mode 100644 index 0000000..0862915 --- /dev/null +++ b/test/test-util @@ -0,0 +1,60 @@ +#!/bin/bash +# Utility function/procedure tests +# +# Copyright (C) 2014 Mike Gewitz +# +# This file is part of shspec. +# +# shspec is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +## + +describe aok + it succeeds for all zero values + expect aok 0 + to succeed + + expect aok 0 0 0 + to succeed + end + + it fails for any zero values + expect aok 1 + to fail + + expect aok 1 0 0 + to fail + + expect aok 0 1 0 + to fail + + expect aok 0 0 1 + to fail + + expect aok 1 1 1 + to fail + end + + # this surely implies a bug in the user's code + it fails for any non-numeric values + expect aok foo + to fail + + expect aok 0 foo + to fail + + expect aok foo 0 + to fail + end +end +