I: pbuilder: network access will be disabled during build
I: Current time: Sun Mar  9 16:10:41 -12 2025
I: pbuilder-time-stamp: 1741579841
I: Building the build Environment
I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz]
I: copying local configuration
W: --override-config is not set; not updating apt.conf Read the manpage for details.
I: mounting /proc filesystem
I: mounting /sys filesystem
I: creating /{dev,run}/shm
I: mounting /dev/pts filesystem
I: redirecting /dev/ptmx to /dev/pts/ptmx
I: policy-rc.d already exists
I: using eatmydata during job
I: Copying source file
I: copying [terminaltables3_4.0.0-4.dsc]
I: copying [./terminaltables3_4.0.0.orig.tar.xz]
I: copying [./terminaltables3_4.0.0-4.debian.tar.xz]
I: Extracting source
dpkg-source: warning: cannot verify inline signature for ./terminaltables3_4.0.0-4.dsc: unsupported subcommand
dpkg-source: info: extracting terminaltables3 in terminaltables3-4.0.0
dpkg-source: info: unpacking terminaltables3_4.0.0.orig.tar.xz
dpkg-source: info: unpacking terminaltables3_4.0.0-4.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying debian/0001-google-analytics.patch
dpkg-source: info: applying debian/0002-html-output.patch
dpkg-source: info: applying debian/0003-python-shebang.patch
dpkg-source: info: applying debian/0004-quiet-stdout.patch
dpkg-source: info: applying debian/0005-sphinx-meta.patch
dpkg-source: info: applying debian/0006-sphinx-extlinks.patch
I: Not using root during the build.
I: Installing the build-deps
I: user script /srv/workspace/pbuilder/6078/tmp/hooks/D02_print_environment starting
I: set
  BUILDDIR='/build/reproducible-path'
  BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other'
  BUILDUSERNAME='pbuilder1'
  BUILD_ARCH='i386'
  DEBIAN_FRONTEND='noninteractive'
  DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=11 '
  DISTRIBUTION='trixie'
  HOME='/root'
  HOST_ARCH='i386'
  IFS=' 	
  '
  INVOCATION_ID='3bbccd34cf784911b5a0403c7b13c8fa'
  LANG='C'
  LANGUAGE='en_US:en'
  LC_ALL='C'
  LD_LIBRARY_PATH='/usr/lib/libeatmydata'
  LD_PRELOAD='libeatmydata.so'
  MAIL='/var/mail/root'
  OPTIND='1'
  PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games'
  PBCURRENTCOMMANDLINEOPERATION='build'
  PBUILDER_OPERATION='build'
  PBUILDER_PKGDATADIR='/usr/share/pbuilder'
  PBUILDER_PKGLIBDIR='/usr/lib/pbuilder'
  PBUILDER_SYSCONFDIR='/etc'
  PPID='6078'
  PS1='# '
  PS2='> '
  PS4='+ '
  PWD='/'
  SHELL='/bin/bash'
  SHLVL='2'
  SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.hA6PFsps/pbuilderrc_ChOS --distribution trixie --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.hA6PFsps/b1 --logfile b1/build.log terminaltables3_4.0.0-4.dsc'
  SUDO_GID='112'
  SUDO_UID='107'
  SUDO_USER='jenkins'
  TERM='unknown'
  TZ='/usr/share/zoneinfo/Etc/GMT+12'
  USER='root'
  _='/usr/bin/systemd-run'
  http_proxy='http://46.16.76.132:3128'
I: uname -a
  Linux ionos12-i386 6.1.0-31-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.128-1 (2025-02-07) x86_64 GNU/Linux
I: ls -l /bin
  lrwxrwxrwx 1 root root 7 Nov 22 14:40 /bin -> usr/bin
I: user script /srv/workspace/pbuilder/6078/tmp/hooks/D02_print_environment finished
 -> Attempting to satisfy build-dependencies
 -> Creating pbuilder-satisfydepends-dummy package
Package: pbuilder-satisfydepends-dummy
Version: 0.invalid.0
Architecture: i386
Maintainer: Debian Pbuilder Team <pbuilder-maint@lists.alioth.debian.org>
Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder
 This package was created automatically by pbuilder to satisfy the
 build-dependencies of the package being currently built.
Depends: debhelper-compat (= 13), dh-python, pybuild-plugin-pyproject, python3-all, python3-colorama, python3-colorclass, python3-poetry, python3-pytest, python3-setuptools, python3-sphinx, python3-sphinx-rtd-theme, python3-termcolor
dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'.
Selecting previously unselected package pbuilder-satisfydepends-dummy.
(Reading database ... 19787 files and directories currently installed.)
Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ...
Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ...
dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested:
 pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however:
  Package debhelper-compat is not installed.
 pbuilder-satisfydepends-dummy depends on dh-python; however:
  Package dh-python is not installed.
 pbuilder-satisfydepends-dummy depends on pybuild-plugin-pyproject; however:
  Package pybuild-plugin-pyproject is not installed.
 pbuilder-satisfydepends-dummy depends on python3-all; however:
  Package python3-all is not installed.
 pbuilder-satisfydepends-dummy depends on python3-colorama; however:
  Package python3-colorama is not installed.
 pbuilder-satisfydepends-dummy depends on python3-colorclass; however:
  Package python3-colorclass is not installed.
 pbuilder-satisfydepends-dummy depends on python3-poetry; however:
  Package python3-poetry is not installed.
 pbuilder-satisfydepends-dummy depends on python3-pytest; however:
  Package python3-pytest is not installed.
 pbuilder-satisfydepends-dummy depends on python3-setuptools; however:
  Package python3-setuptools is not installed.
 pbuilder-satisfydepends-dummy depends on python3-sphinx; however:
  Package python3-sphinx is not installed.
 pbuilder-satisfydepends-dummy depends on python3-sphinx-rtd-theme; however:
  Package python3-sphinx-rtd-theme is not installed.
 pbuilder-satisfydepends-dummy depends on python3-termcolor; however:
  Package python3-termcolor is not installed.

Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ...
Reading package lists...
Building dependency tree...
Reading state information...
Initializing package states...
Writing extended state information...
Building tag database...
pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0)
pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0)
The following NEW packages will be installed:
  autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} ca-certificates{a} debhelper{a} dh-autoreconf{a} dh-python{a} dh-strip-nondeterminism{a} docutils-common{a} dwz{a} file{a} fonts-font-awesome{a} fonts-lato{a} gettext{a} gettext-base{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libdebhelper-perl{a} libelf1t64{a} libexpat1{a} libffi8{a} libfile-stripnondeterminism-perl{a} libicu72{a} libjs-jquery{a} libjs-sphinxdoc{a} libjs-underscore{a} libjson-perl{a} libmagic-mgc{a} libmagic1t64{a} libpipeline1{a} libpython3-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} libtool{a} libuchardet0{a} libunistring5{a} libxml2{a} m4{a} man-db{a} media-types{a} netbase{a} openssl{a} po-debconf{a} pybuild-plugin-pyproject{a} python-babel-localedata{a} python3{a} python3-alabaster{a} python3-all{a} python3-autocommand{a} python3-babel{a} python3-bcrypt{a} python3-build{a} python3-cachecontrol{a} python3-certifi{a} python3-cffi-backend{a} python3-chardet{a} python3-charset-normalizer{a} python3-cleo{a} python3-colorama{a} python3-colorclass{a} python3-cryptography{a} python3-defusedxml{a} python3-distlib{a} python3-docutils{a} python3-dulwich{a} python3-fastjsonschema{a} python3-filelock{a} python3-idna{a} python3-imagesize{a} python3-importlib-metadata{a} python3-inflect{a} python3-iniconfig{a} python3-installer{a} python3-jaraco.classes{a} python3-jaraco.context{a} python3-jaraco.functools{a} python3-jaraco.text{a} python3-jeepney{a} python3-jinja2{a} python3-keyring{a} python3-markupsafe{a} python3-minimal{a} python3-more-itertools{a} python3-msgpack{a} python3-packaging{a} python3-pip-whl{a} python3-pkg-resources{a} python3-pkginfo{a} python3-platformdirs{a} python3-pluggy{a} python3-poetry{a} python3-poetry-core{a} python3-pygments{a} python3-pyproject-hooks{a} python3-pytest{a} python3-requests{a} python3-requests-toolbelt{a} python3-roman{a} python3-secretstorage{a} python3-setuptools{a} python3-setuptools-whl{a} python3-shellingham{a} python3-snowballstemmer{a} python3-sphinx{a} python3-sphinx-rtd-theme{a} python3-sphinxcontrib.jquery{a} python3-termcolor{a} python3-toml{a} python3-tomlkit{a} python3-trove-classifiers{a} python3-typeguard{a} python3-typing-extensions{a} python3-urllib3{a} python3-virtualenv{a} python3-wheel{a} python3-wheel-whl{a} python3-zipp{a} python3.13{a} python3.13-minimal{a} readline-common{a} sensible-utils{a} sgml-base{a} sphinx-common{a} sphinx-rtd-theme-common{a} tzdata{a} xml-core{a} 
The following packages are RECOMMENDED but will NOT be installed:
  curl javascript-common libarchive-cpio-perl libjson-xs-perl libltdl-dev libmail-sendmail-perl libpaper-utils lynx python-pkginfo-doc python3-dev python3-fastimport python3-pil wget 
