Skip to content

Commit

Permalink
Merge pull request #227 from aiotter/master
Browse files Browse the repository at this point in the history
github/workflows (nightly): add CI checks in macOS and msys2
  • Loading branch information
akinomyoga committed Sep 25, 2022
2 parents 49e55f4 + 4cb0baa commit c5ddacc
Show file tree
Hide file tree
Showing 17 changed files with 762 additions and 172 deletions.
18 changes: 18 additions & 0 deletions .github/workflows/build.yml
Expand Up @@ -86,3 +86,21 @@ jobs:
# Add the following line at the end of ~/.bashrc
[[ ${BLE_VERSION-} ]] && ble-attach
```
check:
needs: build
strategy:
matrix:
os: [macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v3
with:
submodules: recursive
- name: Install dependencies
if: runner.os == 'macOs'
run: brew install gawk
- name: Build
run: make
- name: Test
run: make check
24 changes: 24 additions & 0 deletions .github/workflows/test.yml
@@ -0,0 +1,24 @@
name: test
on:
pull_request:
branches:
- '*'

jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v3
with:
submodules: recursive
- name: Install dependencies
if: runner.os == 'macOs'
run: brew install gawk
- name: Build
run: make
- name: Test
run: make check
7 changes: 6 additions & 1 deletion .gitignore
Expand Up @@ -17,12 +17,17 @@
/test

# memo
/memo/*.exe
/memo/D0702.HISTFILE*
/memo/D0727.bind.*
/memo/D0857.unbind
/memo/D0857.bind
/memo/D0857.pipe
/memo/D0857.stderr
/memo/*.exe
/memo/D1881/pr227.*.txt
/memo/D1881/pr227.*.hist
/memo/D1881/pr227-sleep-delay.pdf

# make
/make/*.exe
/make/canvas.c2w.wcwidth.txt
6 changes: 4 additions & 2 deletions ble.pp
Expand Up @@ -541,8 +541,8 @@ function ble/base/recover-bash-options {

# WA #D1534 workaround for msys2 .inputrc
if [[ $OSTYPE == msys* ]]; then
[[ $(builtin bind -m emacs -p | grep '"\\C-?"') == '"\C-?": backward-kill-line' ]] &&
builtin bind -m emacs '"\C-?": backward-delete-char'
[[ $(builtin bind -m emacs -p 2>/dev/null | grep '"\\C-?"') == '"\C-?": backward-kill-line' ]] &&
builtin bind -m emacs '"\C-?": backward-delete-char' 2>/dev/null
fi

if [[ ! -o emacs && ! -o vi && ! $_ble_init_command ]]; then
Expand Down Expand Up @@ -2171,6 +2171,8 @@ function ble/base/process-blesh-arguments {
function ble/base/sub:test {
local error= logfile=

[[ ${LANG-} ]] || local LANG=en_US.UTF-8

ble-import lib/core-test

if (($#==0)); then
Expand Down
2 changes: 1 addition & 1 deletion lib/core-complete.sh
Expand Up @@ -2997,7 +2997,7 @@ function ble/complete/progcomp/.compvar-reduce-cur {
cur=${cur:${#BASH_REMATCH}+1}
elif [[ $cur =~ $_ble_complete_progcomp_cur_rex_break ]]; then
cur=${cur:${#BASH_REMATCH}}
[[ ${BASH_REMATCH[5]} == @(\$*|@|\\?) ]] && cur=${BASH_REMATCH[5]#\\}$cur
case ${BASH_REMATCH[5]} in (\$*|@|\\?) cur=${BASH_REMATCH[5]#\\}$cur ;; esac
fi
}

Expand Down
107 changes: 71 additions & 36 deletions lib/test-canvas.sh
Expand Up @@ -352,7 +352,22 @@ function ble/test:canvas/textmap {
#------------------------------------------------------------------------------
# Grapheme_Cluster_Break

ble/test/start-section 'ble/unicode/GraphemeCluster/c2break' 72
ble/test/start-section 'ble/unicode/GraphemeCluster/c2break' 77

if (LC_ALL=C.UTF-8 builtin eval "s=\$'\\U1F6D1'"; ((${#s}==2))) 2>/dev/null; then
function ble/test:canvas/GraphemeCluster/.locate-code-point {
local s=$1 k=$2 len=${#1} i=0 shift
while ((k-->=1&&i<len)); do
ble/unicode/GraphemeCluster/s2break-right "$s" "$i" shift
((i+=shift))
done
ret=$i
}
else
function ble/test:canvas/GraphemeCluster/.locate-code-point {
ret=$2
}
fi

(
bleopt emoji_opts=ri:tpvs:epvs:zwj
Expand Down Expand Up @@ -396,44 +411,60 @@ ble/test/start-section 'ble/unicode/GraphemeCluster/c2break' 72
ble/test 'ble/unicode/GraphemeCluster/c2break "$((0x1F32B))"' ret="$_ble_unicode_GraphemeClusterBreak_Pictographic"

if ((_ble_bash>=40200)); then
function ble/test:canvas/GraphemeClusterBreak/find-previous-boundary {
local str=$1 index=$2 ans=$3 ret=
ble/test:canvas/GraphemeCluster/.locate-code-point "$str." "$index"; index=$ret
ble/test:canvas/GraphemeCluster/.locate-code-point "$str" "$ans"; ans=$ret
ble/test "ble/unicode/GraphemeCluster/find-previous-boundary '$str' $index" ret="$ans"
}

# Regional_Indicator
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F1E6\U1F1FF\U1F1E6\U1F1FF" 1' ret="0"
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F1E6\U1F1FF\U1F1E6\U1F1FF" 2' ret="0"
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F1E6\U1F1FF\U1F1E6\U1F1FF" 3' ret="2"
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F1E6\U1F1FF\U1F1E6\U1F1FF" 4' ret="2"
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F1E6\U1F1FF\U1F1E6\U1F1FF" 5' ret="4"
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6" 2' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6" 3' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6" 4' ret=3
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6" 5' ret=3
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6" 6' ret=5
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6" 7' ret=6
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6Z" 7' ret=6
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\u600\u600\u600\u600\U1F1E6\U1F1FF" 7' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "A\u600\u600\u600\u600\U1F1E6\U1F1FF" 6' ret=1
ble/test $'bleopt_grapheme_cluster=legacy ble/unicode/GraphemeCluster/find-previous-boundary "A\u600\u600\u600\u600\U1F1E6\U1F1FF" 7' ret=5
ble/test $'bleopt_grapheme_cluster=legacy ble/unicode/GraphemeCluster/find-previous-boundary "A\u600\u600\u600\u600\U1F1E6\U1F1FF" 6' ret=5
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F1E6\U1F1FF\U1F1E6\U1F1FF' 1 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F1E6\U1F1FF\U1F1E6\U1F1FF' 2 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F1E6\U1F1FF\U1F1E6\U1F1FF' 3 2
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F1E6\U1F1FF\U1F1E6\U1F1FF' 4 2
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F1E6\U1F1FF\U1F1E6\U1F1FF' 5 4
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'A\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6' 2 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'B\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6' 3 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'C\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6' 4 3
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'D\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6' 5 3
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'E\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6' 6 5
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'F\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6' 7 6
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'G\U1F1E6\U1F1FF\U1F1E6\U1F1FF\U1F1E6Z' 7 6
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'H\u600\u600\u600\u600\U1F1E6\U1F1FF' 7 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'I\u600\u600\u600\u600\U1F1E6\U1F1FF' 6 1
bleopt_grapheme_cluster=legacy ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'J\u600\u600\u600\u600\U1F1E6\U1F1FF' 7 5
bleopt_grapheme_cluster=legacy ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'K\u600\u600\u600\u600\U1F1E6\U1F1FF' 6 5

# ZWJ sequence
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F636\U200D\U1F32B\UFE0F" 1' ret=0
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F636\U200D\U1F32B\UFE0F" 2' ret=0
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F636\U200D\U1F32B\UFE0F" 3' ret=0
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F636\U200D\U1F32B\UFE0F" 4' ret=0
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "\U1F636\U200D\U1F32B\UFE0F" 5' ret=4
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U1F636\U200D\U1F32B\UFE0F" 2' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U1F636\U200D\U1F32B\UFE0F" 3' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U1F636\U200D\U1F32B\UFE0F" 4' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U1F636\U200D\U1F32B\UFE0F" 5' ret=1
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U1F636\U200D\U1F32B\UFE0F" 6' ret=5
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U200D\U1F32B\UFE0F" 2' ret=0
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U200D\U1F32B\UFE0F" 3' ret=2
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U200D\U1F32B\UFE0F" 4' ret=2
ble/test $'ble/unicode/GraphemeCluster/find-previous-boundary "a\U200D\U1F32B\UFE0F" 5' ret=4
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F636\U200D\U1F32B\UFE0F' 1 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F636\U200D\U1F32B\UFE0F' 2 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F636\U200D\U1F32B\UFE0F' 3 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F636\U200D\U1F32B\UFE0F' 4 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'\U1F636\U200D\U1F32B\UFE0F' 5 4
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'a\U1F636\U200D\U1F32B\UFE0F' 2 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'b\U1F636\U200D\U1F32B\UFE0F' 3 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'c\U1F636\U200D\U1F32B\UFE0F' 4 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'d\U1F636\U200D\U1F32B\UFE0F' 5 1
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'e\U1F636\U200D\U1F32B\UFE0F' 6 5
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'f\U200D\U1F32B\UFE0F' 2 0
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'g\U200D\U1F32B\UFE0F' 3 2
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'h\U200D\U1F32B\UFE0F' 4 2
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary $'i\U200D\U1F32B\UFE0F' 5 4

ble/test "ble/test:canvas/textmap \$'@@' stderr; ble/textmap#get-index-at -v ret 1 0" ret=1
ble/test "ble/test:canvas/textmap \$'@\u0308@' stderr; ble/textmap#get-index-at -v ret 1 0" ret=2
ble/test "ble/test:canvas/textmap \$'@\u0308\u0308@' stderr; ble/textmap#get-index-at -v ret 1 0" ret=3
ble/test "ble/test:canvas/textmap \$'@\u0308\u0308\u0308@' stderr; ble/textmap#get-index-at -v ret 1 0" ret=4

# s2break-{right,left}
ble/test 'ble/util/is-unicode-output'
c1=$'\uFE0F'
ble/test code:'code=; ble/unicode/GraphemeCluster/s2break-right "$c1" 0 code; ret=$code' ret="$((0xFE0F))"
ble/test code:'code=; ble/unicode/GraphemeCluster/s2break-left "$c1" "${#c1}" code; ret=$code' ret="$((0xFE0F))"
c2=$'\U1F6D1'
ble/test code:'code=; ble/unicode/GraphemeCluster/s2break-right "$c2" 0 code; ret=$code' ret="$((0x1F6D1))"
ble/test code:'code=; ble/unicode/GraphemeCluster/s2break-left "$c2" "${#c2}" code; ret=$code' ret="$((0x1F6D1))"
fi
)

Expand All @@ -446,17 +477,21 @@ ble/test/start-section 'ble/unicode/GraphemeCluster/c2break (GraphemeBreakTest.t

function ble/test:canvas/GraphemeClusterBreak/find-previous-boundary {
local ans=${1%%:*} str=${1#*:}
eval "local s=\$'$str'"
ble/string#split ans , "$ans"
local i=0 b=0
local k=0 b=0
for k in "${!ans[@]}"; do
ble/test "ble/unicode/GraphemeCluster/find-previous-boundary \$'$str' $((k+1))" ret=${ans[k]}
if ((ans[k]>b)); then
ble/test:canvas/GraphemeCluster/.locate-code-point "$s." "$((k+1))"; local i=$ret
ble/test:canvas/GraphemeCluster/.locate-code-point "$s" "${ans[k]}"; local a=$ret
ble/test "ble/unicode/GraphemeCluster/find-previous-boundary \$'$str' $i" ret="$a"
if ((a>b)); then
local ret= c= w= cs= extend=
ble/test "ble/unicode/GraphemeCluster/match \$'$str' $b && ((ret=b+1+extend))" ret=${ans[k]}
((b=ans[k]))
ble/test "ble/unicode/GraphemeCluster/match \$'$str' $b && ((ret=b+1+extend))" ret="$a"
((b=a))
fi
done
}

if ((_ble_bash>=40200)); then
for spec in "${tests_cases[@]}"; do
ble/test:canvas/GraphemeClusterBreak/find-previous-boundary "$spec"
Expand Down
11 changes: 9 additions & 2 deletions lib/test-main.sh
Expand Up @@ -30,6 +30,11 @@ ble/test/start-section 'ble/main' 19

# ble/util/readlink
(
if [[ $OSTYPE == msys* ]]; then
ble/path#append MSYS winsymlinks
export MSYS
fi

ble/bin/.freeze-utility-path readlink ls
function ble/test:readlink.impl1 {
ret=$1
Expand All @@ -56,10 +61,12 @@ ble/test/start-section 'ble/main' 19
ret="${PWD%/}/ab/cd/ef/file.txt"

# loop symbolic links
touch loop1.sh
ln -s loop1.sh loop0.sh
ln -s loop2.sh loop1.sh
ln -s loop3.sh loop2.sh
ln -s loop1.sh loop3.sh
rm loop1.sh
ln -s loop3.sh loop2.sh
ln -s loop2.sh loop1.sh
for impl in impl1 impl2; do
ble/test "ble/test:readlink.$impl loop0.sh" ret='loop1.sh'
done
Expand Down
25 changes: 16 additions & 9 deletions lib/test-util.sh
Expand Up @@ -1414,7 +1414,8 @@ function is-global() (readonly "$1"; ! local "$1" 2>/dev/null)
if ((_ble_bash>=40000)); then
(
ble/test 'echo 1 | { sleep 0.01; ble/util/is-stdin-ready; }'
ble/test 'sleep 0.01 | ble/util/is-stdin-ready' exit=1
[[ ${CI-} == true && ${GITHUB_ACTION-} && $OSTYPE == msys* ]] ||
ble/test 'sleep 0.01 | ble/util/is-stdin-ready' exit=1
ble/test 'ble/util/is-stdin-ready <<< a'
ble/test 'ble/util/is-stdin-ready <<< ""'

Expand Down Expand Up @@ -1515,6 +1516,10 @@ ble/test ble/util/is-running-in-subshell exit=1
ble/util/declare-print-definitions a0 a1 a{2..8} 2>/dev/null)"

for name in a0 a1 a{2..8}; do
# WA: msys bash では何故か配列代入形式 arr2=("${arr1[@]}") で要素に含まれる
# \r が全て消滅する。仕方がないのでスキップする。
[[ $name == a5 && $OSTYPE == msys* ]] && continue

stdout_var=s$name
ble/test "status $name" ret="${!stdout_var}"
done
Expand Down Expand Up @@ -1588,13 +1593,15 @@ ble/test ble/util/is-running-in-subshell exit=1
# ble/util/strftime

# ble/util/{msleep,sleep}
ble/util/msleep/.calibrate-loop &>/dev/null
ble/util/msleep/.calibrate-loop &>/dev/null
ble/util/msleep/.calibrate-loop &>/dev/null
(
ble/test 'ble-measure -q "ble/util/msleep 100"; echo "$ret usec" >&2; ((msec=ret/1000,90<=msec&&msec<=110))'
ble/test 'ble-measure -q "ble/util/sleep 0.1"; echo "$ret usec" >&2; ((msec=ret/1000,90<=msec&&msec<=110))'
)
if ! [[ ${CI-} == true && ${GITHUB_ACTION-} ]]; then
ble/util/msleep/.calibrate-loop &>/dev/null
ble/util/msleep/.calibrate-loop &>/dev/null
ble/util/msleep/.calibrate-loop &>/dev/null
(
ble/test 'ble-measure -q "ble/util/msleep 100"; echo "$ret usec" >&2; ((msec=ret/1000,90<=msec&&msec<=120))'
ble/test 'ble-measure -q "ble/util/sleep 0.1"; echo "$ret usec" >&2; ((msec=ret/1000,90<=msec&&msec<=120))'
)
fi

# ble/util/conditional-sync
(
Expand Down Expand Up @@ -1822,7 +1829,7 @@ ble/util/msleep/.calibrate-loop &>/dev/null
ble/test 'ble/util/c2s.cached 956' ret=μ
ble/test 'ble/util/c2s.cached 12354' ret=あ

LANG=C
LC_ALL=C
ble/test 'ble/util/c2s 97' ret=a
ble/test 'ble/util/c2s 956; [[ $ret != μ ]]'
ble/test 'ble/util/c2s 12354; [[ $ret != あ ]]'
Expand Down

0 comments on commit c5ddacc

Please sign in to comment.