aboutsummaryrefslogtreecommitdiff
path: root/lib/test/asserts.sh
blob: b1f538e3414e0f3dc9cf1e29fd29db29afe0d75a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/sh

fail() {
  message=${1:-"fail called without message"}
  echo -e "  ${red}fail:${_rst} ${reason}"
  exit 1
}

_assert_warn=

assert_warn() {
  if ! is_true "${_assert_warn}"; then _assert_warn=y; fi
}

assert_exited() {
  status=${1}
  expected=${2:-0}
  message=${3:-"exit status"}
  assert_compare "=" "$status" "$expected" "$message"
}

assert_compare() {
  expression=$1
  left=$2
  right=$3
  message=$4
  #cloyster_test_log "assert_compare 'test \"$left\" $expression \"$right\" && echo \"OK\" || echo \"$right\"'"
  assert "test \"$left\" $expression \"$right\" && echo \"\$?\" || echo \"\$?\"" "0" "${message}"
}

assert() {
  assertion=$1
  expected=$2
  message=${3:-assertion}
  status=
  assertion_eval="$(eval $(echo "$1"))" && status=0 || status=$?; true
  cloyster_test_log "assert: assertion={$(echo "$1" | head -c 30 | sed "s:\\n: :g")} expected=${expected} evaluated=${assertion_eval} status=${status}"
  if [ ! "$status" = "0" ]; then
    _assert_failed "exited: ${status}"
    _assert_exit
  elif [ ! "$assertion_eval" = "$expected" ]; then
    _assert_failed "${message}"
    echo -e "${_bold}Expected:${_rst}  ${expected}\n${_bold}Got     :${_rst}  ${assertion_eval}"
    _assert_exit
  fi
  _test_asserts_counter=$(( ${_test_asserts_counter:-0} + 1 ))
  _assert_warn=
}

_assert_count() {
  echo "$_test_asserts_counter"
}
_assert_reset_count() {
  _test_asserts_counter=0
}
_assert_failed() {
  name=$1
  reason=$2; if [ -n "${reason}" ]; then reason=" ${reason}"; fi
  line=; if [ -n "${_assert_line}" ]; then line=" at line ${_bold}${_assert_line}"; fi
  emoji="💥"; text=
  if is_true "$_assert_warn"; then emoji="🔥"; text=" (WARNING)"; fi
  echo -e "${emoji} $(tput AF 214)Assertion ${_test_asserts_counter} failed${text}${line}: ${_bold}$name${_rst}${reason}"
}

_assert_exit() {
  if ! is_true "$_assert_warn"; then exit 99; fi
  _assert_warn=
}