0 packages upgraded, 130 newly installed, 0 to remove and 0 not upgraded.
Need to get 51.2 MB of archives. After unpacking 196 MB will be used.
Writing extended state information...
Get: 1 http://deb.debian.org/debian trixie/main i386 fonts-lato all 2.015-1 [2780 kB]
Get: 2 http://deb.debian.org/debian trixie/main i386 libpython3.13-minimal i386 3.13.2-1 [859 kB]
Get: 3 http://deb.debian.org/debian trixie/main i386 libexpat1 i386 2.6.4-1 [107 kB]
Get: 4 http://deb.debian.org/debian trixie/main i386 python3.13-minimal i386 3.13.2-1 [2266 kB]
Get: 5 http://deb.debian.org/debian trixie/main i386 python3-minimal i386 3.13.2-1 [27.1 kB]
Get: 6 http://deb.debian.org/debian trixie/main i386 media-types all 12.0.0 [28.9 kB]
Get: 7 http://deb.debian.org/debian trixie/main i386 netbase all 6.4 [12.8 kB]
Get: 8 http://deb.debian.org/debian trixie/main i386 tzdata all 2025a-2 [259 kB]
Get: 9 http://deb.debian.org/debian trixie/main i386 libffi8 i386 3.4.7-1 [21.4 kB]
Get: 10 http://deb.debian.org/debian trixie/main i386 readline-common all 8.2-6 [69.4 kB]
Get: 11 http://deb.debian.org/debian trixie/main i386 libreadline8t64 i386 8.2-6 [173 kB]
Get: 12 http://deb.debian.org/debian trixie/main i386 libpython3.13-stdlib i386 3.13.2-1 [1985 kB]
Get: 13 http://deb.debian.org/debian trixie/main i386 python3.13 i386 3.13.2-1 [745 kB]
Get: 14 http://deb.debian.org/debian trixie/main i386 libpython3-stdlib i386 3.13.2-1 [10.0 kB]
Get: 15 http://deb.debian.org/debian trixie/main i386 python3 i386 3.13.2-1 [28.1 kB]
Get: 16 http://deb.debian.org/debian trixie/main i386 sgml-base all 1.31 [15.4 kB]
Get: 17 http://deb.debian.org/debian trixie/main i386 sensible-utils all 0.0.24 [24.8 kB]
Get: 18 http://deb.debian.org/debian trixie/main i386 openssl i386 3.4.1-1 [1432 kB]
Get: 19 http://deb.debian.org/debian trixie/main i386 ca-certificates all 20241223 [164 kB]
Get: 20 http://deb.debian.org/debian trixie/main i386 libmagic-mgc i386 1:5.45-3+b1 [314 kB]
Get: 21 http://deb.debian.org/debian trixie/main i386 libmagic1t64 i386 1:5.45-3+b1 [115 kB]
Get: 22 http://deb.debian.org/debian trixie/main i386 file i386 1:5.45-3+b1 [43.2 kB]
Get: 23 http://deb.debian.org/debian trixie/main i386 gettext-base i386 0.23.1-1 [245 kB]
Get: 24 http://deb.debian.org/debian trixie/main i386 libuchardet0 i386 0.0.8-1+b2 [69.2 kB]
Get: 25 http://deb.debian.org/debian trixie/main i386 groff-base i386 1.23.0-7 [1199 kB]
Get: 26 http://deb.debian.org/debian trixie/main i386 bsdextrautils i386 2.40.4-5 [96.5 kB]
Get: 27 http://deb.debian.org/debian trixie/main i386 libpipeline1 i386 1.5.8-1 [41.2 kB]
Get: 28 http://deb.debian.org/debian trixie/main i386 man-db i386 2.13.0-1 [1428 kB]
Get: 29 http://deb.debian.org/debian trixie/main i386 m4 i386 1.4.19-7 [301 kB]
Get: 30 http://deb.debian.org/debian trixie/main i386 autoconf all 2.72-3 [493 kB]
Get: 31 http://deb.debian.org/debian trixie/main i386 autotools-dev all 20220109.1 [51.6 kB]
Get: 32 http://deb.debian.org/debian trixie/main i386 automake all 1:1.17-3 [862 kB]
Get: 33 http://deb.debian.org/debian trixie/main i386 autopoint all 0.23.1-1 [770 kB]
Get: 34 http://deb.debian.org/debian trixie/main i386 libdebhelper-perl all 13.24.1 [90.9 kB]
Get: 35 http://deb.debian.org/debian trixie/main i386 libtool all 2.5.4-4 [539 kB]
Get: 36 http://deb.debian.org/debian trixie/main i386 dh-autoreconf all 20 [17.1 kB]
Get: 37 http://deb.debian.org/debian trixie/main i386 libarchive-zip-perl all 1.68-1 [104 kB]
Get: 38 http://deb.debian.org/debian trixie/main i386 libfile-stripnondeterminism-perl all 1.14.1-2 [19.7 kB]
Get: 39 http://deb.debian.org/debian trixie/main i386 dh-strip-nondeterminism all 1.14.1-2 [8620 B]
Get: 40 http://deb.debian.org/debian trixie/main i386 libelf1t64 i386 0.192-4 [195 kB]
Get: 41 http://deb.debian.org/debian trixie/main i386 dwz i386 0.15-1+b1 [116 kB]
Get: 42 http://deb.debian.org/debian trixie/main i386 libunistring5 i386 1.3-1 [458 kB]
Get: 43 http://deb.debian.org/debian trixie/main i386 libicu72 i386 72.1-6 [9582 kB]
Get: 44 http://deb.debian.org/debian trixie/main i386 libxml2 i386 2.12.7+dfsg+really2.9.14-0.2+b2 [734 kB]
Get: 45 http://deb.debian.org/debian trixie/main i386 gettext i386 0.23.1-1 [1714 kB]
Get: 46 http://deb.debian.org/debian trixie/main i386 intltool-debian all 0.35.0+20060710.6 [22.9 kB]
Get: 47 http://deb.debian.org/debian trixie/main i386 po-debconf all 1.0.21+nmu1 [248 kB]
Get: 48 http://deb.debian.org/debian trixie/main i386 debhelper all 13.24.1 [920 kB]
Get: 49 http://deb.debian.org/debian trixie/main i386 python3-autocommand all 2.2.2-3 [13.6 kB]
Get: 50 http://deb.debian.org/debian trixie/main i386 python3-more-itertools all 10.6.0-1 [65.3 kB]
Get: 51 http://deb.debian.org/debian trixie/main i386 python3-zipp all 3.21.0-1 [10.6 kB]
Get: 52 http://deb.debian.org/debian trixie/main i386 python3-importlib-metadata all 8.6.1-1 [21.4 kB]
Get: 53 http://deb.debian.org/debian trixie/main i386 python3-typing-extensions all 4.12.2-2 [73.0 kB]
Get: 54 http://deb.debian.org/debian trixie/main i386 python3-typeguard all 4.4.2-1 [37.3 kB]
Get: 55 http://deb.debian.org/debian trixie/main i386 python3-inflect all 7.3.1-2 [32.4 kB]
Get: 56 http://deb.debian.org/debian trixie/main i386 python3-jaraco.context all 6.0.1-1 [8276 B]
Get: 57 http://deb.debian.org/debian trixie/main i386 python3-jaraco.functools all 4.1.0-1 [12.0 kB]
Get: 58 http://deb.debian.org/debian trixie/main i386 python3-pkg-resources all 75.8.0-1 [222 kB]
Get: 59 http://deb.debian.org/debian trixie/main i386 python3-jaraco.text all 4.0.0-1 [11.4 kB]
Get: 60 http://deb.debian.org/debian trixie/main i386 python3-setuptools all 75.8.0-1 [724 kB]
Get: 61 http://deb.debian.org/debian trixie/main i386 dh-python all 6.20250108 [113 kB]
Get: 62 http://deb.debian.org/debian trixie/main i386 xml-core all 0.19 [20.1 kB]
Get: 63 http://deb.debian.org/debian trixie/main i386 docutils-common all 0.21.2+dfsg-2 [128 kB]
Get: 64 http://deb.debian.org/debian trixie/main i386 fonts-font-awesome all 5.0.10+really4.7.0~dfsg-4.1 [517 kB]
Get: 65 http://deb.debian.org/debian trixie/main i386 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB]
Get: 66 http://deb.debian.org/debian trixie/main i386 libjs-underscore all 1.13.4~dfsg+~1.11.4-3 [116 kB]
Get: 67 http://deb.debian.org/debian trixie/main i386 libjs-sphinxdoc all 8.1.3-5 [30.5 kB]
Get: 68 http://deb.debian.org/debian trixie/main i386 libjson-perl all 4.10000-1 [87.5 kB]
Get: 69 http://deb.debian.org/debian trixie/main i386 python3-packaging all 24.2-1 [55.3 kB]
Get: 70 http://deb.debian.org/debian trixie/main i386 python3-pyproject-hooks all 1.2.0-1 [11.7 kB]
Get: 71 http://deb.debian.org/debian trixie/main i386 python3-toml all 0.10.2-1 [16.2 kB]
Get: 72 http://deb.debian.org/debian trixie/main i386 python3-wheel all 0.45.1-1 [56.7 kB]
Get: 73 http://deb.debian.org/debian trixie/main i386 python3-build all 1.2.2-1 [36.0 kB]
Get: 74 http://deb.debian.org/debian trixie/main i386 python3-installer all 0.7.0+dfsg1-3 [18.6 kB]
Get: 75 http://deb.debian.org/debian trixie/main i386 pybuild-plugin-pyproject all 6.20250108 [11.6 kB]
Get: 76 http://deb.debian.org/debian trixie/main i386 python-babel-localedata all 2.17.0-1 [6050 kB]
Get: 77 http://deb.debian.org/debian trixie/main i386 python3-alabaster all 0.7.16-0.1 [27.9 kB]
Get: 78 http://deb.debian.org/debian trixie/main i386 python3-all i386 3.13.2-1 [1048 B]
Get: 79 http://deb.debian.org/debian trixie/main i386 python3-babel all 2.17.0-1 [117 kB]
Get: 80 http://deb.debian.org/debian trixie/main i386 python3-bcrypt i386 4.2.0-2.1+b1 [225 kB]
Get: 81 http://deb.debian.org/debian trixie/main i386 python3-certifi all 2025.1.31+ds-1 [9652 B]
Get: 82 http://deb.debian.org/debian trixie/main i386 python3-charset-normalizer i386 3.4.1-1+b1 [127 kB]
Get: 83 http://deb.debian.org/debian trixie/main i386 python3-idna all 3.10-1 [42.0 kB]
Get: 84 http://deb.debian.org/debian trixie/main i386 python3-urllib3 all 2.3.0-1 [114 kB]
Get: 85 http://deb.debian.org/debian trixie/main i386 python3-chardet all 5.2.0+dfsg-2 [108 kB]
Get: 86 http://deb.debian.org/debian trixie/main i386 python3-requests all 2.32.3+dfsg-4 [72.1 kB]
Get: 87 http://deb.debian.org/debian trixie/main i386 python3-msgpack i386 1.0.3-3+b4 [86.1 kB]
Get: 88 http://deb.debian.org/debian trixie/main i386 python3-cachecontrol all 0.14.2-1 [18.3 kB]
Get: 89 http://deb.debian.org/debian trixie/main i386 python3-cffi-backend i386 1.17.1-2+b2 [96.5 kB]
Get: 90 http://deb.debian.org/debian trixie/main i386 python3-cleo all 2.2.1-1 [55.5 kB]
Get: 91 http://deb.debian.org/debian trixie/main i386 python3-colorama all 0.4.6-4 [36.2 kB]
Get: 92 http://deb.debian.org/debian trixie/main i386 python3-colorclass all 2.2.2-6 [467 kB]
Get: 93 http://deb.debian.org/debian trixie/main i386 python3-cryptography i386 43.0.0-1 [975 kB]
Get: 94 http://deb.debian.org/debian trixie/main i386 python3-defusedxml all 0.7.1-3 [43.4 kB]
Get: 95 http://deb.debian.org/debian trixie/main i386 python3-distlib all 0.3.9-1 [257 kB]
Get: 96 http://deb.debian.org/debian trixie/main i386 python3-roman all 5.0-1 [10.6 kB]
Get: 97 http://deb.debian.org/debian trixie/main i386 python3-docutils all 0.21.2+dfsg-2 [403 kB]
Get: 98 http://deb.debian.org/debian trixie/main i386 python3-dulwich i386 0.22.7-1 [205 kB]
Get: 99 http://deb.debian.org/debian trixie/main i386 python3-fastjsonschema all 2.21.1-1 [22.4 kB]
Get: 100 http://deb.debian.org/debian trixie/main i386 python3-filelock all 3.17.0-1 [12.7 kB]
Get: 101 http://deb.debian.org/debian trixie/main i386 python3-imagesize all 1.4.1-1 [6688 B]
Get: 102 http://deb.debian.org/debian trixie/main i386 python3-iniconfig all 1.1.1-2 [6396 B]
Get: 103 http://deb.debian.org/debian trixie/main i386 python3-jaraco.classes all 3.4.0-1 [7728 B]
Get: 104 http://deb.debian.org/debian trixie/main i386 python3-jeepney all 0.8.0-4 [32.6 kB]
Get: 105 http://deb.debian.org/debian trixie/main i386 python3-markupsafe i386 2.1.5-1+b3 [14.0 kB]
Get: 106 http://deb.debian.org/debian trixie/main i386 python3-jinja2 all 3.1.5-2 [107 kB]
Get: 107 http://deb.debian.org/debian trixie/main i386 python3-secretstorage all 3.3.3-3 [16.1 kB]
Get: 108 http://deb.debian.org/debian trixie/main i386 python3-keyring all 25.6.0-1 [54.7 kB]
Get: 109 http://deb.debian.org/debian trixie/main i386 python3-pip-whl all 25.0+dfsg-1 [1522 kB]
Get: 110 http://deb.debian.org/debian trixie/main i386 python3-pkginfo all 1.12.1.2-2 [21.1 kB]
Get: 111 http://deb.debian.org/debian trixie/main i386 python3-platformdirs all 4.3.6-1 [16.6 kB]
Get: 112 http://deb.debian.org/debian trixie/main i386 python3-pluggy all 1.5.0-1 [26.9 kB]
Get: 113 http://deb.debian.org/debian trixie/main i386 python3-poetry-core all 2.0.1-2 [225 kB]
Get: 114 http://deb.debian.org/debian trixie/main i386 python3-requests-toolbelt all 1.0.0-4 [40.3 kB]
Get: 115 http://deb.debian.org/debian trixie/main i386 python3-shellingham all 1.5.4-1 [11.0 kB]
Get: 116 http://deb.debian.org/debian trixie/main i386 python3-tomlkit all 0.13.2-1 [42.7 kB]
Get: 117 http://deb.debian.org/debian trixie/main i386 python3-trove-classifiers all 2025.2.18.16-1 [10.4 kB]
Get: 118 http://deb.debian.org/debian trixie/main i386 python3-setuptools-whl all 75.8.0-1 [1244 kB]
Get: 119 http://deb.debian.org/debian trixie/main i386 python3-wheel-whl all 0.45.1-1 [75.3 kB]
Get: 120 http://deb.debian.org/debian trixie/main i386 python3-virtualenv all 20.29.1+ds-1 [71.6 kB]
Get: 121 http://deb.debian.org/debian trixie/main i386 python3-poetry all 2.0.1+dfsg-1 [187 kB]
Get: 122 http://deb.debian.org/debian trixie/main i386 python3-pygments all 2.18.0+dfsg-2 [836 kB]
Get: 123 http://deb.debian.org/debian trixie/main i386 python3-pytest all 8.3.4-1 [250 kB]
Get: 124 http://deb.debian.org/debian trixie/main i386 python3-snowballstemmer all 2.2.0-4 [58.0 kB]
Get: 125 http://deb.debian.org/debian trixie/main i386 sphinx-common all 8.1.3-5 [617 kB]
Get: 126 http://deb.debian.org/debian trixie/main i386 python3-sphinx all 8.1.3-5 [468 kB]
Get: 127 http://deb.debian.org/debian trixie/main i386 sphinx-rtd-theme-common all 3.0.2+dfsg-2 [1023 kB]
Get: 128 http://deb.debian.org/debian trixie/main i386 python3-sphinxcontrib.jquery all 4.1-5 [7348 B]
Get: 129 http://deb.debian.org/debian trixie/main i386 python3-sphinx-rtd-theme all 3.0.2+dfsg-2 [29.7 kB]
Get: 130 http://deb.debian.org/debian trixie/main i386 python3-termcolor all 2.4.0-2 [9460 B]
Fetched 51.2 MB in 1s (47.4 MB/s)
Preconfiguring packages ...
Selecting previously unselected package fonts-lato.
(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 19787 files and directories currently installed.)
Preparing to unpack .../fonts-lato_2.015-1_all.deb ...
Unpacking fonts-lato (2.015-1) ...
Selecting previously unselected package libpython3.13-minimal:i386.
Preparing to unpack .../libpython3.13-minimal_3.13.2-1_i386.deb ...
Unpacking libpython3.13-minimal:i386 (3.13.2-1) ...
Selecting previously unselected package libexpat1:i386.
Preparing to unpack .../libexpat1_2.6.4-1_i386.deb ...
Unpacking libexpat1:i386 (2.6.4-1) ...
Selecting previously unselected package python3.13-minimal.
Preparing to unpack .../python3.13-minimal_3.13.2-1_i386.deb ...
Unpacking python3.13-minimal (3.13.2-1) ...
Setting up libpython3.13-minimal:i386 (3.13.2-1) ...
Setting up libexpat1:i386 (2.6.4-1) ...
Setting up python3.13-minimal (3.13.2-1) ...
Selecting previously unselected package python3-minimal.
(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 20147 files and directories currently installed.)
Preparing to unpack .../0-python3-minimal_3.13.2-1_i386.deb ...
Unpacking python3-minimal (3.13.2-1) ...
Selecting previously unselected package media-types.
Preparing to unpack .../1-media-types_12.0.0_all.deb ...
Unpacking media-types (12.0.0) ...
Selecting previously unselected package netbase.
Preparing to unpack .../2-netbase_6.4_all.deb ...
Unpacking netbase (6.4) ...
Selecting previously unselected package tzdata.
Preparing to unpack .../3-tzdata_2025a-2_all.deb ...
Unpacking tzdata (2025a-2) ...
Selecting previously unselected package libffi8:i386.
Preparing to unpack .../4-libffi8_3.4.7-1_i386.deb ...
Unpacking libffi8:i386 (3.4.7-1) ...
Selecting previously unselected package readline-common.
Preparing to unpack .../5-readline-common_8.2-6_all.deb ...
Unpacking readline-common (8.2-6) ...
Selecting previously unselected package libreadline8t64:i386.
Preparing to unpack .../6-libreadline8t64_8.2-6_i386.deb ...
Adding 'diversion of /lib/i386-linux-gnu/libhistory.so.8 to /lib/i386-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/i386-linux-gnu/libhistory.so.8.2 to /lib/i386-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/i386-linux-gnu/libreadline.so.8 to /lib/i386-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/i386-linux-gnu/libreadline.so.8.2 to /lib/i386-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64'
Unpacking libreadline8t64:i386 (8.2-6) ...
Selecting previously unselected package libpython3.13-stdlib:i386.
Preparing to unpack .../7-libpython3.13-stdlib_3.13.2-1_i386.deb ...
Unpacking libpython3.13-stdlib:i386 (3.13.2-1) ...
Selecting previously unselected package python3.13.
Preparing to unpack .../8-python3.13_3.13.2-1_i386.deb ...
Unpacking python3.13 (3.13.2-1) ...
Selecting previously unselected package libpython3-stdlib:i386.
Preparing to unpack .../9-libpython3-stdlib_3.13.2-1_i386.deb ...
Unpacking libpython3-stdlib:i386 (3.13.2-1) ...
Setting up python3-minimal (3.13.2-1) ...
Selecting previously unselected package python3.
(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 21157 files and directories currently installed.)
Preparing to unpack .../000-python3_3.13.2-1_i386.deb ...
Unpacking python3 (3.13.2-1) ...
Selecting previously unselected package sgml-base.
Preparing to unpack .../001-sgml-base_1.31_all.deb ...
Unpacking sgml-base (1.31) ...
Selecting previously unselected package sensible-utils.
Preparing to unpack .../002-sensible-utils_0.0.24_all.deb ...
Unpacking sensible-utils (0.0.24) ...
Selecting previously unselected package openssl.
Preparing to unpack .../003-openssl_3.4.1-1_i386.deb ...
Unpacking openssl (3.4.1-1) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../004-ca-certificates_20241223_all.deb ...
Unpacking ca-certificates (20241223) ...
Selecting previously unselected package libmagic-mgc.
Preparing to unpack .../005-libmagic-mgc_1%3a5.45-3+b1_i386.deb ...
Unpacking libmagic-mgc (1:5.45-3+b1) ...
Selecting previously unselected package libmagic1t64:i386.
Preparing to unpack .../006-libmagic1t64_1%3a5.45-3+b1_i386.deb ...
Unpacking libmagic1t64:i386 (1:5.45-3+b1) ...
Selecting previously unselected package file.
Preparing to unpack .../007-file_1%3a5.45-3+b1_i386.deb ...
Unpacking file (1:5.45-3+b1) ...
Selecting previously unselected package gettext-base.
Preparing to unpack .../008-gettext-base_0.23.1-1_i386.deb ...
Unpacking gettext-base (0.23.1-1) ...
Selecting previously unselected package libuchardet0:i386.
Preparing to unpack .../009-libuchardet0_0.0.8-1+b2_i386.deb ...
Unpacking libuchardet0:i386 (0.0.8-1+b2) ...
Selecting previously unselected package groff-base.
Preparing to unpack .../010-groff-base_1.23.0-7_i386.deb ...
Unpacking groff-base (1.23.0-7) ...
Selecting previously unselected package bsdextrautils.
Preparing to unpack .../011-bsdextrautils_2.40.4-5_i386.deb ...
Unpacking bsdextrautils (2.40.4-5) ...
Selecting previously unselected package libpipeline1:i386.
Preparing to unpack .../012-libpipeline1_1.5.8-1_i386.deb ...
Unpacking libpipeline1:i386 (1.5.8-1) ...
Selecting previously unselected package man-db.
Preparing to unpack .../013-man-db_2.13.0-1_i386.deb ...
Unpacking man-db (2.13.0-1) ...
Selecting previously unselected package m4.
Preparing to unpack .../014-m4_1.4.19-7_i386.deb ...
Unpacking m4 (1.4.19-7) ...
Selecting previously unselected package autoconf.
Preparing to unpack .../015-autoconf_2.72-3_all.deb ...
Unpacking autoconf (2.72-3) ...
Selecting previously unselected package autotools-dev.
Preparing to unpack .../016-autotools-dev_20220109.1_all.deb ...
Unpacking autotools-dev (20220109.1) ...
Selecting previously unselected package automake.
Preparing to unpack .../017-automake_1%3a1.17-3_all.deb ...
Unpacking automake (1:1.17-3) ...
Selecting previously unselected package autopoint.
Preparing to unpack .../018-autopoint_0.23.1-1_all.deb ...
Unpacking autopoint (0.23.1-1) ...
Selecting previously unselected package libdebhelper-perl.
Preparing to unpack .../019-libdebhelper-perl_13.24.1_all.deb ...
Unpacking libdebhelper-perl (13.24.1) ...
Selecting previously unselected package libtool.
Preparing to unpack .../020-libtool_2.5.4-4_all.deb ...
Unpacking libtool (2.5.4-4) ...
Selecting previously unselected package dh-autoreconf.
Preparing to unpack .../021-dh-autoreconf_20_all.deb ...
Unpacking dh-autoreconf (20) ...
Selecting previously unselected package libarchive-zip-perl.
Preparing to unpack .../022-libarchive-zip-perl_1.68-1_all.deb ...
Unpacking libarchive-zip-perl (1.68-1) ...
Selecting previously unselected package libfile-stripnondeterminism-perl.
Preparing to unpack .../023-libfile-stripnondeterminism-perl_1.14.1-2_all.deb ...
Unpacking libfile-stripnondeterminism-perl (1.14.1-2) ...
Selecting previously unselected package dh-strip-nondeterminism.
Preparing to unpack .../024-dh-strip-nondeterminism_1.14.1-2_all.deb ...
Unpacking dh-strip-nondeterminism (1.14.1-2) ...
Selecting previously unselected package libelf1t64:i386.
Preparing to unpack .../025-libelf1t64_0.192-4_i386.deb ...
Unpacking libelf1t64:i386 (0.192-4) ...
Selecting previously unselected package dwz.
Preparing to unpack .../026-dwz_0.15-1+b1_i386.deb ...
Unpacking dwz (0.15-1+b1) ...
Selecting previously unselected package libunistring5:i386.
Preparing to unpack .../027-libunistring5_1.3-1_i386.deb ...
Unpacking libunistring5:i386 (1.3-1) ...
Selecting previously unselected package libicu72:i386.
Preparing to unpack .../028-libicu72_72.1-6_i386.deb ...
Unpacking libicu72:i386 (72.1-6) ...
Selecting previously unselected package libxml2:i386.
Preparing to unpack .../029-libxml2_2.12.7+dfsg+really2.9.14-0.2+b2_i386.deb ...
Unpacking libxml2:i386 (2.12.7+dfsg+really2.9.14-0.2+b2) ...
Selecting previously unselected package gettext.
Preparing to unpack .../030-gettext_0.23.1-1_i386.deb ...
Unpacking gettext (0.23.1-1) ...
Selecting previously unselected package intltool-debian.
Preparing to unpack .../031-intltool-debian_0.35.0+20060710.6_all.deb ...
Unpacking intltool-debian (0.35.0+20060710.6) ...
Selecting previously unselected package po-debconf.
Preparing to unpack .../032-po-debconf_1.0.21+nmu1_all.deb ...
Unpacking po-debconf (1.0.21+nmu1) ...
Selecting previously unselected package debhelper.
Preparing to unpack .../033-debhelper_13.24.1_all.deb ...
Unpacking debhelper (13.24.1) ...
Selecting previously unselected package python3-autocommand.
Preparing to unpack .../034-python3-autocommand_2.2.2-3_all.deb ...
Unpacking python3-autocommand (2.2.2-3) ...
Selecting previously unselected package python3-more-itertools.
Preparing to unpack .../035-python3-more-itertools_10.6.0-1_all.deb ...
Unpacking python3-more-itertools (10.6.0-1) ...
Selecting previously unselected package python3-zipp.
Preparing to unpack .../036-python3-zipp_3.21.0-1_all.deb ...
Unpacking python3-zipp (3.21.0-1) ...
Selecting previously unselected package python3-importlib-metadata.
Preparing to unpack .../037-python3-importlib-metadata_8.6.1-1_all.deb ...
Unpacking python3-importlib-metadata (8.6.1-1) ...
Selecting previously unselected package python3-typing-extensions.
Preparing to unpack .../038-python3-typing-extensions_4.12.2-2_all.deb ...
Unpacking python3-typing-extensions (4.12.2-2) ...
Selecting previously unselected package python3-typeguard.
Preparing to unpack .../039-python3-typeguard_4.4.2-1_all.deb ...
Unpacking python3-typeguard (4.4.2-1) ...
Selecting previously unselected package python3-inflect.
Preparing to unpack .../040-python3-inflect_7.3.1-2_all.deb ...
Unpacking python3-inflect (7.3.1-2) ...
Selecting previously unselected package python3-jaraco.context.
Preparing to unpack .../041-python3-jaraco.context_6.0.1-1_all.deb ...
Unpacking python3-jaraco.context (6.0.1-1) ...
Selecting previously unselected package python3-jaraco.functools.
Preparing to unpack .../042-python3-jaraco.functools_4.1.0-1_all.deb ...
Unpacking python3-jaraco.functools (4.1.0-1) ...
Selecting previously unselected package python3-pkg-resources.
Preparing to unpack .../043-python3-pkg-resources_75.8.0-1_all.deb ...
Unpacking python3-pkg-resources (75.8.0-1) ...
Selecting previously unselected package python3-jaraco.text.
Preparing to unpack .../044-python3-jaraco.text_4.0.0-1_all.deb ...
Unpacking python3-jaraco.text (4.0.0-1) ...
Selecting previously unselected package python3-setuptools.
Preparing to unpack .../045-python3-setuptools_75.8.0-1_all.deb ...
Unpacking python3-setuptools (75.8.0-1) ...
Selecting previously unselected package dh-python.
Preparing to unpack .../046-dh-python_6.20250108_all.deb ...
Unpacking dh-python (6.20250108) ...
Selecting previously unselected package xml-core.
Preparing to unpack .../047-xml-core_0.19_all.deb ...
Unpacking xml-core (0.19) ...
Selecting previously unselected package docutils-common.
Preparing to unpack .../048-docutils-common_0.21.2+dfsg-2_all.deb ...
Unpacking docutils-common (0.21.2+dfsg-2) ...
Selecting previously unselected package fonts-font-awesome.
Preparing to unpack .../049-fonts-font-awesome_5.0.10+really4.7.0~dfsg-4.1_all.deb ...
Unpacking fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ...
Selecting previously unselected package libjs-jquery.
Preparing to unpack .../050-libjs-jquery_3.6.1+dfsg+~3.5.14-1_all.deb ...
Unpacking libjs-jquery (3.6.1+dfsg+~3.5.14-1) ...
Selecting previously unselected package libjs-underscore.
Preparing to unpack .../051-libjs-underscore_1.13.4~dfsg+~1.11.4-3_all.deb ...
Unpacking libjs-underscore (1.13.4~dfsg+~1.11.4-3) ...
Selecting previously unselected package libjs-sphinxdoc.
Preparing to unpack .../052-libjs-sphinxdoc_8.1.3-5_all.deb ...
Unpacking libjs-sphinxdoc (8.1.3-5) ...
Selecting previously unselected package libjson-perl.
Preparing to unpack .../053-libjson-perl_4.10000-1_all.deb ...
Unpacking libjson-perl (4.10000-1) ...
Selecting previously unselected package python3-packaging.
Preparing to unpack .../054-python3-packaging_24.2-1_all.deb ...
Unpacking python3-packaging (24.2-1) ...
Selecting previously unselected package python3-pyproject-hooks.
Preparing to unpack .../055-python3-pyproject-hooks_1.2.0-1_all.deb ...
Unpacking python3-pyproject-hooks (1.2.0-1) ...
Selecting previously unselected package python3-toml.
Preparing to unpack .../056-python3-toml_0.10.2-1_all.deb ...
Unpacking python3-toml (0.10.2-1) ...
Selecting previously unselected package python3-wheel.
Preparing to unpack .../057-python3-wheel_0.45.1-1_all.deb ...
Unpacking python3-wheel (0.45.1-1) ...
Selecting previously unselected package python3-build.
Preparing to unpack .../058-python3-build_1.2.2-1_all.deb ...
Unpacking python3-build (1.2.2-1) ...
Selecting previously unselected package python3-installer.
Preparing to unpack .../059-python3-installer_0.7.0+dfsg1-3_all.deb ...
Unpacking python3-installer (0.7.0+dfsg1-3) ...
Selecting previously unselected package pybuild-plugin-pyproject.
Preparing to unpack .../060-pybuild-plugin-pyproject_6.20250108_all.deb ...
Unpacking pybuild-plugin-pyproject (6.20250108) ...
Selecting previously unselected package python-babel-localedata.
Preparing to unpack .../061-python-babel-localedata_2.17.0-1_all.deb ...
Unpacking python-babel-localedata (2.17.0-1) ...
Selecting previously unselected package python3-alabaster.
Preparing to unpack .../062-python3-alabaster_0.7.16-0.1_all.deb ...
Unpacking python3-alabaster (0.7.16-0.1) ...
Selecting previously unselected package python3-all.
Preparing to unpack .../063-python3-all_3.13.2-1_i386.deb ...
Unpacking python3-all (3.13.2-1) ...
Selecting previously unselected package python3-babel.
Preparing to unpack .../064-python3-babel_2.17.0-1_all.deb ...
Unpacking python3-babel (2.17.0-1) ...
Selecting previously unselected package python3-bcrypt.
Preparing to unpack .../065-python3-bcrypt_4.2.0-2.1+b1_i386.deb ...
Unpacking python3-bcrypt (4.2.0-2.1+b1) ...
Selecting previously unselected package python3-certifi.
Preparing to unpack .../066-python3-certifi_2025.1.31+ds-1_all.deb ...
Unpacking python3-certifi (2025.1.31+ds-1) ...
Selecting previously unselected package python3-charset-normalizer.
Preparing to unpack .../067-python3-charset-normalizer_3.4.1-1+b1_i386.deb ...
Unpacking python3-charset-normalizer (3.4.1-1+b1) ...
Selecting previously unselected package python3-idna.
Preparing to unpack .../068-python3-idna_3.10-1_all.deb ...
Unpacking python3-idna (3.10-1) ...
Selecting previously unselected package python3-urllib3.
Preparing to unpack .../069-python3-urllib3_2.3.0-1_all.deb ...
Unpacking python3-urllib3 (2.3.0-1) ...
Selecting previously unselected package python3-chardet.
Preparing to unpack .../070-python3-chardet_5.2.0+dfsg-2_all.deb ...
Unpacking python3-chardet (5.2.0+dfsg-2) ...
Selecting previously unselected package python3-requests.
Preparing to unpack .../071-python3-requests_2.32.3+dfsg-4_all.deb ...
Unpacking python3-requests (2.32.3+dfsg-4) ...
Selecting previously unselected package python3-msgpack.
Preparing to unpack .../072-python3-msgpack_1.0.3-3+b4_i386.deb ...
Unpacking python3-msgpack (1.0.3-3+b4) ...
Selecting previously unselected package python3-cachecontrol.
Preparing to unpack .../073-python3-cachecontrol_0.14.2-1_all.deb ...
Unpacking python3-cachecontrol (0.14.2-1) ...
Selecting previously unselected package python3-cffi-backend:i386.
Preparing to unpack .../074-python3-cffi-backend_1.17.1-2+b2_i386.deb ...
Unpacking python3-cffi-backend:i386 (1.17.1-2+b2) ...
Selecting previously unselected package python3-cleo.
Preparing to unpack .../075-python3-cleo_2.2.1-1_all.deb ...
Unpacking python3-cleo (2.2.1-1) ...
Selecting previously unselected package python3-colorama.
Preparing to unpack .../076-python3-colorama_0.4.6-4_all.deb ...
Unpacking python3-colorama (0.4.6-4) ...
Selecting previously unselected package python3-colorclass.
Preparing to unpack .../077-python3-colorclass_2.2.2-6_all.deb ...
Unpacking python3-colorclass (2.2.2-6) ...
Selecting previously unselected package python3-cryptography.
Preparing to unpack .../078-python3-cryptography_43.0.0-1_i386.deb ...
Unpacking python3-cryptography (43.0.0-1) ...
Selecting previously unselected package python3-defusedxml.
Preparing to unpack .../079-python3-defusedxml_0.7.1-3_all.deb ...
Unpacking python3-defusedxml (0.7.1-3) ...
Selecting previously unselected package python3-distlib.
Preparing to unpack .../080-python3-distlib_0.3.9-1_all.deb ...
Unpacking python3-distlib (0.3.9-1) ...
Selecting previously unselected package python3-roman.
Preparing to unpack .../081-python3-roman_5.0-1_all.deb ...
Unpacking python3-roman (5.0-1) ...
Selecting previously unselected package python3-docutils.
Preparing to unpack .../082-python3-docutils_0.21.2+dfsg-2_all.deb ...
Unpacking python3-docutils (0.21.2+dfsg-2) ...
Selecting previously unselected package python3-dulwich.
Preparing to unpack .../083-python3-dulwich_0.22.7-1_i386.deb ...
Unpacking python3-dulwich (0.22.7-1) ...
Selecting previously unselected package python3-fastjsonschema.
Preparing to unpack .../084-python3-fastjsonschema_2.21.1-1_all.deb ...
Unpacking python3-fastjsonschema (2.21.1-1) ...
Selecting previously unselected package python3-filelock.
Preparing to unpack .../085-python3-filelock_3.17.0-1_all.deb ...
Unpacking python3-filelock (3.17.0-1) ...
Selecting previously unselected package python3-imagesize.
Preparing to unpack .../086-python3-imagesize_1.4.1-1_all.deb ...
Unpacking python3-imagesize (1.4.1-1) ...
Selecting previously unselected package python3-iniconfig.
Preparing to unpack .../087-python3-iniconfig_1.1.1-2_all.deb ...
Unpacking python3-iniconfig (1.1.1-2) ...
Selecting previously unselected package python3-jaraco.classes.
Preparing to unpack .../088-python3-jaraco.classes_3.4.0-1_all.deb ...
Unpacking python3-jaraco.classes (3.4.0-1) ...
Selecting previously unselected package python3-jeepney.
Preparing to unpack .../089-python3-jeepney_0.8.0-4_all.deb ...
Unpacking python3-jeepney (0.8.0-4) ...
Selecting previously unselected package python3-markupsafe.
Preparing to unpack .../090-python3-markupsafe_2.1.5-1+b3_i386.deb ...
Unpacking python3-markupsafe (2.1.5-1+b3) ...
Selecting previously unselected package python3-jinja2.
Preparing to unpack .../091-python3-jinja2_3.1.5-2_all.deb ...
Unpacking python3-jinja2 (3.1.5-2) ...
Selecting previously unselected package python3-secretstorage.
Preparing to unpack .../092-python3-secretstorage_3.3.3-3_all.deb ...
Unpacking python3-secretstorage (3.3.3-3) ...
Selecting previously unselected package python3-keyring.
Preparing to unpack .../093-python3-keyring_25.6.0-1_all.deb ...
Unpacking python3-keyring (25.6.0-1) ...
Selecting previously unselected package python3-pip-whl.
Preparing to unpack .../094-python3-pip-whl_25.0+dfsg-1_all.deb ...
Unpacking python3-pip-whl (25.0+dfsg-1) ...
Selecting previously unselected package python3-pkginfo.
Preparing to unpack .../095-python3-pkginfo_1.12.1.2-2_all.deb ...
Unpacking python3-pkginfo (1.12.1.2-2) ...
Selecting previously unselected package python3-platformdirs.
Preparing to unpack .../096-python3-platformdirs_4.3.6-1_all.deb ...
Unpacking python3-platformdirs (4.3.6-1) ...
Selecting previously unselected package python3-pluggy.
Preparing to unpack .../097-python3-pluggy_1.5.0-1_all.deb ...
Unpacking python3-pluggy (1.5.0-1) ...
Selecting previously unselected package python3-poetry-core.
Preparing to unpack .../098-python3-poetry-core_2.0.1-2_all.deb ...
Unpacking python3-poetry-core (2.0.1-2) ...
Selecting previously unselected package python3-requests-toolbelt.
Preparing to unpack .../099-python3-requests-toolbelt_1.0.0-4_all.deb ...
Unpacking python3-requests-toolbelt (1.0.0-4) ...
Selecting previously unselected package python3-shellingham.
Preparing to unpack .../100-python3-shellingham_1.5.4-1_all.deb ...
Unpacking python3-shellingham (1.5.4-1) ...
Selecting previously unselected package python3-tomlkit.
Preparing to unpack .../101-python3-tomlkit_0.13.2-1_all.deb ...
Unpacking python3-tomlkit (0.13.2-1) ...
Selecting previously unselected package python3-trove-classifiers.
Preparing to unpack .../102-python3-trove-classifiers_2025.2.18.16-1_all.deb ...
Unpacking python3-trove-classifiers (2025.2.18.16-1) ...
Selecting previously unselected package python3-setuptools-whl.
Preparing to unpack .../103-python3-setuptools-whl_75.8.0-1_all.deb ...
Unpacking python3-setuptools-whl (75.8.0-1) ...
Selecting previously unselected package python3-wheel-whl.
Preparing to unpack .../104-python3-wheel-whl_0.45.1-1_all.deb ...
Unpacking python3-wheel-whl (0.45.1-1) ...
Selecting previously unselected package python3-virtualenv.
Preparing to unpack .../105-python3-virtualenv_20.29.1+ds-1_all.deb ...
Unpacking python3-virtualenv (20.29.1+ds-1) ...
Selecting previously unselected package python3-poetry.
Preparing to unpack .../106-python3-poetry_2.0.1+dfsg-1_all.deb ...
Unpacking python3-poetry (2.0.1+dfsg-1) ...
Selecting previously unselected package python3-pygments.
Preparing to unpack .../107-python3-pygments_2.18.0+dfsg-2_all.deb ...
Unpacking python3-pygments (2.18.0+dfsg-2) ...
Selecting previously unselected package python3-pytest.
Preparing to unpack .../108-python3-pytest_8.3.4-1_all.deb ...
Unpacking python3-pytest (8.3.4-1) ...
Selecting previously unselected package python3-snowballstemmer.
Preparing to unpack .../109-python3-snowballstemmer_2.2.0-4_all.deb ...
Unpacking python3-snowballstemmer (2.2.0-4) ...
Selecting previously unselected package sphinx-common.
Preparing to unpack .../110-sphinx-common_8.1.3-5_all.deb ...
Unpacking sphinx-common (8.1.3-5) ...
Selecting previously unselected package python3-sphinx.
Preparing to unpack .../111-python3-sphinx_8.1.3-5_all.deb ...
Unpacking python3-sphinx (8.1.3-5) ...
Selecting previously unselected package sphinx-rtd-theme-common.
Preparing to unpack .../112-sphinx-rtd-theme-common_3.0.2+dfsg-2_all.deb ...
Unpacking sphinx-rtd-theme-common (3.0.2+dfsg-2) ...
Selecting previously unselected package python3-sphinxcontrib.jquery.
Preparing to unpack .../113-python3-sphinxcontrib.jquery_4.1-5_all.deb ...
Unpacking python3-sphinxcontrib.jquery (4.1-5) ...
Selecting previously unselected package python3-sphinx-rtd-theme.
Preparing to unpack .../114-python3-sphinx-rtd-theme_3.0.2+dfsg-2_all.deb ...
Unpacking python3-sphinx-rtd-theme (3.0.2+dfsg-2) ...
Selecting previously unselected package python3-termcolor.
Preparing to unpack .../115-python3-termcolor_2.4.0-2_all.deb ...
Unpacking python3-termcolor (2.4.0-2) ...
Setting up media-types (12.0.0) ...
Setting up libpipeline1:i386 (1.5.8-1) ...
Setting up python3-setuptools-whl (75.8.0-1) ...
Setting up fonts-lato (2.015-1) ...
Setting up libicu72:i386 (72.1-6) ...
Setting up bsdextrautils (2.40.4-5) ...
Setting up libmagic-mgc (1:5.45-3+b1) ...
Setting up libarchive-zip-perl (1.68-1) ...
Setting up libdebhelper-perl (13.24.1) ...
Setting up libmagic1t64:i386 (1:5.45-3+b1) ...
Setting up gettext-base (0.23.1-1) ...
Setting up m4 (1.4.19-7) ...
Setting up file (1:5.45-3+b1) ...
Setting up libelf1t64:i386 (0.192-4) ...
Setting up python-babel-localedata (2.17.0-1) ...
Setting up tzdata (2025a-2) ...

