#!bb/sh

DIRNAME="$(dirname "$0")"

DI=
if [ "$1" = di ]; then
   # test in DI context
   DI=1
else
  # add busybox tools in front of the path
  # so that we are nearly as in the installer context
  #
  PATH="$DIRNAME/bb:$PATH"
fi

set -e

NL='
'
. ./extract_base.sh
. ./extract_base.sh.orig

gen_suffix() {
  local p
  echo b B
  for p in '' B b iB ib ; do
    for m in k K m M g G t T p P e E; do
      echo $m$p
    done
  done
}

check_with() {
  local prefix="$1"
  local v="$2"
  if ${prefix}valid_human $v; then
    ${prefix}human2longint $v
  fi
}

with_bc() {
  local n="$1"
  local s="$2"
  local fake="$3"
  if [ "$DI" = 1 ]; then
    # no bc available
    echo "$fake"
    return
  fi
  local pow=0
  local base=1000
  case "$s" in
  [kK]*) pow=1;; 
  [mM]*|'') pow=2;; 
  [gG]*) pow=3;; 
  [tT]*) pow=4;; 
  [pP]*) pow=5;; 
  [eE]*) pow=6;; 
  esac
  s="${s:1}"

  local round=0
  case "$s" in
  i*)
    base=1024
    s="${s#i}"
    # rounding for binary units
    round=0.5
    ;;
  esac
  n="${n/,/.}"

  echo "($n * $base ^ $pow + $round)/1" | bc -q | tr -d '\\\n' # +0.5 for rounding
}

check() {
  local n="$1"
  local s="$2"
  local v="$n$s"
  local old
  local new
  old="$(check_with orig_ "$v")"
  new="$(check_with '' "$v")"
  real="$(with_bc "$n" "$s" "$new")"
  if [ "$real" = "$new" ]; then
    if [ "$new" = "$old" ]; then
      echo "OK: $v = $real B"
    else
      if [ -z "$old" ]; then
        echo "OK+: $v = $real B"
      else
        echo "OK+: $v = $real B (previously: $old)"
      fi
    fi
  else
    echo "NACK: $n $s / OLD: $old / NEW: $new / REAL: $real"
  fi
}

#with_bc 1.8 EiB
#human2longint 1.8 EiB
#human2longint 9 EiB
#human2longint 7.999999999999999999132638262011596452794037759304046630859375 EiB
#human2longint 0.00000000000001 kiB
#exit 0
RET=128MiB

if valid_human "$RET"; then
        size=$(human2longint "$RET")
fi
hsize="$RET"

echo size="'$size'"
echo hsize="'$hsize'"

check 128 MB
#check 7999999999999999999132638262011596452794037759304046630859375 EiB
#exit 0

for s in '' $(gen_suffix); do
  for n in 9 005 5.5 09.9 ; do
    check "$n" "$s"
  done
done

check 1000000 TB
check 10000000 TB
check 1000000 TiB
check 10000000 TiB
check 1000000000 GB
check 1000000000000 MB
check 1000000000000000 kB
check 1.0009765625 kib
check 1.000001 MB
check 1.0000001 MB

check 1.9 EiB
check 1.8 EiB
check 1.7 EiB
check 1.6 EiB
check 1.5 EiB
check 1.4 EiB
check 1.3 EiB
check 1.2 EiB
check 1.1 EiB
check 8.0 EiB
# 2^63-1 in EiB
check 7.999999999999999999132638262011596452794037759304046630859375 EiB
check 7999999999999999999132638262011596452794037759304046630859375 EiB
check 4336808689942017736029811203479766845703125000000000000000000000000000000000000000.000000000000000000867361737988403547205962240695953369140625 EiB
check 4336808689942017736029811203479766845703125000000000000000000000000000000000000000.000000000000000000867361737988403547205962240695953369140625 TiB
check 4336808689942017736029811203479766845703125000000000000000000000000000000000000000.000000000000000000867361737988403547205962240695953369140625 GiB
check 4336808689942017736029811203479766845703125000000000000000000000000000000000000000.000000000000000000867361737988403547205962240695953369140625 MiB
check 4336808689942017736029811203479766845703125000000000000000000000000000000000000000.000000000000000000867361737988403547205962240695953369140625 kiB
check 0.00000000000001 EiB
check 0.00000000000001 kiB
check 0.000000000000000001 EiB
