Thu Nov 28 02:22:07 UTC 2024  I: starting to build terminaltables/trixie/armhf on jenkins on '2024-11-28 02:21'
Thu Nov 28 02:22:07 UTC 2024  I: The jenkins build log is/was available at https://jenkins.debian.net/userContent/reproducible/debian/build_service/armhf_16/10294/console.log
Thu Nov 28 02:22:07 UTC 2024  I: Downloading source for trixie/terminaltables=3.1.10-6
--2024-11-28 02:22:07--  http://deb.debian.org/debian/pool/main/t/terminaltables/terminaltables_3.1.10-6.dsc
Connecting to 46.16.76.132:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 2329 (2.3K) [text/prs.lines.tag]
Saving to: ‘terminaltables_3.1.10-6.dsc’

     0K ..                                                    100%  356M=0s

2024-11-28 02:22:07 (356 MB/s) - ‘terminaltables_3.1.10-6.dsc’ saved [2329/2329]

Thu Nov 28 02:22:07 UTC 2024  I: terminaltables_3.1.10-6.dsc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 3.0 (quilt)
Source: terminaltables
Binary: python-terminaltables-doc, python3-terminaltables
Architecture: all
Version: 3.1.10-6
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Homepage: https://github.com/matthewdeanmartin/terminaltables
Standards-Version: 4.7.0
Vcs-Browser: https://git.progress-linux.org/users/daniel.baumann/debian/packages/terminaltables
Vcs-Git: https://git.progress-linux.org/users/daniel.baumann/debian/packages/terminaltables
Testsuite: autopkgtest-pkg-python
Build-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
Package-List:
 python-terminaltables-doc deb doc optional arch=all
 python3-terminaltables deb python optional arch=all
Checksums-Sha1:
 db075b2aafc4b14b302538191839f0ac9a71b761 243872 terminaltables_3.1.10.orig.tar.xz
 394f93ed84f577200891e022b3882f6fd446678a 5612 terminaltables_3.1.10-6.debian.tar.xz
Checksums-Sha256:
 69e6771f9442bd9c5452a3b8ff2b05dd2b5f3b661d1641de25c0d598d106fe73 243872 terminaltables_3.1.10.orig.tar.xz
 096908c3a1ee79a8502c2e4c3a78699a7681beccb6efe270dac6b962acc7a61d 5612 terminaltables_3.1.10-6.debian.tar.xz
Files:
 82950ec544b521f1bd9edd417104714a 243872 terminaltables_3.1.10.orig.tar.xz
 2036fb2a0955e284bff1f483193b9d51 5612 terminaltables_3.1.10-6.debian.tar.xz

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEgTbtJcfWfpLHSkKSVc8b+YaruccFAmc7blMACgkQVc8b+Yar
ucf3fRAAnRm+M2jDb2KbYrmJEF3Jtsrt5bkaEBthStOmdnjCnq0DNlItC8lzLLN6
1KkiglZsx70a/TXgkh9bZxvL13b0i/doJTM3IRZTWTvxHGszZsCTBzfB0KVsJtDh
vECcDrNhT1E4zWCflDgC2pP3UsckjdOBYEfePFn5bs1ifMC3L0cKSPnIyuD7zQEf
4ffedpKOpBYiUTkg6X+yjSyBKfOFBM58EMrm9RE6y+C05FUROmqd6HKgzfinLmkP
SyveWkQ9rh6j23JcaNC8CirxV+XgPZpoH5BwYYDZ8J3CtL7oXtLVuS5jFTGxgQNf
jo252Srju/VOrASNGhVMBgvUPwXwjazOFvcLeXn5/mnNb4HTwYWxc+HTO4QVpU6/
idRM1z3BBsLT7pSGPwZNXhIyuP1jg4DMe0AeTiGlNoQvvWaRMqKp3N7R4V/a0BWe
00QDhUWSBaamnGd2oE+ACFWftHNtVVs/ZeP+Ttp0a+yLQX2A8X1QOg6JMlIRaG2u
WVFB+MVDNDpuE2pBY7nLGjzbkmXc+HwJiVHCx0C2MGB2bY8flKbF6YP4RJKK+wtG
W5e9Je8Kr6c1nOIX1J+UqmEhS9E+mPQ1N+N6atLSMaHcRHal4B3r0r/6dQqLUP8/
dSHYZ97n1+bdJKNgSX7XUaNLhDILF0ZTLeijLiRPRJbhicdniuA=
=aQFP
-----END PGP SIGNATURE-----
Thu Nov 28 02:22:07 UTC 2024  I: Checking whether the package is not for us
Thu Nov 28 02:22:07 UTC 2024  I: Starting 1st build on remote node virt32b-armhf-rb.debian.net.
Thu Nov 28 02:22:07 UTC 2024  I: Preparing to do remote build '1' on virt32b-armhf-rb.debian.net.
Thu Nov 28 02:25:40 UTC 2024  I: Deleting $TMPDIR on virt32b-armhf-rb.debian.net.
I: pbuilder: network access will be disabled during build
I: Current time: Wed Nov 27 14:22:14 -12 2024
I: pbuilder-time-stamp: 1732760534
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: Copying source file
I: copying [terminaltables_3.1.10-6.dsc]
I: copying [./terminaltables_3.1.10.orig.tar.xz]
I: copying [./terminaltables_3.1.10-6.debian.tar.xz]
I: Extracting source
gpgv: Signature made Mon Nov 18 16:41:55 2024 
gpgv:                using RSA key 8136ED25C7D67E92C74A429255CF1BF986ABB9C7
gpgv: Can't check signature: No public key
dpkg-source: warning: cannot verify inline signature for ./terminaltables_3.1.10-6.dsc: no acceptable signature found
dpkg-source: info: extracting terminaltables in terminaltables-3.1.10
dpkg-source: info: unpacking terminaltables_3.1.10.orig.tar.xz
dpkg-source: info: unpacking terminaltables_3.1.10-6.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/18857/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='armhf'
  DEBIAN_FRONTEND='noninteractive'
  DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=3 '
  DISTRIBUTION='trixie'
  HOME='/root'
  HOST_ARCH='armhf'
  IFS=' 	
  '
  INVOCATION_ID='9eeb3e5613a34e149ce63a1d146f1211'
  LANG='C'
  LANGUAGE='en_US:en'
  LC_ALL='C'
  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='18857'
  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.H2NSyoe6/pbuilderrc_wlHt --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.H2NSyoe6/b1 --logfile b1/build.log terminaltables_3.1.10-6.dsc'
  SUDO_GID='112'
  SUDO_UID='106'
  SUDO_USER='jenkins'
  TERM='unknown'
  TZ='/usr/share/zoneinfo/Etc/GMT+12'
  USER='root'
  _='/usr/bin/systemd-run'
  http_proxy='http://10.0.0.15:3142/'
I: uname -a
  Linux virt32b 6.1.0-28-armmp-lpae #1 SMP Debian 6.1.119-1 (2024-11-22) armv7l GNU/Linux
I: ls -l /bin
  lrwxrwxrwx 1 root root 7 Aug  4 21:30 /bin -> usr/bin