Current default time zone: 'Etc/UTC'
Local time is now:      Mon Mar 10 04:12:10 UTC 2025.
Universal Time is now:  Mon Mar 10 04:12:10 UTC 2025.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

Setting up autotools-dev (20220109.1) ...
Setting up libunistring5:i386 (1.3-1) ...
Setting up autopoint (0.23.1-1) ...
Setting up autoconf (2.72-3) ...
Setting up libffi8:i386 (3.4.7-1) ...
Setting up dwz (0.15-1+b1) ...
Setting up sensible-utils (0.0.24) ...
Setting up libuchardet0:i386 (0.0.8-1+b2) ...
Setting up libjson-perl (4.10000-1) ...
Setting up netbase (6.4) ...
Setting up sgml-base (1.31) ...
Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ...
Setting up openssl (3.4.1-1) ...
Setting up python3-wheel-whl (0.45.1-1) ...
Setting up readline-common (8.2-6) ...
Setting up libxml2:i386 (2.12.7+dfsg+really2.9.14-0.2+b2) ...
Setting up fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ...
Setting up sphinx-rtd-theme-common (3.0.2+dfsg-2) ...
Setting up libjs-underscore (1.13.4~dfsg+~1.11.4-3) ...
Setting up automake (1:1.17-3) ...
update-alternatives: using /usr/bin/automake-1.17 to provide /usr/bin/automake (automake) in auto mode
Setting up libfile-stripnondeterminism-perl (1.14.1-2) ...
Setting up gettext (0.23.1-1) ...
Setting up libtool (2.5.4-4) ...
Setting up intltool-debian (0.35.0+20060710.6) ...
Setting up dh-autoreconf (20) ...
Setting up ca-certificates (20241223) ...
Updating certificates in /etc/ssl/certs...
152 added, 0 removed; done.
Setting up libjs-sphinxdoc (8.1.3-5) ...
Setting up libreadline8t64:i386 (8.2-6) ...
Setting up dh-strip-nondeterminism (1.14.1-2) ...
Setting up groff-base (1.23.0-7) ...
Setting up xml-core (0.19) ...
Setting up libpython3.13-stdlib:i386 (3.13.2-1) ...
Setting up libpython3-stdlib:i386 (3.13.2-1) ...
Setting up python3.13 (3.13.2-1) ...
Setting up python3-pip-whl (25.0+dfsg-1) ...
Setting up po-debconf (1.0.21+nmu1) ...
Setting up python3 (3.13.2-1) ...
Setting up python3-distlib (0.3.9-1) ...
Setting up python3-zipp (3.21.0-1) ...
Setting up python3-autocommand (2.2.2-3) ...
Setting up man-db (2.13.0-1) ...
Not building database; man-db/auto-update is not 'true'.
Setting up python3-markupsafe (2.1.5-1+b3) ...
Setting up python3-wheel (0.45.1-1) ...
Setting up python3-platformdirs (4.3.6-1) ...
Setting up python3-roman (5.0-1) ...
Setting up python3-jinja2 (3.1.5-2) ...
Setting up python3-pygments (2.18.0+dfsg-2) ...
Setting up python3-packaging (24.2-1) ...
Setting up python3-chardet (5.2.0+dfsg-2) ...
Setting up python3-pyproject-hooks (1.2.0-1) ...
Setting up python3-certifi (2025.1.31+ds-1) ...
Setting up python3-snowballstemmer (2.2.0-4) ...
Setting up python3-poetry-core (2.0.1-2) ...
Setting up sphinx-common (8.1.3-5) ...
Setting up python3-idna (3.10-1) ...
Setting up python3-colorclass (2.2.2-6) ...
Setting up python3-typing-extensions (4.12.2-2) ...
Setting up python3-toml (0.10.2-1) ...
Setting up python3-jeepney (0.8.0-4) ...
Setting up python3-installer (0.7.0+dfsg1-3) ...
Setting up python3-urllib3 (2.3.0-1) ...
Setting up python3-pluggy (1.5.0-1) ...
Setting up python3-fastjsonschema (2.21.1-1) ...
Setting up python3-trove-classifiers (2025.2.18.16-1) ...
Setting up python3-dulwich (0.22.7-1) ...
Setting up python3-cleo (2.2.1-1) ...
Setting up python3-msgpack (1.0.3-3+b4) ...
Setting up python3-build (1.2.2-1) ...
Setting up python3-shellingham (1.5.4-1) ...
Setting up python3-tomlkit (0.13.2-1) ...
Setting up python3-cffi-backend:i386 (1.17.1-2+b2) ...
Setting up python3-imagesize (1.4.1-1) ...
Setting up python3-termcolor (2.4.0-2) ...
Setting up python3-more-itertools (10.6.0-1) ...
Setting up python3-iniconfig (1.1.1-2) ...
Setting up python3-filelock (3.17.0-1) ...
Setting up python3-jaraco.classes (3.4.0-1) ...
Setting up python3-importlib-metadata (8.6.1-1) ...
Setting up python3-jaraco.functools (4.1.0-1) ...
Setting up python3-jaraco.context (6.0.1-1) ...
Setting up python3-babel (2.17.0-1) ...
update-alternatives: using /usr/bin/pybabel-python3 to provide /usr/bin/pybabel (pybabel) in auto mode
Setting up python3-pkginfo (1.12.1.2-2) ...
Setting up python3-colorama (0.4.6-4) ...
Setting up python3-defusedxml (0.7.1-3) ...
Setting up python3-charset-normalizer (3.4.1-1+b1) ...
Setting up python3-pytest (8.3.4-1) ...
Setting up python3-alabaster (0.7.16-0.1) ...
Setting up python3-bcrypt (4.2.0-2.1+b1) ...
Setting up python3-typeguard (4.4.2-1) ...
Setting up python3-virtualenv (20.29.1+ds-1) ...
Setting up python3-all (3.13.2-1) ...
Setting up debhelper (13.24.1) ...
Setting up python3-inflect (7.3.1-2) ...
Setting up python3-jaraco.text (4.0.0-1) ...
Setting up python3-cryptography (43.0.0-1) ...
Setting up python3-requests (2.32.3+dfsg-4) ...
Setting up python3-cachecontrol (0.14.2-1) ...
Setting up python3-pkg-resources (75.8.0-1) ...
Setting up python3-requests-toolbelt (1.0.0-4) ...
Setting up python3-setuptools (75.8.0-1) ...
Setting up python3-secretstorage (3.3.3-3) ...
Setting up python3-keyring (25.6.0-1) ...
Setting up dh-python (6.20250108) ...
Setting up pybuild-plugin-pyproject (6.20250108) ...
Setting up python3-poetry (2.0.1+dfsg-1) ...
Processing triggers for libc-bin (2.40-7) ...
Processing triggers for sgml-base (1.31) ...
Setting up docutils-common (0.21.2+dfsg-2) ...
Processing triggers for sgml-base (1.31) ...
Setting up python3-docutils (0.21.2+dfsg-2) ...
Setting up python3-sphinx (8.1.3-5) ...
Setting up python3-sphinxcontrib.jquery (4.1-5) ...
Setting up python3-sphinx-rtd-theme (3.0.2+dfsg-2) ...
Processing triggers for ca-certificates (20241223) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Reading package lists...
Building dependency tree...
Reading state information...
Reading extended state information...
Initializing package states...
Writing extended state information...
Building tag database...
 -> Finished parsing the build-deps
