# -*- tcl -*-
# tabify.test:  tests for the tabify sub-package of the textutil package.
#
# This file contains a collection of tests for one or more of the Tcl
# built-in commands.  Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.
#

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.2
testsNeedTcltest 1.0

support {
    useLocal     repeat.tcl   textutil::repeat
}
testing {
    useLocal     tabify.tcl   textutil::tabify
}

# -------------------------------------------------------------------------

test tabify-0.1 {tabify string} {
    ::textutil::tabify::tabify "        hello,        world        "
} "\thello,\tworld\t"

test tabify-0.2 {tabify string with 4 chars} {
    ::textutil::tabify::tabify "        hello,        world        " 4
} "\t\thello,\t\tworld\t\t"

test tabify-0.3 {tabify string with 5 chars} {
    ::textutil::tabify::tabify "        hello,        world        " 5
} "\t   hello,\t   world\t   "

test tabify-1.1 {untabify string} {
    ::textutil::tabify::untabify "\thello,\tworld\t"
} "        hello,        world        "

test tabify-1.2 {untabify string with 4 chars} {
    ::textutil::tabify::untabify "\t\thello,\t\tworld\t\t" 4
} "        hello,        world        "

test tabify-1.3 {untabify string with 5 chars} {
    ::textutil::tabify::untabify "\t   hello,\t   world\t   " 5
} "        hello,        world        "

#
# Tests for version 2 of (un)tabify
#

#
# tests 2.1 - 2.3: see how a single space (after 'hello') is not converted
# to a tab
#
test tabify-2.1 {version 2: tabify, tab size 3} {
    ::textutil::tabify::tabify2 "hello    world" 3
    #                    ---|||---|||--
} "hello \tworld"

test tabify-2.2 {version 2: tabify, tab size 3, more spaces than needed} {
    ::textutil::tabify::tabify2 "hello      world" 3
} "hello \t  world"

test tabify-2.3 {version 2: tabify, tab size 3, less spaces than needed} {
    ::textutil::tabify::tabify2 "hello   world" 3
} "hello   world"

test tabify-2.4 {version 2: tabify, tab size 8} {
    ::textutil::tabify::tabify2 "hello   world"
} "hello\tworld"

test tabify-2.5 {version 2: tabify, tab size 8, more spaces than needed} {
    ::textutil::tabify::tabify2 "hello     world"
} "hello\t  world"

test tabify-2.6 {version 2: tabify, tab size 8, less spaces than needed} {
    ::textutil::tabify::tabify2 "hello  world"
} "hello  world"

#
# tests 2.7 & 2.8: 'end of line' (\n or not) of last line is preserved
#
test tabify-2.7 {version 2: tabify, tab size 8, multi line} {
    ::textutil::tabify::tabify2 "line 1  \n        line 2\nline 3  \n        line 4"
} "line 1\t\n\tline 2\nline 3\t\n\tline 4"

test tabify-2.8 {version 2: tabify, tab size 8, multi line} {
    ::textutil::tabify::tabify2 "line 1  \n        line 2\nline 3  \n        line 4\n"
} "line 1\t\n\tline 2\nline 3\t\n\tline 4\n"

# Test handling of existing tabs ... 2.9 as test and 2.10 the
# discrimator to check that it is correct if I use spaces
# instead of a tab, to see that my understanding is basically correct.

test tabify-2.9 {version 2: handling of existing tabs} {
    ::textutil::tabify::tabify2 "hello\tworld   bye"
    #                    hello...world   bye
    #                    --------||||||||---
} "hello\tworld\tbye"

test tabify-2.10 {version 2: handling of existing tabs} {
    ::textutil::tabify::tabify2 "hello   world   bye"
} "hello\tworld\tbye"


#
# untabify
#
test tabify-3.1 {version 2: untabify, tab size 3} {
    ::textutil::tabify::untabify2 "hello \tworld" 3
} "hello    world"

test tabify-3.2 {version 2: untabify, tab size 3, tab to single space} {
    ::textutil::tabify::untabify2 "hello\t\tworld" 3
} "hello    world"

#
# The change in tab size from 3 to 8 (silently) results in building the
# appropriate 'Spaces' strings (in 3.5 'Spaces(6)' is needed)
#
test tabify-3.3 {version 2: untabify, tab size 8} {
    ::textutil::tabify::untabify2 "hello\tworld"
} "hello   world"

test tabify-3.4 {version 2: untabify, tab size 8, mix of tab and spaces} {
    ::textutil::tabify::untabify2 "hello  \tworld"
} "hello   world"

test tabify-3.5 {version 2: untabify, tab size 8, requires 'long' space string} {
    ::textutil::tabify::untabify2 "hello\tmy\tworld"
} "hello   my      world"


#
# tests 3.6 & 3.7: 'end of line' (\n or not) of last line is preserved
#
test tabify-3.6 {version 2: untabify, tab size 8, multi line} {
    ::textutil::tabify::untabify2 "line 1\t\n\tline 2\nline 3\t\n\tline 4"
} "line 1  \n        line 2\nline 3  \n        line 4"

test tabify-3.7 {version 2: untabify, tab size 8, multi line} {
    ::textutil::tabify::untabify2 "line 1\t\n\tline 2\nline 3\t\n\tline 4\n"
} "line 1  \n        line 2\nline 3  \n        line 4\n"

#
# Edge cases: test for empty string
#
test tabify-4.1 {tabify empty string}    { ::textutil::tabify::tabify    "" } ""
test tabify-4.2 {untabify empty string}  { ::textutil::tabify::untabify  "" } ""
test tabify-4.3 {tabify2 empty string}   { ::textutil::tabify::tabify2   "" } ""
test tabify-4.4 {untabify2 empty string} { ::textutil::tabify::untabify2 "" } ""

