2011-01-10 23:46:27 +01:00
#!/usr/bin/env zsh
# -------------------------------------------------------------------------------------------------
2017-12-25 08:41:53 +00:00
# Copyright (c) 2010-2017 zsh-syntax-highlighting contributors
2011-01-10 23:46:27 +01:00
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the zsh-syntax-highlighting contributors nor the names of its contributors
# may be used to endorse or promote products derived from this software without specific prior
# written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
# -------------------------------------------------------------------------------------------------
2017-11-04 11:19:00 -05:00
setopt NO_UNSET WARN_CREATE_GLOBAL
2017-11-02 19:25:23 -05:00
2011-06-12 22:57:14 +02:00
# Check an highlighter was given as argument.
[ [ -n " $1 " ] ] || {
2015-10-23 05:34:01 +00:00
echo >& 2 "Bail out! You must provide the name of a valid highlighter as argument."
exit 2
2011-06-12 22:57:14 +02:00
}
# Check the highlighter is valid.
[ [ -f ${ 0 : h : h } /highlighters/$1 /$1 -highlighter.zsh ] ] || {
2016-01-20 22:01:45 +00:00
echo >& 2 " Bail out! Could not find highlighter ${ (qq)1 } . "
2015-10-23 05:34:01 +00:00
exit 2
2011-06-12 22:57:14 +02:00
}
# Check the highlighter has test data.
[ [ -d ${ 0 : h : h } /highlighters/$1 /test-data ] ] || {
2016-01-20 22:01:45 +00:00
echo >& 2 " Bail out! Highlighter ${ (qq)1 } has no test data. "
2015-10-23 05:34:01 +00:00
exit 2
2011-06-12 22:57:14 +02:00
}
2016-12-02 09:50:55 +00:00
# Set up results_filter
local results_filter
2017-11-02 19:24:56 -05:00
if [ [ ${ QUIET - } = = y ] ] ; then
2016-12-02 09:50:55 +00:00
if type -w perl >/dev/null; then
results_filter = ${ 0 : A : h } /tap-filter
else
echo >& 2 "Bail out! quiet mode not supported: perl not found" ; exit 2
fi
else
results_filter = cat
fi
[ [ -n $results_filter ] ] || { echo >& 2 "Bail out! BUG setting \$results_filter" ; exit 2 }
2011-01-10 23:46:27 +01:00
# Load the main script.
2016-12-02 09:35:29 +00:00
# While here, test that it doesn't eat aliases.
print > >( $results_filter | ${ 0 : A : h } /tap-colorizer.zsh) -r -- "# global (driver) tests"
print > >( $results_filter | ${ 0 : A : h } /tap-colorizer.zsh) -r -- "1..1"
alias -- +plus= plus
alias -- _other = other
original_alias_dash_L_output = " $( alias -L) "
2011-06-12 22:57:14 +02:00
. ${ 0 : h : h } /zsh-syntax-highlighting.zsh
2016-12-02 09:35:29 +00:00
if [ [ $original_alias_dash_L_output = = $( alias -L) ] ] ; then
print -r -- "ok 1 # 'alias -- +foo=bar' is preserved"
else
print -r -- "not ok 1 # 'alias -- +foo=bar' is preserved"
exit 1
fi > >( $results_filter | ${ 0 : A : h } /tap-colorizer.zsh)
2011-06-12 22:57:14 +02:00
2016-04-02 20:27:10 -05:00
# Overwrite _zsh_highlight_add_highlight so we get the key itself instead of the style
_zsh_highlight_add_highlight( )
{
region_highlight += ( " $1 $2 $3 " )
}
2011-06-12 22:57:14 +02:00
# Activate the highlighter.
ZSH_HIGHLIGHT_HIGHLIGHTERS = ( $1 )
2011-01-10 23:46:27 +01:00
2018-12-29 11:57:15 +00:00
# In zsh<5.3, 'typeset -p arrayvar' emits two lines, so we use this wrapper instead.
typeset_p( ) {
for 1 ; do
print -r -- " $1 =( ${ (@q-P)1 } ) "
done
}
2015-10-23 03:27:05 +00:00
# Runs a highlighting test
# $1: data file
2015-11-16 22:54:52 +00:00
run_test_internal( ) {
2011-01-10 23:46:27 +01:00
2015-11-16 22:54:52 +00:00
local tests_tempdir = " $1 " ; shift
local srcdir = " $PWD "
2018-01-12 14:28:08 +00:00
builtin cd -q -- " $tests_tempdir " || { echo >& 2 " Bail out! On ${ (qq)1 } : cd failed: $? " ; return 1 }
2015-11-16 22:54:52 +00:00
2015-10-27 11:55:36 +02:00
echo " # ${ 1 : t : r } "
2011-01-10 23:46:27 +01:00
# Load the data and prepare checking it.
2018-02-06 19:14:26 -06:00
local BUFFER CURSOR MARK PENDING PREBUFFER REGION_ACTIVE WIDGET skip_test unsorted = 0
2018-12-29 11:31:18 +00:00
local expected_mismatch
2017-11-04 11:18:31 -05:00
local -a expected_region_highlight region_highlight
2015-11-16 22:54:52 +00:00
. " $srcdir " /" $1 "
2011-01-10 23:46:27 +01:00
2017-11-06 07:08:53 -06:00
( ( $# skip_test ) ) && { print -r -- " 1..0 # SKIP $skip_test " ; return ; }
2015-01-26 14:03:08 +00:00
# Check the data declares $PREBUFFER or $BUFFER.
2018-01-12 14:28:08 +00:00
[ [ -z $PREBUFFER && -z $BUFFER ] ] && { echo >& 2 " Bail out! On ${ (qq)1 } : Either 'PREBUFFER' or 'BUFFER' must be declared and non-blank " ; return 1; }
2015-10-23 03:27:05 +00:00
# Check the data declares $expected_region_highlight.
2018-02-06 19:14:26 -06:00
( ( $+expected_region_highlight = = 0 ) ) && { echo >& 2 " Bail out! On ${ (qq)1 } : 'expected_region_highlight' is not declared. " ; return 1; }
2015-10-23 03:27:05 +00:00
2017-11-02 19:09:32 -05:00
# Set sane defaults for ZLE variables
: ${ CURSOR = $# BUFFER } ${ PENDING =0 } ${ WIDGET =z-sy-h-test-harness-test-widget }
2015-10-23 03:27:05 +00:00
# Process the data.
_zsh_highlight
2018-02-06 19:14:26 -06:00
if ( ( unsorted ) ) ; then
region_highlight = ( " ${ (@n)region_highlight } " )
expected_region_highlight = ( " ${ (@n)expected_region_highlight } " )
fi
2015-10-23 03:27:05 +00:00
2018-02-06 19:14:26 -06:00
echo " 1.. $(( $# expected_region_highlight + 1 )) "
local i
for ( ( i = 1; i<= $# expected_region_highlight; i++) ) ; do
local -a expected_highlight_zone; expected_highlight_zone = ( ${ (z)expected_region_highlight[i] } )
integer exp_start = $expected_highlight_zone [ 1] exp_end = $expected_highlight_zone [ 2]
2015-10-23 04:26:51 +00:00
local todo =
2018-02-06 19:14:26 -06:00
( ( $+expected_highlight_zone[ 4] ) ) && todo = " # TODO $expected_highlight_zone [4] "
if ! ( ( $+region_highlight[ i] ) ) ; then
print -r -- " not ok $i - unmatched expectation ( $exp_start $exp_end $expected_highlight_zone [3]) "
continue
fi
local -a highlight_zone; highlight_zone = ( ${ (z)region_highlight[i] } )
integer start = $(( highlight_zone[ 1 ] + 1 )) end = $highlight_zone [ 2]
2018-02-10 13:23:08 -06:00
# Escape # as ♯ and newline as ↵ they are illegal in the 'description' part of TAP output
local desc = " [ $start , $end ] « ${ ${ BUFFER [ $start , $end ]// '#' /♯ } // $'\n' /↵ } » "
2018-02-06 19:14:26 -06:00
if
[ [ $start != $exp_start ] ] ||
[ [ $end != $exp_end ] ] ||
[ [ $highlight_zone [ 3] != $expected_highlight_zone [ 3] ] ]
then
print -r -- " not ok $i - $desc - expected ( $exp_start $exp_end ${ (qqq)expected_highlight_zone[3] } ), observed ( $start $end ${ (qqq)highlight_zone[3] } ). $todo "
else
print -r -- " ok $i - $desc ${ todo : + - } $todo "
fi
unset expected_highlight_zone
unset exp_start exp_end
2016-05-05 18:44:54 +00:00
unset todo
unset highlight_zone
2018-02-06 19:14:26 -06:00
unset start end
unset desc
2015-10-23 03:27:05 +00:00
done
2018-02-06 19:14:26 -06:00
if ( ( $# expected_region_highlight = = $# region_highlight ) ) ; then
2018-12-29 11:46:18 +00:00
print -r -- " ok $i - cardinality check " " ${ expected_mismatch : + " # TODO ${ (qqq)expected_mismatch } " } "
2018-02-06 19:14:26 -06:00
else
2018-12-29 11:57:15 +00:00
print -r -- " not ok $i - have $# expected_region_highlight expectations and $# region_highlight region_highlight entries: « $( typeset_p expected_region_highlight) » « $( typeset_p region_highlight) » " " ${ expected_mismatch : + " # TODO ${ (qqq)expected_mismatch } " } "
2018-02-06 19:14:26 -06:00
fi
2015-10-23 03:27:05 +00:00
}
2011-01-10 23:46:27 +01:00
2016-01-01 16:35:00 +00:00
# Run a single test file. The exit status is 1 if the test harness had
# an error and 0 otherwise. The exit status does not depend on whether
# test points succeeded or failed.
2015-11-16 22:54:52 +00:00
run_test( ) {
# Do not combine the declaration and initialization: «local x="$(false)"» does not set $?.
2015-11-17 01:05:05 +00:00
local __tests_tempdir
__tests_tempdir = " $( mktemp -d) " && [ [ -d $__tests_tempdir ] ] || {
2015-11-16 22:54:52 +00:00
echo >& 2 "Bail out! mktemp failed" ; return 1
2015-11-17 01:05:05 +00:00
}
2015-11-16 22:54:52 +00:00
typeset -r __tests_tempdir # don't allow tests to override the variable that we will 'rm -rf' later on
{
2016-01-01 16:35:00 +00:00
# Use a subshell to isolate tests from each other.
# (So tests can alter global shell state using 'cd', 'hash', etc)
2016-05-12 21:39:11 -05:00
{
# These braces are so multios don't come into play.
{ ( run_test_internal " $__tests_tempdir " " $@ " ) 3>& 1 >& 2 2>& 3 } | grep \^
local ret = $pipestatus [ 1] stderr = $pipestatus [ 2]
if ( ( ! stderr ) ) ; then
# stdout will become stderr
2018-01-12 14:28:08 +00:00
echo " Bail out! On ${ (qq)1 } : output on stderr " ; return 1
2016-05-12 21:39:11 -05:00
else
return $ret
fi
} 3>& 1 >& 2 2>& 3
2015-11-16 22:54:52 +00:00
} always {
rm -rf -- " $__tests_tempdir "
}
}
2015-10-23 03:27:05 +00:00
# Process each test data file in test data directory.
integer something_failed = 0
2016-04-24 23:22:14 -05:00
ZSH_HIGHLIGHT_STYLES = ( )
2015-10-23 03:27:05 +00:00
for data_file in ${ 0 : h : h } /highlighters/$1 /test-data/*.zsh; do
2016-04-01 00:52:27 -05:00
run_test " $data_file " | tee >( $results_filter | ${ 0 : A : h } /tap-colorizer.zsh) | grep -v '^not ok.*# TODO' | grep -Eq '^not ok|^ok.*# TODO' && ( ( something_failed = 1 ) )
2015-10-23 03:27:05 +00:00
( ( $pipestatus [ 1] ) ) && exit 2
2011-01-10 23:46:27 +01:00
done
2015-09-05 09:27:51 +00:00
exit $something_failed