I: Building the package
I: Running cd /build/reproducible-path/terminaltables3-4.0.0/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S  > ../terminaltables3_4.0.0-4_source.changes
dpkg-buildpackage: info: source package terminaltables3
dpkg-buildpackage: info: source version 4.0.0-4
dpkg-buildpackage: info: source distribution sid
dpkg-buildpackage: info: source changed by Daniel Baumann <daniel@debian.org>
 dpkg-source --before-build .
dpkg-buildpackage: info: host architecture i386
dpkg-source: info: using options from terminaltables3-4.0.0/debian/source/options: --extend-diff-ignore=^[^/]+\.egg-info/
 debian/rules clean
dh clean --buildsystem pybuild --with python3,sphinxdoc
   dh_auto_clean -O--buildsystem=pybuild
   debian/rules execute_after_dh_auto_clean
make[1]: Entering directory '/build/reproducible-path/terminaltables3-4.0.0'
# help pybuild
rm -rf *.egg-info
make[1]: Leaving directory '/build/reproducible-path/terminaltables3-4.0.0'
   dh_autoreconf_clean -O--buildsystem=pybuild
   dh_clean -O--buildsystem=pybuild
 debian/rules binary
dh binary --buildsystem pybuild --with python3,sphinxdoc
   dh_update_autotools_config -O--buildsystem=pybuild
   dh_autoreconf -O--buildsystem=pybuild
   dh_auto_configure -O--buildsystem=pybuild
   dh_auto_build -O--buildsystem=pybuild