I: user script /srv/workspace/pbuilder/18857/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: armhf
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 ... 19689 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} libcom-err2{a} libdebhelper-perl{a} libelf1t64{a} libexpat1{a} libfile-stripnondeterminism-perl{a} libgssapi-krb5-2{a} libicu72{a} libjs-jquery{a} libjs-sphinxdoc{a} libjs-underscore{a} libjson-perl{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libmagic-mgc{a} libmagic1t64{a} libnsl2{a} libpipeline1{a} libpython3-stdlib{a} libpython3.12-minimal{a} libpython3.12-stdlib{a} libreadline8t64{a} libtirpc-common{a} libtirpc3t64{a} libtool{a} libuchardet0{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-crashtest{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-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-pexpect{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-poetry-plugin-export{a} python3-ptyprocess{a} python3-pygments{a} python3-pylev{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.12{a} python3.12-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 krb5-locales 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, 141 newly installed, 0 to remove and 0 not upgraded.
Need to get 49.2 MB of archives. After unpacking 186 MB will be used.
Writing extended state information...
Get: 1 http://deb.debian.org/debian trixie/main armhf fonts-lato all 2.015-1 [2780 kB]
Get: 2 http://deb.debian.org/debian trixie/main armhf libpython3.12-minimal armhf 3.12.7-3 [800 kB]
Get: 3 http://deb.debian.org/debian trixie/main armhf libexpat1 armhf 2.6.4-1 [83.5 kB]
Get: 4 http://deb.debian.org/debian trixie/main armhf python3.12-minimal armhf 3.12.7-3 [1808 kB]
Get: 5 http://deb.debian.org/debian trixie/main armhf python3-minimal armhf 3.12.6-1 [26.7 kB]
Get: 6 http://deb.debian.org/debian trixie/main armhf media-types all 10.1.0 [26.9 kB]
Get: 7 http://deb.debian.org/debian trixie/main armhf netbase all 6.4 [12.8 kB]
Get: 8 http://deb.debian.org/debian trixie/main armhf tzdata all 2024b-3 [255 kB]
Get: 9 http://deb.debian.org/debian trixie/main armhf libkrb5support0 armhf 1.21.3-3 [30.0 kB]
Get: 10 http://deb.debian.org/debian trixie/main armhf libcom-err2 armhf 1.47.1-1+b1 [22.3 kB]
Get: 11 http://deb.debian.org/debian trixie/main armhf libk5crypto3 armhf 1.21.3-3 [75.8 kB]
Get: 12 http://deb.debian.org/debian trixie/main armhf libkeyutils1 armhf 1.6.3-4 [8096 B]
Get: 13 http://deb.debian.org/debian trixie/main armhf libkrb5-3 armhf 1.21.3-3 [283 kB]
Get: 14 http://deb.debian.org/debian trixie/main armhf libgssapi-krb5-2 armhf 1.21.3-3 [114 kB]
Get: 15 http://deb.debian.org/debian trixie/main armhf libtirpc-common all 1.3.4+ds-1.3 [10.9 kB]
Get: 16 http://deb.debian.org/debian trixie/main armhf libtirpc3t64 armhf 1.3.4+ds-1.3+b1 [71.3 kB]
Get: 17 http://deb.debian.org/debian trixie/main armhf libnsl2 armhf 1.3.0-3+b3 [35.0 kB]
Get: 18 http://deb.debian.org/debian trixie/main armhf readline-common all 8.2-5 [69.3 kB]
Get: 19 http://deb.debian.org/debian trixie/main armhf libreadline8t64 armhf 8.2-5 [146 kB]
Get: 20 http://deb.debian.org/debian trixie/main armhf libpython3.12-stdlib armhf 3.12.7-3 [1819 kB]
Get: 21 http://deb.debian.org/debian trixie/main armhf python3.12 armhf 3.12.7-3 [671 kB]
Get: 22 http://deb.debian.org/debian trixie/main armhf libpython3-stdlib armhf 3.12.6-1 [9692 B]
Get: 23 http://deb.debian.org/debian trixie/main armhf python3 armhf 3.12.6-1 [27.8 kB]
Get: 24 http://deb.debian.org/debian trixie/main armhf sgml-base all 1.31 [15.4 kB]
Get: 25 http://deb.debian.org/debian trixie/main armhf sensible-utils all 0.0.24 [24.8 kB]
Get: 26 http://deb.debian.org/debian trixie/main armhf openssl armhf 3.3.2-2 [1348 kB]
Get: 27 http://deb.debian.org/debian trixie/main armhf ca-certificates all 20240203 [158 kB]
Get: 28 http://deb.debian.org/debian trixie/main armhf libmagic-mgc armhf 1:5.45-3+b1 [314 kB]
Get: 29 http://deb.debian.org/debian trixie/main armhf libmagic1t64 armhf 1:5.45-3+b1 [98.5 kB]
Get: 30 http://deb.debian.org/debian trixie/main armhf file armhf 1:5.45-3+b1 [42.3 kB]
Get: 31 http://deb.debian.org/debian trixie/main armhf gettext-base armhf 0.22.5-2 [195 kB]
Get: 32 http://deb.debian.org/debian trixie/main armhf libuchardet0 armhf 0.0.8-1+b2 [65.6 kB]
Get: 33 http://deb.debian.org/debian trixie/main armhf groff-base armhf 1.23.0-5 [1091 kB]
Get: 34 http://deb.debian.org/debian trixie/main armhf bsdextrautils armhf 2.40.2-11 [83.6 kB]
Get: 35 http://deb.debian.org/debian trixie/main armhf libpipeline1 armhf 1.5.8-1 [35.0 kB]
Get: 36 http://deb.debian.org/debian trixie/main armhf man-db armhf 2.13.0-1 [1382 kB]
Get: 37 http://deb.debian.org/debian trixie/main armhf m4 armhf 1.4.19-4 [264 kB]
Get: 38 http://deb.debian.org/debian trixie/main armhf autoconf all 2.72-3 [493 kB]
Get: 39 http://deb.debian.org/debian trixie/main armhf autotools-dev all 20220109.1 [51.6 kB]
Get: 40 http://deb.debian.org/debian trixie/main armhf automake all 1:1.16.5-1.3 [823 kB]
Get: 41 http://deb.debian.org/debian trixie/main armhf autopoint all 0.22.5-2 [723 kB]
Get: 42 http://deb.debian.org/debian trixie/main armhf libdebhelper-perl all 13.20 [89.7 kB]
Get: 43 http://deb.debian.org/debian trixie/main armhf libtool all 2.4.7-8 [517 kB]
Get: 44 http://deb.debian.org/debian trixie/main armhf dh-autoreconf all 20 [17.1 kB]
Get: 45 http://deb.debian.org/debian trixie/main armhf libarchive-zip-perl all 1.68-1 [104 kB]
Get: 46 http://deb.debian.org/debian trixie/main armhf libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB]
Get: 47 http://deb.debian.org/debian trixie/main armhf dh-strip-nondeterminism all 1.14.0-1 [8448 B]
Get: 48 http://deb.debian.org/debian trixie/main armhf libelf1t64 armhf 0.192-4 [184 kB]
Get: 49 http://deb.debian.org/debian trixie/main armhf dwz armhf 0.15-1+b2 [106 kB]
Get: 50 http://deb.debian.org/debian trixie/main armhf libicu72 armhf 72.1-5+b1 [9088 kB]
Get: 51 http://deb.debian.org/debian trixie/main armhf libxml2 armhf 2.12.7+dfsg+really2.9.14-0.2+b1 [605 kB]
Get: 52 http://deb.debian.org/debian trixie/main armhf gettext armhf 0.22.5-2 [1485 kB]
Get: 53 http://deb.debian.org/debian trixie/main armhf intltool-debian all 0.35.0+20060710.6 [22.9 kB]
Get: 54 http://deb.debian.org/debian trixie/main armhf po-debconf all 1.0.21+nmu1 [248 kB]
Get: 55 http://deb.debian.org/debian trixie/main armhf debhelper all 13.20 [915 kB]
Get: 56 http://deb.debian.org/debian trixie/main armhf python3-autocommand all 2.2.2-3 [13.6 kB]
Get: 57 http://deb.debian.org/debian trixie/main armhf python3-more-itertools all 10.5.0-1 [63.8 kB]
Get: 58 http://deb.debian.org/debian trixie/main armhf python3-typing-extensions all 4.12.2-2 [73.0 kB]
Get: 59 http://deb.debian.org/debian trixie/main armhf python3-zipp all 3.21.0-1 [10.6 kB]
Get: 60 http://deb.debian.org/debian trixie/main armhf python3-importlib-metadata all 8.5.0-1 [21.0 kB]
Get: 61 http://deb.debian.org/debian trixie/main armhf python3-typeguard all 4.4.1-1 [37.0 kB]
Get: 62 http://deb.debian.org/debian trixie/main armhf python3-inflect all 7.3.1-2 [32.4 kB]
Get: 63 http://deb.debian.org/debian trixie/main armhf python3-jaraco.context all 6.0.0-1 [7984 B]
Get: 64 http://deb.debian.org/debian trixie/main armhf python3-jaraco.functools all 4.1.0-1 [12.0 kB]
Get: 65 http://deb.debian.org/debian trixie/main armhf python3-pkg-resources all 74.1.2-2 [213 kB]
Get: 66 http://deb.debian.org/debian trixie/main armhf python3-setuptools all 74.1.2-2 [736 kB]
Get: 67 http://deb.debian.org/debian trixie/main armhf dh-python all 6.20241024 [109 kB]
Get: 68 http://deb.debian.org/debian trixie/main armhf xml-core all 0.19 [20.1 kB]
Get: 69 http://deb.debian.org/debian trixie/main armhf docutils-common all 0.21.2+dfsg-2 [128 kB]
Get: 70 http://deb.debian.org/debian trixie/main armhf fonts-font-awesome all 5.0.10+really4.7.0~dfsg-4.1 [517 kB]
Get: 71 http://deb.debian.org/debian trixie/main armhf libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB]
Get: 72 http://deb.debian.org/debian trixie/main armhf libjs-underscore all 1.13.4~dfsg+~1.11.4-3 [116 kB]
Get: 73 http://deb.debian.org/debian trixie/main armhf libjs-sphinxdoc all 7.4.7-4 [158 kB]
Get: 74 http://deb.debian.org/debian trixie/main armhf libjson-perl all 4.10000-1 [87.5 kB]
Get: 75 http://deb.debian.org/debian trixie/main armhf python3-packaging all 24.2-1 [55.3 kB]
Get: 76 http://deb.debian.org/debian trixie/main armhf python3-pyproject-hooks all 1.2.0-1 [11.7 kB]
Get: 77 http://deb.debian.org/debian trixie/main armhf python3-toml all 0.10.2-1 [16.2 kB]
Get: 78 http://deb.debian.org/debian trixie/main armhf python3-wheel all 0.45.1-1 [56.7 kB]
Get: 79 http://deb.debian.org/debian trixie/main armhf python3-build all 1.2.2-1 [36.0 kB]
Get: 80 http://deb.debian.org/debian trixie/main armhf python3-installer all 0.7.0+dfsg1-3 [18.6 kB]
Get: 81 http://deb.debian.org/debian trixie/main armhf pybuild-plugin-pyproject all 6.20241024 [11.4 kB]
Get: 82 http://deb.debian.org/debian trixie/main armhf python-babel-localedata all 2.16.0-1 [5696 kB]
Get: 83 http://deb.debian.org/debian trixie/main armhf python3-alabaster all 0.7.16-0.1 [27.9 kB]
Get: 84 http://deb.debian.org/debian trixie/main armhf python3-all armhf 3.12.6-1 [1040 B]
Get: 85 http://deb.debian.org/debian trixie/main armhf python3-babel all 2.16.0-1 [114 kB]
Get: 86 http://deb.debian.org/debian trixie/main armhf python3-bcrypt armhf 4.2.0-2.1 [214 kB]
Get: 87 http://deb.debian.org/debian trixie/main armhf python3-certifi all 2024.8.30+dfsg-1 [9576 B]
Get: 88 http://deb.debian.org/debian trixie/main armhf python3-charset-normalizer armhf 3.4.0-1+b1 [126 kB]
Get: 89 http://deb.debian.org/debian trixie/main armhf python3-idna all 3.8-2 [41.6 kB]
Get: 90 http://deb.debian.org/debian trixie/main armhf python3-urllib3 all 2.0.7-2 [111 kB]
Get: 91 http://deb.debian.org/debian trixie/main armhf python3-chardet all 5.2.0+dfsg-1 [107 kB]
Get: 92 http://deb.debian.org/debian trixie/main armhf python3-requests all 2.32.3+dfsg-1 [71.9 kB]
Get: 93 http://deb.debian.org/debian trixie/main armhf python3-msgpack armhf 1.0.3-3+b3 [101 kB]
Get: 94 http://deb.debian.org/debian trixie/main armhf python3-cachecontrol all 0.14.1-1 [18.6 kB]
Get: 95 http://deb.debian.org/debian trixie/main armhf python3-cffi-backend armhf 1.17.1-2+b1 [83.7 kB]
Get: 96 http://deb.debian.org/debian trixie/main armhf python3-crashtest all 0.4.1-1 [6740 B]
Get: 97 http://deb.debian.org/debian trixie/main armhf python3-pylev all 1.4.0-1 [6496 B]
Get: 98 http://deb.debian.org/debian trixie/main armhf python3-cleo all 2.1.0-2 [54.4 kB]
Get: 99 http://deb.debian.org/debian trixie/main armhf python3-colorama all 0.4.6-4 [36.2 kB]
Get: 100 http://deb.debian.org/debian trixie/main armhf python3-colorclass all 2.2.2-3 [467 kB]
Get: 101 http://deb.debian.org/debian trixie/main armhf python3-cryptography armhf 43.0.0-1 [827 kB]
Get: 102 http://deb.debian.org/debian trixie/main armhf python3-defusedxml all 0.7.1-2 [43.3 kB]
Get: 103 http://deb.debian.org/debian trixie/main armhf python3-distlib all 0.3.9-1 [257 kB]
Get: 104 http://deb.debian.org/debian trixie/main armhf python3-roman all 4.2-1 [10.4 kB]
Get: 105 http://deb.debian.org/debian trixie/main armhf python3-docutils all 0.21.2+dfsg-2 [403 kB]
Get: 106 http://deb.debian.org/debian trixie/main armhf python3-dulwich armhf 0.21.6-1+b2 [323 kB]
Get: 107 http://deb.debian.org/debian trixie/main armhf python3-fastjsonschema all 2.20.0-1 [21.8 kB]
Get: 108 http://deb.debian.org/debian trixie/main armhf python3-filelock all 3.16.1-1 [12.6 kB]
Get: 109 http://deb.debian.org/debian trixie/main armhf python3-imagesize all 1.4.1-1 [6688 B]
Get: 110 http://deb.debian.org/debian trixie/main armhf python3-iniconfig all 1.1.1-2 [6396 B]
Get: 111 http://deb.debian.org/debian trixie/main armhf python3-jaraco.classes all 3.4.0-1 [7728 B]
Get: 112 http://deb.debian.org/debian trixie/main armhf python3-jeepney all 0.8.0-4 [32.6 kB]
Get: 113 http://deb.debian.org/debian trixie/main armhf python3-markupsafe armhf 2.1.5-1+b2 [13.4 kB]
Get: 114 http://deb.debian.org/debian trixie/main armhf python3-jinja2 all 3.1.3-1 [119 kB]
Get: 115 http://deb.debian.org/debian trixie/main armhf python3-secretstorage all 3.3.3-3 [16.1 kB]
Get: 116 http://deb.debian.org/debian trixie/main armhf python3-keyring all 25.4.1-1 [54.6 kB]
Get: 117 http://deb.debian.org/debian trixie/main armhf python3-ptyprocess all 0.7.0-6 [14.5 kB]
Get: 118 http://deb.debian.org/debian trixie/main armhf python3-pexpect all 4.9-3 [55.6 kB]
Get: 119 http://deb.debian.org/debian trixie/main armhf python3-pip-whl all 24.3.1+dfsg-1 [1501 kB]
Get: 120 http://deb.debian.org/debian trixie/main armhf python3-pkginfo all 1.11.2-1 [20.4 kB]
Get: 121 http://deb.debian.org/debian trixie/main armhf python3-platformdirs all 4.3.6-1 [16.6 kB]
Get: 122 http://deb.debian.org/debian trixie/main armhf python3-pluggy all 1.5.0-1 [26.9 kB]
Get: 123 http://deb.debian.org/debian trixie/main armhf python3-poetry-core all 1.9.0-2 [210 kB]
Get: 124 http://deb.debian.org/debian trixie/main armhf python3-poetry-plugin-export all 1.8.0-1 [12.0 kB]
Get: 125 http://deb.debian.org/debian trixie/main armhf python3-requests-toolbelt all 1.0.0-3 [40.2 kB]
Get: 126 http://deb.debian.org/debian trixie/main armhf python3-shellingham all 1.5.4-1 [11.0 kB]
Get: 127 http://deb.debian.org/debian trixie/main armhf python3-tomlkit all 0.13.2-1 [42.7 kB]
Get: 128 http://deb.debian.org/debian trixie/main armhf python3-trove-classifiers all 2024.9.12-1 [10.2 kB]
Get: 129 http://deb.debian.org/debian trixie/main armhf python3-setuptools-whl all 74.1.2-2 [1262 kB]
Get: 130 http://deb.debian.org/debian trixie/main armhf python3-wheel-whl all 0.45.1-1 [75.3 kB]
Get: 131 http://deb.debian.org/debian trixie/main armhf python3-virtualenv all 20.27.0+ds-1 [71.1 kB]
Get: 132 http://deb.debian.org/debian trixie/main armhf python3-poetry all 1.8.3+dfsg-4 [181 kB]
Get: 133 http://deb.debian.org/debian trixie/main armhf python3-pygments all 2.18.0+dfsg-1 [836 kB]
Get: 134 http://deb.debian.org/debian trixie/main armhf python3-pytest all 8.3.3-1 [249 kB]
Get: 135 http://deb.debian.org/debian trixie/main armhf python3-snowballstemmer all 2.2.0-4 [58.0 kB]
Get: 136 http://deb.debian.org/debian trixie/main armhf sphinx-common all 7.4.7-4 [731 kB]
Get: 137 http://deb.debian.org/debian trixie/main armhf python3-sphinx all 7.4.7-4 [588 kB]
Get: 138 http://deb.debian.org/debian trixie/main armhf sphinx-rtd-theme-common all 3.0.2+dfsg-1 [1023 kB]
Get: 139 http://deb.debian.org/debian trixie/main armhf python3-sphinxcontrib.jquery all 4.1-5 [7348 B]
Get: 140 http://deb.debian.org/debian trixie/main armhf python3-sphinx-rtd-theme all 3.0.2+dfsg-1 [29.5 kB]
Get: 141 http://deb.debian.org/debian trixie/main armhf python3-termcolor all 2.4.0-1 [9612 B]
Fetched 49.2 MB in 2s (30.3 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
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 ... 19689 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.12-minimal:armhf.
Preparing to unpack .../libpython3.12-minimal_3.12.7-3_armhf.deb ...
Unpacking libpython3.12-minimal:armhf (3.12.7-3) ...
Selecting previously unselected package libexpat1:armhf.
Preparing to unpack .../libexpat1_2.6.4-1_armhf.deb ...
Unpacking libexpat1:armhf (2.6.4-1) ...
Selecting previously unselected package python3.12-minimal.
Preparing to unpack .../python3.12-minimal_3.12.7-3_armhf.deb ...
Unpacking python3.12-minimal (3.12.7-3) ...
Setting up libpython3.12-minimal:armhf (3.12.7-3) ...
Setting up libexpat1:armhf (2.6.4-1) ...
Setting up python3.12-minimal (3.12.7-3) ...
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 ... 20035 files and directories currently installed.)
Preparing to unpack .../00-python3-minimal_3.12.6-1_armhf.deb ...
Unpacking python3-minimal (3.12.6-1) ...
Selecting previously unselected package media-types.
Preparing to unpack .../01-media-types_10.1.0_all.deb ...
Unpacking media-types (10.1.0) ...
Selecting previously unselected package netbase.
Preparing to unpack .../02-netbase_6.4_all.deb ...
Unpacking netbase (6.4) ...
Selecting previously unselected package tzdata.
Preparing to unpack .../03-tzdata_2024b-3_all.deb ...
Unpacking tzdata (2024b-3) ...
Selecting previously unselected package libkrb5support0:armhf.
Preparing to unpack .../04-libkrb5support0_1.21.3-3_armhf.deb ...
Unpacking libkrb5support0:armhf (1.21.3-3) ...
Selecting previously unselected package libcom-err2:armhf.
Preparing to unpack .../05-libcom-err2_1.47.1-1+b1_armhf.deb ...
Unpacking libcom-err2:armhf (1.47.1-1+b1) ...
Selecting previously unselected package libk5crypto3:armhf.
Preparing to unpack .../06-libk5crypto3_1.21.3-3_armhf.deb ...
Unpacking libk5crypto3:armhf (1.21.3-3) ...
Selecting previously unselected package libkeyutils1:armhf.
Preparing to unpack .../07-libkeyutils1_1.6.3-4_armhf.deb ...
Unpacking libkeyutils1:armhf (1.6.3-4) ...
Selecting previously unselected package libkrb5-3:armhf.
Preparing to unpack .../08-libkrb5-3_1.21.3-3_armhf.deb ...
Unpacking libkrb5-3:armhf (1.21.3-3) ...
Selecting previously unselected package libgssapi-krb5-2:armhf.
Preparing to unpack .../09-libgssapi-krb5-2_1.21.3-3_armhf.deb ...
Unpacking libgssapi-krb5-2:armhf (1.21.3-3) ...
Selecting previously unselected package libtirpc-common.
Preparing to unpack .../10-libtirpc-common_1.3.4+ds-1.3_all.deb ...
Unpacking libtirpc-common (1.3.4+ds-1.3) ...
Selecting previously unselected package libtirpc3t64:armhf.
Preparing to unpack .../11-libtirpc3t64_1.3.4+ds-1.3+b1_armhf.deb ...
Adding 'diversion of /lib/arm-linux-gnueabihf/libtirpc.so.3 to /lib/arm-linux-gnueabihf/libtirpc.so.3.usr-is-merged by libtirpc3t64'
Adding 'diversion of /lib/arm-linux-gnueabihf/libtirpc.so.3.0.0 to /lib/arm-linux-gnueabihf/libtirpc.so.3.0.0.usr-is-merged by libtirpc3t64'
Unpacking libtirpc3t64:armhf (1.3.4+ds-1.3+b1) ...
Selecting previously unselected package libnsl2:armhf.
Preparing to unpack .../12-libnsl2_1.3.0-3+b3_armhf.deb ...
Unpacking libnsl2:armhf (1.3.0-3+b3) ...
Selecting previously unselected package readline-common.
Preparing to unpack .../13-readline-common_8.2-5_all.deb ...
Unpacking readline-common (8.2-5) ...
Selecting previously unselected package libreadline8t64:armhf.
Preparing to unpack .../14-libreadline8t64_8.2-5_armhf.deb ...
Adding 'diversion of /lib/arm-linux-gnueabihf/libhistory.so.8 to /lib/arm-linux-gnueabihf/libhistory.so.8.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/arm-linux-gnueabihf/libhistory.so.8.2 to /lib/arm-linux-gnueabihf/libhistory.so.8.2.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/arm-linux-gnueabihf/libreadline.so.8 to /lib/arm-linux-gnueabihf/libreadline.so.8.usr-is-merged by libreadline8t64'
Adding 'diversion of /lib/arm-linux-gnueabihf/libreadline.so.8.2 to /lib/arm-linux-gnueabihf/libreadline.so.8.2.usr-is-merged by libreadline8t64'
Unpacking libreadline8t64:armhf (8.2-5) ...
Selecting previously unselected package libpython3.12-stdlib:armhf.
Preparing to unpack .../15-libpython3.12-stdlib_3.12.7-3_armhf.deb ...
Unpacking libpython3.12-stdlib:armhf (3.12.7-3) ...
Selecting previously unselected package python3.12.
Preparing to unpack .../16-python3.12_3.12.7-3_armhf.deb ...
Unpacking python3.12 (3.12.7-3) ...
Selecting previously unselected package libpython3-stdlib:armhf.
Preparing to unpack .../17-libpython3-stdlib_3.12.6-1_armhf.deb ...
Unpacking libpython3-stdlib:armhf (3.12.6-1) ...
Setting up python3-minimal (3.12.6-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 ... 21097 files and directories currently installed.)
Preparing to unpack .../000-python3_3.12.6-1_armhf.deb ...
Unpacking python3 (3.12.6-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.3.2-2_armhf.deb ...
Unpacking openssl (3.3.2-2) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../004-ca-certificates_20240203_all.deb ...
Unpacking ca-certificates (20240203) ...
Selecting previously unselected package libmagic-mgc.
Preparing to unpack .../005-libmagic-mgc_1%3a5.45-3+b1_armhf.deb ...
Unpacking libmagic-mgc (1:5.45-3+b1) ...
Selecting previously unselected package libmagic1t64:armhf.
Preparing to unpack .../006-libmagic1t64_1%3a5.45-3+b1_armhf.deb ...
Unpacking libmagic1t64:armhf (1:5.45-3+b1) ...
Selecting previously unselected package file.
Preparing to unpack .../007-file_1%3a5.45-3+b1_armhf.deb ...
Unpacking file (1:5.45-3+b1) ...
Selecting previously unselected package gettext-base.
Preparing to unpack .../008-gettext-base_0.22.5-2_armhf.deb ...
Unpacking gettext-base (0.22.5-2) ...
Selecting previously unselected package libuchardet0:armhf.
Preparing to unpack .../009-libuchardet0_0.0.8-1+b2_armhf.deb ...
Unpacking libuchardet0:armhf (0.0.8-1+b2) ...
Selecting previously unselected package groff-base.
Preparing to unpack .../010-groff-base_1.23.0-5_armhf.deb ...
Unpacking groff-base (1.23.0-5) ...
Selecting previously unselected package bsdextrautils.
Preparing to unpack .../011-bsdextrautils_2.40.2-11_armhf.deb ...
Unpacking bsdextrautils (2.40.2-11) ...
Selecting previously unselected package libpipeline1:armhf.
Preparing to unpack .../012-libpipeline1_1.5.8-1_armhf.deb ...
Unpacking libpipeline1:armhf (1.5.8-1) ...
Selecting previously unselected package man-db.
Preparing to unpack .../013-man-db_2.13.0-1_armhf.deb ...
Unpacking man-db (2.13.0-1) ...
Selecting previously unselected package m4.
Preparing to unpack .../014-m4_1.4.19-4_armhf.deb ...
Unpacking m4 (1.4.19-4) ...
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.16.5-1.3_all.deb ...
Unpacking automake (1:1.16.5-1.3) ...
Selecting previously unselected package autopoint.
Preparing to unpack .../018-autopoint_0.22.5-2_all.deb ...
Unpacking autopoint (0.22.5-2) ...
Selecting previously unselected package libdebhelper-perl.
Preparing to unpack .../019-libdebhelper-perl_13.20_all.deb ...
Unpacking libdebhelper-perl (13.20) ...
Selecting previously unselected package libtool.
Preparing to unpack .../020-libtool_2.4.7-8_all.deb ...
Unpacking libtool (2.4.7-8) ...
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.0-1_all.deb ...
Unpacking libfile-stripnondeterminism-perl (1.14.0-1) ...
Selecting previously unselected package dh-strip-nondeterminism.
Preparing to unpack .../024-dh-strip-nondeterminism_1.14.0-1_all.deb ...
Unpacking dh-strip-nondeterminism (1.14.0-1) ...
Selecting previously unselected package libelf1t64:armhf.
Preparing to unpack .../025-libelf1t64_0.192-4_armhf.deb ...
Unpacking libelf1t64:armhf (0.192-4) ...
Selecting previously unselected package dwz.
Preparing to unpack .../026-dwz_0.15-1+b2_armhf.deb ...
Unpacking dwz (0.15-1+b2) ...
Selecting previously unselected package libicu72:armhf.
Preparing to unpack .../027-libicu72_72.1-5+b1_armhf.deb ...
Unpacking libicu72:armhf (72.1-5+b1) ...
Selecting previously unselected package libxml2:armhf.
Preparing to unpack .../028-libxml2_2.12.7+dfsg+really2.9.14-0.2+b1_armhf.deb ...
Unpacking libxml2:armhf (2.12.7+dfsg+really2.9.14-0.2+b1) ...
Selecting previously unselected package gettext.
Preparing to unpack .../029-gettext_0.22.5-2_armhf.deb ...
Unpacking gettext (0.22.5-2) ...
Selecting previously unselected package intltool-debian.
Preparing to unpack .../030-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 .../031-po-debconf_1.0.21+nmu1_all.deb ...
Unpacking po-debconf (1.0.21+nmu1) ...
Selecting previously unselected package debhelper.
Preparing to unpack .../032-debhelper_13.20_all.deb ...
Unpacking debhelper (13.20) ...
Selecting previously unselected package python3-autocommand.
Preparing to unpack .../033-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 .../034-python3-more-itertools_10.5.0-1_all.deb ...
Unpacking python3-more-itertools (10.5.0-1) ...
Selecting previously unselected package python3-typing-extensions.
Preparing to unpack .../035-python3-typing-extensions_4.12.2-2_all.deb ...
Unpacking python3-typing-extensions (4.12.2-2) ...
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.5.0-1_all.deb ...
Unpacking python3-importlib-metadata (8.5.0-1) ...
Selecting previously unselected package python3-typeguard.
Preparing to unpack .../038-python3-typeguard_4.4.1-1_all.deb ...
Unpacking python3-typeguard (4.4.1-1) ...
Selecting previously unselected package python3-inflect.
Preparing to unpack .../039-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 .../040-python3-jaraco.context_6.0.0-1_all.deb ...
Unpacking python3-jaraco.context (6.0.0-1) ...
Selecting previously unselected package python3-jaraco.functools.
Preparing to unpack .../041-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 .../042-python3-pkg-resources_74.1.2-2_all.deb ...
Unpacking python3-pkg-resources (74.1.2-2) ...
Selecting previously unselected package python3-setuptools.
Preparing to unpack .../043-python3-setuptools_74.1.2-2_all.deb ...
Unpacking python3-setuptools (74.1.2-2) ...
Selecting previously unselected package dh-python.
Preparing to unpack .../044-dh-python_6.20241024_all.deb ...
Unpacking dh-python (6.20241024) ...
Selecting previously unselected package xml-core.
Preparing to unpack .../045-xml-core_0.19_all.deb ...
Unpacking xml-core (0.19) ...
Selecting previously unselected package docutils-common.
Preparing to unpack .../046-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 .../047-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 .../048-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 .../049-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 .../050-libjs-sphinxdoc_7.4.7-4_all.deb ...
Unpacking libjs-sphinxdoc (7.4.7-4) ...
Selecting previously unselected package libjson-perl.
Preparing to unpack .../051-libjson-perl_4.10000-1_all.deb ...
Unpacking libjson-perl (4.10000-1) ...
Selecting previously unselected package python3-packaging.
Preparing to unpack .../052-python3-packaging_24.2-1_all.deb ...
Unpacking python3-packaging (24.2-1) ...
Selecting previously unselected package python3-pyproject-hooks.
Preparing to unpack .../053-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 .../054-python3-toml_0.10.2-1_all.deb ...
Unpacking python3-toml (0.10.2-1) ...
Selecting previously unselected package python3-wheel.
Preparing to unpack .../055-python3-wheel_0.45.1-1_all.deb ...
Unpacking python3-wheel (0.45.1-1) ...
Selecting previously unselected package python3-build.
Preparing to unpack .../056-python3-build_1.2.2-1_all.deb ...
Unpacking python3-build (1.2.2-1) ...
Selecting previously unselected package python3-installer.
Preparing to unpack .../057-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 .../058-pybuild-plugin-pyproject_6.20241024_all.deb ...
Unpacking pybuild-plugin-pyproject (6.20241024) ...
Selecting previously unselected package python-babel-localedata.
Preparing to unpack .../059-python-babel-localedata_2.16.0-1_all.deb ...
Unpacking python-babel-localedata (2.16.0-1) ...
Selecting previously unselected package python3-alabaster.
Preparing to unpack .../060-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 .../061-python3-all_3.12.6-1_armhf.deb ...
Unpacking python3-all (3.12.6-1) ...
Selecting previously unselected package python3-babel.
Preparing to unpack .../062-python3-babel_2.16.0-1_all.deb ...
Unpacking python3-babel (2.16.0-1) ...
Selecting previously unselected package python3-bcrypt.
Preparing to unpack .../063-python3-bcrypt_4.2.0-2.1_armhf.deb ...
Unpacking python3-bcrypt (4.2.0-2.1) ...
Selecting previously unselected package python3-certifi.
Preparing to unpack .../064-python3-certifi_2024.8.30+dfsg-1_all.deb ...
Unpacking python3-certifi (2024.8.30+dfsg-1) ...
Selecting previously unselected package python3-charset-normalizer.
Preparing to unpack .../065-python3-charset-normalizer_3.4.0-1+b1_armhf.deb ...
Unpacking python3-charset-normalizer (3.4.0-1+b1) ...
Selecting previously unselected package python3-idna.
Preparing to unpack .../066-python3-idna_3.8-2_all.deb ...
Unpacking python3-idna (3.8-2) ...
Selecting previously unselected package python3-urllib3.
Preparing to unpack .../067-python3-urllib3_2.0.7-2_all.deb ...
Unpacking python3-urllib3 (2.0.7-2) ...
Selecting previously unselected package python3-chardet.
Preparing to unpack .../068-python3-chardet_5.2.0+dfsg-1_all.deb ...
Unpacking python3-chardet (5.2.0+dfsg-1) ...
Selecting previously unselected package python3-requests.
Preparing to unpack .../069-python3-requests_2.32.3+dfsg-1_all.deb ...
Unpacking python3-requests (2.32.3+dfsg-1) ...
Selecting previously unselected package python3-msgpack.
Preparing to unpack .../070-python3-msgpack_1.0.3-3+b3_armhf.deb ...
Unpacking python3-msgpack (1.0.3-3+b3) ...
Selecting previously unselected package python3-cachecontrol.
Preparing to unpack .../071-python3-cachecontrol_0.14.1-1_all.deb ...
Unpacking python3-cachecontrol (0.14.1-1) ...
Selecting previously unselected package python3-cffi-backend:armhf.
Preparing to unpack .../072-python3-cffi-backend_1.17.1-2+b1_armhf.deb ...
Unpacking python3-cffi-backend:armhf (1.17.1-2+b1) ...
Selecting previously unselected package python3-crashtest.
Preparing to unpack .../073-python3-crashtest_0.4.1-1_all.deb ...
Unpacking python3-crashtest (0.4.1-1) ...
Selecting previously unselected package python3-pylev.
Preparing to unpack .../074-python3-pylev_1.4.0-1_all.deb ...
Unpacking python3-pylev (1.4.0-1) ...
Selecting previously unselected package python3-cleo.
Preparing to unpack .../075-python3-cleo_2.1.0-2_all.deb ...
Unpacking python3-cleo (2.1.0-2) ...
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-3_all.deb ...
Unpacking python3-colorclass (2.2.2-3) ...
Selecting previously unselected package python3-cryptography.
Preparing to unpack .../078-python3-cryptography_43.0.0-1_armhf.deb ...
Unpacking python3-cryptography (43.0.0-1) ...
Selecting previously unselected package python3-defusedxml.
Preparing to unpack .../079-python3-defusedxml_0.7.1-2_all.deb ...
Unpacking python3-defusedxml (0.7.1-2) ...
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_4.2-1_all.deb ...
Unpacking python3-roman (4.2-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.21.6-1+b2_armhf.deb ...
Unpacking python3-dulwich (0.21.6-1+b2) ...
Selecting previously unselected package python3-fastjsonschema.
Preparing to unpack .../084-python3-fastjsonschema_2.20.0-1_all.deb ...
Unpacking python3-fastjsonschema (2.20.0-1) ...
Selecting previously unselected package python3-filelock.
Preparing to unpack .../085-python3-filelock_3.16.1-1_all.deb ...
Unpacking python3-filelock (3.16.1-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+b2_armhf.deb ...
Unpacking python3-markupsafe (2.1.5-1+b2) ...
Selecting previously unselected package python3-jinja2.
Preparing to unpack .../091-python3-jinja2_3.1.3-1_all.deb ...
Unpacking python3-jinja2 (3.1.3-1) ...
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.4.1-1_all.deb ...
Unpacking python3-keyring (25.4.1-1) ...
Selecting previously unselected package python3-ptyprocess.
Preparing to unpack .../094-python3-ptyprocess_0.7.0-6_all.deb ...
Unpacking python3-ptyprocess (0.7.0-6) ...
Selecting previously unselected package python3-pexpect.
Preparing to unpack .../095-python3-pexpect_4.9-3_all.deb ...
Unpacking python3-pexpect (4.9-3) ...
Selecting previously unselected package python3-pip-whl.
Preparing to unpack .../096-python3-pip-whl_24.3.1+dfsg-1_all.deb ...
Unpacking python3-pip-whl (24.3.1+dfsg-1) ...
Selecting previously unselected package python3-pkginfo.
Preparing to unpack .../097-python3-pkginfo_1.11.2-1_all.deb ...
Unpacking python3-pkginfo (1.11.2-1) ...
Selecting previously unselected package python3-platformdirs.
Preparing to unpack .../098-python3-platformdirs_4.3.6-1_all.deb ...
Unpacking python3-platformdirs (4.3.6-1) ...
Selecting previously unselected package python3-pluggy.
Preparing to unpack .../099-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 .../100-python3-poetry-core_1.9.0-2_all.deb ...
Unpacking python3-poetry-core (1.9.0-2) ...
Selecting previously unselected package python3-poetry-plugin-export.
Preparing to unpack .../101-python3-poetry-plugin-export_1.8.0-1_all.deb ...
Unpacking python3-poetry-plugin-export (1.8.0-1) ...
Selecting previously unselected package python3-requests-toolbelt.
Preparing to unpack .../102-python3-requests-toolbelt_1.0.0-3_all.deb ...
Unpacking python3-requests-toolbelt (1.0.0-3) ...
Selecting previously unselected package python3-shellingham.
Preparing to unpack .../103-python3-shellingham_1.5.4-1_all.deb ...
Unpacking python3-shellingham (1.5.4-1) ...
Selecting previously unselected package python3-tomlkit.
Preparing to unpack .../104-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 .../105-python3-trove-classifiers_2024.9.12-1_all.deb ...
Unpacking python3-trove-classifiers (2024.9.12-1) ...
Selecting previously unselected package python3-setuptools-whl.
Preparing to unpack .../106-python3-setuptools-whl_74.1.2-2_all.deb ...
Unpacking python3-setuptools-whl (74.1.2-2) ...
Selecting previously unselected package python3-wheel-whl.
Preparing to unpack .../107-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 .../108-python3-virtualenv_20.27.0+ds-1_all.deb ...
Unpacking python3-virtualenv (20.27.0+ds-1) ...
Selecting previously unselected package python3-poetry.
Preparing to unpack .../109-python3-poetry_1.8.3+dfsg-4_all.deb ...
Unpacking python3-poetry (1.8.3+dfsg-4) ...
Selecting previously unselected package python3-pygments.
Preparing to unpack .../110-python3-pygments_2.18.0+dfsg-1_all.deb ...
Unpacking python3-pygments (2.18.0+dfsg-1) ...
Selecting previously unselected package python3-pytest.
Preparing to unpack .../111-python3-pytest_8.3.3-1_all.deb ...
Unpacking python3-pytest (8.3.3-1) ...
Selecting previously unselected package python3-snowballstemmer.
Preparing to unpack .../112-python3-snowballstemmer_2.2.0-4_all.deb ...
Unpacking python3-snowballstemmer (2.2.0-4) ...
Selecting previously unselected package sphinx-common.
Preparing to unpack .../113-sphinx-common_7.4.7-4_all.deb ...
Unpacking sphinx-common (7.4.7-4) ...
Selecting previously unselected package python3-sphinx.
Preparing to unpack .../114-python3-sphinx_7.4.7-4_all.deb ...
Unpacking python3-sphinx (7.4.7-4) ...
Selecting previously unselected package sphinx-rtd-theme-common.
Preparing to unpack .../115-sphinx-rtd-theme-common_3.0.2+dfsg-1_all.deb ...
Unpacking sphinx-rtd-theme-common (3.0.2+dfsg-1) ...
Selecting previously unselected package python3-sphinxcontrib.jquery.
Preparing to unpack .../116-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 .../117-python3-sphinx-rtd-theme_3.0.2+dfsg-1_all.deb ...
Unpacking python3-sphinx-rtd-theme (3.0.2+dfsg-1) ...
Selecting previously unselected package python3-termcolor.
Preparing to unpack .../118-python3-termcolor_2.4.0-1_all.deb ...
Unpacking python3-termcolor (2.4.0-1) ...
Setting up media-types (10.1.0) ...
Setting up libpipeline1:armhf (1.5.8-1) ...
Setting up python3-setuptools-whl (74.1.2-2) ...
Setting up libkeyutils1:armhf (1.6.3-4) ...
Setting up fonts-lato (2.015-1) ...
Setting up libicu72:armhf (72.1-5+b1) ...
Setting up bsdextrautils (2.40.2-11) ...
Setting up libmagic-mgc (1:5.45-3+b1) ...
Setting up libarchive-zip-perl (1.68-1) ...
Setting up libtirpc-common (1.3.4+ds-1.3) ...
Setting up libdebhelper-perl (13.20) ...
Setting up libmagic1t64:armhf (1:5.45-3+b1) ...
Setting up gettext-base (0.22.5-2) ...
Setting up m4 (1.4.19-4) ...
Setting up libcom-err2:armhf (1.47.1-1+b1) ...
Setting up file (1:5.45-3+b1) ...
Setting up libelf1t64:armhf (0.192-4) ...
Setting up python-babel-localedata (2.16.0-1) ...
Setting up libkrb5support0:armhf (1.21.3-3) ...
Setting up tzdata (2024b-3) ...

Current default time zone: 'Etc/UTC'
Local time is now:      Thu Nov 28 02:23:37 UTC 2024.
Universal Time is now:  Thu Nov 28 02:23:37 UTC 2024.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

Setting up autotools-dev (20220109.1) ...
Setting up autopoint (0.22.5-2) ...
Setting up libk5crypto3:armhf (1.21.3-3) ...
Setting up autoconf (2.72-3) ...
Setting up dwz (0.15-1+b2) ...
Setting up sensible-utils (0.0.24) ...
Setting up libuchardet0:armhf (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 libkrb5-3:armhf (1.21.3-3) ...
Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ...
Setting up openssl (3.3.2-2) ...
Setting up python3-wheel-whl (0.45.1-1) ...
Setting up readline-common (8.2-5) ...
Setting up libxml2:armhf (2.12.7+dfsg+really2.9.14-0.2+b1) ...
Setting up fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ...
Setting up sphinx-rtd-theme-common (3.0.2+dfsg-1) ...
Setting up libjs-underscore (1.13.4~dfsg+~1.11.4-3) ...
Setting up automake (1:1.16.5-1.3) ...
update-alternatives: using /usr/bin/automake-1.16 to provide /usr/bin/automake (automake) in auto mode
Setting up libfile-stripnondeterminism-perl (1.14.0-1) ...
Setting up gettext (0.22.5-2) ...
Setting up libtool (2.4.7-8) ...
Setting up intltool-debian (0.35.0+20060710.6) ...
Setting up dh-autoreconf (20) ...
Setting up ca-certificates (20240203) ...
Updating certificates in /etc/ssl/certs...
146 added, 0 removed; done.
Setting up libgssapi-krb5-2:armhf (1.21.3-3) ...
Setting up libjs-sphinxdoc (7.4.7-4) ...
Setting up libreadline8t64:armhf (8.2-5) ...
Setting up dh-strip-nondeterminism (1.14.0-1) ...
Setting up groff-base (1.23.0-5) ...
Setting up xml-core (0.19) ...
Setting up libtirpc3t64:armhf (1.3.4+ds-1.3+b1) ...
Setting up python3-pip-whl (24.3.1+dfsg-1) ...
Setting up po-debconf (1.0.21+nmu1) ...
Setting up man-db (2.13.0-1) ...
Not building database; man-db/auto-update is not 'true'.
Setting up sphinx-common (7.4.7-4) ...
Setting up libnsl2:armhf (1.3.0-3+b3) ...
Setting up libpython3.12-stdlib:armhf (3.12.7-3) ...
Setting up python3.12 (3.12.7-3) ...
Setting up debhelper (13.20) ...
Setting up libpython3-stdlib:armhf (3.12.6-1) ...
Setting up python3 (3.12.6-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 python3-markupsafe (2.1.5-1+b2) ...
Setting up python3-wheel (0.45.1-1) ...
Setting up python3-platformdirs (4.3.6-1) ...
Setting up python3-roman (4.2-1) ...
Setting up python3-jinja2 (3.1.3-1) ...
Setting up python3-packaging (24.2-1) ...
Setting up python3-pyproject-hooks (1.2.0-1) ...
Setting up python3-certifi (2024.8.30+dfsg-1) ...
Setting up python3-snowballstemmer (2.2.0-4) ...
Setting up python3-poetry-core (1.9.0-2) ...
Setting up python3-crashtest (0.4.1-1) ...
Setting up python3-idna (3.8-2) ...
Setting up python3-colorclass (2.2.2-3) ...
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.0.7-2) ...
Setting up python3-pluggy (1.5.0-1) ...
Setting up python3-fastjsonschema (2.20.0-1) ...
Setting up python3-trove-classifiers (2024.9.12-1) ...
Setting up python3-dulwich (0.21.6-1+b2) ...
Setting up python3-msgpack (1.0.3-3+b3) ...
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:armhf (1.17.1-2+b1) ...
Setting up python3-imagesize (1.4.1-1) ...
Setting up python3-ptyprocess (0.7.0-6) ...
Setting up python3-termcolor (2.4.0-1) ...
Setting up python3-more-itertools (10.5.0-1) ...
Setting up python3-iniconfig (1.1.1-2) ...
Setting up python3-filelock (3.16.1-1) ...
Setting up python3-jaraco.classes (3.4.0-1) ...
Setting up python3-importlib-metadata (8.5.0-1) ...
Setting up python3-jaraco.functools (4.1.0-1) ...
Setting up python3-jaraco.context (6.0.0-1) ...
Setting up python3-colorama (0.4.6-4) ...
Setting up python3-defusedxml (0.7.1-2) ...
Setting up python3-charset-normalizer (3.4.0-1+b1) ...
Setting up python3-pytest (8.3.3-1) ...
Setting up python3-alabaster (0.7.16-0.1) ...
Setting up python3-bcrypt (4.2.0-2.1) ...
Setting up python3-typeguard (4.4.1-1) ...
Setting up python3-pylev (1.4.0-1) ...
Setting up python3-virtualenv (20.27.0+ds-1) ...
Setting up python3-all (3.12.6-1) ...
Setting up python3-inflect (7.3.1-2) ...
Setting up python3-pexpect (4.9-3) ...
Setting up python3-cryptography (43.0.0-1) ...
Setting up python3-cleo (2.1.0-2) ...
Setting up python3-pkg-resources (74.1.2-2) ...
Setting up python3-setuptools (74.1.2-2) ...
Setting up python3-babel (2.16.0-1) ...
update-alternatives: using /usr/bin/pybabel-python3 to provide /usr/bin/pybabel (pybabel) in auto mode
Setting up python3-pkginfo (1.11.2-1) ...
Setting up python3-pygments (2.18.0+dfsg-1) ...
Setting up python3-chardet (5.2.0+dfsg-1) ...
Setting up python3-secretstorage (3.3.3-3) ...
Setting up python3-requests (2.32.3+dfsg-1) ...
Setting up python3-keyring (25.4.1-1) ...
Setting up python3-cachecontrol (0.14.1-1) ...
Setting up dh-python (6.20241024) ...
Setting up python3-requests-toolbelt (1.0.0-3) ...
Setting up pybuild-plugin-pyproject (6.20241024) ...
Setting up python3-poetry-plugin-export (1.8.0-1) ...
Setting up python3-poetry (1.8.3+dfsg-4) ...
Processing triggers for libc-bin (2.40-3) ...
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 (7.4.7-4) ...
Setting up python3-sphinxcontrib.jquery (4.1-5) ...
Setting up python3-sphinx-rtd-theme (3.0.2+dfsg-1) ...
Processing triggers for ca-certificates (20240203) ...
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/terminaltables-3.1.10/ && 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  > ../terminaltables_3.1.10-6_source.changes
dpkg-buildpackage: info: source package terminaltables
dpkg-buildpackage: info: source version 3.1.10-6
dpkg-buildpackage: info: source distribution sid
dpkg-buildpackage: info: source changed by Daniel Baumann <daniel.baumann@progress-linux.org>
 dpkg-source --before-build .
dpkg-buildpackage: info: host architecture armhf
dpkg-source: info: using options from terminaltables-3.1.10/debian/source/options: --extend-diff-ignore=^[^/]+\.egg-info/
 debian/rules clean
dh clean --buildsystem pybuild --with python3,sphinxdoc
   dh_auto_clean -O--buildsystem=pybuild
   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.12 with "build" module
I: pybuild base:311: python3.12 -m build --skip-dependency-check --no-isolation --wheel --outdir /build/reproducible-path/terminaltables-3.1.10/.pybuild/cpython3_3.12_terminaltables  
* Building wheel...
Successfully built terminaltables-3.1.10-py2.py3-none-any.whl
I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.12 with "installer" module
   debian/rules override_dh_auto_test
make[1]: Entering directory '/build/reproducible-path/terminaltables-3.1.10'
dh_auto_test
I: pybuild pybuild:308: cp example*.py /build/reproducible-path/terminaltables-3.1.10/.pybuild/cpython3_3.12_terminaltables/build
I: pybuild base:311: cd /build/reproducible-path/terminaltables-3.1.10/.pybuild/cpython3_3.12_terminaltables/build; python3.12 -m pytest tests
============================= test session starts ==============================
platform linux -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0
rootdir: /build/reproducible-path/terminaltables-3.1.10/.pybuild/cpython3_3.12_terminaltables/build
configfile: pyproject.toml
plugins: typeguard-4.4.1
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 = (
            u'+------------+-----+-------+------+\n'
            u'| ansi       | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n'
            u'| colorclass | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n'
            u'| colorama   | \033[31mRed\033[39m | \033[32mGreen\033[39m | \033[34mBlue\033[39m |\n'
            u'| termcolor  | \033[31mRed\033[0m | \033[32mGreen\033[0m | \033[34mBlue\033[0m |\n'
            u'+------------+-----+-------+------+'
        )
    
>       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:196: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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:295: 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, ['蓝色']),
        (u'שלום', '', 4, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 4, [u'\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, ['蓝色 ']),
        (u'שלום', '', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', '', 5, [u'\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, ['蓝色 ']),
        (u'שלום', 'left', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'left', 5, [u'\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, [' 蓝色']),
        (u'שלום', 'right', 5, [u' \u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'right', 5, [u' \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, [' 蓝色 ']),
        (u'שלום', 'center', 6, [u' \u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'center', 6, [u' \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:87: 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, ['蓝色']),
        (u'שלום', '', 4, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 4, [u'\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, ['蓝色 ']),
        (u'שלום', '', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', '', 5, [u'\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, ['蓝色 ']),
        (u'שלום', 'left', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'left', 5, [u'\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, [' 蓝色']),
        (u'שלום', 'right', 5, [u' \u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'right', 5, [u' \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, [' 蓝色 ']),
        (u'שלום', 'center', 6, [u' \u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'center', 6, [u' \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:87: 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, ['蓝色']),
        (u'שלום', '', 4, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 4, [u'\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, ['蓝色 ']),
        (u'שלום', '', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', '', 5, [u'\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, ['蓝色 ']),
        (u'שלום', 'left', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'left', 5, [u'\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, [' 蓝色']),
        (u'שלום', 'right', 5, [u' \u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'right', 5, [u' \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, [' 蓝色 ']),
        (u'שלום', 'center', 6, [u' \u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'center', 6, [u' \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:87: 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, ['蓝色']),
        (u'שלום', '', 4, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 4, [u'\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, ['蓝色 ']),
        (u'שלום', '', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', '', 5, [u'\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, ['蓝色 ']),
        (u'שלום', 'left', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'left', 5, [u'\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, [' 蓝色']),
        (u'שלום', 'right', 5, [u' \u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'right', 5, [u' \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, [' 蓝色 ']),
        (u'שלום', 'center', 6, [u' \u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'center', 6, [u' \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:87: 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, ['蓝色']),
        (u'שלום', '', 4, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 4, [u'\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, ['蓝色 ']),
        (u'שלום', '', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', '', 5, [u'\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, ['蓝色 ']),
        (u'שלום', 'left', 5, [u'\u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'left', 5, [u'\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, [' 蓝色']),
        (u'שלום', 'right', 5, [u' \u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'right', 5, [u' \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, [' 蓝色 ']),
        (u'שלום', 'center', 6, [u' \u05e9\u05dc\u05d5\u05dd ']),
        (u'معرب', 'center', 6, [u' \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:87: 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, ['蓝色']),
        (u'שלום', '', 1, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 1, [u'\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, ['蓝色', '    ']),
        (u'שלום', '', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', '', 2, [u'\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, ['蓝色', '    ']),
        (u'שלום', 'top', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'top', 2, [u'\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, ['    ', '蓝色']),
        (u'שלום', 'bottom', 2, ['    ', u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'bottom', 2, ['    ', u'\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, ['    ', '蓝色', '    ']),
        (u'שלום', 'middle', 3, ['    ', u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'middle', 3, ['    ', u'\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:140: 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, ['蓝色']),
        (u'שלום', '', 1, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 1, [u'\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, ['蓝色', '    ']),
        (u'שלום', '', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', '', 2, [u'\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, ['蓝色', '    ']),
        (u'שלום', 'top', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'top', 2, [u'\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, ['    ', '蓝色']),
        (u'שלום', 'bottom', 2, ['    ', u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'bottom', 2, ['    ', u'\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, ['    ', '蓝色', '    ']),
        (u'שלום', 'middle', 3, ['    ', u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'middle', 3, ['    ', u'\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:140: 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, ['蓝色']),
        (u'שלום', '', 1, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 1, [u'\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, ['蓝色', '    ']),
        (u'שלום', '', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', '', 2, [u'\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, ['蓝色', '    ']),
        (u'שלום', 'top', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'top', 2, [u'\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, ['    ', '蓝色']),
        (u'שלום', 'bottom', 2, ['    ', u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'bottom', 2, ['    ', u'\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, ['    ', '蓝色', '    ']),
        (u'שלום', 'middle', 3, ['    ', u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'middle', 3, ['    ', u'\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:140: 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, ['蓝色']),
        (u'שלום', '', 1, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 1, [u'\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, ['蓝色', '    ']),
        (u'שלום', '', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', '', 2, [u'\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, ['蓝色', '    ']),
        (u'שלום', 'top', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'top', 2, [u'\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, ['    ', '蓝色']),
        (u'שלום', 'bottom', 2, ['    ', u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'bottom', 2, ['    ', u'\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, ['    ', '蓝色', '    ']),
        (u'שלום', 'middle', 3, ['    ', u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'middle', 3, ['    ', u'\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:140: 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, ['蓝色']),
        (u'שלום', '', 1, [u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', '', 1, [u'\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, ['蓝色', '    ']),
        (u'שלום', '', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', '', 2, [u'\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, ['蓝色', '    ']),
        (u'שלום', 'top', 2, [u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'top', 2, [u'\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, ['    ', '蓝色']),
        (u'שלום', 'bottom', 2, ['    ', u'\u05e9\u05dc\u05d5\u05dd']),
        (u'معرب', 'bottom', 2, ['    ', u'\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, ['    ', '蓝色', '    ']),
        (u'שלום', 'middle', 3, ['    ', u'\u05e9\u05dc\u05d5\u05dd', '    ']),
        (u'معرب', 'middle', 3, ['    ', u'\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:140: 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..', '.......', '.......']),
    
        (
            u'蓝色\nשלום\nمعرب',
            '',
            ['.......', u'.蓝色..', u'.\u05e9\u05dc\u05d5\u05dd..', u'.\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:202: 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 8.23s ==================
E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd /build/reproducible-path/terminaltables-3.1.10/.pybuild/cpython3_3.12_terminaltables/build; python3.12 -m pytest tests
dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.12 returned exit code 13
make[1]: [debian/rules:12: override_dh_auto_test] Error 25 (ignored)
make[1]: Leaving directory '/build/reproducible-path/terminaltables-3.1.10'
   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.12 to destdir
   debian/rules execute_after_dh_auto_install
make[1]: Entering directory '/build/reproducible-path/terminaltables-3.1.10'
# installed via python-terminaltables-doc.examples
rm -f debian/python3-terminaltables/usr/lib/python*/dist-packages/example*.py
make[1]: Leaving directory '/build/reproducible-path/terminaltables-3.1.10'
   dh_installdocs -O--buildsystem=pybuild
dh_installdocs: warning: Cannot auto-detect main package for python-terminaltables-doc.  If the default is wrong, please use --doc-main-package
   debian/rules override_dh_sphinxdoc
make[1]: Entering directory '/build/reproducible-path/terminaltables-3.1.10'
PYTHONPATH=. /usr/share/sphinx/scripts/python3/sphinx-build -N -q -E -b html docs/ debian/python-terminaltables-doc/usr/share/doc/python-terminaltables-doc/html/
/build/reproducible-path/terminaltables-3.1.10/docs/changelog.rst:3: CRITICAL: Problems with "include" directive path:
InputError: [Errno 2] No such file or directory: 'README.rst'.
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:29: ERROR: Unknown interpreted text role "github".
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:29: ERROR: Unknown interpreted text role "github".
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:29: ERROR: Unknown interpreted text role "github".
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
/build/reproducible-path/terminaltables-3.1.10/docs/index.rst:68: WARNING: toctree contains reference to document 'changelog' that doesn't have a title: no link will be generated
dh_sphinxdoc
make[1]: Leaving directory '/build/reproducible-path/terminaltables-3.1.10'
   debian/rules override_dh_installchangelogs
make[1]: Entering directory '/build/reproducible-path/terminaltables-3.1.10'
dh_installchangelogs CHANGELOG.md
make[1]: Leaving directory '/build/reproducible-path/terminaltables-3.1.10'
   dh_installexamples -O--buildsystem=pybuild
dh_installexamples: warning: Cannot auto-detect main package for python-terminaltables-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/terminaltables-3.1.10'
dh_compress -X example1.py -X example2.py -X example3.py -X html/
make[1]: Leaving directory '/build/reproducible-path/terminaltables-3.1.10'
   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 'python3-terminaltables' in '../python3-terminaltables_3.1.10-6_all.deb'.
dpkg-deb: building package 'python-terminaltables-doc' in '../python-terminaltables-doc_3.1.10-6_all.deb'.
 dpkg-genbuildinfo --build=binary -O../terminaltables_3.1.10-6_armhf.buildinfo
 dpkg-genchanges --build=binary -O../terminaltables_3.1.10-6_armhf.changes
dpkg-genchanges: info: binary-only upload (no source code included)
 dpkg-source --after-build .
dpkg-source: info: using options from terminaltables-3.1.10/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/18857 and its subdirectories
I: Current time: Wed Nov 27 14:25:35 -12 2024
I: pbuilder-time-stamp: 1732760735
Thu Nov 28 02:25:42 UTC 2024  I: 1st build successful. Starting 2nd build on remote node virt64z-armhf-rb.debian.net.
Thu Nov 28 02:25:42 UTC 2024  I: Preparing to do remote build '2' on virt64z-armhf-rb.debian.net.
Thu Nov 28 02:27:52 UTC 2024  I: Deleting $TMPDIR on virt64z-armhf-rb.debian.net.
Thu Nov 28 02:27:55 UTC 2024  I: terminaltables_3.1.10-6_armhf.changes:
Format: 1.8
Date: Mon, 18 Nov 2024 17:41:01 +0100
Source: terminaltables
Binary: python-terminaltables-doc python3-terminaltables
Architecture: all
Version: 3.1.10-6
Distribution: sid
Urgency: medium
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Changed-By: Daniel Baumann <daniel.baumann@progress-linux.org>
Description:
 python-terminaltables-doc - Documentation for terminaltables table printer
 python3-terminaltables - Python library for printing tables to the console
Closes: 1087767
Changes:
 terminaltables (3.1.10-6) sid; urgency=medium
 .
   * Uploading to sid.
   * Avoiding to install example files twice, thanks to Alexandre Detiste
     <alexandre.detiste@gmail.com> (Closes: #1087767).
Checksums-Sha1:
 1b81a48775fe11aebfcde55cfc354aaff09ffa50 228856 python-terminaltables-doc_3.1.10-6_all.deb
 4e669938f2fdfc11711a2aa7769e590031d9d343 14376 python3-terminaltables_3.1.10-6_all.deb
 6875edacf8d9696aff8d38d4c481cd2a727efea2 8660 terminaltables_3.1.10-6_armhf.buildinfo
Checksums-Sha256:
 978dd9f4c260c74bd208a4c51f33ed182255ac8ccac8bda9e378283217e4431c 228856 python-terminaltables-doc_3.1.10-6_all.deb
 83b86d03d477344809dcd8c92c032865e3ed8b4340bb156c5de21bf9075cc451 14376 python3-terminaltables_3.1.10-6_all.deb
 5c93dbb7c5851769640b1583000dd13b25c1070970cd0baad4c211b9c16ec9a3 8660 terminaltables_3.1.10-6_armhf.buildinfo
Files:
 8a176a751ea4da1191f90e4faffc04fe 228856 doc optional python-terminaltables-doc_3.1.10-6_all.deb
 8e58b48ada4a7f3f1faf1dd9348bd578 14376 python optional python3-terminaltables_3.1.10-6_all.deb
 6d807f841e06ea7c57f2ddf4f3eb66e5 8660 python optional terminaltables_3.1.10-6_armhf.buildinfo
Thu Nov 28 02:27:56 UTC 2024  I: diffoscope 283 will be used to compare the two builds:
Running as unit: rb-diffoscope-armhf_16-10294.service
# Profiling output for: /usr/bin/diffoscope --timeout 7200 --html /srv/reproducible-results/rbuild-debian/r-b-build.H2NSyoe6/terminaltables_3.1.10-6.diffoscope.html --text /srv/reproducible-results/rbuild-debian/r-b-build.H2NSyoe6/terminaltables_3.1.10-6.diffoscope.txt --json /srv/reproducible-results/rbuild-debian/r-b-build.H2NSyoe6/terminaltables_3.1.10-6.diffoscope.json --profile=- /srv/reproducible-results/rbuild-debian/r-b-build.H2NSyoe6/b1/terminaltables_3.1.10-6_armhf.changes /srv/reproducible-results/rbuild-debian/r-b-build.H2NSyoe6/b2/terminaltables_3.1.10-6_armhf.changes

## close_archive (total time: 0.000s)
       0.000s      2 calls    diffoscope.comparators.xz.XzContainer
       0.000s      2 calls    diffoscope.comparators.tar.TarContainer

## command (total time: 0.302s)
       0.211s     24 calls    diff
       0.047s      6 calls    xz
       0.034s     88 calls    html2text
       0.004s      2 calls    cmp
       0.004s      2 calls    cmp (external)
       0.003s     47 calls    cmp (internal)

## compare_files (cumulative) (total time: 2.526s)
       0.590s      1 call     abc.DotChangesFile
       0.577s      1 call     abc.DebFile
       0.552s      2 calls    abc.XzFile
       0.478s      1 call     abc.DebDataTarFile
       0.265s      8 calls    abc.HtmlFile
       0.034s      3 calls    abc.TextFile
       0.026s      1 call     abc.TarFile
       0.005s      1 call     abc.Md5sumsFile

## container_extract (total time: 0.075s)
       0.047s      6 calls    diffoscope.comparators.xz.XzContainer
       0.022s     88 calls    diffoscope.comparators.deb.DebTarContainer
       0.003s      8 calls    diffoscope.comparators.deb.DebContainer
       0.003s      6 calls    diffoscope.comparators.tar.TarContainer

## diff (total time: 0.004s)
       0.004s     21 calls    linediff

## has_same_content_as (total time: 0.010s)
       0.003s     27 calls    diffoscope.comparators.utils.libarchive.LibarchiveSymlink
       0.003s      1 call     abc.DebDataTarFile
       0.002s      2 calls    abc.XzFile
       0.001s      8 calls    abc.HtmlFile
       0.001s      5 calls    abc.TextFile
       0.000s      2 calls    abc.DebFile
       0.000s      2 calls    abc.Md5sumsFile
       0.000s      1 call     abc.DotChangesFile
       0.000s      1 call     abc.TarFile

## main (total time: 1.056s)
       1.050s      2 calls    outputs
       0.006s      1 call     cleanup

## open_archive (total time: 0.000s)
       0.000s      6 calls    diffoscope.comparators.xz.XzContainer
       0.000s      4 calls    diffoscope.comparators.tar.TarContainer
       0.000s      2 calls    diffoscope.comparators.deb.DebTarContainer
       0.000s      2 calls    diffoscope.comparators.deb.DebContainer

## output (total time: 0.125s)
       0.124s      1 call     html
       0.001s      1 call     text
       0.001s      1 call     json

## recognizes (total time: 0.113s)
       0.080s   1010 calls    diffoscope.comparators.utils.libarchive.LibarchiveMember
       0.017s     12 calls    diffoscope.comparators.binary.FilesystemFile
       0.013s    260 calls    diffoscope.comparators.utils.archive.ArchiveMember
       0.003s    108 calls    diffoscope.comparators.debian.DebControlMember

## specialize (total time: 0.089s)
       0.089s     49 calls    specialize
Finished with result: success
Main processes terminated with: code=exited/status=1
Service runtime: 1.362s
CPU time consumed: 1.511s
Thu Nov 28 02:27:57 UTC 2024  W: Diffoscope claims the build is reproducible, but there is a diffoscope file. Please investigate.
Thu Nov 28 02:27:57 UTC 2024  E: terminaltables failed to build reproducibly in trixie on armhf.
Thu Nov 28 02:27:58 UTC 2024  I: Submitting .buildinfo files to external archives:
Thu Nov 28 02:27:58 UTC 2024  I: Submitting 12K	b1/terminaltables_3.1.10-6_armhf.buildinfo.asc
Thu Nov 28 02:27:59 UTC 2024  I: Submitting 12K	b2/terminaltables_3.1.10-6_armhf.buildinfo.asc
Thu Nov 28 02:28:00 UTC 2024  I: Done submitting .buildinfo files to http://buildinfo.debian.net/api/submit.
Thu Nov 28 02:28:00 UTC 2024  I: Done submitting .buildinfo files.
Thu Nov 28 02:28:00 UTC 2024  I: Removing signed terminaltables_3.1.10-6_armhf.buildinfo.asc files:
removed './b1/terminaltables_3.1.10-6_armhf.buildinfo.asc'
removed './b2/terminaltables_3.1.10-6_armhf.buildinfo.asc'