I: pybuild plugin_pyproject:129: Building wheel for python3.13 with "build" module
I: pybuild base:311: python3.13 -m build --skip-dependency-check --no-isolation --wheel --outdir /build/reproducible-path/terminaltables3-4.0.0/.pybuild/cpython3_3.13_terminaltables3  
* Building wheel...
The "poetry.dev-dependencies" section is deprecated and will be removed in a future version. Use "poetry.group.dev.dependencies" instead.
Successfully built terminaltables3-4.0.0-py3-none-any.whl
I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.13 with "installer" module
   debian/rules override_dh_auto_test
make[1]: Entering directory '/build/reproducible-path/terminaltables3-4.0.0'
dh_auto_test
I: pybuild pybuild:308: cp example*.py /build/reproducible-path/terminaltables3-4.0.0/.pybuild/cpython3_3.13_terminaltables3/build
I: pybuild base:311: cd /build/reproducible-path/terminaltables3-4.0.0/.pybuild/cpython3_3.13_terminaltables3/build; python3.13 -m pytest tests
============================= test session starts ==============================
platform linux -- Python 3.13.2, pytest-8.3.4, pluggy-1.5.0
rootdir: /build/reproducible-path/terminaltables3-4.0.0/.pybuild/cpython3_3.13_terminaltables3/build
configfile: pyproject.toml
plugins: typeguard-4.4.2
collected 801 items

tests/test_all_tables_e2e/test_ascii_table.py ..s                        [  0%]
tests/test_all_tables_e2e/test_double_table.py ..s                       [  0%]
tests/test_all_tables_e2e/test_github_table.py ..                        [  0%]
tests/test_all_tables_e2e/test_porcelain_table.py ..                     [  1%]
tests/test_all_tables_e2e/test_single_table.py ..                        [  1%]
tests/test_all_tables_e2e/test_single_table_windows.py sss               [  1%]
tests/test_ascii_table.py ......................                         [  4%]
tests/test_base_table/test_gen_row_lines.py ...............              [  6%]
tests/test_base_table/test_gen_table.py ....................             [  8%]
tests/test_base_table/test_horizontal_border.py ................         [ 10%]
tests/test_base_table/test_table.py .......F                             [ 11%]
tests/test_build/test_build_border.py .................................. [ 16%]
........................................................................ [ 25%]
........................................................................ [ 34%]
........................................................................ [ 43%]
........................................................................ [ 52%]
........................................................................ [ 61%]
...................................FFFFFFFFFFFFFFFFFF.FFFFFFFFFFFFFF.FFF [ 70%]
FFFFFFFFFFFFFFF.FFFFFFFFFFFFFF.....                                      [ 74%]
tests/test_build/test_build_row.py ......                                [ 75%]
tests/test_build/test_combine.py ......                                  [ 76%]
tests/test_build/test_flatten.py ..                                      [ 76%]
tests/test_examples.py ...                                               [ 76%]
tests/test_terminal_io/test_get_console_info.py .                        [ 76%]
tests/test_terminal_io/test_set_terminal_title.py sssssssss              [ 77%]
tests/test_terminal_io/test_terminal_size.py .....                       [ 78%]
tests/test_width_and_alignment/test_align_and_pad_cell.py ........F..... [ 80%]
......F...........F...........F...........F......F......F......F......F. [ 89%]
.....F................................F                                  [ 94%]
tests/test_width_and_alignment/test_column_max_width.py ...              [ 94%]
tests/test_width_and_alignment/test_max_dimensions.py ...........        [ 95%]
tests/test_width_and_alignment/test_table_width.py ...                   [ 96%]
tests/test_width_and_alignment/test_visible_width.py ................... [ 98%]
...........                                                              [100%]

=================================== FAILURES ===================================
__________________________________ test_color __________________________________

    def test_color():
        """Test with color characters."""
        table_data = [
            [
                "ansi",
                "\033[31mRed\033[39m",
                "\033[32mGreen\033[39m",
                "\033[34mBlue\033[39m",
            ],
            [
                "colorclass",
                Color("{red}Red{/red}"),
                Color("{green}Green{/green}"),
                Color("{blue}Blue{/blue}"),
            ],
            [
                "colorama",
                Fore.RED + "Red" + Fore.RESET,
                Fore.GREEN + "Green" + Fore.RESET,
                Fore.BLUE + "Blue" + Fore.RESET,
            ],
            [
                "termcolor",
                colored("Red", "red"),
                colored("Green", "green"),
                colored("Blue", "blue"),
            ],
        ]
        table = BaseTable(table_data)
        table.inner_heading_row_border = False
        actual = table.table
    
        expected = (
            "+------------+-----+-------+------+\n"
            "| ansi       | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n"
            "| colorclass | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n"
            "| colorama   | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n"
            "| termcolor  | \033[31mRed\033[0m | \033[32mGreen\033[0m | \033[34mBlue\033[0m |\n"
            "+------------+-----+-------+------+"
        )
    
>       assert actual == expected
E       AssertionError: assert '+-----------...-----+------+' == '+-----------...-----+------+'
E         
E         Skipping 239 identical leading characters in diff, use -v to show
E         - mcolor  | Red | Green | Blue |
E         + mcolor  | Red | Green | Blue |
E           +------------+-----+-------+------+

tests/test_base_table/test_table.py:210: AssertionError
_______ test_colors[TEST---outer_widths0-+-\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [12], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
________ test_colors[TEST---outer_widths1--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [12], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths2-+-\x1b[34mTEST\x1b[0m---+-----] _______

outer_widths = [7, 5], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m---+-----'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST---+-----' == '\x1b[34mTEST\x1b[0m---+-----'
E         
E         - TEST---+-----
E         + TEST---+-----

tests/test_build/test_build_border.py:315: AssertionError
________ test_colors[TEST---outer_widths3--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [7, 5], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST---outer_widths4-+-\x1b[34mTEST\x1b[0m] ____________

outer_widths = [4], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST' == '\x1b[34mTEST\x1b[0m'
E         
E         - TEST
E         + TEST

tests/test_build/test_build_border.py:315: AssertionError
____________ test_colors[TEST---outer_widths5--\x1b[34mTEST\x1b[0m] ____________

outer_widths = [4], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST' == '\x1b[34mTEST\x1b[0m'
E         
E         - TEST
E         + TEST

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST---outer_widths6-+-\x1b[34mTEST\x1b[0m+-] ___________

outer_widths = [4, 1], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m+-'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST+-' == '\x1b[34mTEST\x1b[0m+-'
E         
E         - TEST+-
E         + TEST+-

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST---outer_widths7--\x1b[34mTEST\x1b[0m-] ____________

outer_widths = [4, 1], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m-'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-' == '\x1b[34mTEST\x1b[0m-'
E         
E         - TEST-
E         + TEST-

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST---outer_widths8-+-\x1b[34mTEST\x1b[0m+] ___________

outer_widths = [4, 0], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m+'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST+' == '\x1b[34mTEST\x1b[0m+'
E         
E         - TEST+
E         + TEST+

tests/test_build/test_build_border.py:315: AssertionError
____________ test_colors[TEST---outer_widths9--\x1b[34mTEST\x1b[0m] ____________

outer_widths = [4, 0], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST' == '\x1b[34mTEST\x1b[0m'
E         
E         - TEST
E         + TEST

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths10--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [12], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths11--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [6, 6], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths12--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [3, 3, 3, 3], left = '', intersect = '', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths13--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [2, 1, 2, 1, 2, 1, ...], left = '', intersect = '', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths14--\x1b[34mTEST\x1b[0m--------] ________

outer_widths = [1, 1, 1, 1, 1, 1, ...], left = '', intersect = '', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST---outer_widths15--\x1b[34mTEST\x1b[0m--] ___________

outer_widths = [2, 4], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--' == '\x1b[34mTEST\x1b[0m--'
E         
E         - TEST--
E         + TEST--

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST---outer_widths16--\x1b[34mTEST\x1b[0m-] ___________

outer_widths = [1, 4], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m-'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-' == '\x1b[34mTEST\x1b[0m-'
E         
E         - TEST-
E         + TEST-

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST---outer_widths17--\x1b[34mTEST\x1b[0m] ____________

outer_widths = [1, 3], left = '', intersect = '', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST' == '\x1b[34mTEST\x1b[0m'
E         
E         - TEST
E         + TEST

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths19-+-\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [12], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------' == '\x1b[34mTEST\x1b[0m--------'
E         
E         - TEST--------
E         + TEST--------

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST---outer_widths20-+-\x1b[34mTEST\x1b[0m---------] _______

outer_widths = [0, 12], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m---------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST---------' == '\x1b[34mTEST\x1b[0m---------'
E         
E         - TEST---------
E         + TEST---------

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST---outer_widths21-+-\x1b[34mTEST\x1b[0m--------+] _______

outer_widths = [12, 0], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m--------+'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------+' == '\x1b[34mTEST\x1b[0m--------+'
E         
E         - TEST--------+
E         + TEST--------+

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST---outer_widths22-+-\x1b[34mTEST\x1b[0m----------] ______

outer_widths = [0, 0, 12], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m----------'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST----------' == '\x1b[34mTEST...[0m----------'
E         
E         - TEST----------
E         ? -----    ----
E         + TEST----------

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST---outer_widths23-+-\x1b[34mTEST\x1b[0m--------++] ______

outer_widths = [12, 0, 0], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m--------++'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST--------++' == '\x1b[34mTEST...[0m--------++'
E         
E         - TEST--------++
E         ? -----    ----
E         + TEST--------++

tests/test_build/test_build_border.py:315: AssertionError
_________ test_colors[TEST---outer_widths24-+-\x1b[34mTEST\x1b[0m---] __________

outer_widths = [3, 3], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m---'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST---' == '\x1b[34mTEST\x1b[0m---'
E         
E         - TEST---
E         + TEST---

tests/test_build/test_build_border.py:315: AssertionError
_________ test_colors[TEST---outer_widths25-+-\x1b[34mTEST\x1b[0m+--] __________

outer_widths = [4, 2], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m+--'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST+--' == '\x1b[34mTEST\x1b[0m+--'
E         
E         - TEST+--
E         + TEST+--

tests/test_build/test_build_border.py:315: AssertionError
_________ test_colors[TEST---outer_widths26-+-\x1b[34mTEST\x1b[0m-+-] __________

outer_widths = [5, 1], left = '', intersect = '+', right = '', title = 'TEST'
expected = '\x1b[34mTEST\x1b[0m-+-'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-+-' == '\x1b[34mTEST\x1b[0m-+-'
E         
E         - TEST-+-
E         + TEST-+-

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST---outer_widths27-+-\x1b[34mTEST\x1b[0m---+---+---] ______

outer_widths = [3, 3, 3, 3], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m---+---+---'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST---+---+---' == '\x1b[34mTEST...0m---+---+---'
E         
E         - TEST---+---+---
E         ? -----    ----
E         + TEST---+---+---

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST---outer_widths28-+-\x1b[34mTEST\x1b[0m-+----+----] ______

outer_widths = [2, 2, 4, 4], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m-+----+----'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-+----+----' == '\x1b[34mTEST...0m-+----+----'
E         
E         - TEST-+----+----
E         ? -----    ----
E         + TEST-+----+----

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST---outer_widths29-+-\x1b[34mTEST\x1b[0m-----+-----] ______

outer_widths = [1, 1, 5, 5], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m-----+-----'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-----+-----' == '\x1b[34mTEST...0m-----+-----'
E         
E         - TEST-----+-----
E         ? -----    ----
E         + TEST-----+-----

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST---outer_widths30-+-\x1b[34mTEST\x1b[0m-+--+--] ________

outer_widths = [2, 2, 2, 2], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m-+--+--'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-+--+--' == '\x1b[34mTEST\x1b[0m-+--+--'
E         
E         - TEST-+--+--
E         + TEST-+--+--

tests/test_build/test_build_border.py:315: AssertionError
________ test_colors[TEST---outer_widths31-+-\x1b[34mTEST\x1b[0m-+-+-] _________

outer_widths = [1, 1, 1, 1, 1], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m-+-+-'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST-+-+-' == '\x1b[34mTEST\x1b[0m-+-+-'
E         
E         - TEST-+-+-
E         + TEST-+-+-

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST---outer_widths32-+-\x1b[34mTEST\x1b[0m++] __________

outer_widths = [0, 0, 0, 0, 0, 0, ...], left = '', intersect = '+', right = ''
title = 'TEST', expected = '\x1b[34mTEST\x1b[0m++'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert 'TEST++' == '\x1b[34mTEST\x1b[0m++'
E         
E         - TEST++
E         + TEST++

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths0-+-\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [12], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST-<->-outer_widths1--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [12], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths2-+-\x1b[34mTEST\x1b[0m---+-----] ______

outer_widths = [7, 5], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m---+----->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST---+----->' == '<\x1b[34mTES...[0m---+----->'
E         
E         - <TEST---+----->
E         ?  -----    ----
E         + <TEST---+----->

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST-<->-outer_widths3--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [7, 5], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST-<->-outer_widths4-+-\x1b[34mTEST\x1b[0m] ___________

outer_widths = [4], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST>' == '<\x1b[34mTEST\x1b[0m>'
E         
E         - <TEST>
E         + <TEST>

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST-<->-outer_widths5--\x1b[34mTEST\x1b[0m] ___________

outer_widths = [4], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST>' == '<\x1b[34mTEST\x1b[0m>'
E         
E         - <TEST>
E         + <TEST>

tests/test_build/test_build_border.py:315: AssertionError
_________ test_colors[TEST-<->-outer_widths6-+-\x1b[34mTEST\x1b[0m+-] __________

outer_widths = [4, 1], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m+->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST+->' == '<\x1b[34mTEST\x1b[0m+->'
E         
E         - <TEST+->
E         + <TEST+->

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST-<->-outer_widths7--\x1b[34mTEST\x1b[0m-] ___________

outer_widths = [4, 1], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST->' == '<\x1b[34mTEST\x1b[0m->'
E         
E         - <TEST->
E         + <TEST->

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST-<->-outer_widths8-+-\x1b[34mTEST\x1b[0m+] __________

outer_widths = [4, 0], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m+>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST+>' == '<\x1b[34mTEST\x1b[0m+>'
E         
E         - <TEST+>
E         + <TEST+>

tests/test_build/test_build_border.py:315: AssertionError
___________ test_colors[TEST-<->-outer_widths9--\x1b[34mTEST\x1b[0m] ___________

outer_widths = [4, 0], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST>' == '<\x1b[34mTEST\x1b[0m>'
E         
E         - <TEST>
E         + <TEST>

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths10--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [12], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths11--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [6, 6], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths12--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [3, 3, 3, 3], left = '<', intersect = '', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths13--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [2, 1, 2, 1, 2, 1, ...], left = '<', intersect = '', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths14--\x1b[34mTEST\x1b[0m--------] _______

outer_widths = [1, 1, 1, 1, 1, 1, ...], left = '<', intersect = '', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
_________ test_colors[TEST-<->-outer_widths15--\x1b[34mTEST\x1b[0m--] __________

outer_widths = [2, 4], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-->' == '<\x1b[34mTEST\x1b[0m-->'
E         
E         - <TEST-->
E         + <TEST-->

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST-<->-outer_widths16--\x1b[34mTEST\x1b[0m-] __________

outer_widths = [1, 4], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST->' == '<\x1b[34mTEST\x1b[0m->'
E         
E         - <TEST->
E         + <TEST->

tests/test_build/test_build_border.py:315: AssertionError
__________ test_colors[TEST-<->-outer_widths17--\x1b[34mTEST\x1b[0m] ___________

outer_widths = [1, 3], left = '<', intersect = '', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST>' == '<\x1b[34mTEST\x1b[0m>'
E         
E         - <TEST>
E         + <TEST>

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths19-+-\x1b[34mTEST\x1b[0m--------] ______

outer_widths = [12], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-------->' == '<\x1b[34mTES...b[0m-------->'
E         
E         - <TEST-------->
E         ?  -----    ----
E         + <TEST-------->

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST-<->-outer_widths20-+-\x1b[34mTEST\x1b[0m---------] ______

outer_widths = [0, 12], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m--------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST--------->' == '<\x1b[34mTES...[0m--------->'
E         
E         - <TEST--------->
E         ?  -----    ----
E         + <TEST--------->

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST-<->-outer_widths21-+-\x1b[34mTEST\x1b[0m--------+] ______

outer_widths = [12, 0], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m--------+>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST--------+>' == '<\x1b[34mTES...[0m--------+>'
E         
E         - <TEST--------+>
E         ?  -----    ----
E         + <TEST--------+>

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST-<->-outer_widths22-+-\x1b[34mTEST\x1b[0m----------] _____

outer_widths = [0, 0, 12], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m---------->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST---------->' == '<\x1b[34mTES...0m---------->'
E         
E         - <TEST---------->
E         ?  -----    ----
E         + <TEST---------->

tests/test_build/test_build_border.py:315: AssertionError
_____ test_colors[TEST-<->-outer_widths23-+-\x1b[34mTEST\x1b[0m--------++] _____

outer_widths = [12, 0, 0], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m--------++>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST--------++>' == '<\x1b[34mTES...0m--------++>'
E         
E         - <TEST--------++>
E         ?  -----    ----
E         + <TEST--------++>

tests/test_build/test_build_border.py:315: AssertionError
________ test_colors[TEST-<->-outer_widths24-+-\x1b[34mTEST\x1b[0m---] _________

outer_widths = [3, 3], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m--->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST--->' == '<\x1b[34mTEST\x1b[0m--->'
E         
E         - <TEST--->
E         + <TEST--->

tests/test_build/test_build_border.py:315: AssertionError
________ test_colors[TEST-<->-outer_widths25-+-\x1b[34mTEST\x1b[0m+--] _________

outer_widths = [4, 2], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m+-->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST+-->' == '<\x1b[34mTEST\x1b[0m+-->'
E         
E         - <TEST+-->
E         + <TEST+-->

tests/test_build/test_build_border.py:315: AssertionError
________ test_colors[TEST-<->-outer_widths26-+-\x1b[34mTEST\x1b[0m-+-] _________

outer_widths = [5, 1], left = '<', intersect = '+', right = '>', title = 'TEST'
expected = '<\x1b[34mTEST\x1b[0m-+->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-+->' == '<\x1b[34mTEST\x1b[0m-+->'
E         
E         - <TEST-+->
E         + <TEST-+->

tests/test_build/test_build_border.py:315: AssertionError
____ test_colors[TEST-<->-outer_widths27-+-\x1b[34mTEST\x1b[0m---+---+---] _____

outer_widths = [3, 3, 3, 3], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m---+---+--->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST---+---+--->' == '<\x1b[34mTES...m---+---+--->'
E         
E         - <TEST---+---+--->
E         ?  -----    ----
E         + <TEST---+---+--->

tests/test_build/test_build_border.py:315: AssertionError
____ test_colors[TEST-<->-outer_widths28-+-\x1b[34mTEST\x1b[0m-+----+----] _____

outer_widths = [2, 2, 4, 4], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-+----+---->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-+----+---->' == '<\x1b[34mTES...m-+----+---->'
E         
E         - <TEST-+----+---->
E         ?  -----    ----
E         + <TEST-+----+---->

tests/test_build/test_build_border.py:315: AssertionError
____ test_colors[TEST-<->-outer_widths29-+-\x1b[34mTEST\x1b[0m-----+-----] _____

outer_widths = [1, 1, 5, 5], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-----+----->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-----+----->' == '<\x1b[34mTES...m-----+----->'
E         
E         - <TEST-----+----->
E         ?  -----    ----
E         + <TEST-----+----->

tests/test_build/test_build_border.py:315: AssertionError
______ test_colors[TEST-<->-outer_widths30-+-\x1b[34mTEST\x1b[0m-+--+--] _______

outer_widths = [2, 2, 2, 2], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-+--+-->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-+--+-->' == '<\x1b[34mTEST\x1b[0m-+--+-->'
E         
E         - <TEST-+--+-->
E         + <TEST-+--+-->

tests/test_build/test_build_border.py:315: AssertionError
_______ test_colors[TEST-<->-outer_widths31-+-\x1b[34mTEST\x1b[0m-+-+-] ________

outer_widths = [1, 1, 1, 1, 1], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m-+-+->'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST-+-+->' == '<\x1b[34mTEST\x1b[0m-+-+->'
E         
E         - <TEST-+-+->
E         + <TEST-+-+->

tests/test_build/test_build_border.py:315: AssertionError
_________ test_colors[TEST-<->-outer_widths32-+-\x1b[34mTEST\x1b[0m++] _________

outer_widths = [0, 0, 0, 0, 0, 0, ...], left = '<', intersect = '+', right = '>'
title = 'TEST', expected = '<\x1b[34mTEST\x1b[0m++>'

    @pytest.mark.parametrize(
        "outer_widths,intersect,expected",
        [
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([7, 5], "+", "\x1b[34mTEST\x1b[0m---+-----"),
            ([7, 5], "", "\x1b[34mTEST\x1b[0m--------"),
            ([4], "+", "\x1b[34mTEST\x1b[0m"),
            ([4], "", "\x1b[34mTEST\x1b[0m"),
            ([4, 1], "+", "\x1b[34mTEST\x1b[0m+-"),
            ([4, 1], "", "\x1b[34mTEST\x1b[0m-"),
            ([4, 0], "+", "\x1b[34mTEST\x1b[0m+"),
            ([4, 0], "", "\x1b[34mTEST\x1b[0m"),
            ([12], "", "\x1b[34mTEST\x1b[0m--------"),
            ([6, 6], "", "\x1b[34mTEST\x1b[0m--------"),
            ([3, 3, 3, 3], "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 1, 2, 1, 2, 1, 2, 1], "", "\x1b[34mTEST\x1b[0m--------"),
            ([1] * 12, "", "\x1b[34mTEST\x1b[0m--------"),
            ([2, 4], "", "\x1b[34mTEST\x1b[0m--"),
            ([1, 4], "", "\x1b[34mTEST\x1b[0m-"),
            ([1, 3], "", "\x1b[34mTEST\x1b[0m"),
            ([1, 2], "", "---"),
            ([12], "+", "\x1b[34mTEST\x1b[0m--------"),
            ([0, 12], "+", "\x1b[34mTEST\x1b[0m---------"),
            ([12, 0], "+", "\x1b[34mTEST\x1b[0m--------+"),
            ([0, 0, 12], "+", "\x1b[34mTEST\x1b[0m----------"),
            ([12, 0, 0], "+", "\x1b[34mTEST\x1b[0m--------++"),
            ([3, 3], "+", "\x1b[34mTEST\x1b[0m---"),
            ([4, 2], "+", "\x1b[34mTEST\x1b[0m+--"),
            ([5, 1], "+", "\x1b[34mTEST\x1b[0m-+-"),
            ([3, 3, 3, 3], "+", "\x1b[34mTEST\x1b[0m---+---+---"),
            ([2, 2, 4, 4], "+", "\x1b[34mTEST\x1b[0m-+----+----"),
            ([1, 1, 5, 5], "+", "\x1b[34mTEST\x1b[0m-----+-----"),
            ([2, 2, 2, 2], "+", "\x1b[34mTEST\x1b[0m-+--+--"),
            ([1, 1, 1, 1, 1], "+", "\x1b[34mTEST\x1b[0m-+-+-"),
            ([0, 0, 0, 0, 0, 0, 0], "+", "\x1b[34mTEST\x1b[0m++"),
            ([1, 1], "+", "-+-"),
        ],
    )
    @pytest.mark.parametrize("left,right", [("", ""), ("<", ">")])
    @pytest.mark.parametrize(
        "title",
        [
            "\x1b[34mTEST\x1b[0m",
            Color("{blue}TEST{/all}"),
            Fore.BLUE + "TEST" + Style.RESET_ALL,
            colored("TEST", "blue"),
        ],
    )
    def test_colors(outer_widths, left, intersect, right, title, expected):
        """Test with color title characters.
    
        :param iter outer_widths: List of integers representing column widths with padding.
        :param str left: Left border.
        :param str intersect: Column separator.
        :param str right: Right border.
        :param title: Title in border with color codes.
        :param str expected: Expected output.
        """
        if left and right:
            expected = left + expected + right
        actual = build_border(outer_widths, "-", left, intersect, right, title=title)
>       assert "".join(actual) == expected
E       AssertionError: assert '<TEST++>' == '<\x1b[34mTEST\x1b[0m++>'
E         
E         - <TEST++>
E         + <TEST++>

tests/test_build/test_build_border.py:315: AssertionError
________________________ test_width[Test--4-expected8] _________________________

string = 'Test', align = '', width = 4, expected = ['\x1b[34mTest\x1b[0m']

    @pytest.mark.parametrize(
        "string,align,width,expected",
        [
            ("test", "", 4, ["test"]),
            (123, "", 3, ["123"]),
            (0.9, "", 3, ["0.9"]),
            (None, "", 4, ["None"]),
            (True, "", 4, ["True"]),
            (False, "", 5, ["False"]),
            (Color("{blue}Test{/blue}"), "", 4, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 4, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 4, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 4, ["蓝色"]),
            ("שלום", "", 4, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 4, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 5, ["test "]),
            (123, "", 4, ["123 "]),
            (0.9, "", 4, ["0.9 "]),
            (None, "", 5, ["None "]),
            (True, "", 5, ["True "]),
            (False, "", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "", 5, ["蓝色 "]),
            ("שלום", "", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "left", 5, ["test "]),
            (123, "left", 4, ["123 "]),
            (0.9, "left", 4, ["0.9 "]),
            (None, "left", 5, ["None "]),
            (True, "left", 5, ["True "]),
            (False, "left", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "left", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "left", 5, ["蓝色 "]),
            ("שלום", "left", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "left", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "right", 5, [" test"]),
            (123, "right", 4, [" 123"]),
            (0.9, "right", 4, [" 0.9"]),
            (None, "right", 5, [" None"]),
            (True, "right", 5, [" True"]),
            (False, "right", 6, [" False"]),
            (Color("{blue}Test{/blue}"), "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "right", 5, [" \x1b[34mTest\x1b[0m"]),
            ("蓝色", "right", 5, [" 蓝色"]),
            ("שלום", "right", 5, [" \u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "right", 5, [" \u0645\u0639\u0631\u0628"]),
            ("test", "center", 6, [" test "]),
            (123, "center", 5, [" 123 "]),
            (0.9, "center", 5, [" 0.9 "]),
            (None, "center", 6, [" None "]),
            (True, "center", 6, [" True "]),
            (False, "center", 7, [" False "]),
            (Color("{blue}Test{/blue}"), "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "center", 6, [" \x1b[34mTest\x1b[0m "]),
            ("蓝色", "center", 6, [" 蓝色 "]),
            ("שלום", "center", 6, [" \u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "center", 6, [" \u0645\u0639\u0631\u0628 "]),
        ],
    )
    def test_width(string, align, width, expected):
        """Test width and horizontal alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int width: Expand string to this width without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (width, 1), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['Test'] == ['\x1b[34mTest\x1b[0m']
E         
E         At index 0 diff: 'Test' != '\x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:85: AssertionError
________________________ test_width[Test--5-expected20] ________________________

string = 'Test', align = '', width = 5, expected = ['\x1b[34mTest\x1b[0m ']

    @pytest.mark.parametrize(
        "string,align,width,expected",
        [
            ("test", "", 4, ["test"]),
            (123, "", 3, ["123"]),
            (0.9, "", 3, ["0.9"]),
            (None, "", 4, ["None"]),
            (True, "", 4, ["True"]),
            (False, "", 5, ["False"]),
            (Color("{blue}Test{/blue}"), "", 4, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 4, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 4, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 4, ["蓝色"]),
            ("שלום", "", 4, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 4, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 5, ["test "]),
            (123, "", 4, ["123 "]),
            (0.9, "", 4, ["0.9 "]),
            (None, "", 5, ["None "]),
            (True, "", 5, ["True "]),
            (False, "", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "", 5, ["蓝色 "]),
            ("שלום", "", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "left", 5, ["test "]),
            (123, "left", 4, ["123 "]),
            (0.9, "left", 4, ["0.9 "]),
            (None, "left", 5, ["None "]),
            (True, "left", 5, ["True "]),
            (False, "left", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "left", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "left", 5, ["蓝色 "]),
            ("שלום", "left", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "left", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "right", 5, [" test"]),
            (123, "right", 4, [" 123"]),
            (0.9, "right", 4, [" 0.9"]),
            (None, "right", 5, [" None"]),
            (True, "right", 5, [" True"]),
            (False, "right", 6, [" False"]),
            (Color("{blue}Test{/blue}"), "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "right", 5, [" \x1b[34mTest\x1b[0m"]),
            ("蓝色", "right", 5, [" 蓝色"]),
            ("שלום", "right", 5, [" \u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "right", 5, [" \u0645\u0639\u0631\u0628"]),
            ("test", "center", 6, [" test "]),
            (123, "center", 5, [" 123 "]),
            (0.9, "center", 5, [" 0.9 "]),
            (None, "center", 6, [" None "]),
            (True, "center", 6, [" True "]),
            (False, "center", 7, [" False "]),
            (Color("{blue}Test{/blue}"), "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "center", 6, [" \x1b[34mTest\x1b[0m "]),
            ("蓝色", "center", 6, [" 蓝色 "]),
            ("שלום", "center", 6, [" \u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "center", 6, [" \u0645\u0639\u0631\u0628 "]),
        ],
    )
    def test_width(string, align, width, expected):
        """Test width and horizontal alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int width: Expand string to this width without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (width, 1), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['Test '] == ['\x1b[34mTest\x1b[0m ']
E         
E         At index 0 diff: 'Test ' != '\x1b[34mTest\x1b[0m '
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:85: AssertionError
______________________ test_width[Test-left-5-expected32] ______________________

string = 'Test', align = 'left', width = 5, expected = ['\x1b[34mTest\x1b[0m ']

    @pytest.mark.parametrize(
        "string,align,width,expected",
        [
            ("test", "", 4, ["test"]),
            (123, "", 3, ["123"]),
            (0.9, "", 3, ["0.9"]),
            (None, "", 4, ["None"]),
            (True, "", 4, ["True"]),
            (False, "", 5, ["False"]),
            (Color("{blue}Test{/blue}"), "", 4, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 4, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 4, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 4, ["蓝色"]),
            ("שלום", "", 4, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 4, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 5, ["test "]),
            (123, "", 4, ["123 "]),
            (0.9, "", 4, ["0.9 "]),
            (None, "", 5, ["None "]),
            (True, "", 5, ["True "]),
            (False, "", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "", 5, ["蓝色 "]),
            ("שלום", "", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "left", 5, ["test "]),
            (123, "left", 4, ["123 "]),
            (0.9, "left", 4, ["0.9 "]),
            (None, "left", 5, ["None "]),
            (True, "left", 5, ["True "]),
            (False, "left", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "left", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "left", 5, ["蓝色 "]),
            ("שלום", "left", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "left", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "right", 5, [" test"]),
            (123, "right", 4, [" 123"]),
            (0.9, "right", 4, [" 0.9"]),
            (None, "right", 5, [" None"]),
            (True, "right", 5, [" True"]),
            (False, "right", 6, [" False"]),
            (Color("{blue}Test{/blue}"), "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "right", 5, [" \x1b[34mTest\x1b[0m"]),
            ("蓝色", "right", 5, [" 蓝色"]),
            ("שלום", "right", 5, [" \u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "right", 5, [" \u0645\u0639\u0631\u0628"]),
            ("test", "center", 6, [" test "]),
            (123, "center", 5, [" 123 "]),
            (0.9, "center", 5, [" 0.9 "]),
            (None, "center", 6, [" None "]),
            (True, "center", 6, [" True "]),
            (False, "center", 7, [" False "]),
            (Color("{blue}Test{/blue}"), "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "center", 6, [" \x1b[34mTest\x1b[0m "]),
            ("蓝色", "center", 6, [" 蓝色 "]),
            ("שלום", "center", 6, [" \u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "center", 6, [" \u0645\u0639\u0631\u0628 "]),
        ],
    )
    def test_width(string, align, width, expected):
        """Test width and horizontal alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int width: Expand string to this width without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (width, 1), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['Test '] == ['\x1b[34mTest\x1b[0m ']
E         
E         At index 0 diff: 'Test ' != '\x1b[34mTest\x1b[0m '
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:85: AssertionError
_____________________ test_width[Test-right-5-expected44] ______________________

string = 'Test', align = 'right', width = 5, expected = [' \x1b[34mTest\x1b[0m']

    @pytest.mark.parametrize(
        "string,align,width,expected",
        [
            ("test", "", 4, ["test"]),
            (123, "", 3, ["123"]),
            (0.9, "", 3, ["0.9"]),
            (None, "", 4, ["None"]),
            (True, "", 4, ["True"]),
            (False, "", 5, ["False"]),
            (Color("{blue}Test{/blue}"), "", 4, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 4, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 4, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 4, ["蓝色"]),
            ("שלום", "", 4, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 4, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 5, ["test "]),
            (123, "", 4, ["123 "]),
            (0.9, "", 4, ["0.9 "]),
            (None, "", 5, ["None "]),
            (True, "", 5, ["True "]),
            (False, "", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "", 5, ["蓝色 "]),
            ("שלום", "", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "left", 5, ["test "]),
            (123, "left", 4, ["123 "]),
            (0.9, "left", 4, ["0.9 "]),
            (None, "left", 5, ["None "]),
            (True, "left", 5, ["True "]),
            (False, "left", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "left", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "left", 5, ["蓝色 "]),
            ("שלום", "left", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "left", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "right", 5, [" test"]),
            (123, "right", 4, [" 123"]),
            (0.9, "right", 4, [" 0.9"]),
            (None, "right", 5, [" None"]),
            (True, "right", 5, [" True"]),
            (False, "right", 6, [" False"]),
            (Color("{blue}Test{/blue}"), "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "right", 5, [" \x1b[34mTest\x1b[0m"]),
            ("蓝色", "right", 5, [" 蓝色"]),
            ("שלום", "right", 5, [" \u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "right", 5, [" \u0645\u0639\u0631\u0628"]),
            ("test", "center", 6, [" test "]),
            (123, "center", 5, [" 123 "]),
            (0.9, "center", 5, [" 0.9 "]),
            (None, "center", 6, [" None "]),
            (True, "center", 6, [" True "]),
            (False, "center", 7, [" False "]),
            (Color("{blue}Test{/blue}"), "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "center", 6, [" \x1b[34mTest\x1b[0m "]),
            ("蓝色", "center", 6, [" 蓝色 "]),
            ("שלום", "center", 6, [" \u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "center", 6, [" \u0645\u0639\u0631\u0628 "]),
        ],
    )
    def test_width(string, align, width, expected):
        """Test width and horizontal alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int width: Expand string to this width without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (width, 1), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert [' Test'] == [' \x1b[34mTest\x1b[0m']
E         
E         At index 0 diff: ' Test' != ' \x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:85: AssertionError
_____________________ test_width[Test-center-6-expected56] _____________________

string = 'Test', align = 'center', width = 6
expected = [' \x1b[34mTest\x1b[0m ']

    @pytest.mark.parametrize(
        "string,align,width,expected",
        [
            ("test", "", 4, ["test"]),
            (123, "", 3, ["123"]),
            (0.9, "", 3, ["0.9"]),
            (None, "", 4, ["None"]),
            (True, "", 4, ["True"]),
            (False, "", 5, ["False"]),
            (Color("{blue}Test{/blue}"), "", 4, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 4, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 4, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 4, ["蓝色"]),
            ("שלום", "", 4, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 4, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 5, ["test "]),
            (123, "", 4, ["123 "]),
            (0.9, "", 4, ["0.9 "]),
            (None, "", 5, ["None "]),
            (True, "", 5, ["True "]),
            (False, "", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "", 5, ["蓝色 "]),
            ("שלום", "", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "left", 5, ["test "]),
            (123, "left", 4, ["123 "]),
            (0.9, "left", 4, ["0.9 "]),
            (None, "left", 5, ["None "]),
            (True, "left", 5, ["True "]),
            (False, "left", 6, ["False "]),
            (Color("{blue}Test{/blue}"), "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "left", 5, ["\x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "left", 5, ["\x1b[34mTest\x1b[0m "]),
            ("蓝色", "left", 5, ["蓝色 "]),
            ("שלום", "left", 5, ["\u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "left", 5, ["\u0645\u0639\u0631\u0628 "]),
            ("test", "right", 5, [" test"]),
            (123, "right", 4, [" 123"]),
            (0.9, "right", 4, [" 0.9"]),
            (None, "right", 5, [" None"]),
            (True, "right", 5, [" True"]),
            (False, "right", 6, [" False"]),
            (Color("{blue}Test{/blue}"), "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "right", 5, [" \x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "right", 5, [" \x1b[34mTest\x1b[0m"]),
            ("蓝色", "right", 5, [" 蓝色"]),
            ("שלום", "right", 5, [" \u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "right", 5, [" \u0645\u0639\u0631\u0628"]),
            ("test", "center", 6, [" test "]),
            (123, "center", 5, [" 123 "]),
            (0.9, "center", 5, [" 0.9 "]),
            (None, "center", 6, [" None "]),
            (True, "center", 6, [" True "]),
            (False, "center", 7, [" False "]),
            (Color("{blue}Test{/blue}"), "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (Fore.BLUE + "Test" + Fore.RESET, "center", 6, [" \x1b[34mTest\x1b[39m "]),
            (colored("Test", "blue"), "center", 6, [" \x1b[34mTest\x1b[0m "]),
            ("蓝色", "center", 6, [" 蓝色 "]),
            ("שלום", "center", 6, [" \u05e9\u05dc\u05d5\u05dd "]),
            ("معرب", "center", 6, [" \u0645\u0639\u0631\u0628 "]),
        ],
    )
    def test_width(string, align, width, expected):
        """Test width and horizontal alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int width: Expand string to this width without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (width, 1), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert [' Test '] == [' \x1b[34mTest\x1b[0m ']
E         
E         At index 0 diff: ' Test ' != ' \x1b[34mTest\x1b[0m '
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:85: AssertionError
________________________ test_height[Test--1-expected3] ________________________

string = 'Test', align = '', height = 1, expected = ['\x1b[34mTest\x1b[0m']

    @pytest.mark.parametrize(
        "string,align,height,expected",
        [
            ("test", "", 1, ["test"]),
            (Color("{blue}Test{/blue}"), "", 1, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 1, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 1, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 1, ["蓝色"]),
            ("שלום", "", 1, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 1, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "", 2, ["蓝色", "    "]),
            ("שלום", "", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "top", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "top", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "top", 2, ["蓝色", "    "]),
            ("שלום", "top", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "top", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "bottom", 2, ["    ", "test"]),
            (Color("{blue}Test{/blue}"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[39m"]),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "bottom",
                2,
                ["    ", "\x1b[34mTest\x1b[39m"],
            ),
            (colored("Test", "blue"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[0m"]),
            ("蓝色", "bottom", 2, ["    ", "蓝色"]),
            ("שלום", "bottom", 2, ["    ", "\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "bottom", 2, ["    ", "\u0645\u0639\u0631\u0628"]),
            ("test", "middle", 3, ["    ", "test", "    "]),
            (
                Color("{blue}Test{/blue}"),
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (colored("Test", "blue"), "middle", 3, ["    ", "\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "middle", 3, ["    ", "蓝色", "    "]),
            ("שלום", "middle", 3, ["    ", "\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "middle", 3, ["    ", "\u0645\u0639\u0631\u0628", "    "]),
        ],
    )
    def test_height(string, align, height, expected):
        """Test height and vertical alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int height: Expand string to this height without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (4, height), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['Test'] == ['\x1b[34mTest\x1b[0m']
E         
E         At index 0 diff: 'Test' != '\x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:152: AssertionError
_______________________ test_height[Test--2-expected10] ________________________

string = 'Test', align = '', height = 2
expected = ['\x1b[34mTest\x1b[0m', '    ']

    @pytest.mark.parametrize(
        "string,align,height,expected",
        [
            ("test", "", 1, ["test"]),
            (Color("{blue}Test{/blue}"), "", 1, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 1, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 1, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 1, ["蓝色"]),
            ("שלום", "", 1, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 1, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "", 2, ["蓝色", "    "]),
            ("שלום", "", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "top", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "top", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "top", 2, ["蓝色", "    "]),
            ("שלום", "top", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "top", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "bottom", 2, ["    ", "test"]),
            (Color("{blue}Test{/blue}"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[39m"]),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "bottom",
                2,
                ["    ", "\x1b[34mTest\x1b[39m"],
            ),
            (colored("Test", "blue"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[0m"]),
            ("蓝色", "bottom", 2, ["    ", "蓝色"]),
            ("שלום", "bottom", 2, ["    ", "\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "bottom", 2, ["    ", "\u0645\u0639\u0631\u0628"]),
            ("test", "middle", 3, ["    ", "test", "    "]),
            (
                Color("{blue}Test{/blue}"),
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (colored("Test", "blue"), "middle", 3, ["    ", "\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "middle", 3, ["    ", "蓝色", "    "]),
            ("שלום", "middle", 3, ["    ", "\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "middle", 3, ["    ", "\u0645\u0639\u0631\u0628", "    "]),
        ],
    )
    def test_height(string, align, height, expected):
        """Test height and vertical alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int height: Expand string to this height without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (4, height), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['Test', '    '] == ['\x1b[34mTes...b[0m', '    ']
E         
E         At index 0 diff: 'Test' != '\x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:152: AssertionError
______________________ test_height[Test-top-2-expected17] ______________________

string = 'Test', align = 'top', height = 2
expected = ['\x1b[34mTest\x1b[0m', '    ']

    @pytest.mark.parametrize(
        "string,align,height,expected",
        [
            ("test", "", 1, ["test"]),
            (Color("{blue}Test{/blue}"), "", 1, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 1, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 1, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 1, ["蓝色"]),
            ("שלום", "", 1, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 1, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "", 2, ["蓝色", "    "]),
            ("שלום", "", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "top", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "top", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "top", 2, ["蓝色", "    "]),
            ("שלום", "top", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "top", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "bottom", 2, ["    ", "test"]),
            (Color("{blue}Test{/blue}"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[39m"]),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "bottom",
                2,
                ["    ", "\x1b[34mTest\x1b[39m"],
            ),
            (colored("Test", "blue"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[0m"]),
            ("蓝色", "bottom", 2, ["    ", "蓝色"]),
            ("שלום", "bottom", 2, ["    ", "\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "bottom", 2, ["    ", "\u0645\u0639\u0631\u0628"]),
            ("test", "middle", 3, ["    ", "test", "    "]),
            (
                Color("{blue}Test{/blue}"),
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (colored("Test", "blue"), "middle", 3, ["    ", "\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "middle", 3, ["    ", "蓝色", "    "]),
            ("שלום", "middle", 3, ["    ", "\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "middle", 3, ["    ", "\u0645\u0639\u0631\u0628", "    "]),
        ],
    )
    def test_height(string, align, height, expected):
        """Test height and vertical alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int height: Expand string to this height without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (4, height), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['Test', '    '] == ['\x1b[34mTes...b[0m', '    ']
E         
E         At index 0 diff: 'Test' != '\x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:152: AssertionError
____________________ test_height[Test-bottom-2-expected24] _____________________

string = 'Test', align = 'bottom', height = 2
expected = ['    ', '\x1b[34mTest\x1b[0m']

    @pytest.mark.parametrize(
        "string,align,height,expected",
        [
            ("test", "", 1, ["test"]),
            (Color("{blue}Test{/blue}"), "", 1, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 1, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 1, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 1, ["蓝色"]),
            ("שלום", "", 1, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 1, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "", 2, ["蓝色", "    "]),
            ("שלום", "", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "top", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "top", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "top", 2, ["蓝色", "    "]),
            ("שלום", "top", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "top", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "bottom", 2, ["    ", "test"]),
            (Color("{blue}Test{/blue}"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[39m"]),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "bottom",
                2,
                ["    ", "\x1b[34mTest\x1b[39m"],
            ),
            (colored("Test", "blue"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[0m"]),
            ("蓝色", "bottom", 2, ["    ", "蓝色"]),
            ("שלום", "bottom", 2, ["    ", "\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "bottom", 2, ["    ", "\u0645\u0639\u0631\u0628"]),
            ("test", "middle", 3, ["    ", "test", "    "]),
            (
                Color("{blue}Test{/blue}"),
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (colored("Test", "blue"), "middle", 3, ["    ", "\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "middle", 3, ["    ", "蓝色", "    "]),
            ("שלום", "middle", 3, ["    ", "\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "middle", 3, ["    ", "\u0645\u0639\u0631\u0628", "    "]),
        ],
    )
    def test_height(string, align, height, expected):
        """Test height and vertical alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int height: Expand string to this height without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (4, height), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['    ', 'Test'] == ['    ', '\x1...mTest\x1b[0m']
E         
E         At index 1 diff: 'Test' != '\x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:152: AssertionError
____________________ test_height[Test-middle-3-expected31] _____________________

string = 'Test', align = 'middle', height = 3
expected = ['    ', '\x1b[34mTest\x1b[0m', '    ']

    @pytest.mark.parametrize(
        "string,align,height,expected",
        [
            ("test", "", 1, ["test"]),
            (Color("{blue}Test{/blue}"), "", 1, ["\x1b[34mTest\x1b[39m"]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 1, ["\x1b[34mTest\x1b[39m"]),
            (colored("Test", "blue"), "", 1, ["\x1b[34mTest\x1b[0m"]),
            ("蓝色", "", 1, ["蓝色"]),
            ("שלום", "", 1, ["\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "", 1, ["\u0645\u0639\u0631\u0628"]),
            ("test", "", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "", 2, ["蓝色", "    "]),
            ("שלום", "", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "top", 2, ["test", "    "]),
            (Color("{blue}Test{/blue}"), "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (Fore.BLUE + "Test" + Fore.RESET, "top", 2, ["\x1b[34mTest\x1b[39m", "    "]),
            (colored("Test", "blue"), "top", 2, ["\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "top", 2, ["蓝色", "    "]),
            ("שלום", "top", 2, ["\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "top", 2, ["\u0645\u0639\u0631\u0628", "    "]),
            ("test", "bottom", 2, ["    ", "test"]),
            (Color("{blue}Test{/blue}"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[39m"]),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "bottom",
                2,
                ["    ", "\x1b[34mTest\x1b[39m"],
            ),
            (colored("Test", "blue"), "bottom", 2, ["    ", "\x1b[34mTest\x1b[0m"]),
            ("蓝色", "bottom", 2, ["    ", "蓝色"]),
            ("שלום", "bottom", 2, ["    ", "\u05e9\u05dc\u05d5\u05dd"]),
            ("معرب", "bottom", 2, ["    ", "\u0645\u0639\u0631\u0628"]),
            ("test", "middle", 3, ["    ", "test", "    "]),
            (
                Color("{blue}Test{/blue}"),
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (
                Fore.BLUE + "Test" + Fore.RESET,
                "middle",
                3,
                ["    ", "\x1b[34mTest\x1b[39m", "    "],
            ),
            (colored("Test", "blue"), "middle", 3, ["    ", "\x1b[34mTest\x1b[0m", "    "]),
            ("蓝色", "middle", 3, ["    ", "蓝色", "    "]),
            ("שלום", "middle", 3, ["    ", "\u05e9\u05dc\u05d5\u05dd", "    "]),
            ("معرب", "middle", 3, ["    ", "\u0645\u0639\u0631\u0628", "    "]),
        ],
    )
    def test_height(string, align, height, expected):
        """Test height and vertical alignment.
    
        :param str string: String to test.
        :param str align: Horizontal alignment.
        :param int height: Expand string to this height without padding.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (4, height), (0, 0, 0, 0))
>       assert actual == expected
E       AssertionError: assert ['    ', 'Test', '    '] == ['    ', '\x1...b[0m', '    ']
E         
E         At index 1 diff: 'Test' != '\x1b[34mTest\x1b[0m'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:152: AssertionError
_ test_odd_width_height_pad_space[\x1b[34mTest\x1b[39m\n\x1b[34mTest\x1b[39m\nTest--expected29] _

string = '\x1b[34mTest\x1b[39m\n\x1b[34mTest\x1b[39m\nTest', align = ''
expected = ['.......', '.\x1b[34mTest\x1b[39m..', '.\x1b[34mTest\x1b[39m..', '.\x1b[34mTest\x1b[0m..', '.......']

    @pytest.mark.parametrize(
        "string,align,expected",
        [
            ("", "", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "", [".......", ".a.....", ".b.....", ".c.....", "......."]),
            ("test", "", [".......", ".test..", ".......", ".......", "......."]),
            ("", "left", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "left", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "left", [".......", ".a.....", ".b.....", ".c.....", "......."]),
            ("test", "left", [".......", ".test..", ".......", ".......", "......."]),
            ("", "right", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "right", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "right", [".......", ".....a.", ".....b.", ".....c.", "......."]),
            ("test", "right", [".......", "..test.", ".......", ".......", "......."]),
            ("", "center", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "center", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "center", [".......", "...a...", "...b...", "...c...", "......."]),
            ("test", "center", [".......", "..test.", ".......", ".......", "......."]),
            ("", "top", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "top", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "top", [".......", ".a.....", ".b.....", ".c.....", "......."]),
            ("test", "top", [".......", ".test..", ".......", ".......", "......."]),
            ("", "bottom", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "bottom", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "bottom", [".......", ".a.....", ".b.....", ".c.....", "......."]),
            ("test", "bottom", [".......", ".......", ".......", ".test..", "......."]),
            ("", "middle", [".......", ".......", ".......", ".......", "......."]),
            ("\n", "middle", [".......", ".......", ".......", ".......", "......."]),
            ("a\nb\nc", "middle", [".......", ".a.....", ".b.....", ".c.....", "......."]),
            ("test", "middle", [".......", ".......", ".test..", ".......", "......."]),
            (
                "蓝色\nשלום\nمعرب",
                "",
                [
                    ".......",
                    ".蓝色..",
                    ".\u05e9\u05dc\u05d5\u05dd..",
                    ".\u0645\u0639\u0631\u0628..",
                    ".......",
                ],
            ),
            (
                "\n".join(
                    (
                        Color("{blue}Test{/blue}"),
                        Fore.BLUE + "Test" + Fore.RESET,
                        colored("Test", "blue"),
                    )
                ),
                "",
                [
                    ".......",
                    ".\x1b[34mTest\x1b[39m..",
                    ".\x1b[34mTest\x1b[39m..",
                    ".\x1b[34mTest\x1b[0m..",
                    ".......",
                ],
            ),
            # (Color('{blue}A\nB{/blue}'), '', '.......\n.\x1b[34mA\x1b[39m.....\n.\x1b[34mB\x1b[39m.....\n.......\n.......'),
        ],
    )
    def test_odd_width_height_pad_space(string, align, expected):
        """Test odd number width, height, padding, and dots for whitespaces.
    
        :param str string: String to test.
        :param str align: Alignment in any dimension but one at a time.
        :param list expected: Expected output string.
        """
        actual = align_and_pad_cell(string, (align,), (5, 3), (1, 1, 1, 1), ".")
>       assert actual == expected
E       AssertionError: assert ['.......', '....', '.......'] == ['.......', '....', '.......']
E         
E         At index 3 diff: '.Test..' != '.\x1b[34mTest\x1b[0m..'
E         Use -v to get more diff

tests/test_width_and_alignment/test_align_and_pad_cell.py:225: AssertionError
=========================== short test summary info ============================
FAILED tests/test_base_table/test_table.py::test_color - AssertionError: asse...
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths0-+-\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths1--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths2-+-\x1b[34mTEST\x1b[0m---+-----]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths3--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths4-+-\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths5--\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths6-+-\x1b[34mTEST\x1b[0m+-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths7--\x1b[34mTEST\x1b[0m-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths8-+-\x1b[34mTEST\x1b[0m+]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths9--\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths10--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths11--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths12--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths13--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths14--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths15--\x1b[34mTEST\x1b[0m--]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths16--\x1b[34mTEST\x1b[0m-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths17--\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths19-+-\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths20-+-\x1b[34mTEST\x1b[0m---------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths21-+-\x1b[34mTEST\x1b[0m--------+]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths22-+-\x1b[34mTEST\x1b[0m----------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths23-+-\x1b[34mTEST\x1b[0m--------++]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths24-+-\x1b[34mTEST\x1b[0m---]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths25-+-\x1b[34mTEST\x1b[0m+--]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths26-+-\x1b[34mTEST\x1b[0m-+-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths27-+-\x1b[34mTEST\x1b[0m---+---+---]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths28-+-\x1b[34mTEST\x1b[0m-+----+----]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths29-+-\x1b[34mTEST\x1b[0m-----+-----]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths30-+-\x1b[34mTEST\x1b[0m-+--+--]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths31-+-\x1b[34mTEST\x1b[0m-+-+-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST---outer_widths32-+-\x1b[34mTEST\x1b[0m++]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths0-+-\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths1--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths2-+-\x1b[34mTEST\x1b[0m---+-----]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths3--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths4-+-\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths5--\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths6-+-\x1b[34mTEST\x1b[0m+-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths7--\x1b[34mTEST\x1b[0m-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths8-+-\x1b[34mTEST\x1b[0m+]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths9--\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths10--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths11--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths12--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths13--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths14--\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths15--\x1b[34mTEST\x1b[0m--]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths16--\x1b[34mTEST\x1b[0m-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths17--\x1b[34mTEST\x1b[0m]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths19-+-\x1b[34mTEST\x1b[0m--------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths20-+-\x1b[34mTEST\x1b[0m---------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths21-+-\x1b[34mTEST\x1b[0m--------+]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths22-+-\x1b[34mTEST\x1b[0m----------]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths23-+-\x1b[34mTEST\x1b[0m--------++]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths24-+-\x1b[34mTEST\x1b[0m---]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths25-+-\x1b[34mTEST\x1b[0m+--]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths26-+-\x1b[34mTEST\x1b[0m-+-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths27-+-\x1b[34mTEST\x1b[0m---+---+---]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths28-+-\x1b[34mTEST\x1b[0m-+----+----]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths29-+-\x1b[34mTEST\x1b[0m-----+-----]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths30-+-\x1b[34mTEST\x1b[0m-+--+--]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths31-+-\x1b[34mTEST\x1b[0m-+-+-]
FAILED tests/test_build/test_build_border.py::test_colors[TEST-<->-outer_widths32-+-\x1b[34mTEST\x1b[0m++]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_width[Test--4-expected8]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_width[Test--5-expected20]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_width[Test-left-5-expected32]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_width[Test-right-5-expected44]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_width[Test-center-6-expected56]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_height[Test--1-expected3]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_height[Test--2-expected10]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_height[Test-top-2-expected17]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_height[Test-bottom-2-expected24]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_height[Test-middle-3-expected31]
FAILED tests/test_width_and_alignment/test_align_and_pad_cell.py::test_odd_width_height_pad_space[\x1b[34mTest\x1b[39m\n\x1b[34mTest\x1b[39m\nTest--expected29]
================== 76 failed, 711 passed, 14 skipped in 3.11s ==================
E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd /build/reproducible-path/terminaltables3-4.0.0/.pybuild/cpython3_3.13_terminaltables3/build; python3.13 -m pytest tests
dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.13 returned exit code 13
make[1]: [debian/rules:16: override_dh_auto_test] Error 25 (ignored)
make[1]: Leaving directory '/build/reproducible-path/terminaltables3-4.0.0'
   create-stamp debian/debhelper-build-stamp
   dh_testroot -O--buildsystem=pybuild
   dh_prep -O--buildsystem=pybuild
   dh_auto_install -O--buildsystem=pybuild
I: pybuild plugin_pyproject:178: Copying package built for python3.13 to destdir
   debian/rules execute_after_dh_auto_install
make[1]: Entering directory '/build/reproducible-path/terminaltables3-4.0.0'
# installed via python-terminaltables3-doc.examples
rm -f debian/python3-terminaltables3/usr/lib/python*/dist-packages/example*.py
make[1]: Leaving directory '/build/reproducible-path/terminaltables3-4.0.0'
   dh_installdocs -O--buildsystem=pybuild
dh_installdocs: warning: Cannot auto-detect main package for python-terminaltables3-doc.  If the default is wrong, please use --doc-main-package
   debian/rules override_dh_sphinxdoc
make[1]: Entering directory '/build/reproducible-path/terminaltables3-4.0.0'
TZ=UTC PYTHONPATH=. /usr/share/sphinx/scripts/python3/sphinx-build -N -q -E -b html docs/ debian/python-terminaltables3-doc/usr/share/doc/python-terminaltables3-doc/html/
WARNING: autodoc: failed to import class 'AsciiTable' from module 'terminaltables'; the following exception was raised:
No module named 'terminaltables' [autodoc.import_object]
/build/reproducible-path/terminaltables3-4.0.0/docs/changelog.rst:3: CRITICAL: Problems with "include" directive path:
InputError: [Errno 2] No such file or directory: 'README.rst'. [docutils]
WARNING: autodoc: failed to import class 'DoubleTable' from module 'terminaltables'; the following exception was raised:
No module named 'terminaltables' [autodoc.import_object]
WARNING: autodoc: failed to import class 'GithubFlavoredMarkdownTable' from module 'terminaltables'; the following exception was raised:
No module named 'terminaltables' [autodoc.import_object]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:29: ERROR: Unknown interpreted text role "github". [docutils]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:29: ERROR: Unknown interpreted text role "github". [docutils]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:29: ERROR: Unknown interpreted text role "github". [docutils]
WARNING: autodoc: failed to import class 'SingleTable' from module 'terminaltables'; the following exception was raised:
No module named 'terminaltables' [autodoc.import_object]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
/build/reproducible-path/terminaltables3-4.0.0/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated [toc.no_title]
dh_sphinxdoc
make[1]: Leaving directory '/build/reproducible-path/terminaltables3-4.0.0'
   debian/rules override_dh_installchangelogs
make[1]: Entering directory '/build/reproducible-path/terminaltables3-4.0.0'
dh_installchangelogs CHANGELOG.md
make[1]: Leaving directory '/build/reproducible-path/terminaltables3-4.0.0'
   dh_installexamples -O--buildsystem=pybuild
dh_installexamples: warning: Cannot auto-detect main package for python-terminaltables3-doc.  If the default is wrong, please use --doc-main-package
   dh_python3 -O--buildsystem=pybuild
   dh_installsystemduser -O--buildsystem=pybuild
   dh_perl -O--buildsystem=pybuild
   dh_link -O--buildsystem=pybuild
   dh_strip_nondeterminism -O--buildsystem=pybuild
   debian/rules override_dh_compress
make[1]: Entering directory '/build/reproducible-path/terminaltables3-4.0.0'
dh_compress -X example1.py -X example2.py -X example3.py -X html/
make[1]: Leaving directory '/build/reproducible-path/terminaltables3-4.0.0'
   dh_fixperms -O--buildsystem=pybuild
   dh_missing -O--buildsystem=pybuild
   dh_installdeb -O--buildsystem=pybuild
   dh_gencontrol -O--buildsystem=pybuild
   dh_md5sums -O--buildsystem=pybuild
   dh_builddeb -O--buildsystem=pybuild
dpkg-deb: building package 'python-terminaltables3-doc' in '../python-terminaltables3-doc_4.0.0-4_all.deb'.
dpkg-deb: building package 'python3-terminaltables3' in '../python3-terminaltables3_4.0.0-4_all.deb'.
 dpkg-genbuildinfo --build=binary -O../terminaltables3_4.0.0-4_i386.buildinfo
 dpkg-genchanges --build=binary -O../terminaltables3_4.0.0-4_i386.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build .
dpkg-source: info: using options from terminaltables3-4.0.0/debian/source/options: --extend-diff-ignore=^[^/]+\.egg-info/
dpkg-buildpackage: info: binary-only upload (no source included)
dpkg-genchanges: info: not including original source code in upload
I: copying local configuration
I: unmounting dev/ptmx filesystem
I: unmounting dev/pts filesystem
I: unmounting dev/shm filesystem
I: unmounting proc filesystem
I: unmounting sys filesystem
I: cleaning the build env 
I: removing directory /srv/workspace/pbuilder/6078 and its subdirectories
I: Current time: Sun Mar  9 16:13:31 -12 2025
I: pbuilder-time-stamp: 1741580011